Merge topic 'find_package_set_FOUND_VariableInConfigFile'
0cf8447
find_package: additional test for checking the error message56ae3f9
find_package: add test for setting Foo_FOUND to FALSE in a Config file16c0c73
find_package: allow <pkg>Config.cmake to set <pkg>_FOUND to FALSE
This commit is contained in:
commit
f2b44c64fc
|
@ -952,11 +952,26 @@ bool cmFindPackageCommand::HandlePackageMode()
|
|||
}
|
||||
}
|
||||
|
||||
std::string foundVar = this->Name;
|
||||
foundVar += "_FOUND";
|
||||
|
||||
// If the directory for the config file was found, try to read the file.
|
||||
bool result = true;
|
||||
bool found = false;
|
||||
bool configFileSetFOUNDFalse = false;
|
||||
|
||||
if(fileFound)
|
||||
{
|
||||
if ((this->Makefile->IsDefinitionSet(foundVar.c_str()))
|
||||
&& (this->Makefile->IsOn(foundVar.c_str()) == false))
|
||||
{
|
||||
// by removing Foo_FOUND here if it is FALSE, we don't really change
|
||||
// the situation for the Config file which is about to be included,
|
||||
// but we make it possible to detect later on whether the Config file
|
||||
// has set Foo_FOUND to FALSE itself:
|
||||
this->Makefile->RemoveDefinition(foundVar.c_str());
|
||||
}
|
||||
|
||||
// Set the version variables before loading the config file.
|
||||
// It may override them.
|
||||
this->StoreVersionFound();
|
||||
|
@ -966,6 +981,15 @@ bool cmFindPackageCommand::HandlePackageMode()
|
|||
{
|
||||
// The package has been found.
|
||||
found = true;
|
||||
|
||||
// Check whether the Config file has set Foo_FOUND to FALSE:
|
||||
if ((this->Makefile->IsDefinitionSet(foundVar.c_str()))
|
||||
&& (this->Makefile->IsOn(foundVar.c_str()) == false))
|
||||
{
|
||||
// we get here if the Config file has set Foo_FOUND actively to FALSE
|
||||
found = false;
|
||||
configFileSetFOUNDFalse = true;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -973,14 +997,22 @@ bool cmFindPackageCommand::HandlePackageMode()
|
|||
result = false;
|
||||
}
|
||||
}
|
||||
else if(!this->Quiet || this->Required)
|
||||
|
||||
if (result && !found && (!this->Quiet || this->Required))
|
||||
{
|
||||
// The variable is not set.
|
||||
cmOStringStream e;
|
||||
cmOStringStream aw;
|
||||
if (configFileSetFOUNDFalse)
|
||||
{
|
||||
e << "Found package configuration file:\n"
|
||||
" " << this->FileFound << "\n"
|
||||
"but it set " << foundVar << " to FALSE so package \"" <<
|
||||
this->Name << "\" is considered to be NOT FOUND.";
|
||||
}
|
||||
// If there are files in ConsideredConfigs, it means that FooConfig.cmake
|
||||
// have been found, but they didn't have appropriate versions.
|
||||
if (this->ConsideredConfigs.size() > 0)
|
||||
else if (this->ConsideredConfigs.size() > 0)
|
||||
{
|
||||
e << "Could not find a configuration file for package \""
|
||||
<< this->Name << "\" that "
|
||||
|
@ -1074,8 +1106,6 @@ bool cmFindPackageCommand::HandlePackageMode()
|
|||
}
|
||||
|
||||
// Set a variable marking whether the package was found.
|
||||
std::string foundVar = this->Name;
|
||||
foundVar += "_FOUND";
|
||||
this->Makefile->AddDefinition(foundVar.c_str(), found? "1":"0");
|
||||
|
||||
// Set a variable naming the configuration file that was found.
|
||||
|
|
|
@ -82,6 +82,7 @@ SET(PACKAGES
|
|||
RecursiveA RecursiveB RecursiveC
|
||||
ArchA ArchB ArchC ArchD
|
||||
EnvA EnvB
|
||||
SetFoundTRUE SetFoundFALSE
|
||||
${CMakeTestSystemPackage}
|
||||
)
|
||||
FOREACH(p ${PACKAGES})
|
||||
|
@ -117,6 +118,10 @@ FIND_PACKAGE(VersionedC 4.0 EXACT NAMES zot)
|
|||
FIND_PACKAGE(VersionedD 1.1 EXACT NAMES Baz)
|
||||
FIND_PACKAGE(VersionedE 1.2 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)
|
||||
|
@ -201,6 +206,8 @@ 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.
|
||||
|
@ -212,6 +219,11 @@ FOREACH(p ${PACKAGES})
|
|||
"Package ${p} should have been [${${p}_MISSING}] but "
|
||||
"was [${${p}_DIR}]")
|
||||
ENDIF()
|
||||
IF(${p}_FOUND)
|
||||
MESSAGE(SEND_ERROR
|
||||
"Package ${p} should not have been found, but ${p}_FOUND is set to "
|
||||
"\"${${p}_FOUND}\"")
|
||||
ENDIF()
|
||||
ELSEIF(${p}_FOUND)
|
||||
# Convert to relative path for comparison to expected location.
|
||||
FILE(RELATIVE_PATH REL_${p}_CONFIG "${CMAKE_CURRENT_SOURCE_DIR}"
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
set(SetFoundFALSE_FOUND FALSE)
|
|
@ -0,0 +1 @@
|
|||
set(SetFoundTRUE_FOUND TRUE)
|
|
@ -12,3 +12,4 @@ run_cmake(MissingConfigOneName)
|
|||
run_cmake(MissingConfigRequired)
|
||||
run_cmake(MissingConfigVersion)
|
||||
run_cmake(MixedModeOptions)
|
||||
run_cmake(SetFoundFALSE)
|
||||
|
|
|
@ -0,0 +1,9 @@
|
|||
CMake Warning at SetFoundFALSE.cmake:2 \(find_package\):
|
||||
Found package configuration file:
|
||||
|
||||
.*/Tests/RunCMake/find_package/SetFoundFALSEConfig.cmake
|
||||
|
||||
but it set SetFoundFALSE_FOUND to FALSE so package "SetFoundFALSE" is
|
||||
considered to be NOT FOUND.
|
||||
Call Stack \(most recent call first\):
|
||||
CMakeLists.txt:3 \(include\)
|
|
@ -0,0 +1,2 @@
|
|||
set(SetFoundFALSE_DIR "${CMAKE_CURRENT_SOURCE_DIR}")
|
||||
find_package(SetFoundFALSE CONFIG)
|
|
@ -0,0 +1 @@
|
|||
set(SetFoundFALSE_FOUND FALSE)
|
Loading…
Reference in New Issue