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