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/${PREFIX} ${dir}/Headers)
42    set(${PREFIX}_LIB_SEARCH_PATH ${${PREFIX}_LIB_SEARCH_PATH}
43      ${dir}/lib ${dir}/lib/${PREFIX} ${dir}/Libs)
44  endforeach(dir)
45  set(${PREFIX}_FRAMEWORK_SEARCH_PATH ${${PREFIX}_PREFIX_PATH})
46endmacro(create_search_paths)
47
48# clear cache variables if a certain variable changed
49macro(clear_if_changed TESTVAR)
50  # test against internal check variable
51  if (NOT "${${TESTVAR}}" STREQUAL "${${TESTVAR}_INT_CHECK}")
52    message(STATUS "${TESTVAR} changed.")
53    foreach(var ${ARGN})
54      set(${var} "NOTFOUND" CACHE STRING "x" FORCE)
55    endforeach(var)
56  endif ()
57  set(${TESTVAR}_INT_CHECK ${${TESTVAR}} CACHE INTERNAL "x" FORCE)
58endmacro(clear_if_changed)
59
60# Try to get some hints from pkg-config, if available
61macro(use_pkgconfig PREFIX PKGNAME)
62  find_package(PkgConfig)
63  if (PKG_CONFIG_FOUND)
64    pkg_check_modules(${PREFIX} ${PKGNAME})
65  endif ()
66endmacro (use_pkgconfig)
67
68# Couple a set of release AND debug libraries (or frameworks)
69macro(make_library_set PREFIX)
70  if (${PREFIX}_FWK)
71    set(${PREFIX} ${${PREFIX}_FWK})
72  elseif (${PREFIX}_REL AND ${PREFIX}_DBG)
73    set(${PREFIX} optimized ${${PREFIX}_REL} debug ${${PREFIX}_DBG})
74  elseif (${PREFIX}_REL)
75    set(${PREFIX} ${${PREFIX}_REL})
76  elseif (${PREFIX}_DBG)
77    set(${PREFIX} ${${PREFIX}_DBG})
78  endif ()
79endmacro(make_library_set)
80
81# Generate debug names from given release names
82macro(get_debug_names PREFIX)
83  foreach(i ${${PREFIX}})
84    set(${PREFIX}_DBG ${${PREFIX}_DBG} ${i}d ${i}D ${i}_d ${i}_D ${i}_debug ${i})
85  endforeach(i)
86endmacro(get_debug_names)
87
88# Add the parent dir from DIR to VAR
89macro(add_parent_dir VAR DIR)
90  get_filename_component(${DIR}_TEMP "${${DIR}}/.." ABSOLUTE)
91  set(${VAR} ${${VAR}} ${${DIR}_TEMP})
92endmacro(add_parent_dir)
93
94# Do the final processing for the package find.
95macro(findpkg_finish PREFIX)
96  # skip if already processed during this run
97  if (NOT ${PREFIX}_FOUND)
98    if (${PREFIX}_INCLUDE_DIR AND ${PREFIX}_LIBRARY)
99      set(${PREFIX}_FOUND TRUE)
100      set(${PREFIX}_INCLUDE_DIRS ${${PREFIX}_INCLUDE_DIR})
101      set(${PREFIX}_LIBRARIES ${${PREFIX}_LIBRARY})
102      if (NOT ${PREFIX}_FIND_QUIETLY)
103        message(STATUS "Found ${PREFIX}: ${${PREFIX}_LIBRARIES}")
104      endif ()
105    else ()
106      if (NOT ${PREFIX}_FIND_QUIETLY)
107        message(STATUS "Could not locate ${PREFIX}")
108      endif ()
109      if (${PREFIX}_FIND_REQUIRED)
110        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.")
111      endif ()
112    endif ()
113
114    mark_as_advanced(${PREFIX}_INCLUDE_DIR ${PREFIX}_LIBRARY ${PREFIX}_LIBRARY_REL ${PREFIX}_LIBRARY_DBG ${PREFIX}_LIBRARY_FWK)
115  endif ()
116endmacro(findpkg_finish)
117
118
119# Slightly customised framework finder
120MACRO(findpkg_framework fwk)
121  IF(APPLE)
122    SET(${fwk}_FRAMEWORK_PATH
123      ${${fwk}_FRAMEWORK_SEARCH_PATH}
124      ${CMAKE_FRAMEWORK_PATH}
125      ~/Library/Frameworks
126      /Library/Frameworks
127      /System/Library/Frameworks
128      /Network/Library/Frameworks
129      /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.0.sdk/System/Library/Frameworks/
130      /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.0.sdk/System/Library/Frameworks/
131    )
132    FOREACH(dir ${${fwk}_FRAMEWORK_PATH})
133      SET(fwkpath ${dir}/${fwk}.framework)
134      IF(EXISTS ${fwkpath})
135        SET(${fwk}_FRAMEWORK_INCLUDES ${${fwk}_FRAMEWORK_INCLUDES}
136          ${fwkpath}/Headers ${fwkpath}/PrivateHeaders)
137        if (NOT ${fwk}_LIBRARY_FWK)
138          SET(${fwk}_LIBRARY_FWK "-framework ${fwk}")
139        endif ()
140      ENDIF(EXISTS ${fwkpath})
141    ENDFOREACH(dir)
142  ENDIF(APPLE)
143ENDMACRO(findpkg_framework)
144