diff options
author | Robert Goulet <robert.goulet@autodesk.com> | 2015-08-11 19:18:39 (GMT) |
---|---|---|
committer | Brad King <brad.king@kitware.com> | 2015-08-12 17:42:57 (GMT) |
commit | e36a05fd7f7d008c4c1e75ebf46eac3072ef71b1 (patch) | |
tree | 6502c05664d2f4c11e54ef10f438f663565bb59b /Source/cmTarget.cxx | |
parent | 422d3f68de6bfa5c3fad68d2b030f2a618a821a2 (diff) | |
download | CMake-e36a05fd7f7d008c4c1e75ebf46eac3072ef71b1.zip CMake-e36a05fd7f7d008c4c1e75ebf46eac3072ef71b1.tar.gz CMake-e36a05fd7f7d008c4c1e75ebf46eac3072ef71b1.tar.bz2 |
cmTarget: Detect and diagnose recursion in GetOutputInfo
Diffstat (limited to 'Source/cmTarget.cxx')
-rw-r--r-- | Source/cmTarget.cxx | 24 |
1 files changed, 21 insertions, 3 deletions
diff --git a/Source/cmTarget.cxx b/Source/cmTarget.cxx index d3170e4..d2d4c67 100644 --- a/Source/cmTarget.cxx +++ b/Source/cmTarget.cxx @@ -66,6 +66,8 @@ struct cmTarget::OutputInfo std::string OutDir; std::string ImpDir; std::string PdbDir; + bool empty() const + { return OutDir.empty() && ImpDir.empty() && PdbDir.empty(); } }; //---------------------------------------------------------------------------- @@ -2609,19 +2611,35 @@ cmTarget::OutputInfo const* cmTarget::GetOutputInfo( config_upper = cmSystemTools::UpperCase(config); } typedef cmTargetInternals::OutputInfoMapType OutputInfoMapType; - OutputInfoMapType::const_iterator i = + OutputInfoMapType::iterator i = this->Internal->OutputInfoMap.find(config_upper); if(i == this->Internal->OutputInfoMap.end()) { + // Add empty info in map to detect potential recursion. OutputInfo info; + OutputInfoMapType::value_type entry(config_upper, info); + i = this->Internal->OutputInfoMap.insert(entry).first; + + // Compute output directories. this->ComputeOutputDir(config, false, info.OutDir); this->ComputeOutputDir(config, true, info.ImpDir); if(!this->ComputePDBOutputDir("PDB", config, info.PdbDir)) { info.PdbDir = info.OutDir; } - OutputInfoMapType::value_type entry(config_upper, info); - i = this->Internal->OutputInfoMap.insert(entry).first; + + // Now update the previously-prepared map entry. + i->second = info; + } + else if(i->second.empty()) + { + // An empty map entry indicates we have been called recursively + // from the above block. + this->Makefile->GetCMakeInstance()->IssueMessage( + cmake::FATAL_ERROR, + "Target '" + this->GetName() + "' OUTPUT_DIRECTORY depends on itself.", + this->GetBacktrace()); + return 0; } return &i->second; } |