diff --git a/Source/cmFindPackageCommand.cxx b/Source/cmFindPackageCommand.cxx index 2b45b22424..398bc94ce2 100644 --- a/Source/cmFindPackageCommand.cxx +++ b/Source/cmFindPackageCommand.cxx @@ -1543,6 +1543,7 @@ bool cmFindPackageCommand::HandlePackageMode( } } + std::string const fileVar = cmStrCat(this->Name, "_CONFIG"); std::string const foundVar = cmStrCat(this->Name, "_FOUND"); std::string const notFoundMessageVar = cmStrCat(this->Name, "_NOT_FOUND_MESSAGE"); @@ -1573,7 +1574,15 @@ bool cmFindPackageCommand::HandlePackageMode( if (this->CpsReader) { // The package has been found. found = true; - result = this->ReadPackage(); + + // Don't read a CPS file if we've already read it. + cmValue const& previousFileFound = + this->Makefile->GetDefinition(fileVar); + if (previousFileFound.Compare(this->FileFound) == 0) { + result = true; + } else { + result = this->ReadPackage(); + } } else if (this->ReadListFile(this->FileFound, DoPolicyScope)) { // The package has been found. found = true; @@ -1756,7 +1765,6 @@ bool cmFindPackageCommand::HandlePackageMode( this->Makefile->AddDefinition(foundVar, found ? "1" : "0"); // Set a variable naming the configuration file that was found. - std::string const fileVar = cmStrCat(this->Name, "_CONFIG"); if (found) { this->Makefile->AddDefinition(fileVar, this->FileFound); } else { diff --git a/Tests/FindPackageCpsTest/CMakeLists.txt b/Tests/FindPackageCpsTest/CMakeLists.txt index 17a398f8da..1304ee7286 100644 --- a/Tests/FindPackageCpsTest/CMakeLists.txt +++ b/Tests/FindPackageCpsTest/CMakeLists.txt @@ -54,6 +54,12 @@ endfunction() find_package(Sample CONFIG) test_version(Sample "2.10.11" 3 2 10 11 0) +############################################################################### +# Test finding a package more than once. + +find_package(Repeat REQUIRED) +find_package(Repeat REQUIRED) + ############################################################################### # Test some more complicated version parsing. diff --git a/Tests/FindPackageCpsTest/cps/Repeat.cps b/Tests/FindPackageCpsTest/cps/Repeat.cps new file mode 100644 index 0000000000..55354fdbfc --- /dev/null +++ b/Tests/FindPackageCpsTest/cps/Repeat.cps @@ -0,0 +1,10 @@ +{ + "cps_version": "0.13", + "name": "Repeat", + "cps_path": "@prefix@/cps", + "components": { + "Repeat": { + "type": "interface" + } + } +}