diff options
author | Robert Maynard <rmaynard@nvidia.com> | 2022-04-27 17:54:42 (GMT) |
---|---|---|
committer | Robert Maynard <rmaynard@nvidia.com> | 2022-05-04 13:33:35 (GMT) |
commit | 627ef4c1d002cf642ef0ef9048c5e3fa24069516 (patch) | |
tree | 810f7b1cd4c27b9e20fee545147b25192fcd3de9 /Source | |
parent | 1d82670bd4daff26d0d0169820b289bc401f4943 (diff) | |
download | CMake-627ef4c1d002cf642ef0ef9048c5e3fa24069516.zip CMake-627ef4c1d002cf642ef0ef9048c5e3fa24069516.tar.gz CMake-627ef4c1d002cf642ef0ef9048c5e3fa24069516.tar.bz2 |
Provide guidance when trying to use non-enabled language
Fixes #23463
Diffstat (limited to 'Source')
-rw-r--r-- | Source/cmCommonTargetGenerator.cxx | 30 | ||||
-rw-r--r-- | Source/cmCommonTargetGenerator.h | 4 | ||||
-rw-r--r-- | Source/cmMakefileTargetGenerator.cxx | 14 | ||||
-rw-r--r-- | Source/cmNinjaNormalTargetGenerator.cxx | 10 |
4 files changed, 45 insertions, 13 deletions
diff --git a/Source/cmCommonTargetGenerator.cxx b/Source/cmCommonTargetGenerator.cxx index 129ef4b..b172c20 100644 --- a/Source/cmCommonTargetGenerator.cxx +++ b/Source/cmCommonTargetGenerator.cxx @@ -2,7 +2,7 @@ file Copyright.txt or https://cmake.org/licensing for details. */ #include "cmCommonTargetGenerator.h" -#include <set> +#include <algorithm> #include <sstream> #include <utility> @@ -13,9 +13,11 @@ #include "cmLocalCommonGenerator.h" #include "cmLocalGenerator.h" #include "cmMakefile.h" +#include "cmMessageType.h" #include "cmOutputConverter.h" #include "cmRange.h" #include "cmSourceFile.h" +#include "cmState.h" #include "cmStateTypes.h" #include "cmStringAlgorithms.h" #include "cmTarget.h" @@ -321,3 +323,29 @@ std::string cmCommonTargetGenerator::GetLinkerLauncher( } return std::string(); } + +bool cmCommonTargetGenerator::HaveRequiredLanguages( + const std::vector<cmSourceFile const*>& sources, + std::set<std::string>& languagesNeeded) const +{ + for (cmSourceFile const* sf : sources) { + languagesNeeded.insert(sf->GetLanguage()); + } + + auto* makefile = this->Makefile; + auto* state = makefile->GetState(); + auto unary = [&state, &makefile](const std::string& lang) -> bool { + const bool valid = state->GetLanguageEnabled(lang); + if (!valid) { + makefile->IssueMessage( + MessageType::FATAL_ERROR, + cmStrCat("The language ", lang, + " was requested for compilation but was not enabled." + " To enable a language it needs to be specified in a" + " 'project' or 'enable_language' command in the root" + " CMakeLists.txt")); + } + return valid; + }; + return std::all_of(languagesNeeded.cbegin(), languagesNeeded.cend(), unary); +} diff --git a/Source/cmCommonTargetGenerator.h b/Source/cmCommonTargetGenerator.h index 5aba1c6..1b804b4 100644 --- a/Source/cmCommonTargetGenerator.h +++ b/Source/cmCommonTargetGenerator.h @@ -5,6 +5,7 @@ #include "cmConfigure.h" // IWYU pragma: keep #include <map> +#include <set> #include <string> #include <vector> @@ -74,6 +75,9 @@ protected: std::string GetLinkerLauncher(const std::string& config); + bool HaveRequiredLanguages(const std::vector<cmSourceFile const*>& sources, + std::set<std::string>& languagesNeeded) const; + private: using ByLanguageMap = std::map<std::string, std::string>; struct ByConfig diff --git a/Source/cmMakefileTargetGenerator.cxx b/Source/cmMakefileTargetGenerator.cxx index 1c92c7f..aec6577 100644 --- a/Source/cmMakefileTargetGenerator.cxx +++ b/Source/cmMakefileTargetGenerator.cxx @@ -305,9 +305,14 @@ void cmMakefileTargetGenerator::WriteTargetBuildRules() std::vector<cmSourceFile const*> objectSources; this->GeneratorTarget->GetObjectSources(objectSources, this->GetConfigName()); - for (cmSourceFile const* sf : objectSources) { - // Generate this object file's rule file. - this->WriteObjectRuleFiles(*sf); + + // validate that all languages requested are enabled. + std::set<std::string> requiredLangs; + if (this->HaveRequiredLanguages(objectSources, requiredLangs)) { + for (cmSourceFile const* sf : objectSources) { + // Generate this object file's rule file. + this->WriteObjectRuleFiles(*sf); + } } } @@ -532,8 +537,7 @@ void cmMakefileTargetGenerator::WriteObjectRuleFiles( cmSourceFile const& source) { // Identify the language of the source file. - const std::string& lang = - this->LocalGenerator->GetSourceFileLanguage(source); + const std::string& lang = source.GetLanguage(); if (lang.empty()) { // don't know anything about this file so skip it return; diff --git a/Source/cmNinjaNormalTargetGenerator.cxx b/Source/cmNinjaNormalTargetGenerator.cxx index 1c5bac8..4f6da0e 100644 --- a/Source/cmNinjaNormalTargetGenerator.cxx +++ b/Source/cmNinjaNormalTargetGenerator.cxx @@ -126,15 +126,11 @@ void cmNinjaNormalTargetGenerator::WriteLanguagesRules( std::set<std::string> languages; std::vector<cmSourceFile const*> sourceFiles; this->GetGeneratorTarget()->GetObjectSources(sourceFiles, config); - for (cmSourceFile const* sf : sourceFiles) { - std::string const lang = sf->GetLanguage(); - if (!lang.empty()) { - languages.insert(lang); + if (this->HaveRequiredLanguages(sourceFiles, languages)) { + for (std::string const& language : languages) { + this->WriteLanguageRules(language, config); } } - for (std::string const& language : languages) { - this->WriteLanguageRules(language, config); - } } const char* cmNinjaNormalTargetGenerator::GetVisibleTypeName() const |