1# Distributed under the OSI-approved BSD 3-Clause License.  See accompanying
2# file Copyright.txt or https://cmake.org/licensing for details.
3
4#[=======================================================================[.rst:
5CMakeFindPackageMode
6--------------------
7
8
9
10This file is executed by cmake when invoked with --find-package.  It
11expects that the following variables are set using -D:
12
13``NAME``
14  name of the package
15``COMPILER_ID``
16  the CMake compiler ID for which the result is,
17  i.e. GNU/Intel/Clang/MSVC, etc.
18``LANGUAGE``
19  language for which the result will be used,
20  i.e. C/CXX/Fortran/ASM
21``MODE``
22  ``EXIST``
23    only check for existence of the given package
24  ``COMPILE``
25    print the flags needed for compiling an object file which uses
26    the given package
27  ``LINK``
28    print the flags needed for linking when using the given package
29``QUIET``
30  if TRUE, don't print anything
31#]=======================================================================]
32
33if(NOT NAME)
34  message(FATAL_ERROR "Name of the package to be searched not specified. Set the CMake variable NAME, e.g. -DNAME=JPEG .")
35endif()
36
37if(NOT COMPILER_ID)
38  message(FATAL_ERROR "COMPILER_ID argument not specified. In doubt, use GNU.")
39endif()
40
41if(NOT LANGUAGE)
42  message(FATAL_ERROR "LANGUAGE argument not specified. Use C, CXX or Fortran.")
43endif()
44
45if(NOT MODE)
46  message(FATAL_ERROR "MODE argument not specified. Use either EXIST, COMPILE or LINK.")
47endif()
48
49# require the current version. If we don't do this, Platforms/CYGWIN.cmake complains because
50# it doesn't know whether it should set WIN32 or not:
51cmake_minimum_required(VERSION ${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}.${CMAKE_PATCH_VERSION} )
52
53macro(ENABLE_LANGUAGE)
54  # disable the enable_language() command, otherwise --find-package breaks on Windows.
55  # On Windows, enable_language(RC) is called in the platform files unconditionally.
56  # But in --find-package mode, we don't want (and can't) enable any language.
57endmacro()
58
59set(CMAKE_PLATFORM_INFO_DIR ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY})
60
61include(CMakeDetermineSystem)
62
63# short-cut some tests on Darwin, see Darwin-GNU.cmake:
64if("${CMAKE_SYSTEM_NAME}" MATCHES Darwin  AND  "${COMPILER_ID}" MATCHES GNU)
65  set(CMAKE_${LANGUAGE}_SYSROOT_FLAG "")
66  set(CMAKE_${LANGUAGE}_OSX_DEPLOYMENT_TARGET_FLAG "")
67endif()
68
69include(CMakeSystemSpecificInitialize)
70
71# Also load the system specific file, which sets up e.g. the search paths.
72# This makes the FIND_XXX() calls work much better
73include(CMakeSystemSpecificInformation)
74
75if(UNIX)
76
77  # try to guess whether we have a 64bit system, if it has not been set
78  # from the outside
79  if(NOT CMAKE_SIZEOF_VOID_P)
80    set(CMAKE_SIZEOF_VOID_P 4)
81    if(EXISTS ${CMAKE_SYSROOT}/usr/lib64)
82      set(CMAKE_SIZEOF_VOID_P 8)
83    else()
84      # use the file utility to check whether itself is 64 bit:
85      find_program(FILE_EXECUTABLE file)
86      if(FILE_EXECUTABLE)
87        get_filename_component(FILE_ABSPATH "${FILE_EXECUTABLE}" ABSOLUTE)
88        execute_process(COMMAND "${FILE_ABSPATH}" "${FILE_ABSPATH}" OUTPUT_VARIABLE fileOutput ERROR_QUIET)
89        if("${fileOutput}" MATCHES "64-bit")
90          set(CMAKE_SIZEOF_VOID_P 8)
91        endif()
92      endif()
93    endif()
94  endif()
95
96  # guess Debian multiarch if it has not been set:
97  if(EXISTS /etc/debian_version)
98    if(NOT CMAKE_${LANGUAGE}_LIBRARY_ARCHITECTURE )
99      file(GLOB filesInLib RELATIVE /lib /lib/*-linux-gnu* )
100      foreach(file ${filesInLib})
101        if("${file}" MATCHES "${CMAKE_LIBRARY_ARCHITECTURE_REGEX}")
102          set(CMAKE_${LANGUAGE}_LIBRARY_ARCHITECTURE ${file})
103          break()
104        endif()
105      endforeach()
106    endif()
107    if(NOT CMAKE_LIBRARY_ARCHITECTURE)
108      set(CMAKE_LIBRARY_ARCHITECTURE ${CMAKE_${LANGUAGE}_LIBRARY_ARCHITECTURE})
109    endif()
110  endif()
111
112endif()
113
114set(CMAKE_${LANGUAGE}_COMPILER "dummy")
115set(CMAKE_${LANGUAGE}_COMPILER_ID "${COMPILER_ID}")
116include(CMake${LANGUAGE}Information)
117
118
119function(set_compile_flags_var _packageName)
120  string(TOUPPER "${_packageName}" PACKAGE_NAME)
121  # Check the following variables:
122  # FOO_INCLUDE_DIRS
123  # Foo_INCLUDE_DIRS
124  # FOO_INCLUDES
125  # Foo_INCLUDES
126  # FOO_INCLUDE_DIR
127  # Foo_INCLUDE_DIR
128  set(includes)
129  if(DEFINED ${_packageName}_INCLUDE_DIRS)
130    set(includes ${_packageName}_INCLUDE_DIRS)
131  elseif(DEFINED ${PACKAGE_NAME}_INCLUDE_DIRS)
132    set(includes ${PACKAGE_NAME}_INCLUDE_DIRS)
133  elseif(DEFINED ${_packageName}_INCLUDES)
134    set(includes ${_packageName}_INCLUDES)
135  elseif(DEFINED ${PACKAGE_NAME}_INCLUDES)
136    set(includes ${PACKAGE_NAME}_INCLUDES)
137  elseif(DEFINED ${_packageName}_INCLUDE_DIR)
138    set(includes ${_packageName}_INCLUDE_DIR)
139  elseif(DEFINED ${PACKAGE_NAME}_INCLUDE_DIR)
140    set(includes ${PACKAGE_NAME}_INCLUDE_DIR)
141  endif()
142
143  set(PACKAGE_INCLUDE_DIRS "${${includes}}" PARENT_SCOPE)
144
145  # Check the following variables:
146  # FOO_DEFINITIONS
147  # Foo_DEFINITIONS
148  set(definitions)
149  if(DEFINED ${_packageName}_DEFINITIONS)
150    set(definitions ${_packageName}_DEFINITIONS)
151  elseif(DEFINED ${PACKAGE_NAME}_DEFINITIONS)
152    set(definitions ${PACKAGE_NAME}_DEFINITIONS)
153  endif()
154
155  set(PACKAGE_DEFINITIONS  "${${definitions}}" )
156
157endfunction()
158
159
160function(set_link_flags_var _packageName)
161  string(TOUPPER "${_packageName}" PACKAGE_NAME)
162  # Check the following variables:
163  # FOO_LIBRARIES
164  # Foo_LIBRARIES
165  # FOO_LIBS
166  # Foo_LIBS
167  set(libs)
168  if(DEFINED ${_packageName}_LIBRARIES)
169    set(libs ${_packageName}_LIBRARIES)
170  elseif(DEFINED ${PACKAGE_NAME}_LIBRARIES)
171    set(libs ${PACKAGE_NAME}_LIBRARIES)
172  elseif(DEFINED ${_packageName}_LIBS)
173    set(libs ${_packageName}_LIBS)
174  elseif(DEFINED ${PACKAGE_NAME}_LIBS)
175    set(libs ${PACKAGE_NAME}_LIBS)
176  endif()
177
178  set(PACKAGE_LIBRARIES "${${libs}}" PARENT_SCOPE )
179
180endfunction()
181
182
183find_package("${NAME}" QUIET)
184
185set(PACKAGE_FOUND FALSE)
186
187string(TOUPPER "${NAME}" UPPERCASE_NAME)
188
189if(${NAME}_FOUND  OR  ${UPPERCASE_NAME}_FOUND)
190  set(PACKAGE_FOUND TRUE)
191
192  if("${MODE}" STREQUAL "EXIST")
193    # do nothing
194  elseif("${MODE}" STREQUAL "COMPILE")
195    set_compile_flags_var(${NAME})
196  elseif("${MODE}" STREQUAL "LINK")
197    set_link_flags_var(${NAME})
198  else()
199    message(FATAL_ERROR "Invalid mode argument ${MODE} given.")
200  endif()
201
202endif()
203
204set(PACKAGE_QUIET ${SILENT} )
205