summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Cole <david.cole@kitware.com>2012-12-05 15:29:48 (GMT)
committerCMake Topic Stage <kwrobot@kitware.com>2012-12-05 15:29:48 (GMT)
commit8a581696efaf47707c150e6fb95f1258aab8cd39 (patch)
tree2ca990403635b3a479f73ba4ca8e9f76e4394642
parent00dc0ce592285ed990ef9a8e747f1dcde2830866 (diff)
parentbf2ddceb4e55b2b9e3fb749fbee6126340f73f07 (diff)
downloadCMake-8a581696efaf47707c150e6fb95f1258aab8cd39.zip
CMake-8a581696efaf47707c150e6fb95f1258aab8cd39.tar.gz
CMake-8a581696efaf47707c150e6fb95f1258aab8cd39.tar.bz2
Merge topic 'safe-target-file-import'
bf2ddce Generate an early-return guard in target Export files.
-rw-r--r--Source/cmExportBuildFileGenerator.cxx14
-rw-r--r--Source/cmExportFileGenerator.cxx31
-rw-r--r--Source/cmExportFileGenerator.h2
-rw-r--r--Source/cmExportInstallFileGenerator.cxx14
4 files changed, 61 insertions, 0 deletions
diff --git a/Source/cmExportBuildFileGenerator.cxx b/Source/cmExportBuildFileGenerator.cxx
index fb3f39f..cd6a7ab 100644
--- a/Source/cmExportBuildFileGenerator.cxx
+++ b/Source/cmExportBuildFileGenerator.cxx
@@ -22,6 +22,20 @@ cmExportBuildFileGenerator::cmExportBuildFileGenerator()
//----------------------------------------------------------------------------
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.
for(std::vector<cmTarget*>::const_iterator
tei = this->Exports->begin();
diff --git a/Source/cmExportFileGenerator.cxx b/Source/cmExportFileGenerator.cxx
index 8dffae4..3f738cc 100644
--- a/Source/cmExportFileGenerator.cxx
+++ b/Source/cmExportFileGenerator.cxx
@@ -287,6 +287,37 @@ void cmExportFileGenerator::GenerateImportVersionCode(std::ostream& os)
}
//----------------------------------------------------------------------------
+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
cmExportFileGenerator
::GenerateImportTargetCode(std::ostream& os, cmTarget* target)
diff --git a/Source/cmExportFileGenerator.h b/Source/cmExportFileGenerator.h
index 70bc65d..4a75c52 100644
--- a/Source/cmExportFileGenerator.h
+++ b/Source/cmExportFileGenerator.h
@@ -63,6 +63,8 @@ protected:
void GenerateMissingTargetsCheckCode(std::ostream& os,
const std::vector<std::string>& missingTargets);
+ void GenerateExpectedTargetsCode(std::ostream& os,
+ const std::string &expectedTargets);
// Collect properties with detailed information about targets beyond
// their location on disk.
diff --git a/Source/cmExportInstallFileGenerator.cxx b/Source/cmExportInstallFileGenerator.cxx
index 7841731..6ba7d9f 100644
--- a/Source/cmExportInstallFileGenerator.cxx
+++ b/Source/cmExportInstallFileGenerator.cxx
@@ -39,6 +39,20 @@ std::string cmExportInstallFileGenerator::GetConfigImportFileGlob()
//----------------------------------------------------------------------------
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.
for(std::vector<cmTargetExport*>::const_iterator
tei = this->IEGen->GetExportSet()->GetTargetExports()->begin();