Imported Upstream version 3.25.0
[platform/upstream/cmake.git] / Tests / FindPackageTest / CMakeLists.txt
1 cmake_minimum_required (VERSION 2.6)
2 project(FindPackageTest)
3
4 # Protect tests from running inside the default install prefix.
5 set(CMAKE_INSTALL_PREFIX "${CMAKE_CURRENT_BINARY_DIR}/NotDefaultPrefix")
6
7 list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR})
8
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)
15
16 # Look for a package that has a find module and may be found.
17 find_package(OpenGL QUIET)
18
19 # Look for a package that has no find module and will not be found.
20 find_package(NotAPackage QUIET)
21
22 # Look for a package that has an advanced find module.
23 find_package(Boost QUIET)
24
25 add_executable(FindPackageTest FindPackageTest.cxx)
26
27 # test behavior of cmFindBase wrt. the CMAKE_PREFIX_PATH variable
28 # foo.h should be found in ${CMAKE_CURRENT_SOURCE_DIR}/include:
29
30 set(CMAKE_PREFIX_PATH /blub /blah "${CMAKE_CURRENT_SOURCE_DIR}")
31 find_path(FOO_DIR foo.h)
32
33 if(NOT FOO_DIR)
34   message(FATAL_ERROR "Did not find foo.h which is in ${CMAKE_CURRENT_SOURCE_DIR}/include
35   CMAKE_PREFIX_PATH = ${CMAKE_PREFIX_PATH}")
36 endif()
37
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)
42
43
44 find_package(LotsOfComponents COMPONENTS AComp OPTIONAL_COMPONENTS BComp CComp)
45 if(NOT LOTSOFCOMPONENTS_FOUND)
46   message(SEND_ERROR "LotsOfComponents not found !")
47 endif()
48
49 find_package(SomePackage)
50 if(NOT SomePackage_FOUND)
51   message(SEND_ERROR "SomePackage not found !")
52 endif()
53 if(NOT SOMEPACKAGE_FOUND)
54   message(SEND_ERROR "SomePackage compatibility name SOMEPACKAGE_FOUND not set!")
55 endif()
56
57 find_package(UpperCasePackage)
58 if(NOT UpperCasePackage_FOUND)
59   message(SEND_ERROR "UpperCasePackage not found!")
60 endif()
61 if(NOT UPPERCASEPACKAGE_FOUND)
62   message(SEND_ERROR "SomePackage compatibility name SOMEPACKAGE_FOUND not set!")
63 endif()
64
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")
74   execute_process(
75     COMMAND ${CMAKE_COMMAND} -E md5sum ${_file}
76     OUTPUT_VARIABLE _output ERROR_VARIABLE _error RESULT_VARIABLE _failed
77     OUTPUT_STRIP_TRAILING_WHITESPACE
78     )
79   string(REGEX REPLACE " .*" "" _value "${_output}")
80   if(NOT _failed AND _value)
81     execute_process(
82       COMMAND reg add "${_key}" /v "${_value}" /t REG_SZ /d "${_data}" /f
83       OUTPUT_VARIABLE _output ERROR_VARIABLE _output RESULT_VARIABLE _failed
84       )
85   endif()
86   # If the above worked, add the rest of the test and a rule to
87   # cleanup the value.
88   if(NOT _failed)
89     message(STATUS "HKLM is writable: enabling CMakeTestSystemPackage")
90     set(CMakeTestSystemPackage_CLEANUP reg delete "${_key}" /v "${_value}" /f)
91     set(CMakeTestSystemPackage CMakeTestSystemPackage)
92   else()
93     message(STATUS "HKLM is readonly: disabling CMakeTestSystemPackage")
94   endif()
95 endif()
96
97 #-----------------------------------------------------------------------------
98
99 #set(CMAKE_FIND_DEBUG_MODE 1)
100
101 # For purposes of the test wipe out previous find results.
102 set(PACKAGES
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
107   wibbleA wibbleB
108   RecursiveA RecursiveB RecursiveC
109   ArchA ArchB ArchC ArchD
110   EnvA EnvB
111   SetFoundTRUE SetFoundFALSE
112   ${CMakeTestSystemPackage}
113   )
114 foreach(p ${PACKAGES})
115   set(${p}_DIR "" CACHE FILEPATH "Wipe out find results for testing." FORCE)
116 endforeach()
117
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)
122
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)
125
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)
129
130 # Look for packages with new-style signatures.
131 find_package(foo NO_MODULE)
132 find_package(Foo CONFIGS FooConfig.cmake)
133 find_package(Bar)
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)
138 find_package(TApp)
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)
149
150
151 # Test Config files which set Xyz_FOUND themselves:
152 find_package(SetFoundTRUE NO_MODULE)
153 find_package(SetFoundFALSE NO_MODULE)
154
155 # Test wrong initial path when result is present.
156 set(WrongA_DIR "${VersionedD_DIR}")
157 find_package(WrongA 1.2 EXACT NAMES Baz)
158
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)
163
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)
167
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)
172
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)
177
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)
182
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)
190
191 # Test find_package() with CMAKE_FIND_PACKAGE_RESOLVE_SYMLINKS enabled
192 if(UNIX
193     AND NOT MSYS # FIXME: This works on CYGWIN but not on MSYS
194     )
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")
200
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}\")")
208   endif()
209
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}\")")
221     endif()
222   endif()
223
224   # Cleanup.
225   unset(CMAKE_FIND_PACKAGE_RESOLVE_SYMLINKS)
226   file(REMOVE "${CMAKE_CURRENT_SOURCE_DIR}/symlink")
227 endif()
228
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
235
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)
241 endif()
242
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")
247 set(Blub_MISSING "")
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")
253 set(TApp_EXPECTED
254   "TApp.app/Contents/Resources/TAppConfig.cmake")
255 set(Tapp_EXPECTED
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")
283
284 # Check the results.
285 foreach(p ${PACKAGES})
286   if(DEFINED ${p}_MISSING)
287     # Check and report failure.
288     if(NOT "${${p}_DIR}" STREQUAL "${${p}_MISSING}")
289       message(SEND_ERROR
290         "Package ${p} should have been [${${p}_MISSING}] but "
291         "was [${${p}_DIR}]")
292     endif()
293     if(${p}_FOUND)
294       message(SEND_ERROR
295         "Package ${p} should not have been found, but ${p}_FOUND is set to "
296         "\"${${p}_FOUND}\"")
297     endif()
298   elseif(${p}_FOUND)
299     # Convert to relative path for comparison to expected location.
300     file(RELATIVE_PATH REL_${p}_CONFIG "${CMAKE_CURRENT_SOURCE_DIR}"
301       "${${p}_CONFIG}")
302
303     # Debugging output.
304     if(CMAKE_FIND_DEBUG_MODE)
305       message("Package ${p} found [${REL_${p}_CONFIG}]")
306     endif()
307
308     # Check and report failure.
309     if(NOT "${REL_${p}_CONFIG}" STREQUAL "${${p}_EXPECTED}")
310       message(SEND_ERROR
311         "Package ${p} should have been [${${p}_EXPECTED}] but "
312         "was [${REL_${p}_CONFIG}]")
313     endif()
314   else()
315     message(SEND_ERROR "Package ${p} not found!")
316   endif()
317 endforeach()
318
319 # Check that version information was extracted.
320 if(NOT "${VersionedA_VERSION}" STREQUAL "2.0")
321   message(SEND_ERROR
322     "Package VersionedA is version [${VersionedA_VERSION}], not [2.0]")
323 endif()
324 if(NOT "${VersionedA_VERSION_MAJOR}" STREQUAL "2")
325   message(SEND_ERROR
326     "Package VersionedA is major version [${VersionedA_VERSION_MAJOR}], not [2]")
327 endif()
328 if(NOT "${VersionedA_VERSION_MINOR}" STREQUAL "0")
329   message(SEND_ERROR
330     "Package VersionedA is minor version [${VersionedA_VERSION_MINOR}], not [0]")
331 endif()
332
333 if(NOT "${VersionedB_VERSION}" STREQUAL "3.1")
334   message(SEND_ERROR
335     "Package VersionedB is version [${VersionedB_VERSION}], not [3.1]")
336 endif()
337 if(NOT "${VersionedB_VERSION_MAJOR}" STREQUAL "3")
338   message(SEND_ERROR
339     "Package VersionedB is major version [${VersionedB_VERSION_MAJOR}], not [3]")
340 endif()
341 if(NOT "${VersionedB_VERSION_MINOR}" STREQUAL "1")
342   message(SEND_ERROR
343     "Package VersionedB is minor version [${VersionedB_VERSION_MINOR}], not [1]")
344 endif()
345
346 if(NOT "${Special_VERSION}" STREQUAL "1.2")
347   message(SEND_ERROR
348     "Package Special is version [${Special_VERSION}], not [1.2]")
349 endif()
350 if(NOT "${Special_VERSION_MAJOR}" STREQUAL "1")
351   message(SEND_ERROR
352     "Package Special is major version [${Special_VERSION_MAJOR}], not [1]")
353 endif()
354 if(NOT "${Special_VERSION_MINOR}" STREQUAL "2")
355   message(SEND_ERROR
356     "Package Special is minor version [${Special_VERSION_MINOR}], not [2]")
357 endif()
358
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!")
362 endif()
363 if(NOT "1.2" VERSION_LESS "1.10")
364   message(SEND_ERROR "1.2 VERSION_LESS 1.10 is not true!")
365 endif()
366 if(NOT "1.02" VERSION_GREATER "1.1")
367   message(SEND_ERROR "1.02 VERSION_GREATER 1.1 is not true!")
368 endif()
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!")
371 endif()
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!")
374 endif()
375
376 #-----------------------------------------------------------------------------
377 # Test export(PACKAGE) with find_package.
378
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}")
383
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"
391     -Dversion=${version}
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)
396
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!")
402 endif()
403 unset(CMAKE_FIND_USE_PACKAGE_REGISTRY)
404
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!")
410 endif()
411 unset(CMAKE_FIND_PACKAGE_NO_PACKAGE_REGISTRY)
412
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!")
420 endif()
421 unset(CMAKE_FIND_USE_PACKAGE_REGISTRY)
422 unset(CMAKE_FIND_PACKAGE_NO_PACKAGE_REGISTRY)
423
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!")
432 endif()
433 unset(CMAKE_FIND_USE_PACKAGE_REGISTRY)
434 unset(CMAKE_FIND_PACKAGE_NO_PACKAGE_REGISTRY)
435
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
441 #
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"
448     -Dversion=${version}
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!")
454 endif()
455
456 message(STATUS "Remove export(PACKAGE) test project")
457 file(REMOVE_RECURSE ${FindPackageTest_BINARY_DIR}/Exporter-build)
458
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
464   CMAKE_FLAGS
465    "-DCMAKE_POLICY_DEFAULT_CMP0090:STRING=NEW"
466     -Dversion=${version}
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!")
472 endif()
473
474
475 #-----------------------------------------------------------------------------
476 # Test configure_package_config_file().
477
478 include(CMakePackageConfigHelpers)
479
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}" )
484
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
488                              )
489
490 set(Relocatable_FIND_COMPONENTS AComp BComp CComp)
491 set(Relocatable_FIND_REQUIRED_BComp 1)
492 include("${CMAKE_CURRENT_BINARY_DIR}/RelocatableConfig.cmake")
493
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\")")
496 endif()
497
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/\")")
500 endif()
501
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}\")")
504 endif()
505
506 if(NOT DEFINED Relocatable_FOUND)
507   message(SEND_ERROR "Relocatable_FOUND not defined !")
508 endif()
509
510 if(Relocatable_FOUND)
511   message(SEND_ERROR "Relocatable_FOUND set to TRUE !")
512 endif()
513
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}" )
518
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}"
523                              )
524
525 set(Relocatable_FIND_COMPONENTS AComp BComp CComp)
526 set(Relocatable_FIND_REQUIRED_BComp 1)
527 include("${CMAKE_CURRENT_BINARY_DIR}/RelocatableConfig.cmake")
528
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\")")
531 endif()
532
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/\")")
535 endif()
536
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}\")")
539 endif()
540
541 if(NOT DEFINED Relocatable_FOUND)
542   message(SEND_ERROR "Relocatable_FOUND not defined !")
543 endif()
544
545 if(Relocatable_FOUND)
546   message(SEND_ERROR "Relocatable_FOUND set to TRUE !")
547 endif()
548
549
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)
555
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}")
560 endif()
561 unset(SortLib_VERSION)
562
563
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}")
570 endif()
571 set(SortLib_DIR "" CACHE FILEPATH "Wipe out find results for testing." FORCE)
572 unset(SortLib_VERSION)
573
574 unset(CMAKE_FIND_PACKAGE_SORT_ORDER)
575 unset(CMAKE_FIND_PACKAGE_SORT_DIRECTION)
576 set(CMAKE_PREFIX_PATH )
577
578 ############################################################################
579 ##Test FIND_PACKAGE CMAKE_FIND_PACKAGE_PREFER_CONFIG
580
581 set(CMAKE_PREFIX_PATH ${CMAKE_CURRENT_SOURCE_DIR}/PreferConfig)
582 set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/PreferConfig)
583
584 # prefer module mode
585 set(CMAKE_FIND_PACKAGE_PREFER_CONFIG OFF)
586 unset(ABC_FOUND)
587 unset(ABC_CONFIG)
588
589 find_package(ABC)
590 if(NOT ABC_FOUND)
591     message(SEND_ERROR "Did not find ABC package")
592 endif()
593 if(ABC_CONFIG)
594     message(SEND_ERROR "Incorrectly found ABC in CONFIG mode, expected to find it with MODULE mode")
595 endif()
596
597 # Now prefer config mode
598 set(CMAKE_FIND_PACKAGE_PREFER_CONFIG ON)
599 unset(ABC_FOUND)
600 unset(ABC_CONFIG)
601
602 find_package(ABC)
603 if(NOT ABC_FOUND)
604     message(SEND_ERROR "Did not find ABC package")
605 endif()
606 if(NOT ABC_CONFIG)
607     message(SEND_ERROR "Incorrectly found ABC in MODULE mode, expected to find it with CONFIG mode")
608 endif()
609
610 set(CMAKE_FIND_PACKAGE_PREFER_CONFIG OFF)
611 set(CMAKE_PREFIX_PATH)
612 set(CMAKE_MODULE_PATH)
613
614 ############################################################################
615 ##Test FIND_PACKAGE CMAKE_FIND_PACKAGE_PREFER_CONFIG - Do not recurse
616
617 # No CMAKE_PREFIX_PATH
618 set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/PreferConfigRecurse)
619
620 # Now prefer config mode
621 set(CMAKE_FIND_PACKAGE_PREFER_CONFIG ON)
622 unset(ACME_FOUND)
623 unset(ACME_CONFIG)
624
625 find_package(ACME)
626 if(ACME_FOUND AND ACME_CONFIG)
627     message(SEND_ERROR "Incorrectly found ACME in CONFIG mode, from the MODULE package")
628 endif()
629
630 set(CMAKE_FIND_PACKAGE_PREFER_CONFIG OFF)
631 set(CMAKE_MODULE_PATH)
632
633 ############################################################################
634 ##Test find_package CMAKE_FIND_PACKAGE_PREFER_CONFIG with module fallback
635
636 set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/PreferConfigOnlyModule)
637
638 set(CMAKE_FIND_PACKAGE_PREFER_CONFIG ON)
639
640 find_package(ACME REQUIRED)
641
642 if(NOT ACME_FOUND)
643     message(SEND_ERROR "Did not find ACME package")
644 endif()
645
646 ############################################################################
647 ##Test find_package CMAKE_FIND_PACKAGE_PREFER_CONFIG with NO_MODULE
648
649 set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/PreferConfigOnlyModule)
650
651 set(CMAKE_FIND_PACKAGE_PREFER_CONFIG ON)
652
653 find_package(ACME NO_MODULE)
654
655 if(ACME_FOUND)
656     message(SEND_ERROR "Should not find ACME package")
657 endif()
658
659 ############################################################################
660 ##Test find_package CMAKE_FIND_PACKAGE_PREFER_CONFIG with unknown package
661
662 set(CMAKE_FIND_PACKAGE_PREFER_CONFIG ON)
663 find_package(DoesNotExist)