CMakeFindPackageMode.cmake 6.1 KB

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