1 cmake_minimum_required (VERSION 2.6)
2 project(FindPackageTest)
4 # Protect tests from running inside the default install prefix.
5 set(CMAKE_INSTALL_PREFIX "${CMAKE_CURRENT_BINARY_DIR}/NotDefaultPrefix")
7 list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR})
9 # Look for a package which uses FindPackageHandleStandardArgs.cmake with the
10 # new (as of cmake 2.8.3) syntax. This works only if CMP0017 is set to NEW,
11 # because otherwise FindPackageHandleStandardArgs.cmake from the current
12 # directory is included (via CMAKE_MODULE_PATH).
13 cmake_policy(SET CMP0017 NEW)
14 find_package(ZLIB QUIET)
16 # Look for a package that has a find module and may be found.
17 find_package(OpenGL QUIET)
19 # Look for a package that has no find module and will not be found.
20 find_package(NotAPackage QUIET)
22 # Look for a package that has an advanced find module.
23 find_package(Boost QUIET)
25 add_executable(FindPackageTest FindPackageTest.cxx)
27 # test behavior of cmFindBase wrt. the CMAKE_PREFIX_PATH variable
28 # foo.h should be found in ${CMAKE_CURRENT_SOURCE_DIR}/include:
30 set(CMAKE_PREFIX_PATH /blub /blah "${CMAKE_CURRENT_SOURCE_DIR}")
31 find_path(FOO_DIR foo.h)
34 message(FATAL_ERROR "Did not find foo.h which is in ${CMAKE_CURRENT_SOURCE_DIR}/include
35 CMAKE_PREFIX_PATH = ${CMAKE_PREFIX_PATH}")
38 find_package(VersionTestA 1)
39 find_package(VersionTestB 1.2)
40 find_package(VersionTestC 1.2.3)
41 find_package(VersionTestD 1.2.3.4)
44 find_package(LotsOfComponents COMPONENTS AComp OPTIONAL_COMPONENTS BComp CComp)
45 if(NOT LOTSOFCOMPONENTS_FOUND)
46 message(SEND_ERROR "LotsOfComponents not found !")
49 find_package(SomePackage)
50 if(NOT SomePackage_FOUND)
51 message(SEND_ERROR "SomePackage not found !")
53 if(NOT SOMEPACKAGE_FOUND)
54 message(SEND_ERROR "SomePackage compatibility name SOMEPACKAGE_FOUND not set!")
57 find_package(UpperCasePackage)
58 if(NOT UpperCasePackage_FOUND)
59 message(SEND_ERROR "UpperCasePackage not found!")
61 if(NOT UPPERCASEPACKAGE_FOUND)
62 message(SEND_ERROR "SomePackage compatibility name SOMEPACKAGE_FOUND not set!")
65 #-----------------------------------------------------------------------------
66 # Test system package registry if possible.
67 set(CMakeTestSystemPackage "")
68 if(WIN32 AND NOT CYGWIN)
69 # Try writing a value to the system package registry.
70 set(_data "${FindPackageTest_SOURCE_DIR}/SystemPackage")
71 set(_key "HKLM\\Software\\Kitware\\CMake\\Packages\\CMakeTestSystemPackage")
72 set(_file "${FindPackageTest_BINARY_DIR}/CMakeTestSystemPackage.data")
73 file(WRITE ${_file} "${_data}\n")
75 COMMAND ${CMAKE_COMMAND} -E md5sum ${_file}
76 OUTPUT_VARIABLE _output ERROR_VARIABLE _error RESULT_VARIABLE _failed
77 OUTPUT_STRIP_TRAILING_WHITESPACE
79 string(REGEX REPLACE " .*" "" _value "${_output}")
80 if(NOT _failed AND _value)
82 COMMAND reg add "${_key}" /v "${_value}" /t REG_SZ /d "${_data}" /f
83 OUTPUT_VARIABLE _output ERROR_VARIABLE _output RESULT_VARIABLE _failed
86 # If the above worked, add the rest of the test and a rule to
89 message(STATUS "HKLM is writable: enabling CMakeTestSystemPackage")
90 set(CMakeTestSystemPackage_CLEANUP reg delete "${_key}" /v "${_value}" /f)
91 set(CMakeTestSystemPackage CMakeTestSystemPackage)
93 message(STATUS "HKLM is readonly: disabling CMakeTestSystemPackage")
97 #-----------------------------------------------------------------------------
99 #set(CMAKE_FIND_DEBUG_MODE 1)
101 # For purposes of the test wipe out previous find results.
103 foo Foo Bar Blub TFramework Tframework TApp Tapp Special
104 VersionedA VersionedB VersionedC VersionedD VersionedE
105 VersionedF VersionedG VersionedH
106 WrongA WrongB WrongC WrongD
108 RecursiveA RecursiveB RecursiveC
109 ArchA ArchB ArchC ArchD
111 SetFoundTRUE SetFoundFALSE
112 ${CMakeTestSystemPackage}
114 foreach(p ${PACKAGES})
115 set(${p}_DIR "" CACHE FILEPATH "Wipe out find results for testing." FORCE)
118 # Enable framework and bundle searching. Make sure bundles are found
119 # before unix-syle packages.
120 set(CMAKE_FIND_FRAMEWORK LAST)
121 set(CMAKE_FIND_APPBUNDLE FIRST)
123 # Set the wrong answer for a find to make sure it re-finds.
124 set(VersionedA_DIR ${CMAKE_CURRENT_SOURCE_DIR}/lib/cmake/zot-4.0)
126 # Test that CMAKE_IGNORE_PATH can ignore the purposely bad package
127 # files in the lib/cmake/zot-3.1 directory.
128 set(CMAKE_IGNORE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/lib/cmake/zot-3.1)
130 # Look for packages with new-style signatures.
131 find_package(foo NO_MODULE)
132 find_package(Foo CONFIGS FooConfig.cmake)
134 set(CMAKE_DISABLE_FIND_PACKAGE_Blub TRUE)
135 find_package(Blub NO_MODULE)
136 find_package(TFramework CONFIGS TFrameworkConfig.cmake)
137 find_package(Tframework)
139 find_package(Tapp CONFIGS tapp-config.cmake)
140 find_package(Special NAMES Suffix SuffixTest PATH_SUFFIXES test)
141 find_package(VersionedA 2 NAMES zot)
142 find_package(VersionedB 3.1 EXACT NAMES zot)
143 find_package(VersionedC 4.0 EXACT NAMES zot)
144 find_package(VersionedD 1.1 EXACT NAMES Baz)
145 find_package(VersionedE 1.2 EXACT NAMES Baz)
146 find_package(VersionedF 1.3 EXACT NAMES Baz)
147 find_package(VersionedG 2.0 EXACT NAMES Baz)
148 find_package(VersionedH 2.1 EXACT NAMES Baz)
151 # Test Config files which set Xyz_FOUND themselves:
152 find_package(SetFoundTRUE NO_MODULE)
153 find_package(SetFoundFALSE NO_MODULE)
155 # Test wrong initial path when result is present.
156 set(WrongA_DIR "${VersionedD_DIR}")
157 find_package(WrongA 1.2 EXACT NAMES Baz)
159 # Test wrong initial cache entry of UNINITIALIZED type when result is present.
160 set(WrongB_DIR "${VersionedD_DIR}" CACHE UNINITIALIZED "Wrong Value" FORCE)
161 get_property(type CACHE WrongB_DIR PROPERTY TYPE)
162 find_package(WrongB 1.2 EXACT NAMES Baz)
164 # Test wrong initial path when result is missing.
165 set(WrongC_DIR "${VersionedD_DIR}")
166 find_package(WrongC 1.4 EXACT QUIET NAMES Baz)
168 # Test wrong initial cache entry of UNINITIALIZED type when result is missing.
169 set(WrongD_DIR "${VersionedD_DIR}" CACHE UNINITIALIZED "Wrong Value" FORCE)
170 get_property(type CACHE WrongD_DIR PROPERTY TYPE)
171 find_package(WrongD 1.4 EXACT QUIET NAMES Baz)
173 # HINTS should override the system but PATHS should not
174 list(INSERT CMAKE_SYSTEM_PREFIX_PATH 0 "${CMAKE_CURRENT_SOURCE_DIR}/A")
175 find_package(wibbleA NAMES wibble PATHS B)
176 find_package(wibbleB NAMES wibble HINTS B)
178 # Look for package with recursive find-modules.
179 find_package(RecursiveA COMPONENTS A)
180 find_package(RecursiveB 2)
181 find_package(RecursiveC 3.1 EXACT)
183 # Test architecture-specific search directories.
184 set(CMAKE_LIBRARY_ARCHITECTURE arch)
185 find_package(ArchA NAMES Bar)
186 find_package(ArchB NAMES Foo CONFIGS FooConfig.cmake)
187 find_package(ArchC 3.1 EXACT NAMES zot)
188 find_package(ArchD 4.0 EXACT NAMES zot)
189 unset(CMAKE_LIBRARY_ARCHITECTURE)
191 # Test find_package() with CMAKE_FIND_PACKAGE_RESOLVE_SYMLINKS enabled
193 AND NOT MSYS # FIXME: This works on CYGWIN but not on MSYS
195 # Create ./symlink pointing back here.
196 execute_process(COMMAND ${CMAKE_COMMAND} -E create_symlink
197 . "${CMAKE_CURRENT_SOURCE_DIR}/symlink")
198 # Make find_package search through the symlink
199 set(CMAKE_PREFIX_PATH "${CMAKE_CURRENT_SOURCE_DIR}/symlink")
201 # First, test the default behavior where symlinks are preserved.
202 set(SetFoundResolved_DIR "")
203 find_package(SetFoundResolved)
204 # The result must preserve the /symlink/ path.
205 set(SetFoundResolved_EXPECTED "${CMAKE_CURRENT_SOURCE_DIR}/symlink/cmake")
206 if(NOT "${SetFoundResolved_DIR}" STREQUAL "${SetFoundResolved_EXPECTED}")
207 message(SEND_ERROR "SetFoundResolved_DIR set by find_package() is set to \"${SetFoundResolved_DIR}\" (expected \"${SetFoundResolved_EXPECTED}\")")
210 # This part of the test only works if there are no symlinks in our path.
211 get_filename_component(real_src_dir "${CMAKE_CURRENT_SOURCE_DIR}" REALPATH)
212 if(real_src_dir STREQUAL CMAKE_CURRENT_SOURCE_DIR)
213 # Resolve symlinks when finding the package.
214 set(CMAKE_FIND_PACKAGE_RESOLVE_SYMLINKS TRUE)
215 set(SetFoundResolved_DIR "")
216 find_package(SetFoundResolved)
217 # ./symlink points back here so it should be gone when resolved.
218 set(SetFoundResolved_EXPECTED "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
219 if(NOT "${SetFoundResolved_DIR}" STREQUAL "${SetFoundResolved_EXPECTED}")
220 message(SEND_ERROR "SetFoundResolved_DIR set by find_package() is set to \"${SetFoundResolved_DIR}\" (expected \"${SetFoundResolved_EXPECTED}\")")
225 unset(CMAKE_FIND_PACKAGE_RESOLVE_SYMLINKS)
226 file(REMOVE "${CMAKE_CURRENT_SOURCE_DIR}/symlink")
229 # Test <PackageName>_DIR environment variable.
230 # We erase the main prefix path to ensure the env var is used.
231 set(CMAKE_PREFIX_PATH)
232 set(ENV{EnvA_DIR} "${CMAKE_CURRENT_SOURCE_DIR}/lib/zot-3.1")
233 find_package(EnvA 3.1 EXACT QUIET NAMES zot) # Should Work
234 find_package(EnvB 3.1 EXACT QUIET NAMES zot) # Should Fail
236 # Test system package registry if available.
237 if(CMakeTestSystemPackage)
238 find_package(CMakeTestSystemPackage)
239 execute_process(COMMAND ${CMakeTestSystemPackage_CLEANUP}
240 OUTPUT_VARIABLE _output ERROR_VARIABLE _error)
243 # Expected locations at which packages should be found.
244 set(foo_EXPECTED "lib/foo-1.2/foo-config.cmake")
245 set(Foo_EXPECTED "lib/foo-1.2/CMake/FooConfig.cmake")
246 set(Bar_EXPECTED "lib/Bar/BarConfig.cmake")
248 set(Special_EXPECTED "lib/suffix/test/SuffixTestConfig.cmake")
249 set(TFramework_EXPECTED
250 "TFramework.framework/Versions/A/Resources/CMake/TFrameworkConfig.cmake")
251 set(Tframework_EXPECTED
252 "TFramework.framework/Versions/A/Resources/tframework-config.cmake")
254 "TApp.app/Contents/Resources/TAppConfig.cmake")
256 "TApp.app/Contents/Resources/cmake/tapp-config.cmake")
257 set(VersionedA_EXPECTED "lib/zot-2.0/zot-config.cmake")
258 set(VersionedB_EXPECTED "lib/zot-3.1/zot-config.cmake")
259 set(VersionedC_EXPECTED "lib/cmake/zot-4.0/zot-config.cmake")
260 set(VersionedD_EXPECTED "Baz 1.1/BazConfig.cmake")
261 set(VersionedE_EXPECTED "Baz 1.2/CMake/BazConfig.cmake")
262 set(VersionedF_EXPECTED "Baz 1.3/lib/cmake/Baz/BazConfig.cmake")
263 set(VersionedG_EXPECTED "Baz 2.0/share/Baz 2/BazConfig.cmake")
264 set(VersionedH_EXPECTED "Baz 2.1/lib/Baz 2/cmake/BazConfig.cmake")
265 set(WrongA_EXPECTED "${VersionedE_EXPECTED}")
266 set(WrongB_EXPECTED "${VersionedE_EXPECTED}")
267 set(WrongC_MISSING "WrongC_DIR-NOTFOUND")
268 set(WrongD_MISSING "WrongD_DIR-NOTFOUND")
269 set(wibbleA_EXPECTED "A/wibble-config.cmake")
270 set(wibbleB_EXPECTED "B/wibble-config.cmake")
271 set(RecursiveA_EXPECTED "lib/RecursiveA/recursivea-config.cmake")
272 set(RecursiveB_EXPECTED "lib/zot-2.0/zot-config.cmake")
273 set(RecursiveC_EXPECTED "lib/zot-3.1/zot-config.cmake")
274 set(ArchA_EXPECTED "lib/arch/Bar/BarConfig.cmake")
275 set(ArchB_EXPECTED "lib/arch/foo-1.2/CMake/FooConfig.cmake")
276 set(ArchC_EXPECTED "lib/arch/zot-3.1/zot-config.cmake")
277 set(ArchD_EXPECTED "lib/arch/cmake/zot-4.0/zot-config.cmake")
278 set(EnvA_EXPECTED "lib/zot-3.1/zot-config.cmake")
279 set(EnvB_MISSING "EnvB_DIR-NOTFOUND")
280 set(SetFoundTRUE_EXPECTED "cmake/SetFoundTRUEConfig.cmake")
281 set(SetFoundFALSE_MISSING "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
282 set(CMakeTestSystemPackage_EXPECTED "SystemPackage/CMakeTestSystemPackageConfig.cmake")
285 foreach(p ${PACKAGES})
286 if(DEFINED ${p}_MISSING)
287 # Check and report failure.
288 if(NOT "${${p}_DIR}" STREQUAL "${${p}_MISSING}")
290 "Package ${p} should have been [${${p}_MISSING}] but "
295 "Package ${p} should not have been found, but ${p}_FOUND is set to "
299 # Convert to relative path for comparison to expected location.
300 file(RELATIVE_PATH REL_${p}_CONFIG "${CMAKE_CURRENT_SOURCE_DIR}"
304 if(CMAKE_FIND_DEBUG_MODE)
305 message("Package ${p} found [${REL_${p}_CONFIG}]")
308 # Check and report failure.
309 if(NOT "${REL_${p}_CONFIG}" STREQUAL "${${p}_EXPECTED}")
311 "Package ${p} should have been [${${p}_EXPECTED}] but "
312 "was [${REL_${p}_CONFIG}]")
315 message(SEND_ERROR "Package ${p} not found!")
319 # Check that version information was extracted.
320 if(NOT "${VersionedA_VERSION}" STREQUAL "2.0")
322 "Package VersionedA is version [${VersionedA_VERSION}], not [2.0]")
324 if(NOT "${VersionedA_VERSION_MAJOR}" STREQUAL "2")
326 "Package VersionedA is major version [${VersionedA_VERSION_MAJOR}], not [2]")
328 if(NOT "${VersionedA_VERSION_MINOR}" STREQUAL "0")
330 "Package VersionedA is minor version [${VersionedA_VERSION_MINOR}], not [0]")
333 if(NOT "${VersionedB_VERSION}" STREQUAL "3.1")
335 "Package VersionedB is version [${VersionedB_VERSION}], not [3.1]")
337 if(NOT "${VersionedB_VERSION_MAJOR}" STREQUAL "3")
339 "Package VersionedB is major version [${VersionedB_VERSION_MAJOR}], not [3]")
341 if(NOT "${VersionedB_VERSION_MINOR}" STREQUAL "1")
343 "Package VersionedB is minor version [${VersionedB_VERSION_MINOR}], not [1]")
346 if(NOT "${Special_VERSION}" STREQUAL "1.2")
348 "Package Special is version [${Special_VERSION}], not [1.2]")
350 if(NOT "${Special_VERSION_MAJOR}" STREQUAL "1")
352 "Package Special is major version [${Special_VERSION_MAJOR}], not [1]")
354 if(NOT "${Special_VERSION_MINOR}" STREQUAL "2")
356 "Package Special is minor version [${Special_VERSION_MINOR}], not [2]")
359 # Test version number comparison.
360 if(NOT "1.2.3.4" VERSION_LESS "1.2.3.5")
361 message(SEND_ERROR "1.2.3.4 VERSION_LESS 1.2.3.5 is not true!")
363 if(NOT "1.2" VERSION_LESS "1.10")
364 message(SEND_ERROR "1.2 VERSION_LESS 1.10 is not true!")
366 if(NOT "1.02" VERSION_GREATER "1.1")
367 message(SEND_ERROR "1.02 VERSION_GREATER 1.1 is not true!")
369 if("1.2.3" VERSION_GREATER "1.2.3.4")
370 message(SEND_ERROR "1.2.3 VERSION_GREATER 1.2.3.4 is not false!")
372 if(NOT "1.2" VERSION_EQUAL "1.2.0.0")
373 message(SEND_ERROR "1.2 VERSION_EQUAL 1.2.0.0 is not true!")
376 #-----------------------------------------------------------------------------
377 # Test export(PACKAGE) with find_package.
379 # Choose a unique version.
380 string(REGEX REPLACE "-.*$" "" version ${CMAKE_VERSION})
381 string(RANDOM LENGTH 4 ALPHABET "0123456789" v)
382 string(APPEND version ".${v}")
384 message(STATUS "Preparing export(PACKAGE) test project")
385 try_compile(EXPORTER_COMPILED
386 ${FindPackageTest_BINARY_DIR}/Exporter-build
387 ${FindPackageTest_SOURCE_DIR}/Exporter
388 CMakeTestExportPackage dummy
389 CMAKE_FLAGS "-UCMAKE_EXPORT_NO_PACKAGE_REGISTRY"
390 "-DCMAKE_POLICY_DEFAULT_CMP0090:STRING=OLD"
392 OUTPUT_VARIABLE output)
393 message(STATUS "Searching for export(PACKAGE) test project")
394 set(CMakeTestExportPackage_DIR "" CACHE FILEPATH
395 "Wipe out find results for testing." FORCE)
397 message(STATUS "Searching for export(PACKAGE) with CMAKE_FIND_USE_PACKAGE_REGISTRY=TRUE")
398 set(CMAKE_FIND_USE_PACKAGE_REGISTRY TRUE)
399 find_package(CMakeTestExportPackage 1.${version} EXACT REQUIRED)
400 if(NOT CMakeTestExportPackage_FOUND)
401 message(SEND_ERROR "CMakeTestExportPackage should be FOUND!")
403 unset(CMAKE_FIND_USE_PACKAGE_REGISTRY)
405 message(STATUS "Searching for export(PACKAGE) with CMAKE_FIND_PACKAGE_NO_PACKAGE_REGISTRY=FALSE")
406 set(CMAKE_FIND_PACKAGE_NO_PACKAGE_REGISTRY FALSE)
407 find_package(CMakeTestExportPackage 1.${version} EXACT REQUIRED)
408 if(NOT CMakeTestExportPackage_FOUND)
409 message(SEND_ERROR "CMakeTestExportPackage should be FOUND!")
411 unset(CMAKE_FIND_PACKAGE_NO_PACKAGE_REGISTRY)
413 message(STATUS "Searching for export(PACKAGE) with CMAKE_FIND_USE_PACKAGE_REGISTRY=TRUE and CMAKE_FIND_PACKAGE_NO_PACKAGE_REGISTRY=TRUE")
414 set(CMAKE_FIND_USE_PACKAGE_REGISTRY TRUE)
415 set(CMAKE_FIND_PACKAGE_NO_PACKAGE_REGISTRY TRUE)
416 set(CMakeTestExportPackage_DIR FALSE)
417 find_package(CMakeTestExportPackage 1.${version} EXACT REQUIRED)
418 if(NOT CMakeTestExportPackage_FOUND)
419 message(SEND_ERROR "CMakeTestExportPackage should be FOUND!")
421 unset(CMAKE_FIND_USE_PACKAGE_REGISTRY)
422 unset(CMAKE_FIND_PACKAGE_NO_PACKAGE_REGISTRY)
424 message(STATUS "Searching for export(PACKAGE) with CMAKE_FIND_USE_PACKAGE_REGISTRY=FALSE and CMAKE_FIND_PACKAGE_NO_PACKAGE_REGISTRY=FALSE")
425 set(CMAKE_FIND_USE_PACKAGE_REGISTRY FALSE)
426 set(CMAKE_FIND_PACKAGE_NO_PACKAGE_REGISTRY FALSE)
427 set(CMakeTestExportPackage_DIR "" CACHE FILEPATH
428 "Wipe out find results for testing." FORCE)
429 find_package(CMakeTestExportPackage 1.${version} EXACT QUIET)
430 if(CMakeTestExportPackage_FOUND)
431 message(SEND_ERROR "CMakeTestExportPackage should be not FOUND!")
433 unset(CMAKE_FIND_USE_PACKAGE_REGISTRY)
434 unset(CMAKE_FIND_PACKAGE_NO_PACKAGE_REGISTRY)
436 message(STATUS "Remove export(PACKAGE) test project")
437 file(REMOVE_RECURSE ${FindPackageTest_BINARY_DIR}/Exporter-build)
438 set(CMakeTestExportPackage_DIR "" CACHE FILEPATH
439 "Wipe out find results for testing." FORCE)
440 find_package(CMakeTestExportPackage QUIET) # Should clean the user package cache
442 message(STATUS "Preparing export(PACKAGE) test project with CMAKE_EXPORT_NO_PACKAGE_REGISTRY=TRUE")
443 try_compile(EXPORTER_COMPILED
444 ${FindPackageTest_BINARY_DIR}/Exporter-build
445 ${FindPackageTest_SOURCE_DIR}/Exporter
446 CMakeTestExportPackage dummy
447 CMAKE_FLAGS "-DCMAKE_EXPORT_NO_PACKAGE_REGISTRY:BOOL=TRUE"
449 OUTPUT_VARIABLE output)
450 message(STATUS "Searching for export(PACKAGE) test project")
451 find_package(CMakeTestExportPackage 1.${version} EXACT QUIET)
452 if(CMakeTestExportPackage_FOUND)
453 message(SEND_ERROR "CMakeTestExportPackage should not be FOUND!")
456 message(STATUS "Remove export(PACKAGE) test project")
457 file(REMOVE_RECURSE ${FindPackageTest_BINARY_DIR}/Exporter-build)
459 message(STATUS "Preparing export(PACKAGE) test project with POLICY CMP0090=NEW")
460 try_compile(EXPORTER_COMPILED
461 ${FindPackageTest_BINARY_DIR}/Exporter-build
462 ${FindPackageTest_SOURCE_DIR}/Exporter
463 CMakeTestExportPackage dummy
465 "-DCMAKE_POLICY_DEFAULT_CMP0090:STRING=NEW"
467 OUTPUT_VARIABLE output)
468 message(STATUS "Searching for export(PACKAGE) test project")
469 find_package(CMakeTestExportPackage 1.${version} EXACT QUIET)
470 if(CMakeTestExportPackage_FOUND)
471 message(SEND_ERROR "CMakeTestExportPackage should not be FOUND!")
475 #-----------------------------------------------------------------------------
476 # Test configure_package_config_file().
478 include(CMakePackageConfigHelpers)
480 # Generate a config file ready to be installed.
481 set(INCLUDE_INSTALL_DIR include )
482 set(SHARE_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/share/" )
483 set(CURRENT_BUILD_DIR "${CMAKE_CURRENT_BINARY_DIR}" )
485 configure_package_config_file(RelocatableConfig.cmake.in "${CMAKE_CURRENT_BINARY_DIR}/RelocatableConfig.cmake"
486 INSTALL_DESTINATION "${CMAKE_INSTALL_PREFIX}"
487 PATH_VARS INCLUDE_INSTALL_DIR SHARE_INSTALL_DIR CURRENT_BUILD_DIR
490 set(Relocatable_FIND_COMPONENTS AComp BComp CComp)
491 set(Relocatable_FIND_REQUIRED_BComp 1)
492 include("${CMAKE_CURRENT_BINARY_DIR}/RelocatableConfig.cmake")
494 if(NOT "${RELOC_INCLUDE_DIR}" STREQUAL "${CMAKE_CURRENT_BINARY_DIR}/include")
495 message(SEND_ERROR "RELOC_INCLUDE_DIR set by configure_package_config_file() is set to \"${RELOC_INCLUDE_DIR}\" (expected \"${CMAKE_CURRENT_BINARY_DIR}/include\")")
498 if(NOT "${RELOC_SHARE_DIR}" STREQUAL "${CMAKE_CURRENT_BINARY_DIR}/share/")
499 message(SEND_ERROR "RELOC_SHARE_DIR set by configure_package_config_file() is set to \"${RELOC_SHARE_DIR}\" (expected \"${CMAKE_CURRENT_BINARY_DIR}/share/\")")
502 if(NOT "${RELOC_BUILD_DIR}" STREQUAL "${CMAKE_CURRENT_BINARY_DIR}")
503 message(SEND_ERROR "RELOC_BUILD_DIR set by configure_package_config_file() is set to \"${RELOC_BUILD_DIR}\" (expected \"${CMAKE_CURRENT_BINARY_DIR}\")")
506 if(NOT DEFINED Relocatable_FOUND)
507 message(SEND_ERROR "Relocatable_FOUND not defined !")
510 if(Relocatable_FOUND)
511 message(SEND_ERROR "Relocatable_FOUND set to TRUE !")
514 # Generate a config file for the build tree.
515 set(INCLUDE_INSTALL_DIR include )
516 set(SHARE_INSTALL_DIR "${CMAKE_CURRENT_BINARY_DIR}/share/" )
517 set(CURRENT_BUILD_DIR "${CMAKE_CURRENT_BINARY_DIR}" )
519 configure_package_config_file(RelocatableConfig.cmake.in "${CMAKE_CURRENT_BINARY_DIR}/RelocatableConfig.cmake"
520 INSTALL_DESTINATION "${CMAKE_CURRENT_BINARY_DIR}"
521 PATH_VARS INCLUDE_INSTALL_DIR SHARE_INSTALL_DIR CURRENT_BUILD_DIR
522 INSTALL_PREFIX "${CMAKE_CURRENT_BINARY_DIR}"
525 set(Relocatable_FIND_COMPONENTS AComp BComp CComp)
526 set(Relocatable_FIND_REQUIRED_BComp 1)
527 include("${CMAKE_CURRENT_BINARY_DIR}/RelocatableConfig.cmake")
529 if(NOT "${RELOC_INCLUDE_DIR}" STREQUAL "${CMAKE_CURRENT_BINARY_DIR}/include")
530 message(SEND_ERROR "RELOC_INCLUDE_DIR set by configure_package_config_file() is set to \"${RELOC_INCLUDE_DIR}\" (expected \"${CMAKE_CURRENT_BINARY_DIR}/include\")")
533 if(NOT "${RELOC_SHARE_DIR}" STREQUAL "${CMAKE_CURRENT_BINARY_DIR}/share/")
534 message(SEND_ERROR "RELOC_SHARE_DIR set by configure_package_config_file() is set to \"${RELOC_SHARE_DIR}\" (expected \"${CMAKE_CURRENT_BINARY_DIR}/share/\")")
537 if(NOT "${RELOC_BUILD_DIR}" STREQUAL "${CMAKE_CURRENT_BINARY_DIR}")
538 message(SEND_ERROR "RELOC_BUILD_DIR set by configure_package_config_file() is set to \"${RELOC_BUILD_DIR}\" (expected \"${CMAKE_CURRENT_BINARY_DIR}\")")
541 if(NOT DEFINED Relocatable_FOUND)
542 message(SEND_ERROR "Relocatable_FOUND not defined !")
545 if(Relocatable_FOUND)
546 message(SEND_ERROR "Relocatable_FOUND set to TRUE !")
550 ############################################################################
551 ##Test FIND_PACKAGE using sorting
552 set(CMAKE_PREFIX_PATH ${CMAKE_CURRENT_SOURCE_DIR})
553 SET(CMAKE_FIND_PACKAGE_SORT_ORDER NAME)
554 SET(CMAKE_FIND_PACKAGE_SORT_DIRECTION ASC)
556 set(SortLib_DIR "" CACHE FILEPATH "Wipe out find results for testing." FORCE)
557 FIND_PACKAGE(SortLib CONFIG)
558 IF (NOT "${SortLib_VERSION}" STREQUAL "3.1.1")
559 message(SEND_ERROR "FIND_PACKAGE_SORT_ORDER Name Asc! ${SortLib_VERSION}")
561 unset(SortLib_VERSION)
564 set(SortLib_DIR "" CACHE FILEPATH "Wipe out find results for testing." FORCE)
565 SET(CMAKE_FIND_PACKAGE_SORT_ORDER NATURAL)
566 SET(CMAKE_FIND_PACKAGE_SORT_DIRECTION DEC)
567 FIND_PACKAGE(SortLib CONFIG)
568 IF (NOT "${SortLib_VERSION}" STREQUAL "3.10.1")
569 message(SEND_ERROR "FIND_PACKAGE_SORT_ORDER Natural! Dec ${SortLib_VERSION}")
571 set(SortLib_DIR "" CACHE FILEPATH "Wipe out find results for testing." FORCE)
572 unset(SortLib_VERSION)
574 unset(CMAKE_FIND_PACKAGE_SORT_ORDER)
575 unset(CMAKE_FIND_PACKAGE_SORT_DIRECTION)
576 set(CMAKE_PREFIX_PATH )
578 ############################################################################
579 ##Test FIND_PACKAGE CMAKE_FIND_PACKAGE_PREFER_CONFIG
581 set(CMAKE_PREFIX_PATH ${CMAKE_CURRENT_SOURCE_DIR}/PreferConfig)
582 set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/PreferConfig)
585 set(CMAKE_FIND_PACKAGE_PREFER_CONFIG OFF)
591 message(SEND_ERROR "Did not find ABC package")
594 message(SEND_ERROR "Incorrectly found ABC in CONFIG mode, expected to find it with MODULE mode")
597 # Now prefer config mode
598 set(CMAKE_FIND_PACKAGE_PREFER_CONFIG ON)
604 message(SEND_ERROR "Did not find ABC package")
607 message(SEND_ERROR "Incorrectly found ABC in MODULE mode, expected to find it with CONFIG mode")
610 set(CMAKE_FIND_PACKAGE_PREFER_CONFIG OFF)
611 set(CMAKE_PREFIX_PATH)
612 set(CMAKE_MODULE_PATH)
614 ############################################################################
615 ##Test FIND_PACKAGE CMAKE_FIND_PACKAGE_PREFER_CONFIG - Do not recurse
617 # No CMAKE_PREFIX_PATH
618 set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/PreferConfigRecurse)
620 # Now prefer config mode
621 set(CMAKE_FIND_PACKAGE_PREFER_CONFIG ON)
626 if(ACME_FOUND AND ACME_CONFIG)
627 message(SEND_ERROR "Incorrectly found ACME in CONFIG mode, from the MODULE package")
630 set(CMAKE_FIND_PACKAGE_PREFER_CONFIG OFF)
631 set(CMAKE_MODULE_PATH)
633 ############################################################################
634 ##Test find_package CMAKE_FIND_PACKAGE_PREFER_CONFIG with module fallback
636 set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/PreferConfigOnlyModule)
638 set(CMAKE_FIND_PACKAGE_PREFER_CONFIG ON)
640 find_package(ACME REQUIRED)
643 message(SEND_ERROR "Did not find ACME package")
646 ############################################################################
647 ##Test find_package CMAKE_FIND_PACKAGE_PREFER_CONFIG with NO_MODULE
649 set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/PreferConfigOnlyModule)
651 set(CMAKE_FIND_PACKAGE_PREFER_CONFIG ON)
653 find_package(ACME NO_MODULE)
656 message(SEND_ERROR "Should not find ACME package")
659 ############################################################################
660 ##Test find_package CMAKE_FIND_PACKAGE_PREFER_CONFIG with unknown package
662 set(CMAKE_FIND_PACKAGE_PREFER_CONFIG ON)
663 find_package(DoesNotExist)