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