Merge topic 'safe-target-file-import'
bf2ddce
Generate an early-return guard in target Export files.
This commit is contained in:
commit
8a581696ef
|
@ -22,6 +22,20 @@ cmExportBuildFileGenerator::cmExportBuildFileGenerator()
|
||||||
//----------------------------------------------------------------------------
|
//----------------------------------------------------------------------------
|
||||||
bool cmExportBuildFileGenerator::GenerateMainFile(std::ostream& os)
|
bool cmExportBuildFileGenerator::GenerateMainFile(std::ostream& os)
|
||||||
{
|
{
|
||||||
|
{
|
||||||
|
std::string expectedTargets;
|
||||||
|
std::string sep;
|
||||||
|
for(std::vector<cmTarget*>::const_iterator
|
||||||
|
tei = this->Exports->begin();
|
||||||
|
tei != this->Exports->end(); ++tei)
|
||||||
|
{
|
||||||
|
expectedTargets += sep + this->Namespace + (*tei)->GetName();
|
||||||
|
sep = " ";
|
||||||
|
}
|
||||||
|
|
||||||
|
this->GenerateExpectedTargetsCode(os, expectedTargets);
|
||||||
|
}
|
||||||
|
|
||||||
// Create all the imported targets.
|
// Create all the imported targets.
|
||||||
for(std::vector<cmTarget*>::const_iterator
|
for(std::vector<cmTarget*>::const_iterator
|
||||||
tei = this->Exports->begin();
|
tei = this->Exports->begin();
|
||||||
|
|
|
@ -286,6 +286,37 @@ void cmExportFileGenerator::GenerateImportVersionCode(std::ostream& os)
|
||||||
<< "\n";
|
<< "\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
void cmExportFileGenerator::GenerateExpectedTargetsCode(std::ostream& os,
|
||||||
|
const std::string &expectedTargets)
|
||||||
|
{
|
||||||
|
os << "SET(_targetsDefined)\n"
|
||||||
|
"SET(_targetsNotDefined)\n"
|
||||||
|
"SET(_expectedTargets)\n"
|
||||||
|
"FOREACH(_expectedTarget " << expectedTargets << ")\n"
|
||||||
|
" LIST(APPEND _expectedTargets ${_expectedTarget})\n"
|
||||||
|
" IF(NOT TARGET ${_expectedTarget})\n"
|
||||||
|
" LIST(APPEND _targetsNotDefined ${_expectedTarget})\n"
|
||||||
|
" ENDIF(NOT TARGET ${_expectedTarget})\n"
|
||||||
|
" IF(TARGET ${_expectedTarget})\n"
|
||||||
|
" LIST(APPEND _targetsDefined ${_expectedTarget})\n"
|
||||||
|
" ENDIF(TARGET ${_expectedTarget})\n"
|
||||||
|
"ENDFOREACH(_expectedTarget)\n"
|
||||||
|
"IF(\"${_targetsDefined}\" STREQUAL \"${_expectedTargets}\")\n"
|
||||||
|
" SET(CMAKE_IMPORT_FILE_VERSION)\n"
|
||||||
|
" CMAKE_POLICY(POP)\n"
|
||||||
|
" RETURN()\n"
|
||||||
|
"ENDIF(\"${_targetsDefined}\" STREQUAL \"${_expectedTargets}\")\n"
|
||||||
|
"IF(NOT \"${_targetsDefined}\" STREQUAL \"\")\n"
|
||||||
|
" MESSAGE(FATAL_ERROR \"Some (but not all) targets in this export "
|
||||||
|
"set were already defined.\\nTargets Defined: ${_targetsDefined}\\n"
|
||||||
|
"Targets not yet defined: ${_targetsNotDefined}\\n\")\n"
|
||||||
|
"ENDIF(NOT \"${_targetsDefined}\" STREQUAL \"\")\n"
|
||||||
|
"UNSET(_targetsDefined)\n"
|
||||||
|
"UNSET(_targetsNotDefined)\n"
|
||||||
|
"UNSET(_expectedTargets)\n"
|
||||||
|
"\n\n";
|
||||||
|
}
|
||||||
//----------------------------------------------------------------------------
|
//----------------------------------------------------------------------------
|
||||||
void
|
void
|
||||||
cmExportFileGenerator
|
cmExportFileGenerator
|
||||||
|
|
|
@ -63,6 +63,8 @@ protected:
|
||||||
void GenerateMissingTargetsCheckCode(std::ostream& os,
|
void GenerateMissingTargetsCheckCode(std::ostream& os,
|
||||||
const std::vector<std::string>& missingTargets);
|
const std::vector<std::string>& missingTargets);
|
||||||
|
|
||||||
|
void GenerateExpectedTargetsCode(std::ostream& os,
|
||||||
|
const std::string &expectedTargets);
|
||||||
|
|
||||||
// Collect properties with detailed information about targets beyond
|
// Collect properties with detailed information about targets beyond
|
||||||
// their location on disk.
|
// their location on disk.
|
||||||
|
|
|
@ -39,6 +39,20 @@ std::string cmExportInstallFileGenerator::GetConfigImportFileGlob()
|
||||||
//----------------------------------------------------------------------------
|
//----------------------------------------------------------------------------
|
||||||
bool cmExportInstallFileGenerator::GenerateMainFile(std::ostream& os)
|
bool cmExportInstallFileGenerator::GenerateMainFile(std::ostream& os)
|
||||||
{
|
{
|
||||||
|
{
|
||||||
|
std::string expectedTargets;
|
||||||
|
std::string sep;
|
||||||
|
for(std::vector<cmTargetExport*>::const_iterator
|
||||||
|
tei = this->IEGen->GetExportSet()->GetTargetExports()->begin();
|
||||||
|
tei != this->IEGen->GetExportSet()->GetTargetExports()->end(); ++tei)
|
||||||
|
{
|
||||||
|
expectedTargets += sep + this->Namespace + (*tei)->Target->GetName();
|
||||||
|
sep = " ";
|
||||||
|
}
|
||||||
|
|
||||||
|
this->GenerateExpectedTargetsCode(os, expectedTargets);
|
||||||
|
}
|
||||||
|
|
||||||
// Create all the imported targets.
|
// Create all the imported targets.
|
||||||
for(std::vector<cmTargetExport*>::const_iterator
|
for(std::vector<cmTargetExport*>::const_iterator
|
||||||
tei = this->IEGen->GetExportSet()->GetTargetExports()->begin();
|
tei = this->IEGen->GetExportSet()->GetTargetExports()->begin();
|
||||||
|
|
Loading…
Reference in New Issue