CMakeLists.txt 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334
  1. cmake_minimum_required(VERSION 3.31)
  2. project(FindPackageCpsTest)
  3. set(CMAKE_EXPERIMENTAL_FIND_CPS_PACKAGES "e82e467b-f997-4464-8ace-b00808fff261")
  4. # Protect tests from running inside the default install prefix.
  5. set(CMAKE_INSTALL_PREFIX "${CMAKE_CURRENT_BINARY_DIR}/NotDefaultPrefix")
  6. # Use the test directory to Look for packages.
  7. set(CMAKE_PREFIX_PATH ${CMAKE_CURRENT_SOURCE_DIR})
  8. # Disable built-in search paths.
  9. set(CMAKE_FIND_USE_PACKAGE_ROOT_PATH OFF)
  10. set(CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH OFF)
  11. set(CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH OFF)
  12. set(CMAKE_FIND_USE_CMAKE_SYSTEM_PATH OFF)
  13. set(CMAKE_FIND_USE_INSTALL_PREFIX OFF)
  14. # Enable framework searching.
  15. set(CMAKE_FIND_FRAMEWORK FIRST)
  16. add_executable(FindPackageCpsTest FindPackageTest.cxx)
  17. ###############################################################################
  18. function(expect PACKAGE VAR OP VALUE WHAT)
  19. if(NOT ${PACKAGE}_${VAR} ${OP} ${VALUE})
  20. message(SEND_ERROR "${PACKAGE} wrong ${WHAT} ${${PACKAGE}_${VAR}} !")
  21. endif()
  22. endfunction()
  23. function(test_version PACKAGE LITERAL COUNT MAJOR MINOR PATCH TWEAK)
  24. if(NOT ${PACKAGE}_FOUND)
  25. message(SEND_ERROR "${PACKAGE} not found !")
  26. else()
  27. expect(${PACKAGE} VERSION STREQUAL "${LITERAL}" "version")
  28. expect(${PACKAGE} VERSION_COUNT EQUAL ${COUNT} "version count")
  29. expect(${PACKAGE} VERSION_MAJOR EQUAL ${MAJOR} "major version")
  30. expect(${PACKAGE} VERSION_MINOR EQUAL ${MINOR} "minor version")
  31. expect(${PACKAGE} VERSION_PATCH EQUAL ${PATCH} "patch version")
  32. expect(${PACKAGE} VERSION_TWEAK EQUAL ${TWEAK} "tweak version")
  33. endif()
  34. endfunction()
  35. function(test_unparsed_version PACKAGE VERSION)
  36. find_package(${PACKAGE} CONFIG)
  37. test_version(${PACKAGE} "${VERSION}" 0 0 0 0 0)
  38. endfunction()
  39. ###############################################################################
  40. # Test a basic package search.
  41. # It should NOT find the package's CMake package file.
  42. find_package(Sample CONFIG)
  43. test_version(Sample "2.10.11" 3 2 10 11 0)
  44. ###############################################################################
  45. # Test some more complicated version parsing.
  46. find_package(LongVersion CONFIG)
  47. test_version(LongVersion "1.1.2.3.5.8+fibonacci" 6 1 1 2 3)
  48. find_package(EmptyMarker CONFIG)
  49. test_version(EmptyMarker "1.1+" 2 1 1 0 0)
  50. test_unparsed_version(BadVersion1 "1..1")
  51. test_unparsed_version(BadVersion2 "1.1a.0")
  52. test_unparsed_version(BadVersion3 "1.1.")
  53. test_unparsed_version(BadVersion4 "+42")
  54. test_unparsed_version(CustomVersion "VII")
  55. ###############################################################################
  56. # Test finding a package whose CPS file is in the package prefix root.
  57. set(RootTest_DIR "${CMAKE_CURRENT_SOURCE_DIR}/RootTest")
  58. find_package(RootTest)
  59. if(NOT RootTest_FOUND)
  60. message(SEND_ERROR "RootTest not found !")
  61. endif()
  62. ###############################################################################
  63. # Test glob sorting.
  64. foreach(CMAKE_FIND_PACKAGE_SORT_DIRECTION IN ITEMS "" ASC Bogus)
  65. set(SortLib_DIR "" CACHE FILEPATH "Wipe out find results for testing." FORCE)
  66. set(CMAKE_FIND_PACKAGE_SORT_ORDER NAME)
  67. find_package(SortLib CONFIG)
  68. if(NOT "${SortLib_VERSION}" STREQUAL "3.1.1")
  69. message(SEND_ERROR "FIND_PACKAGE_SORT_ORDER Name Asc! ${SortLib_VERSION}")
  70. endif()
  71. unset(SortLib_VERSION)
  72. endforeach()
  73. set(SortLib_DIR "" CACHE FILEPATH "Wipe out find results for testing." FORCE)
  74. set(CMAKE_FIND_PACKAGE_SORT_ORDER NATURAL)
  75. set(CMAKE_FIND_PACKAGE_SORT_DIRECTION DEC)
  76. find_package(SortLib CONFIG)
  77. if(NOT "${SortLib_VERSION}" STREQUAL "3.10.1")
  78. message(SEND_ERROR "FIND_PACKAGE_SORT_ORDER Natural! Dec ${SortLib_VERSION}")
  79. endif()
  80. set(SortLib_DIR "" CACHE FILEPATH "Wipe out find results for testing." FORCE)
  81. unset(SortLib_VERSION)
  82. set(SortLib_DIR "" CACHE FILEPATH "Wipe out find results for testing." FORCE)
  83. FIND_PACKAGE(SortLib 4.0 CONFIG)
  84. IF (NOT "${SortLib_VERSION}" STREQUAL "4.0.0")
  85. message(SEND_ERROR "FIND_PACKAGE_SORT_ORDER gave up too soon! ${SortLib_VERSION}")
  86. endif()
  87. unset(SortLib_VERSION)
  88. set(SortLib_DIR "" CACHE FILEPATH "Wipe out find results for testing." FORCE)
  89. # Expected to default to 'NATURAL' and 'DEC'
  90. unset(CMAKE_FIND_PACKAGE_SORT_ORDER)
  91. unset(CMAKE_FIND_PACKAGE_SORT_DIRECTION)
  92. FIND_PACKAGE(SortLib CONFIG)
  93. IF (NOT "${SortLib_VERSION}" STREQUAL "3.10.1")
  94. message(SEND_ERROR "FIND_PACKAGE_SORT_ORDER Default! ${SortLib_VERSION}")
  95. endif()
  96. unset(SortLib_VERSION)
  97. set(SortFramework_DIR "" CACHE FILEPATH "Wipe out find results for testing." FORCE)
  98. set(CMAKE_FIND_PACKAGE_SORT_ORDER NAME)
  99. set(CMAKE_FIND_PACKAGE_SORT_DIRECTION ASC)
  100. find_package(SortFramework CONFIG)
  101. if(NOT "${SortFramework_VERSION}" STREQUAL "3.1.1")
  102. message(SEND_ERROR "FIND_PACKAGE_SORT_ORDER Framework Name Asc! ${SortFramework_VERSION}")
  103. endif()
  104. set(SortLib_DIR "" CACHE FILEPATH "Wipe out find results for testing." FORCE)
  105. unset(SortFramework_VERSION)
  106. set(SortFramework_DIR "" CACHE FILEPATH "Wipe out find results for testing." FORCE)
  107. set(CMAKE_FIND_PACKAGE_SORT_ORDER NATURAL)
  108. set(CMAKE_FIND_PACKAGE_SORT_DIRECTION DEC)
  109. find_package(SortFramework CONFIG)
  110. if(NOT "${SortFramework_VERSION}" STREQUAL "3.10.1")
  111. message(SEND_ERROR "FIND_PACKAGE_SORT_ORDER Framework Natural! Dec ${SortFramework_VERSION}")
  112. endif()
  113. set(SortLib_DIR "" CACHE FILEPATH "Wipe out find results for testing." FORCE)
  114. unset(SortFramework_VERSION)
  115. unset(CMAKE_FIND_PACKAGE_SORT_ORDER)
  116. unset(CMAKE_FIND_PACKAGE_SORT_DIRECTION)
  117. ###############################################################################
  118. # Find a package that actually has some content.
  119. find_package(Foo CONFIG)
  120. if(NOT Foo_FOUND)
  121. message(SEND_ERROR "Foo not found !")
  122. elseif(NOT TARGET Foo::PrefixTest)
  123. message(SEND_ERROR "Foo::PrefixTest missing !")
  124. elseif(NOT TARGET Foo::RelativeTest)
  125. message(SEND_ERROR "Foo::RelativeTest missing !")
  126. elseif(NOT TARGET Foo::Empty)
  127. message(SEND_ERROR "Foo::Empty missing !")
  128. else()
  129. get_property(pt_includes
  130. TARGET Foo::PrefixTest PROPERTY INTERFACE_INCLUDE_DIRECTORIES_DEFAULT)
  131. if(NOT "${CMAKE_CURRENT_SOURCE_DIR}/include" PATH_EQUAL "${pt_includes}")
  132. message(SEND_ERROR "Foo::PrefixTest has wrong includes '${pt_includes}' !")
  133. endif()
  134. set(pt_includes)
  135. get_property(rt_includes
  136. TARGET Foo::RelativeTest PROPERTY INTERFACE_INCLUDE_DIRECTORIES_DEFAULT)
  137. if(NOT "${CMAKE_CURRENT_SOURCE_DIR}/cps/../include" PATH_EQUAL "${rt_includes}")
  138. message(SEND_ERROR "Foo::RelativeTest has wrong includes '${rt_includes}' !")
  139. endif()
  140. set(rt_includes)
  141. endif()
  142. ###############################################################################
  143. # Test importing of compile definitions.
  144. find_package(defs CONFIG REQUIRED)
  145. if(CMAKE_GENERATOR STREQUAL "Xcode" OR CMAKE_GENERATOR MATCHES "Visual Studio")
  146. # VS/Xcode generators cannot use different definitions within the same
  147. # target, so we must split the test into one target per language.
  148. add_library(defs-test-c STATIC defs-test-c.c)
  149. add_library(defs-test-cxx STATIC defs-test-cxx.cxx)
  150. target_link_libraries(defs-test-c defs::defs)
  151. target_link_libraries(defs-test-cxx defs::defs)
  152. else()
  153. add_library(defs-test STATIC defs-test-c.c defs-test-cxx.cxx)
  154. target_link_libraries(defs-test defs::defs)
  155. endif()
  156. ###############################################################################
  157. # Test importing and mangling of requirements (i.e. link libraries).
  158. find_package(RequiresTest CONFIG REQUIRED)
  159. add_library(requires-test STATIC requires-test.cxx)
  160. target_link_libraries(requires-test RequiresTest::Indirect)
  161. ###############################################################################
  162. # Test importing of (language-specific) include paths.
  163. include(CheckIncludeFile)
  164. include(CheckIncludeFileCXX)
  165. find_package(includes CONFIG REQUIRED)
  166. set(CMAKE_REQUIRED_LIBRARIES includes::default)
  167. check_include_file(cmincludetest/global.h C_GLOBAL_H)
  168. check_include_file(cmincludetest/cxxonly.h C_CXXONLY_H)
  169. check_include_file_cxx(cmincludetest/cxxonly.h CXX_CXXONLY_H)
  170. set(CMAKE_REQUIRED_LIBRARIES)
  171. if(NOT C_GLOBAL_H)
  172. message(SEND_ERROR "cmincludetest/global.h not found !")
  173. endif()
  174. if(NOT CXX_CXXONLY_H)
  175. message(SEND_ERROR "cmincludetest/cxxonly.h not found in C++ mode !")
  176. endif()
  177. if(C_CXXONLY_H)
  178. message(SEND_ERROR "cmincludetest/cxxonly.h unexpectedly found in C mode ?!")
  179. endif()
  180. ###############################################################################
  181. # Find a package that has dependencies.
  182. find_package(Bar)
  183. if(NOT Bar_FOUND)
  184. message(SEND_ERROR "Bar not found !")
  185. elseif(NOT Dep1_FOUND)
  186. message(SEND_ERROR "Bar's Dep1 not found !")
  187. elseif(NOT Dep2_FOUND)
  188. message(SEND_ERROR "Bar's Dep2 not found !")
  189. elseif(NOT Dep3_FOUND)
  190. message(SEND_ERROR "Bar's Dep3 not found !")
  191. elseif(NOT TARGET Dep1::Target)
  192. message(SEND_ERROR "Dep1::Target missing !")
  193. elseif(NOT TARGET Dep2::Target)
  194. message(SEND_ERROR "Dep2::Target missing !")
  195. elseif(NOT TARGET Dep3::Target)
  196. message(SEND_ERROR "Dep3::Target missing !")
  197. elseif(NOT TARGET Bar::Target1)
  198. message(SEND_ERROR "Bar::Target1 missing !")
  199. elseif(NOT TARGET Bar::Target2)
  200. message(SEND_ERROR "Bar::Target2 missing !")
  201. endif()
  202. ###############################################################################
  203. # Test requesting components from a package.
  204. find_package(ComponentTest
  205. COMPONENTS Target1 Target2
  206. OPTIONAL_COMPONENTS Target4 Target6)
  207. if(NOT ComponentTest_FOUND)
  208. message(SEND_ERROR "ComponentTest not found !")
  209. elseif(NOT TARGET ComponentTest::Target1)
  210. message(SEND_ERROR "ComponentTest::Target1 missing !")
  211. elseif(NOT TARGET ComponentTest::Target2)
  212. message(SEND_ERROR "ComponentTest::Target2 missing !")
  213. elseif(NOT TARGET ComponentTest::Target3)
  214. message(SEND_ERROR "ComponentTest::Target3 missing !")
  215. elseif(NOT TARGET ComponentTest::Target4)
  216. message(SEND_ERROR "ComponentTest::Target4 missing !")
  217. elseif(NOT TARGET ComponentTest::Target5)
  218. message(SEND_ERROR "ComponentTest::Target5 missing !")
  219. elseif(TARGET ComponentTest::Target6)
  220. message(SEND_ERROR "ComponentTest::Target6 exists ?!")
  221. elseif(TARGET ComponentTest::Target7)
  222. message(SEND_ERROR "ComponentTest::Target7 exists ?!")
  223. elseif(TARGET ComponentTest::Target8)
  224. message(SEND_ERROR "ComponentTest::Target8 exists ?!")
  225. endif()
  226. ###############################################################################
  227. # Test requesting components from a dependency.
  228. find_package(TransitiveTest)
  229. if(NOT TransitiveTest_FOUND)
  230. message(SEND_ERROR "TransitiveTest not found !")
  231. elseif(NOT TransitiveDep_FOUND)
  232. message(SEND_ERROR "TransitiveTest's TransitiveDep not found !")
  233. elseif(NOT TARGET TransitiveDep::Target1)
  234. message(SEND_ERROR "TransitiveDep::Target1 missing !")
  235. elseif(NOT TARGET TransitiveDep::Target2)
  236. message(SEND_ERROR "TransitiveDep::Target2 missing !")
  237. elseif(NOT TARGET TransitiveDep::Target3)
  238. message(SEND_ERROR "TransitiveDep::Target3 missing !")
  239. elseif(TARGET TransitiveDep::Target4)
  240. message(SEND_ERROR "TransitiveDep::Target4 exists ?!")
  241. elseif(TARGET TransitiveDep::Target5)
  242. message(SEND_ERROR "TransitiveDep::Target5 exists ?!")
  243. endif()
  244. ###############################################################################
  245. # Test finding a package more than once.
  246. find_package(Repeat REQUIRED OPTIONAL_COMPONENTS DoesNotExist)
  247. if(NOT TARGET Repeat::Base)
  248. message(SEND_ERROR "Repeat::Base missing !")
  249. elseif(TARGET Repeat::Extra)
  250. message(SEND_ERROR "Repeat::Extra exists ?!")
  251. endif()
  252. find_package(Repeat REQUIRED COMPONENTS Extra)
  253. if(NOT TARGET Repeat::Extra)
  254. message(SEND_ERROR "Repeat::Extra missing !")
  255. endif()
  256. ###############################################################################
  257. # Test default configurations.
  258. find_package(DefaultConfigurationsTest)
  259. if(NOT DefaultConfigurationsTest_FOUND)
  260. message(SEND_ERROR "DefaultConfigurationsTest not found !")
  261. elseif(NOT TARGET DefaultConfigurationsTest::Target1)
  262. message(SEND_ERROR "DefaultConfigurationsTest::Target1 missing !")
  263. elseif(NOT TARGET DefaultConfigurationsTest::Target2)
  264. message(SEND_ERROR "DefaultConfigurationsTest::Target2 missing !")
  265. else()
  266. get_property(dct1_configs
  267. TARGET DefaultConfigurationsTest::Target1 PROPERTY IMPORTED_CONFIGURATIONS)
  268. if(NOT "${dct1_configs}" STREQUAL "DEFAULT;TEST")
  269. message(SEND_ERROR "DefaultConfigurationsTest::Target1 has wrong configurations '${dct1_configs}' !")
  270. endif()
  271. get_property(dct2_configs
  272. TARGET DefaultConfigurationsTest::Target2 PROPERTY IMPORTED_CONFIGURATIONS)
  273. if(NOT "${dct2_configs}" STREQUAL "TEST")
  274. message(SEND_ERROR "DefaultConfigurationsTest::Target2 has wrong configurations '${dct2_configs}' !")
  275. endif()
  276. set(dct1_configs)
  277. set(dct2_configs)
  278. endif()