#------------------------------------------------------------------- # This file is part of the CMake build system for OGRE # (Object-oriented Graphics Rendering Engine) # For the latest info, see http://www.ogre3d.org/ # # The contents of this file are placed in the public domain. Feel # free to make use of it in any way you like. #------------------------------------------------------------------- ################################################################## # Provides some common functionality for the FindPackage modules ################################################################## # Begin processing of package macro(findpkg_begin PREFIX) if (NOT ${PREFIX}_FIND_QUIETLY) message(STATUS "Looking for ${PREFIX}...") endif () endmacro(findpkg_begin) # Display a status message unless FIND_QUIETLY is set macro(pkg_message PREFIX) if (NOT ${PREFIX}_FIND_QUIETLY) message(STATUS ${ARGN}) endif () endmacro(pkg_message) # Get environment variable, define it as ENV_$var and make sure backslashes are converted to forward slashes macro(getenv_path VAR) set(ENV_${VAR} $ENV{${VAR}}) # replace won't work if var is blank if (ENV_${VAR}) string( REGEX REPLACE "\\\\" "/" ENV_${VAR} ${ENV_${VAR}} ) endif () endmacro(getenv_path) # Construct search paths for includes and libraries from a PREFIX_PATH macro(create_search_paths PREFIX) if (ANDROID) set(${PREFIX}_PREFIX_PATH ${${PREFIX}_PREFIX_PATH} $ENV{SCOL_DEPENDENCIES_PATH}/sdk/android/${ANDROID_ABI}) elseif(WIN32 AND (WIN64 OR (CMAKE_SIZEOF_VOID_P EQUAL 8))) set(${PREFIX}_PREFIX_PATH ${${PREFIX}_PREFIX_PATH} $ENV{SCOL_DEPENDENCIES_PATH}/sdk/windows/x64) elseif(WIN32) set(${PREFIX}_PREFIX_PATH ${${PREFIX}_PREFIX_PATH} $ENV{SCOL_DEPENDENCIES_PATH}/sdk/windows/x86) elseif(APPLE AND APPLE_IOS) set(${PREFIX}_PREFIX_PATH ${${PREFIX}_PREFIX_PATH} $ENV{SCOL_DEPENDENCIES_PATH}/sdk/apple/IOS) elseif(APPLE AND NOT APPLE_IOS) set(${PREFIX}_PREFIX_PATH ${${PREFIX}_PREFIX_PATH} $ENV{SCOL_DEPENDENCIES_PATH}/sdk/apple/OSX) elseif(EMSCRIPTEN) set(${PREFIX}_PREFIX_PATH ${${PREFIX}_PREFIX_PATH} $ENV{SCOL_DEPENDENCIES_PATH}/sdk/emscripten) elseif(PIZERO) set(${PREFIX}_PREFIX_PATH ${${PREFIX}_PREFIX_PATH} $ENV{SCOL_DEPENDENCIES_PATH}/sdk/RPIZERO) elseif(PITHREE) set(${PREFIX}_PREFIX_PATH ${${PREFIX}_PREFIX_PATH} $ENV{SCOL_DEPENDENCIES_PATH}/sdk/RPI3) elseif(PIFOUR) set(${PREFIX}_PREFIX_PATH ${${PREFIX}_PREFIX_PATH} $ENV{SCOL_DEPENDENCIES_PATH}/sdk/RPI4) elseif(RPI) set(${PREFIX}_PREFIX_PATH ${${PREFIX}_PREFIX_PATH} $ENV{SCOL_DEPENDENCIES_PATH}/sdk/RPI2) elseif(LINUX32) set(${PREFIX}_PREFIX_PATH ${${PREFIX}_PREFIX_PATH} $ENV{SCOL_DEPENDENCIES_PATH}/sdk/linux32) elseif(LINUX64) set(${PREFIX}_PREFIX_PATH ${${PREFIX}_PREFIX_PATH} $ENV{SCOL_DEPENDENCIES_PATH}/sdk/linux64) else(SCOL_INSTALL_PREFIX) set(${PREFIX}_PREFIX_PATH ${${PREFIX}_PREFIX_PATH} $ENV{SCOL_DEPENDENCIES_PATH}/sdk/${SCOL_INSTALL_PREFIX}) endif() foreach(dir ${${PREFIX}_PREFIX_PATH}) set(${PREFIX}_INC_SEARCH_PATH ${${PREFIX}_INC_SEARCH_PATH};${dir};${dir}/include;${dir}/Include;${dir}/include/${PREFIX};${dir}/Headers) set(${PREFIX}_LIB_SEARCH_PATH ${${PREFIX}_LIB_SEARCH_PATH};${dir};${dir}/lib;${dir}/lib/Release;${dir}/lib/Debug;${dir}/Lib;${dir}/lib/${PREFIX};${dir}/Libs) set(${PREFIX}_BIN_SEARCH_PATH ${${PREFIX}_BIN_SEARCH_PATH};${dir};${dir}/bin) endforeach(dir) set(${PREFIX}_FRAMEWORK_SEARCH_PATH ${${PREFIX}_PREFIX_PATH}) endmacro(create_search_paths) # clear cache variables if a certain variable changed macro(clear_if_changed TESTVAR) # test against internal check variable # HACK: Apparently, adding a variable to the cache cleans up the list # a bit. We need to also remove any empty strings from the list, but # at the same time ensure that we are actually dealing with a list. list(APPEND ${TESTVAR} "") list(REMOVE_ITEM ${TESTVAR} "") if (NOT "${${TESTVAR}}" STREQUAL "${${TESTVAR}_INT_CHECK}") message(STATUS "${TESTVAR} changed.") foreach(var ${ARGN}) set(${var} "NOTFOUND" CACHE STRING "x" FORCE) endforeach(var) endif () set(${TESTVAR}_INT_CHECK ${${TESTVAR}} CACHE INTERNAL "x" FORCE) endmacro(clear_if_changed) # Try to get some hints from pkg-config, if available macro(use_pkgconfig PREFIX PKGNAME) if(NOT ANDROID) find_package(PkgConfig) if (PKG_CONFIG_FOUND) pkg_check_modules(${PREFIX} ${PKGNAME}) endif () endif() endmacro (use_pkgconfig) # Couple a set of release AND debug libraries (or frameworks) macro(make_library_set PREFIX) if (${PREFIX}_FWK) set(${PREFIX} ${${PREFIX}_FWK}) elseif (${PREFIX}_FRAMEWORK) set(${PREFIX} ${${PREFIX}_FRAMEWORK}) elseif (${PREFIX}_REL AND ${PREFIX}_DBG) set(${PREFIX} optimized ${${PREFIX}_REL} debug ${${PREFIX}_DBG}) elseif (${PREFIX}_REL) set(${PREFIX} ${${PREFIX}_REL}) elseif (${PREFIX}_DBG) set(${PREFIX} ${${PREFIX}_DBG}) elseif (${PREFIX}_RELEASE AND ${PREFIX}_DEBUG) set(${PREFIX} optimized ${${PREFIX}_RELEASE} debug ${${PREFIX}_DEBUG}) elseif (${PREFIX}_RELEASE) set(${PREFIX} ${${PREFIX}_REL}) elseif (${PREFIX}_DEBUG) set(${PREFIX} ${${PREFIX}_DBG}) endif () endmacro(make_library_set) # Generate debug names from given release names macro(get_debug_names PREFIX) foreach(i ${${PREFIX}}) set(${PREFIX}_DBG ${${PREFIX}_DBG} ${i}d ${i}D ${i}_d ${i}_D ${i}_debug ${i}) endforeach(i) endmacro(get_debug_names) # Add the parent dir from DIR to VAR macro(add_parent_dir VAR DIR) get_filename_component(${DIR}_TEMP "${${DIR}}/.." ABSOLUTE) set(${VAR} ${${VAR}} ${${DIR}_TEMP}) endmacro(add_parent_dir) # Do the final processing for the package find. macro(findpkg_finish PREFIX) # skip if already processed during this run if (NOT ${PREFIX}_FOUND) if (${PREFIX}_INCLUDE_DIR AND ${PREFIX}_LIBRARY) set(${PREFIX}_FOUND TRUE) set(${PREFIX}_INCLUDE_DIRS ${${PREFIX}_INCLUDE_DIR}) set(${PREFIX}_LIBRARIES ${${PREFIX}_LIBRARY}) if (NOT ${PREFIX}_FIND_QUIETLY) message(STATUS "Found ${PREFIX}: ${${PREFIX}_LIBRARIES}") endif () else () if (NOT ${PREFIX}_FIND_QUIETLY) message(STATUS "Could not locate ${PREFIX}") endif () if (${PREFIX}_FIND_REQUIRED) message(FATAL_ERROR "Required library ${PREFIX} not found! Install the library (including dev packages) and try again. If the library is already installed, set the missing variables manually in cmake.") endif () endif () mark_as_advanced(${PREFIX}_INCLUDE_DIR ${PREFIX}_LIBRARY ${PREFIX}_LIBRARY_REL ${PREFIX}_LIBRARY_DBG ${PREFIX}_LIBRARY_FWK) endif () endmacro(findpkg_finish) # Slightly customised framework finder macro(findpkg_framework fwk) if(APPLE) set(${fwk}_FRAMEWORK_PATH ${${fwk}_FRAMEWORK_SEARCH_PATH} ${CMAKE_FRAMEWORK_PATH} ~/Library/Frameworks /Library/Frameworks /System/Library/Frameworks /Network/Library/Frameworks ${CMAKE_CURRENT_SOURCE_DIR}/lib/macosx/Release ${CMAKE_CURRENT_SOURCE_DIR}/lib/macosx/Debug ) # These could be arrays of paths, add each individually to the search paths foreach(i ${${PREFIX}_PREFIX_PATH}) set(${fwk}_FRAMEWORK_PATH ${${fwk}_FRAMEWORK_PATH} ${i}/lib/macosx/Release ${i}/lib/macosx/Debug) endforeach(i) foreach(i ${OGRE_PREFIX_BUILD}) set(${fwk}_FRAMEWORK_PATH ${${fwk}_FRAMEWORK_PATH} ${i}/lib/macosx/Release ${i}/lib/macosx/Debug) endforeach(i) foreach(dir ${${fwk}_FRAMEWORK_PATH}) set(fwkpath ${dir}/${fwk}.framework) if(EXISTS ${fwkpath}) set(${fwk}_FRAMEWORK_INCLUDES ${${fwk}_FRAMEWORK_INCLUDES} ${fwkpath}/Headers ${fwkpath}/PrivateHeaders) set(${fwk}_FRAMEWORK_PATH ${dir}) if (NOT ${fwk}_LIBRARY_FWK) set(${fwk}_LIBRARY_FWK "-framework ${fwk}") endif () endif(EXISTS ${fwkpath}) endforeach(dir) endif(APPLE) endmacro(findpkg_framework) # macro to find packages on the host OS if (ANDROID) macro( find_host_package ) set( CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER ) set( CMAKE_FIND_ROOT_PATH_MODE_LIBRARY NEVER ) set( CMAKE_FIND_ROOT_PATH_MODE_INCLUDE NEVER ) if( CMAKE_HOST_WIN32 ) SET( WIN32 1 ) SET( UNIX ) elseif( CMAKE_HOST_APPLE ) SET( APPLE 1 ) SET( UNIX ) endif() find_package( ${ARGN} ) SET( WIN32 ) SET( APPLE ) SET( UNIX 1 ) set( CMAKE_FIND_ROOT_PATH_MODE_PROGRAM BOTH ) set( CMAKE_FIND_ROOT_PATH_MODE_LIBRARY BOTH ) set( CMAKE_FIND_ROOT_PATH_MODE_INCLUDE BOTH ) endmacro() # macro to find programs on the host OS macro( find_host_program ) set( CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER ) set( CMAKE_FIND_ROOT_PATH_MODE_LIBRARY NEVER ) set( CMAKE_FIND_ROOT_PATH_MODE_INCLUDE NEVER ) if( CMAKE_HOST_WIN32 ) SET( WIN32 1 ) SET( UNIX ) elseif( CMAKE_HOST_APPLE ) SET( APPLE 1 ) SET( UNIX ) endif() find_program( ${ARGN} ) SET( WIN32 ) SET( APPLE ) SET( UNIX 1 ) set( CMAKE_FIND_ROOT_PATH_MODE_PROGRAM BOTH ) set( CMAKE_FIND_ROOT_PATH_MODE_LIBRARY BOTH ) set( CMAKE_FIND_ROOT_PATH_MODE_INCLUDE BOTH ) endmacro() endif(ANDROID) if(NOT COMMAND find_host_package) macro(find_host_package) find_package(${ARGN}) endmacro() endif() if(NOT COMMAND find_host_program) macro(find_host_program) find_program(${ARGN}) endmacro() endif()