1#------------------------------------------------------------------- 2# This file is part of the CMake build system for OGRE 3# (Object-oriented Graphics Rendering Engine) 4# For the latest info, see http://www.ogre3d.org/ 5# 6# The contents of this file are placed in the public domain. Feel 7# free to make use of it in any way you like. 8#------------------------------------------------------------------- 9 10################################################################## 11# Provides some common functionality for the FindPackage modules 12################################################################## 13 14# Begin processing of package 15macro(findpkg_begin PREFIX) 16 if (NOT ${PREFIX}_FIND_QUIETLY) 17 message(STATUS "Looking for ${PREFIX}...") 18 endif () 19endmacro(findpkg_begin) 20 21# Display a status message unless FIND_QUIETLY is set 22macro(pkg_message PREFIX) 23 if (NOT ${PREFIX}_FIND_QUIETLY) 24 message(STATUS ${ARGN}) 25 endif () 26endmacro(pkg_message) 27 28# Get environment variable, define it as ENV_$var and make sure backslashes are converted to forward slashes 29macro(getenv_path VAR) 30 set(ENV_${VAR} $ENV{${VAR}}) 31 # replace won't work if var is blank 32 if (ENV_${VAR}) 33 string( REGEX REPLACE "\\\\" "/" ENV_${VAR} ${ENV_${VAR}} ) 34 endif () 35endmacro(getenv_path) 36 37# Construct search paths for includes and libraries from a PREFIX_PATH 38macro(create_search_paths PREFIX) 39 foreach(dir ${${PREFIX}_PREFIX_PATH}) 40 set(${PREFIX}_INC_SEARCH_PATH ${${PREFIX}_INC_SEARCH_PATH} 41 ${dir}/include ${dir}/Include ${dir}/include/${PREFIX} ${dir}/Headers) 42 set(${PREFIX}_LIB_SEARCH_PATH ${${PREFIX}_LIB_SEARCH_PATH} 43 ${dir}/lib ${dir}/Lib ${dir}/lib/${PREFIX} ${dir}/Libs) 44 set(${PREFIX}_BIN_SEARCH_PATH ${${PREFIX}_BIN_SEARCH_PATH} 45 ${dir}/bin) 46 endforeach(dir) 47 if(ANDROID) 48 set(${PREFIX}_LIB_SEARCH_PATH ${${PREFIX}_LIB_SEARCH_PATH} ${OGRE_DEPENDENCIES_DIR}/lib/${ANDROID_ABI}) 49 endif() 50 set(${PREFIX}_FRAMEWORK_SEARCH_PATH ${${PREFIX}_PREFIX_PATH}) 51endmacro(create_search_paths) 52 53# clear cache variables if a certain variable changed 54macro(clear_if_changed TESTVAR) 55 # test against internal check variable 56 # HACK: Apparently, adding a variable to the cache cleans up the list 57 # a bit. We need to also remove any empty strings from the list, but 58 # at the same time ensure that we are actually dealing with a list. 59 list(APPEND ${TESTVAR} "") 60 list(REMOVE_ITEM ${TESTVAR} "") 61 if (NOT "${${TESTVAR}}" STREQUAL "${${TESTVAR}_INT_CHECK}") 62 message(STATUS "${TESTVAR} changed.") 63 foreach(var ${ARGN}) 64 set(${var} "NOTFOUND" CACHE STRING "x" FORCE) 65 endforeach(var) 66 endif () 67 set(${TESTVAR}_INT_CHECK ${${TESTVAR}} CACHE INTERNAL "x" FORCE) 68endmacro(clear_if_changed) 69 70# Try to get some hints from pkg-config, if available 71macro(use_pkgconfig PREFIX PKGNAME) 72 if(NOT ANDROID) 73 find_package(PkgConfig) 74 if (PKG_CONFIG_FOUND) 75 pkg_check_modules(${PREFIX} ${PKGNAME}) 76 endif () 77 endif() 78endmacro (use_pkgconfig) 79 80# Couple a set of release AND debug libraries (or frameworks) 81macro(make_library_set PREFIX) 82 if (${PREFIX}_FWK) 83 set(${PREFIX} ${${PREFIX}_FWK}) 84 elseif (${PREFIX}_REL AND ${PREFIX}_DBG) 85 set(${PREFIX} optimized ${${PREFIX}_REL} debug ${${PREFIX}_DBG}) 86 elseif (${PREFIX}_REL) 87 set(${PREFIX} ${${PREFIX}_REL}) 88 elseif (${PREFIX}_DBG) 89 set(${PREFIX} ${${PREFIX}_DBG}) 90 endif () 91endmacro(make_library_set) 92 93# Generate debug names from given release names 94macro(get_debug_names PREFIX) 95 foreach(i ${${PREFIX}}) 96 set(${PREFIX}_DBG ${${PREFIX}_DBG} ${i}d ${i}D ${i}_d ${i}_D ${i}_debug ${i}) 97 endforeach(i) 98endmacro(get_debug_names) 99 100# Add the parent dir from DIR to VAR 101macro(add_parent_dir VAR DIR) 102 get_filename_component(${DIR}_TEMP "${${DIR}}/.." ABSOLUTE) 103 set(${VAR} ${${VAR}} ${${DIR}_TEMP}) 104endmacro(add_parent_dir) 105 106# Do the final processing for the package find. 107macro(findpkg_finish PREFIX) 108 # skip if already processed during this run 109 if (NOT ${PREFIX}_FOUND) 110 if (${PREFIX}_INCLUDE_DIR AND ${PREFIX}_LIBRARY) 111 set(${PREFIX}_FOUND TRUE) 112 set(${PREFIX}_INCLUDE_DIRS ${${PREFIX}_INCLUDE_DIR}) 113 set(${PREFIX}_LIBRARIES ${${PREFIX}_LIBRARY}) 114 if (NOT ${PREFIX}_FIND_QUIETLY) 115 message(STATUS "Found ${PREFIX}: ${${PREFIX}_LIBRARIES}") 116 endif () 117 else () 118 if (NOT ${PREFIX}_FIND_QUIETLY) 119 message(STATUS "Could not locate ${PREFIX}") 120 endif () 121 if (${PREFIX}_FIND_REQUIRED) 122 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.") 123 endif () 124 endif () 125 126 mark_as_advanced(${PREFIX}_INCLUDE_DIR ${PREFIX}_LIBRARY ${PREFIX}_LIBRARY_REL ${PREFIX}_LIBRARY_DBG ${PREFIX}_LIBRARY_FWK) 127 endif () 128endmacro(findpkg_finish) 129 130 131# Slightly customised framework finder 132macro(findpkg_framework fwk) 133 if(APPLE) 134 set(${fwk}_FRAMEWORK_PATH 135 ${${fwk}_FRAMEWORK_SEARCH_PATH} 136 ${CMAKE_FRAMEWORK_PATH} 137 ~/Library/Frameworks 138 /Library/Frameworks 139 /System/Library/Frameworks 140 /Network/Library/Frameworks 141 ${CMAKE_CURRENT_SOURCE_DIR}/lib/macosx/Release 142 ${CMAKE_CURRENT_SOURCE_DIR}/lib/macosx/Debug 143 ) 144 # These could be arrays of paths, add each individually to the search paths 145 foreach(i ${OGRE_PREFIX_PATH}) 146 set(${fwk}_FRAMEWORK_PATH ${${fwk}_FRAMEWORK_PATH} ${i}/lib/macosx/Release ${i}/lib/macosx/Debug) 147 endforeach(i) 148 149 foreach(i ${OGRE_PREFIX_BUILD}) 150 set(${fwk}_FRAMEWORK_PATH ${${fwk}_FRAMEWORK_PATH} ${i}/lib/macosx/Release ${i}/lib/macosx/Debug) 151 endforeach(i) 152 153 foreach(dir ${${fwk}_FRAMEWORK_PATH}) 154 set(fwkpath ${dir}/${fwk}.framework) 155 if(EXISTS ${fwkpath}) 156 set(${fwk}_FRAMEWORK_INCLUDES ${${fwk}_FRAMEWORK_INCLUDES} 157 ${fwkpath}/Headers ${fwkpath}/PrivateHeaders) 158 set(${fwk}_FRAMEWORK_PATH ${dir}) 159 if (NOT ${fwk}_LIBRARY_FWK) 160 set(${fwk}_LIBRARY_FWK "-framework ${fwk}") 161 endif () 162 endif(EXISTS ${fwkpath}) 163 endforeach(dir) 164 endif(APPLE) 165endmacro(findpkg_framework) 166