summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBrad King <brad.king@kitware.com>2014-12-23 00:41:17 (GMT)
committerBrad King <brad.king@kitware.com>2014-12-23 01:13:30 (GMT)
commitfdbfcfdf0173c34845e495f4c0bd407faafc45b4 (patch)
tree133ed9a0fbe2808b65d69f17523d86c7828c44fc
parent9a13fcbf02e16bda1b8d30332c97ea9460306e4d (diff)
downloadCMake-fdbfcfdf0173c34845e495f4c0bd407faafc45b4.zip
CMake-fdbfcfdf0173c34845e495f4c0bd407faafc45b4.tar.gz
CMake-fdbfcfdf0173c34845e495f4c0bd407faafc45b4.tar.bz2
Ninja: Generate rules only for languages compiled in a target (#15325)
Refactoring in commit v3.1.0-rc1~688^2~2 (cmTarget: Compute languages from object libraries on demand, 2014-03-18) taught cmTarget::GetLanguages to (correctly) include the languages of object library sources. Previously this was done only in cmTarget::ComputeLinkImplementationLanguages to choose the linker language. The Ninja generator writes out generic build rules for each language compiled within a target using the rule variables defined in the directory of the target. This only needs to be done for languages actually compiled within the current target. Switch from using the cmTarget::GetLanguages method to get the list of languages over to using cmTarget::GetSourceFiles directly so we do not get the languages in object libraries. Strictly speaking this should make no difference because it is not safe to use objects from a language not enabled in the directory containing a target or else the link information for the language may not be considered. However, in cases when no link information happens to be needed for a language it was possible in CMake 3.0 and below to enable a language only in a subdirectory providing an object library, and then use the objects from a containing directory. The above change teaches the Ninja generator to continue working in this case.
-rw-r--r--Source/cmNinjaNormalTargetGenerator.cxx17
1 files changed, 15 insertions, 2 deletions
diff --git a/Source/cmNinjaNormalTargetGenerator.cxx b/Source/cmNinjaNormalTargetGenerator.cxx
index e344df4..a05719d 100644
--- a/Source/cmNinjaNormalTargetGenerator.cxx
+++ b/Source/cmNinjaNormalTargetGenerator.cxx
@@ -110,13 +110,26 @@ void cmNinjaNormalTargetGenerator::WriteLanguagesRules()
<< "\n\n";
#endif
+ // Write rules for languages compiled in this target.
std::set<std::string> languages;
- this->GetTarget()->GetLanguages(languages,
- this->GetMakefile()->GetSafeDefinition("CMAKE_BUILD_TYPE"));
+ std::vector<cmSourceFile*> sourceFiles;
+ this->GetTarget()->GetSourceFiles(sourceFiles,
+ this->GetMakefile()->GetSafeDefinition("CMAKE_BUILD_TYPE"));
+ for(std::vector<cmSourceFile*>::const_iterator
+ i = sourceFiles.begin(); i != sourceFiles.end(); ++i)
+ {
+ const std::string& lang = (*i)->GetLanguage();
+ if(!lang.empty())
+ {
+ languages.insert(lang);
+ }
+ }
for(std::set<std::string>::const_iterator l = languages.begin();
l != languages.end();
++l)
+ {
this->WriteLanguageRules(*l);
+ }
}
const char *cmNinjaNormalTargetGenerator::GetVisibleTypeName() const