find_package: Extend search path for combined Windows/UNIX convention

Find packages that install their cmake package configuration files in
`lib/cmake/<name>` when they are installed in the default Windows
CMAKE_INSTALL_PREFIX, `C:/Program Files/<name>`.

Closes: #16212
This commit is contained in:
Silvio Traversaro 2016-08-20 12:06:55 +02:00 committed by Brad King
parent ff5c89de0c
commit 828d6c137d
9 changed files with 75 additions and 2 deletions

View File

@ -201,6 +201,9 @@ Each entry is meant for installation trees following Windows (W), UNIX
<prefix>/(lib/<arch>|lib|share)/cmake/<name>*/ (U) <prefix>/(lib/<arch>|lib|share)/cmake/<name>*/ (U)
<prefix>/(lib/<arch>|lib|share)/<name>*/ (U) <prefix>/(lib/<arch>|lib|share)/<name>*/ (U)
<prefix>/(lib/<arch>|lib|share)/<name>*/(cmake|CMake)/ (U) <prefix>/(lib/<arch>|lib|share)/<name>*/(cmake|CMake)/ (U)
<prefix>/<name>*/(lib/<arch>|lib|share)/cmake/<name>*/ (W/U)
<prefix>/<name>*/(lib/<arch>|lib|share)/<name>*/ (W/U)
<prefix>/<name>*/(lib/<arch>|lib|share)/<name>*/(cmake|CMake)/ (W/U)
On systems supporting OS X Frameworks and Application Bundles the On systems supporting OS X Frameworks and Application Bundles the
following directories are searched for frameworks or bundles following directories are searched for frameworks or bundles

View File

@ -1961,6 +1961,44 @@ bool cmFindPackageCommand::SearchPrefix(std::string const& prefix_in)
} }
} }
// PREFIX/(Foo|foo|FOO).*/(lib/ARCH|lib|share)/cmake/(Foo|foo|FOO).*/
{
cmFindPackageFileList lister(this);
lister / cmFileListGeneratorFixed(prefix) /
cmFileListGeneratorProject(this->Names) /
cmFileListGeneratorEnumerate(common) /
cmFileListGeneratorFixed("cmake") /
cmFileListGeneratorProject(this->Names);
if (lister.Search()) {
return true;
}
}
// PREFIX/(Foo|foo|FOO).*/(lib/ARCH|lib|share)/(Foo|foo|FOO).*/
{
cmFindPackageFileList lister(this);
lister / cmFileListGeneratorFixed(prefix) /
cmFileListGeneratorProject(this->Names) /
cmFileListGeneratorEnumerate(common) /
cmFileListGeneratorProject(this->Names);
if (lister.Search()) {
return true;
}
}
// PREFIX/(Foo|foo|FOO).*/(lib/ARCH|lib|share)/(Foo|foo|FOO).*/(cmake|CMake)/
{
cmFindPackageFileList lister(this);
lister / cmFileListGeneratorFixed(prefix) /
cmFileListGeneratorProject(this->Names) /
cmFileListGeneratorEnumerate(common) /
cmFileListGeneratorProject(this->Names) /
cmFileListGeneratorCaseInsensitive("cmake");
if (lister.Search()) {
return true;
}
}
return false; return false;
} }

View File

@ -0,0 +1 @@
# Test config file.

View File

@ -0,0 +1,7 @@
set(PACKAGE_VERSION 1.3)
if("${PACKAGE_FIND_VERSION_MAJOR}" EQUAL 1)
set(PACKAGE_VERSION_COMPATIBLE 1)
if("${PACKAGE_FIND_VERSION_MINOR}" EQUAL 3)
set(PACKAGE_VERSION_EXACT 1)
endif()
endif()

View File

@ -0,0 +1 @@
# Test config file.

View File

@ -0,0 +1,7 @@
set(PACKAGE_VERSION 2.0)
if("${PACKAGE_FIND_VERSION_MAJOR}" EQUAL 2)
set(PACKAGE_VERSION_COMPATIBLE 1)
if("${PACKAGE_FIND_VERSION_MINOR}" EQUAL 0)
set(PACKAGE_VERSION_EXACT 1)
endif()
endif()

View File

@ -0,0 +1 @@
# Test config file.

View File

@ -0,0 +1,7 @@
set(PACKAGE_VERSION 2.1)
if("${PACKAGE_FIND_VERSION_MAJOR}" EQUAL 2)
set(PACKAGE_VERSION_COMPATIBLE 1)
if("${PACKAGE_FIND_VERSION_MINOR}" EQUAL 1)
set(PACKAGE_VERSION_EXACT 1)
endif()
endif()

View File

@ -102,6 +102,7 @@ endif()
set(PACKAGES set(PACKAGES
foo Foo Bar Blub TFramework Tframework TApp Tapp Special foo Foo Bar Blub TFramework Tframework TApp Tapp Special
VersionedA VersionedB VersionedC VersionedD VersionedE VersionedA VersionedB VersionedC VersionedD VersionedE
VersionedF VersionedG VersionedH
WrongA WrongB WrongC WrongD WrongA WrongB WrongC WrongD
wibbleA wibbleB wibbleA wibbleB
RecursiveA RecursiveB RecursiveC RecursiveA RecursiveB RecursiveC
@ -142,6 +143,10 @@ find_package(VersionedB 3.1 EXACT NAMES zot)
find_package(VersionedC 4.0 EXACT NAMES zot) find_package(VersionedC 4.0 EXACT NAMES zot)
find_package(VersionedD 1.1 EXACT NAMES Baz) find_package(VersionedD 1.1 EXACT NAMES Baz)
find_package(VersionedE 1.2 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: # Test Config files which set Xyz_FOUND themselves:
find_package(SetFoundTRUE NO_MODULE) find_package(SetFoundTRUE NO_MODULE)
@ -158,12 +163,12 @@ find_package(WrongB 1.2 EXACT NAMES Baz)
# Test wrong initial path when result is missing. # Test wrong initial path when result is missing.
set(WrongC_DIR "${VersionedD_DIR}") set(WrongC_DIR "${VersionedD_DIR}")
find_package(WrongC 1.3 EXACT QUIET NAMES Baz) find_package(WrongC 1.4 EXACT QUIET NAMES Baz)
# Test wrong initial cache entry of UNINITIALIZED type when result is missing. # Test wrong initial cache entry of UNINITIALIZED type when result is missing.
set(WrongD_DIR "${VersionedD_DIR}" CACHE UNINITIALIZED "Wrong Value" FORCE) set(WrongD_DIR "${VersionedD_DIR}" CACHE UNINITIALIZED "Wrong Value" FORCE)
get_property(type CACHE WrongD_DIR PROPERTY TYPE) get_property(type CACHE WrongD_DIR PROPERTY TYPE)
find_package(WrongD 1.3 EXACT QUIET NAMES Baz) find_package(WrongD 1.4 EXACT QUIET NAMES Baz)
# HINTS should override the system but PATHS should not # HINTS should override the system but PATHS should not
list(INSERT CMAKE_SYSTEM_PREFIX_PATH 0 "${CMAKE_CURRENT_SOURCE_DIR}/A") list(INSERT CMAKE_SYSTEM_PREFIX_PATH 0 "${CMAKE_CURRENT_SOURCE_DIR}/A")
@ -216,6 +221,9 @@ set(VersionedB_EXPECTED "lib/zot-3.1/zot-config.cmake")
set(VersionedC_EXPECTED "lib/cmake/zot-4.0/zot-config.cmake") set(VersionedC_EXPECTED "lib/cmake/zot-4.0/zot-config.cmake")
set(VersionedD_EXPECTED "Baz 1.1/BazConfig.cmake") set(VersionedD_EXPECTED "Baz 1.1/BazConfig.cmake")
set(VersionedE_EXPECTED "Baz 1.2/CMake/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(WrongA_EXPECTED "${VersionedE_EXPECTED}")
set(WrongB_EXPECTED "${VersionedE_EXPECTED}") set(WrongB_EXPECTED "${VersionedE_EXPECTED}")
set(WrongC_MISSING "WrongC_DIR-NOTFOUND") set(WrongC_MISSING "WrongC_DIR-NOTFOUND")