cmake_minimum_required ( VERSION 2.6 )
project ( FindPackageTest )
# Protect tests from running inside the default install prefix.
set ( CMAKE_INSTALL_PREFIX "${CMAKE_CURRENT_BINARY_DIR}/NotDefaultPrefix" )
list ( APPEND CMAKE_MODULE_PATH ${ CMAKE_CURRENT_SOURCE_DIR } )
# Look for a package which uses FindPackageHandleStandardArgs.cmake with the
# new (as of cmake 2.8.3) syntax. This works only if CMP0017 is set to NEW,
# because otherwise FindPackageHandleStandardArgs.cmake from the current
# directory is included (via CMAKE_MODULE_PATH).
cmake_policy ( SET CMP0017 NEW )
find_package ( ZLIB QUIET )
# Look for a package that has a find module and may be found.
find_package ( OpenGL QUIET )
# Look for a package that has no find module and will not be found.
find_package ( NotAPackage QUIET )
# Look for a package that has an advanced find module.
find_package ( VTK QUIET )
add_executable ( FindPackageTest FindPackageTest.cxx )
# test behaviour of cmFindBase wrt. the CMAKE_PREFIX_PATH variable
# foo.h should be found in ${CMAKE_CURRENT_SOURCE_DIR}/include:
set ( CMAKE_PREFIX_PATH /blub /blah "${CMAKE_CURRENT_SOURCE_DIR}" )
find_path ( FOO_DIR foo.h )
if ( NOT FOO_DIR )
message ( FATAL_ERROR " Did not find foo.h which is in ${ CMAKE_CURRENT_SOURCE_DIR } /include
C M A K E _ P R E F I X _ P A T H = $ { C M A K E _ P R E F I X _ P A T H } " )
endif ( )
find_package ( VersionTestA 1 )
find_package ( VersionTestB 1.2 )
find_package ( VersionTestC 1.2.3 )
find_package ( VersionTestD 1.2.3.4 )
find_package ( LotsOfComponents COMPONENTS AComp OPTIONAL_COMPONENTS BComp CComp )
if ( NOT LOTSOFCOMPONENTS_FOUND )
message ( SEND_ERROR "LotsOfComponents not found !" )
endif ( )
find_package ( SomePackage )
if ( NOT SomePackage_FOUND )
message ( SEND_ERROR "SomePackage not found !" )
endif ( )
if ( NOT SOMEPACKAGE_FOUND )
message ( SEND_ERROR "SomePackage compatibility name SOMEPACKAGE_FOUND not set!" )
endif ( )
find_package ( UpperCasePackage )
if ( NOT UpperCasePackage_FOUND )
message ( SEND_ERROR "UpperCasePackage not found!" )
endif ( )
if ( NOT UPPERCASEPACKAGE_FOUND )
message ( SEND_ERROR "SomePackage compatibility name SOMEPACKAGE_FOUND not set!" )
endif ( )
#-----------------------------------------------------------------------------
# Test system package registry if possible.
set ( CMakeTestSystemPackage "" )
if ( WIN32 AND NOT CYGWIN )
# Try writing a value to the system package registry.
set ( _data "${FindPackageTest_SOURCE_DIR}/SystemPackage" )
set ( _key "HKLM\\Software\\Kitware\\CMake\\Packages\\CMakeTestSystemPackage" )
set ( _file "${FindPackageTest_BINARY_DIR}/CMakeTestSystemPackage.data" )
file ( WRITE ${ _file } "${_data}\n" )
execute_process (
C O M M A N D $ { C M A K E _ C O M M A N D } - E m d 5 s u m $ { _ f i l e }
O U T P U T _ V A R I A B L E _ o u t p u t E R R O R _ V A R I A B L E _ e r r o r R E S U L T _ V A R I A B L E _ f a i l e d
O U T P U T _ S T R I P _ T R A I L I N G _ W H I T E S P A C E
)
string ( REGEX REPLACE " .*" "" _value "${_output}" )
if ( NOT _failed AND _value )
execute_process (
C O M M A N D r e g a d d " $ { _ k e y } " / v " $ { _ v a l u e } " / t R E G _ S Z / d " $ { _ d a t a } " / f
O U T P U T _ V A R I A B L E _ o u t p u t E R R O R _ V A R I A B L E _ o u t p u t R E S U L T _ V A R I A B L E _ f a i l e d
)
endif ( )
# If the above worked, add the rest of the test and a rule to
# cleanup the value.
if ( NOT _failed )
message ( STATUS "HKLM is writable: enabling CMakeTestSystemPackage" )
set ( CMakeTestSystemPackage_CLEANUP reg delete "${_key}" /v "${_value}" /f )
set ( CMakeTestSystemPackage CMakeTestSystemPackage )
else ( )
message ( STATUS "HKLM is readonly: disabling CMakeTestSystemPackage" )
endif ( )
endif ( )
#-----------------------------------------------------------------------------
#set(CMAKE_FIND_DEBUG_MODE 1)
# For purposes of the test wipe out previous find results.
set ( PACKAGES
f o o F o o B a r B l u b T F r a m e w o r k T f r a m e w o r k T A p p T a p p S p e c i a l
V e r s i o n e d A V e r s i o n e d B V e r s i o n e d C V e r s i o n e d D V e r s i o n e d E
V e r s i o n e d F V e r s i o n e d G V e r s i o n e d H
W r o n g A W r o n g B W r o n g C W r o n g D
w i b b l e A w i b b l e B
R e c u r s i v e A R e c u r s i v e B R e c u r s i v e C
A r c h A A r c h B A r c h C A r c h D
E n v A E n v B
S e t F o u n d T R U E S e t F o u n d F A L S E
$ { C M a k e T e s t S y s t e m P a c k a g e }
)
foreach ( p ${ PACKAGES } )
set ( ${ p } _DIR "" CACHE FILEPATH "Wipe out find results for testing." FORCE )
endforeach ( )
# Enable framework and bundle searching. Make sure bundles are found
# before unix-syle packages.
set ( CMAKE_FIND_FRAMEWORK LAST )
set ( CMAKE_FIND_APPBUNDLE FIRST )
# Set the wrong answer for a find to make sure it re-finds.
set ( VersionedA_DIR ${ CMAKE_CURRENT_SOURCE_DIR } /lib/cmake/zot-4.0 )
# Test that CMAKE_IGNORE_PATH can ignore the purposely bad package
# files in the lib/cmake/zot-3.1 directory.
set ( CMAKE_IGNORE_PATH ${ CMAKE_CURRENT_SOURCE_DIR } /lib/cmake/zot-3.1 )
# Look for packages with new-style signatures.
find_package ( foo NO_MODULE )
find_package ( Foo CONFIGS FooConfig.cmake )
find_package ( Bar )
set ( CMAKE_DISABLE_FIND_PACKAGE_Blub TRUE )
find_package ( Blub NO_MODULE )
find_package ( TFramework CONFIGS TFrameworkConfig.cmake )
find_package ( Tframework )
find_package ( TApp )
find_package ( Tapp CONFIGS tapp-config.cmake )
find_package ( Special NAMES Suffix SuffixTest PATH_SUFFIXES test )
find_package ( VersionedA 2 NAMES zot )
find_package ( VersionedB 3.1 EXACT NAMES zot )
find_package ( VersionedC 4.0 EXACT NAMES zot )
find_package ( VersionedD 1.1 EXACT NAMES Baz )
find_package ( VersionedE 1.2 EXACT NAMES Baz )
find_package ( VersionedF 1.3 EXACT NAMES Baz )
find_package ( VersionedG 2.0 EXACT NAMES Baz )
find_package ( VersionedH 2.1 EXACT NAMES Baz )
# Test Config files which set Xyz_FOUND themselves:
find_package ( SetFoundTRUE NO_MODULE )
find_package ( SetFoundFALSE NO_MODULE )
# Test wrong initial path when result is present.
set ( WrongA_DIR "${VersionedD_DIR}" )
find_package ( WrongA 1.2 EXACT NAMES Baz )
# Test wrong initial cache entry of UNINITIALIZED type when result is present.
set ( WrongB_DIR "${VersionedD_DIR}" CACHE UNINITIALIZED "Wrong Value" FORCE )
get_property ( type CACHE WrongB_DIR PROPERTY TYPE )
find_package ( WrongB 1.2 EXACT NAMES Baz )
# Test wrong initial path when result is missing.
set ( WrongC_DIR "${VersionedD_DIR}" )
find_package ( WrongC 1.4 EXACT QUIET NAMES Baz )
# Test wrong initial cache entry of UNINITIALIZED type when result is missing.
set ( WrongD_DIR "${VersionedD_DIR}" CACHE UNINITIALIZED "Wrong Value" FORCE )
get_property ( type CACHE WrongD_DIR PROPERTY TYPE )
find_package ( WrongD 1.4 EXACT QUIET NAMES Baz )
# HINTS should override the system but PATHS should not
list ( INSERT CMAKE_SYSTEM_PREFIX_PATH 0 "${CMAKE_CURRENT_SOURCE_DIR}/A" )
find_package ( wibbleA NAMES wibble PATHS B )
find_package ( wibbleB NAMES wibble HINTS B )
# Look for package with recursive find-modules.
find_package ( RecursiveA COMPONENTS A )
find_package ( RecursiveB 2 )
find_package ( RecursiveC 3.1 EXACT )
# Test architecture-specific search directories.
set ( CMAKE_LIBRARY_ARCHITECTURE arch )
find_package ( ArchA NAMES Bar )
find_package ( ArchB NAMES Foo CONFIGS FooConfig.cmake )
find_package ( ArchC 3.1 EXACT NAMES zot )
find_package ( ArchD 4.0 EXACT NAMES zot )
unset ( CMAKE_LIBRARY_ARCHITECTURE )
# Test find_package() with CMAKE_FIND_PACKAGE_RESOLVE_SYMLINKS enabled
if ( UNIX )
# Create ./symlink pointing back here.
execute_process ( COMMAND ${ CMAKE_COMMAND } -E create_symlink
. " $ { C M A K E _ C U R R E N T _ S O U R C E _ D I R } / s y m l i n k " )
# Make find_package search through the symlink
set ( CMAKE_PREFIX_PATH "${CMAKE_CURRENT_SOURCE_DIR}/symlink" )
# First, test the default behavior where symlinks are preserved.
set ( SetFoundResolved_DIR "" )
find_package ( SetFoundResolved )
# The result must preserve the /symlink/ path.
set ( SetFoundResolved_EXPECTED "${CMAKE_CURRENT_SOURCE_DIR}/symlink/cmake" )
if ( NOT "${SetFoundResolved_DIR}" STREQUAL "${SetFoundResolved_EXPECTED}" )
message ( SEND_ERROR "SetFoundResolved_DIR set by find_package() is set to \" ${ SetFoundResolved_DIR } \" ( expected \"${SetFoundResolved_EXPECTED}\")")
endif ( )
# This part of the test only works if there are no symlinks in our path.
get_filename_component ( real_src_dir "${CMAKE_CURRENT_SOURCE_DIR}" REALPATH )
if ( real_src_dir STREQUAL CMAKE_CURRENT_SOURCE_DIR )
# Resolve symlinks when finding the package.
set ( CMAKE_FIND_PACKAGE_RESOLVE_SYMLINKS TRUE )
set ( SetFoundResolved_DIR "" )
find_package ( SetFoundResolved )
# ./symlink points back here so it should be gone when resolved.
set ( SetFoundResolved_EXPECTED "${CMAKE_CURRENT_SOURCE_DIR}/cmake" )
if ( NOT "${SetFoundResolved_DIR}" STREQUAL "${SetFoundResolved_EXPECTED}" )
message ( SEND_ERROR "SetFoundResolved_DIR set by find_package() is set to \" ${ SetFoundResolved_DIR } \" ( expected \"${SetFoundResolved_EXPECTED}\")")
endif ( )
endif ( )
# Cleanup.
unset ( CMAKE_FIND_PACKAGE_RESOLVE_SYMLINKS )
file ( REMOVE "${CMAKE_CURRENT_SOURCE_DIR}/symlink" )
endif ( )
# Test <PackageName>_DIR environment variable.
# We erase the main prefix path to ensure the env var is used.
set ( CMAKE_PREFIX_PATH )
set ( ENV{EnvA_DIR} "${CMAKE_CURRENT_SOURCE_DIR}/lib/zot-3.1" )
find_package ( EnvA 3.1 EXACT QUIET NAMES zot ) # Should Work
find_package ( EnvB 3.1 EXACT QUIET NAMES zot ) # Should Fail
# Test system package registry if available.
if ( CMakeTestSystemPackage )
find_package ( CMakeTestSystemPackage )
execute_process ( COMMAND ${ CMakeTestSystemPackage_CLEANUP }
O U T P U T _ V A R I A B L E _ o u t p u t E R R O R _ V A R I A B L E _ e r r o r )
endif ( )
# Expected locations at which packages should be found.
set ( foo_EXPECTED "lib/foo-1.2/foo-config.cmake" )
set ( Foo_EXPECTED "lib/foo-1.2/CMake/FooConfig.cmake" )
set ( Bar_EXPECTED "lib/Bar/BarConfig.cmake" )
set ( Blub_MISSING "" )
set ( Special_EXPECTED "lib/suffix/test/SuffixTestConfig.cmake" )
set ( TFramework_EXPECTED
" T F r a m e w o r k . f r a m e w o r k / V e r s i o n s / A / R e s o u r c e s / C M a k e / T F r a m e w o r k C o n f i g . c m a k e " )
set ( Tframework_EXPECTED
" T F r a m e w o r k . f r a m e w o r k / V e r s i o n s / A / R e s o u r c e s / t f r a m e w o r k - c o n f i g . c m a k e " )
set ( TApp_EXPECTED
" T A p p . a p p / C o n t e n t s / R e s o u r c e s / T A p p C o n f i g . c m a k e " )
set ( Tapp_EXPECTED
" T A p p . a p p / C o n t e n t s / R e s o u r c e s / c m a k e / t a p p - c o n f i g . c m a k e " )
set ( VersionedA_EXPECTED "lib/zot-2.0/zot-config.cmake" )
set ( VersionedB_EXPECTED "lib/zot-3.1/zot-config.cmake" )
set ( VersionedC_EXPECTED "lib/cmake/zot-4.0/zot-config.cmake" )
set ( VersionedD_EXPECTED "Baz 1.1/BazConfig.cmake" )
set ( VersionedE_EXPECTED "Baz 1.2/CMake/BazConfig.cmake" )
set ( VersionedF_EXPECTED "Baz 1.3/lib/cmake/Baz/BazConfig.cmake" )
set ( VersionedG_EXPECTED "Baz 2.0/share/Baz 2/BazConfig.cmake" )
set ( VersionedH_EXPECTED "Baz 2.1/lib/Baz 2/cmake/BazConfig.cmake" )
set ( WrongA_EXPECTED "${VersionedE_EXPECTED}" )
set ( WrongB_EXPECTED "${VersionedE_EXPECTED}" )
set ( WrongC_MISSING "WrongC_DIR-NOTFOUND" )
set ( WrongD_MISSING "WrongD_DIR-NOTFOUND" )
set ( wibbleA_EXPECTED "A/wibble-config.cmake" )
set ( wibbleB_EXPECTED "B/wibble-config.cmake" )
set ( RecursiveA_EXPECTED "lib/RecursiveA/recursivea-config.cmake" )
set ( RecursiveB_EXPECTED "lib/zot-2.0/zot-config.cmake" )
set ( RecursiveC_EXPECTED "lib/zot-3.1/zot-config.cmake" )
set ( ArchA_EXPECTED "lib/arch/Bar/BarConfig.cmake" )
set ( ArchB_EXPECTED "lib/arch/foo-1.2/CMake/FooConfig.cmake" )
set ( ArchC_EXPECTED "lib/arch/zot-3.1/zot-config.cmake" )
set ( ArchD_EXPECTED "lib/arch/cmake/zot-4.0/zot-config.cmake" )
set ( EnvA_EXPECTED "lib/zot-3.1/zot-config.cmake" )
set ( EnvB_MISSING "EnvB_DIR-NOTFOUND" )
set ( SetFoundTRUE_EXPECTED "cmake/SetFoundTRUEConfig.cmake" )
set ( SetFoundFALSE_MISSING "${CMAKE_CURRENT_SOURCE_DIR}/cmake" )
set ( CMakeTestSystemPackage_EXPECTED "SystemPackage/CMakeTestSystemPackageConfig.cmake" )
# Check the results.
foreach ( p ${ PACKAGES } )
if ( DEFINED ${ p } _MISSING )
# Check and report failure.
if ( NOT "${${p}_DIR}" STREQUAL "${${p}_MISSING}" )
message ( SEND_ERROR
" P a c k a g e $ { p } s h o u l d h a v e b e e n [ $ { $ { p } _ M I S S I N G } ] b u t "
" w a s [ $ { $ { p } _ D I R } ] " )
endif ( )
if ( ${ p } _FOUND )
message ( SEND_ERROR
" P a c k a g e $ { p } s h o u l d n o t h a v e b e e n f o u n d , b u t $ { p } _ F O U N D i s s e t t o "
" \ " $ { $ { p } _ F O U N D } \ " " )
endif ( )
elseif ( ${ p } _FOUND )
# Convert to relative path for comparison to expected location.
file ( RELATIVE_PATH REL_ ${ p } _CONFIG "${CMAKE_CURRENT_SOURCE_DIR}"
" $ { $ { p } _ C O N F I G } " )
# Debugging output.
if ( CMAKE_FIND_DEBUG_MODE )
message ( "Package ${p} found [${REL_${p}_CONFIG}]" )
endif ( )
# Check and report failure.
if ( NOT "${REL_${p}_CONFIG}" STREQUAL "${${p}_EXPECTED}" )
message ( SEND_ERROR
" P a c k a g e $ { p } s h o u l d h a v e b e e n [ $ { $ { p } _ E X P E C T E D } ] b u t "
" w a s [ $ { R E L _ $ { p } _ C O N F I G } ] " )
endif ( )
else ( )
message ( SEND_ERROR "Package ${p} not found!" )
endif ( )
endforeach ( )
# Check that version information was extracted.
if ( NOT "${VersionedA_VERSION}" STREQUAL "2.0" )
message ( SEND_ERROR
" P a c k a g e V e r s i o n e d A i s v e r s i o n [ $ { V e r s i o n e d A _ V E R S I O N } ] , n o t [ 2 . 0 ] " )
endif ( )
if ( NOT "${VersionedA_VERSION_MAJOR}" STREQUAL "2" )
message ( SEND_ERROR
" P a c k a g e V e r s i o n e d A i s m a j o r v e r s i o n [ $ { V e r s i o n e d A _ V E R S I O N _ M A J O R } ] , n o t [ 2 ] " )
endif ( )
if ( NOT "${VersionedA_VERSION_MINOR}" STREQUAL "0" )
message ( SEND_ERROR
" P a c k a g e V e r s i o n e d A i s m i n o r v e r s i o n [ $ { V e r s i o n e d A _ V E R S I O N _ M I N O R } ] , n o t [ 0 ] " )
endif ( )
if ( NOT "${VersionedB_VERSION}" STREQUAL "3.1" )
message ( SEND_ERROR
" P a c k a g e V e r s i o n e d B i s v e r s i o n [ $ { V e r s i o n e d B _ V E R S I O N } ] , n o t [ 3 . 1 ] " )
endif ( )
if ( NOT "${VersionedB_VERSION_MAJOR}" STREQUAL "3" )
message ( SEND_ERROR
" P a c k a g e V e r s i o n e d B i s m a j o r v e r s i o n [ $ { V e r s i o n e d B _ V E R S I O N _ M A J O R } ] , n o t [ 3 ] " )
endif ( )
if ( NOT "${VersionedB_VERSION_MINOR}" STREQUAL "1" )
message ( SEND_ERROR
" P a c k a g e V e r s i o n e d B i s m i n o r v e r s i o n [ $ { V e r s i o n e d B _ V E R S I O N _ M I N O R } ] , n o t [ 1 ] " )
endif ( )
if ( NOT "${Special_VERSION}" STREQUAL "1.2" )
message ( SEND_ERROR
" P a c k a g e S p e c i a l i s v e r s i o n [ $ { S p e c i a l _ V E R S I O N } ] , n o t [ 1 . 2 ] " )
endif ( )
if ( NOT "${Special_VERSION_MAJOR}" STREQUAL "1" )
message ( SEND_ERROR
" P a c k a g e S p e c i a l i s m a j o r v e r s i o n [ $ { S p e c i a l _ V E R S I O N _ M A J O R } ] , n o t [ 1 ] " )
endif ( )
if ( NOT "${Special_VERSION_MINOR}" STREQUAL "2" )
message ( SEND_ERROR
" P a c k a g e S p e c i a l i s m i n o r v e r s i o n [ $ { S p e c i a l _ V E R S I O N _ M I N O R } ] , n o t [ 2 ] " )
endif ( )
# Test version number comparison.
if ( NOT "1.2.3.4" VERSION_LESS "1.2.3.5" )
message ( SEND_ERROR "1.2.3.4 VERSION_LESS 1.2.3.5 is not true!" )
endif ( )
if ( NOT "1.2" VERSION_LESS "1.10" )
message ( SEND_ERROR "1.2 VERSION_LESS 1.10 is not true!" )
endif ( )
if ( NOT "1.02" VERSION_GREATER "1.1" )
message ( SEND_ERROR "1.02 VERSION_GREATER 1.1 is not true!" )
endif ( )
if ( "1.2.3" VERSION_GREATER "1.2.3.4" )
message ( SEND_ERROR "1.2.3 VERSION_GREATER 1.2.3.4 is not false!" )
endif ( )
if ( NOT "1.2" VERSION_EQUAL "1.2.0.0" )
message ( SEND_ERROR "1.2 VERSION_EQUAL 1.2.0.0 is not true!" )
endif ( )
#-----------------------------------------------------------------------------
# Test export(PACKAGE) with find_package.
# Choose a unique version.
string ( REGEX REPLACE "-.*$" "" version ${ CMAKE_VERSION } )
string ( RANDOM LENGTH 4 ALPHABET "0123456789" v )
string ( APPEND version ".${v}" )
message ( STATUS "Preparing export(PACKAGE) test project" )
try_compile ( EXPORTER_COMPILED
$ { F i n d P a c k a g e T e s t _ B I N A R Y _ D I R } / E x p o r t e r - b u i l d
$ { F i n d P a c k a g e T e s t _ S O U R C E _ D I R } / E x p o r t e r
C M a k e T e s t E x p o r t P a c k a g e d u m m y
C M A K E _ F L A G S " - U C M A K E _ E X P O R T _ N O _ P A C K A G E _ R E G I S T R Y "
" - D C M A K E _ P O L I C Y _ D E F A U L T _ C M P 0 0 9 0 : S T R I N G = O L D "
- D v e r s i o n = $ { v e r s i o n }
O U T P U T _ V A R I A B L E o u t p u t )
message ( STATUS "Searching for export(PACKAGE) test project" )
set ( CMakeTestExportPackage_DIR "" CACHE FILEPATH
" W i p e o u t f i n d r e s u l t s f o r t e s t i n g . " F O R C E )
find_package ( CMakeTestExportPackage 1. ${ version } EXACT REQUIRED )
message ( STATUS "Searching for export(PACKAGE) test project with CMAKE_FIND_PACKAGE_NO_PACKAGE_REGISTRY=TRUE" )
set ( CMAKE_FIND_PACKAGE_NO_PACKAGE_REGISTRY TRUE )
set ( CMakeTestExportPackage_DIR "" CACHE FILEPATH
" W i p e o u t f i n d r e s u l t s f o r t e s t i n g . " F O R C E )
find_package ( CMakeTestExportPackage 1. ${ version } EXACT QUIET )
if ( CMakeTestExportPackage_FOUND )
message ( SEND_ERROR "CMakeTestExportPackage should not be FOUND!" )
endif ( )
unset ( CMAKE_FIND_PACKAGE_NO_PACKAGE_REGISTRY )
message ( STATUS "Remove export(PACKAGE) test project" )
file ( REMOVE_RECURSE ${ FindPackageTest_BINARY_DIR } /Exporter-build )
set ( CMakeTestExportPackage_DIR "" CACHE FILEPATH
" W i p e o u t f i n d r e s u l t s f o r t e s t i n g . " F O R C E )
find_package ( CMakeTestExportPackage QUIET ) # Should clean the user package cache
#
message ( STATUS "Preparing export(PACKAGE) test project with CMAKE_EXPORT_NO_PACKAGE_REGISTRY=TRUE" )
try_compile ( EXPORTER_COMPILED
$ { F i n d P a c k a g e T e s t _ B I N A R Y _ D I R } / E x p o r t e r - b u i l d
$ { F i n d P a c k a g e T e s t _ S O U R C E _ D I R } / E x p o r t e r
C M a k e T e s t E x p o r t P a c k a g e d u m m y
C M A K E _ F L A G S " - D C M A K E _ E X P O R T _ N O _ P A C K A G E _ R E G I S T R Y : B O O L = T R U E "
- D v e r s i o n = $ { v e r s i o n }
O U T P U T _ V A R I A B L E o u t p u t )
message ( STATUS "Searching for export(PACKAGE) test project" )
find_package ( CMakeTestExportPackage 1. ${ version } EXACT QUIET )
if ( CMakeTestExportPackage_FOUND )
message ( SEND_ERROR "CMakeTestExportPackage should not be FOUND!" )
endif ( )
message ( STATUS "Remove export(PACKAGE) test project" )
file ( REMOVE_RECURSE ${ FindPackageTest_BINARY_DIR } /Exporter-build )
message ( STATUS "Preparing export(PACKAGE) test project with POLICY CMP0090=NEW" )
try_compile ( EXPORTER_COMPILED
$ { F i n d P a c k a g e T e s t _ B I N A R Y _ D I R } / E x p o r t e r - b u i l d
$ { F i n d P a c k a g e T e s t _ S O U R C E _ D I R } / E x p o r t e r
C M a k e T e s t E x p o r t P a c k a g e d u m m y
C M A K E _ F L A G S
" - D C M A K E _ P O L I C Y _ D E F A U L T _ C M P 0 0 9 0 : S T R I N G = N E W "
- D v e r s i o n = $ { v e r s i o n }
O U T P U T _ V A R I A B L E o u t p u t )
message ( STATUS "Searching for export(PACKAGE) test project" )
find_package ( CMakeTestExportPackage 1. ${ version } EXACT QUIET )
if ( CMakeTestExportPackage_FOUND )
message ( SEND_ERROR "CMakeTestExportPackage should not be FOUND!" )
endif ( )
#-----------------------------------------------------------------------------
# Test configure_package_config_file().
include ( CMakePackageConfigHelpers )
# Generate a config file ready to be installed.
set ( INCLUDE_INSTALL_DIR include )
set ( SHARE_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/share/" )
set ( CURRENT_BUILD_DIR "${CMAKE_CURRENT_BINARY_DIR}" )
configure_package_config_file ( RelocatableConfig.cmake.in "${CMAKE_CURRENT_BINARY_DIR}/RelocatableConfig.cmake"
I N S T A L L _ D E S T I N A T I O N " $ { C M A K E _ I N S T A L L _ P R E F I X } "
P A T H _ V A R S I N C L U D E _ I N S T A L L _ D I R S H A R E _ I N S T A L L _ D I R C U R R E N T _ B U I L D _ D I R
)
set ( Relocatable_FIND_COMPONENTS AComp BComp CComp )
set ( Relocatable_FIND_REQUIRED_BComp 1 )
include ( "${CMAKE_CURRENT_BINARY_DIR}/RelocatableConfig.cmake" )
if ( NOT "${RELOC_INCLUDE_DIR}" STREQUAL "${CMAKE_CURRENT_BINARY_DIR}/include" )
message ( SEND_ERROR "RELOC_INCLUDE_DIR set by configure_package_config_file() is set to \" ${ RELOC_INCLUDE_DIR } \" ( expected \"${CMAKE_CURRENT_BINARY_DIR}/include\")")
endif ( )
if ( NOT "${RELOC_SHARE_DIR}" STREQUAL "${CMAKE_CURRENT_BINARY_DIR}/share/" )
message ( SEND_ERROR "RELOC_SHARE_DIR set by configure_package_config_file() is set to \" ${ RELOC_SHARE_DIR } \" ( expected \"${CMAKE_CURRENT_BINARY_DIR}/share/\")")
endif ( )
if ( NOT "${RELOC_BUILD_DIR}" STREQUAL "${CMAKE_CURRENT_BINARY_DIR}" )
message ( SEND_ERROR "RELOC_BUILD_DIR set by configure_package_config_file() is set to \" ${ RELOC_BUILD_DIR } \" ( expected \"${CMAKE_CURRENT_BINARY_DIR}\")")
endif ( )
if ( NOT DEFINED Relocatable_FOUND )
message ( SEND_ERROR "Relocatable_FOUND not defined !" )
endif ( )
if ( Relocatable_FOUND )
message ( SEND_ERROR "Relocatable_FOUND set to TRUE !" )
endif ( )
# Generate a config file for the build tree.
set ( INCLUDE_INSTALL_DIR include )
set ( SHARE_INSTALL_DIR "${CMAKE_CURRENT_BINARY_DIR}/share/" )
set ( CURRENT_BUILD_DIR "${CMAKE_CURRENT_BINARY_DIR}" )
configure_package_config_file ( RelocatableConfig.cmake.in "${CMAKE_CURRENT_BINARY_DIR}/RelocatableConfig.cmake"
I N S T A L L _ D E S T I N A T I O N " $ { C M A K E _ C U R R E N T _ B I N A R Y _ D I R } "
P A T H _ V A R S I N C L U D E _ I N S T A L L _ D I R S H A R E _ I N S T A L L _ D I R C U R R E N T _ B U I L D _ D I R
I N S T A L L _ P R E F I X " $ { C M A K E _ C U R R E N T _ B I N A R Y _ D I R } "
)
set ( Relocatable_FIND_COMPONENTS AComp BComp CComp )
set ( Relocatable_FIND_REQUIRED_BComp 1 )
include ( "${CMAKE_CURRENT_BINARY_DIR}/RelocatableConfig.cmake" )
if ( NOT "${RELOC_INCLUDE_DIR}" STREQUAL "${CMAKE_CURRENT_BINARY_DIR}/include" )
message ( SEND_ERROR "RELOC_INCLUDE_DIR set by configure_package_config_file() is set to \" ${ RELOC_INCLUDE_DIR } \" ( expected \"${CMAKE_CURRENT_BINARY_DIR}/include\")")
endif ( )
if ( NOT "${RELOC_SHARE_DIR}" STREQUAL "${CMAKE_CURRENT_BINARY_DIR}/share/" )
message ( SEND_ERROR "RELOC_SHARE_DIR set by configure_package_config_file() is set to \" ${ RELOC_SHARE_DIR } \" ( expected \"${CMAKE_CURRENT_BINARY_DIR}/share/\")")
endif ( )
if ( NOT "${RELOC_BUILD_DIR}" STREQUAL "${CMAKE_CURRENT_BINARY_DIR}" )
message ( SEND_ERROR "RELOC_BUILD_DIR set by configure_package_config_file() is set to \" ${ RELOC_BUILD_DIR } \" ( expected \"${CMAKE_CURRENT_BINARY_DIR}\")")
endif ( )
if ( NOT DEFINED Relocatable_FOUND )
message ( SEND_ERROR "Relocatable_FOUND not defined !" )
endif ( )
if ( Relocatable_FOUND )
message ( SEND_ERROR "Relocatable_FOUND set to TRUE !" )
endif ( )
############################################################################
##Test FIND_PACKAGE using sorting
set ( CMAKE_PREFIX_PATH ${ CMAKE_CURRENT_SOURCE_DIR } )
SET ( CMAKE_FIND_PACKAGE_SORT_ORDER NAME )
SET ( CMAKE_FIND_PACKAGE_SORT_DIRECTION ASC )
set ( SortLib_DIR "" CACHE FILEPATH "Wipe out find results for testing." FORCE )
FIND_PACKAGE ( SortLib CONFIG )
IF ( NOT "${SortLib_VERSION}" STREQUAL "3.1.1" )
message ( SEND_ERROR "FIND_PACKAGE_SORT_ORDER Name Asc! ${SortLib_VERSION}" )
endif ( )
unset ( SortLib_VERSION )
set ( SortLib_DIR "" CACHE FILEPATH "Wipe out find results for testing." FORCE )
SET ( CMAKE_FIND_PACKAGE_SORT_ORDER NATURAL )
SET ( CMAKE_FIND_PACKAGE_SORT_DIRECTION DEC )
FIND_PACKAGE ( SortLib CONFIG )
IF ( NOT "${SortLib_VERSION}" STREQUAL "3.10.1" )
message ( SEND_ERROR "FIND_PACKAGE_SORT_ORDER Natural! Dec ${SortLib_VERSION}" )
endif ( )
set ( SortLib_DIR "" CACHE FILEPATH "Wipe out find results for testing." FORCE )
unset ( SortLib_VERSION )
unset ( CMAKE_FIND_PACKAGE_SORT_ORDER )
unset ( CMAKE_FIND_PACKAGE_SORT_DIRECTION )
set ( CMAKE_PREFIX_PATH )
############################################################################
##Test FIND_PACKAGE CMAKE_FIND_PACKAGE_PREFER_CONFIG
set ( CMAKE_PREFIX_PATH ${ CMAKE_CURRENT_SOURCE_DIR } /PreferConfig )
set ( CMAKE_MODULE_PATH ${ CMAKE_CURRENT_SOURCE_DIR } /PreferConfig )
# prefer module mode
set ( CMAKE_FIND_PACKAGE_PREFER_CONFIG OFF )
unset ( ABC_FOUND )
unset ( ABC_CONFIG )
find_package ( ABC )
if ( NOT ABC_FOUND )
message ( SEND_ERROR "Did not find ABC package" )
endif ( )
if ( ABC_CONFIG )
message ( SEND_ERROR "Incorrectly found ABC in CONFIG mode, expected to find it with MODULE mode" )
endif ( )
# Now prefer config mode
set ( CMAKE_FIND_PACKAGE_PREFER_CONFIG ON )
unset ( ABC_FOUND )
unset ( ABC_CONFIG )
find_package ( ABC )
if ( NOT ABC_FOUND )
message ( SEND_ERROR "Did not find ABC package" )
endif ( )
if ( NOT ABC_CONFIG )
message ( SEND_ERROR "Incorrectly found ABC in MODULE mode, expected to find it with CONFIG mode" )
endif ( )
set ( CMAKE_FIND_PACKAGE_PREFER_CONFIG OFF )
set ( CMAKE_PREFIX_PATH )
set ( CMAKE_MODULE_PATH )
############################################################################
##Test FIND_PACKAGE CMAKE_FIND_PACKAGE_PREFER_CONFIG - Do not recurse
# No CMAKE_PREFIX_PATH
set ( CMAKE_MODULE_PATH ${ CMAKE_CURRENT_SOURCE_DIR } /PreferConfigRecurse )
# Now prefer config mode
set ( CMAKE_FIND_PACKAGE_PREFER_CONFIG ON )
unset ( ACME_FOUND )
unset ( ACME_CONFIG )
find_package ( ACME )
if ( ACME_FOUND AND ACME_CONFIG )
message ( SEND_ERROR "Incorrectly found ACME in CONFIG mode, from the MODULE package" )
endif ( )
set ( CMAKE_FIND_PACKAGE_PREFER_CONFIG OFF )
set ( CMAKE_MODULE_PATH )
############################################################################
##Test find_package CMAKE_FIND_PACKAGE_PREFER_CONFIG with module fallback
set ( CMAKE_MODULE_PATH ${ CMAKE_CURRENT_SOURCE_DIR } /PreferConfigOnlyModule )
set ( CMAKE_FIND_PACKAGE_PREFER_CONFIG ON )
find_package ( ACME REQUIRED )
if ( NOT ACME_FOUND )
message ( SEND_ERROR "Did not find ACME package" )
endif ( )
############################################################################
##Test find_package CMAKE_FIND_PACKAGE_PREFER_CONFIG with NO_MODULE
set ( CMAKE_MODULE_PATH ${ CMAKE_CURRENT_SOURCE_DIR } /PreferConfigOnlyModule )
set ( CMAKE_FIND_PACKAGE_PREFER_CONFIG ON )
find_package ( ACME NO_MODULE )
if ( ACME_FOUND )
message ( SEND_ERROR "Should not find ACME package" )
endif ( )
############################################################################
##Test find_package CMAKE_FIND_PACKAGE_PREFER_CONFIG with unknown package
set ( CMAKE_FIND_PACKAGE_PREFER_CONFIG ON )
find_package ( DoesNotExist )