Merge topic 'enable_language-deduplicate'

e3c8012ccd Help: Document enable_language accepting multiple languages
b4fd385c9b cmMakefile: Dedupe languages when enabling them
66bfe14309 cmMakefile: Refactor parameter and variable names for EnableLanguage

Acked-by: Kitware Robot <kwrobot@kitware.com>
Acked-by: buildbot <buildbot@kitware.com>
Merge-request: !7426
This commit is contained in:
Brad King
2022-07-06 13:16:25 +00:00
committed by Kitware Robot
5 changed files with 67 additions and 16 deletions
+36 -12
View File
@@ -3479,7 +3479,7 @@ void cmMakefile::AddTargetObject(std::string const& tgtName,
#endif
}
void cmMakefile::EnableLanguage(std::vector<std::string> const& lang,
void cmMakefile::EnableLanguage(std::vector<std::string> const& languages,
bool optional)
{
if (this->DeferRunning) {
@@ -3491,24 +3491,48 @@ void cmMakefile::EnableLanguage(std::vector<std::string> const& lang,
if (const char* def = this->GetGlobalGenerator()->GetCMakeCFGIntDir()) {
this->AddDefinition("CMAKE_CFG_INTDIR", def);
}
std::vector<std::string> unique_languages;
{
std::vector<std::string> duplicate_languages;
for (std::string const& language : languages) {
if (!cm::contains(unique_languages, language)) {
unique_languages.push_back(language);
} else if (!cm::contains(duplicate_languages, language)) {
duplicate_languages.push_back(language);
}
}
if (!duplicate_languages.empty()) {
auto quantity = duplicate_languages.size() == 1 ? std::string(" has")
: std::string("s have");
this->IssueMessage(MessageType::AUTHOR_WARNING,
"Languages to be enabled may not be specified more "
"than once at the same time. The following language" +
quantity + " been specified multiple times: " +
cmJoin(duplicate_languages, ", "));
}
}
// If RC is explicitly listed we need to do it after other languages.
// On some platforms we enable RC implicitly while enabling others.
// Do not let that look like recursive enable_language(RC).
std::vector<std::string> langs;
std::vector<std::string> langsRC;
langs.reserve(lang.size());
for (std::string const& i : lang) {
if (i == "RC") {
langsRC.push_back(i);
std::vector<std::string> languages_without_RC;
std::vector<std::string> languages_for_RC;
languages_without_RC.reserve(unique_languages.size());
for (std::string const& language : unique_languages) {
if (language == "RC") {
languages_for_RC.push_back(language);
} else {
langs.push_back(i);
languages_without_RC.push_back(language);
}
}
if (!langs.empty()) {
this->GetGlobalGenerator()->EnableLanguage(langs, this, optional);
if (!languages_without_RC.empty()) {
this->GetGlobalGenerator()->EnableLanguage(languages_without_RC, this,
optional);
}
if (!langsRC.empty()) {
this->GetGlobalGenerator()->EnableLanguage(langsRC, this, optional);
if (!languages_for_RC.empty()) {
this->GetGlobalGenerator()->EnableLanguage(languages_for_RC, this,
optional);
}
}