Merge topic 'find_package_set_FOUND_VariableInConfigFile'

0cf8447 find_package: additional test for checking the error message
56ae3f9 find_package: add test for setting Foo_FOUND to FALSE in a Config file
16c0c73 find_package: allow <pkg>Config.cmake to set <pkg>_FOUND to FALSE
This commit is contained in:
Brad King 2012-03-19 14:42:03 -04:00 committed by CMake Topic Stage
commit f2b44c64fc
8 changed files with 61 additions and 4 deletions

View File

@ -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.

View File

@ -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}"

View File

@ -0,0 +1 @@
set(SetFoundFALSE_FOUND FALSE)

View File

@ -0,0 +1 @@
set(SetFoundTRUE_FOUND TRUE)

View File

@ -12,3 +12,4 @@ run_cmake(MissingConfigOneName)
run_cmake(MissingConfigRequired)
run_cmake(MissingConfigVersion)
run_cmake(MixedModeOptions)
run_cmake(SetFoundFALSE)

View File

@ -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\)

View File

@ -0,0 +1,2 @@
set(SetFoundFALSE_DIR "${CMAKE_CURRENT_SOURCE_DIR}")
find_package(SetFoundFALSE CONFIG)

View File

@ -0,0 +1 @@
set(SetFoundFALSE_FOUND FALSE)