summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarc Chevrier <marc.chevrier@gmail.com>2022-09-07 13:20:53 (GMT)
committerMarc Chevrier <marc.chevrier@gmail.com>2022-09-07 13:20:53 (GMT)
commit985b4c82a64c064e1d22351091206e73ed6fc727 (patch)
treebde65e548731d5f43b5ebaa666307401cba118ac
parenta47eef32a30599e01e445e6dd69d4702bceae1bd (diff)
downloadCMake-985b4c82a64c064e1d22351091206e73ed6fc727.zip
CMake-985b4c82a64c064e1d22351091206e73ed6fc727.tar.gz
CMake-985b4c82a64c064e1d22351091206e73ed6fc727.tar.bz2
Check link libraries properties: fix performances regression
Fixes: #23939
-rw-r--r--Source/cmLinkLibrariesCommand.cxx2
-rw-r--r--Source/cmMakefile.cxx25
-rw-r--r--Source/cmMakefile.h1
-rw-r--r--Source/cmTarget.cxx80
-rw-r--r--Source/cmTargetLinkLibrariesCommand.cxx3
-rw-r--r--Tests/RunCMake/GenEx-LINK_GROUP/forbidden-arguments-stderr.txt6
-rw-r--r--Tests/RunCMake/GenEx-LINK_LIBRARY/forbidden-arguments-stderr.txt4
7 files changed, 51 insertions, 70 deletions
diff --git a/Source/cmLinkLibrariesCommand.cxx b/Source/cmLinkLibrariesCommand.cxx
index ed89e91..2b8f836 100644
--- a/Source/cmLinkLibrariesCommand.cxx
+++ b/Source/cmLinkLibrariesCommand.cxx
@@ -35,7 +35,5 @@ bool cmLinkLibrariesCommand(std::vector<std::string> const& args,
mf.AppendProperty("LINK_LIBRARIES", *i);
}
- mf.CheckProperty("LINK_LIBRARIES");
-
return true;
}
diff --git a/Source/cmMakefile.cxx b/Source/cmMakefile.cxx
index 628eb1d..469eac3 100644
--- a/Source/cmMakefile.cxx
+++ b/Source/cmMakefile.cxx
@@ -3987,31 +3987,6 @@ std::vector<std::string> cmMakefile::GetPropertyKeys() const
return this->StateSnapshot.GetDirectory().GetPropertyKeys();
}
-void cmMakefile::CheckProperty(const std::string& prop) const
-{
- // Certain properties need checking.
- if (prop == "LINK_LIBRARIES") {
- if (cmValue value = this->GetProperty(prop)) {
- // Look for <LINK_LIBRARY:> internal pattern
- static cmsys::RegularExpression linkPattern(
- "(^|;)(</?LINK_(LIBRARY|GROUP):[^;>]*>)(;|$)");
- if (!linkPattern.find(value)) {
- return;
- }
-
- // Report an error.
- this->IssueMessage(
- MessageType::FATAL_ERROR,
- cmStrCat("Property ", prop, " contains the invalid item \"",
- linkPattern.match(2), "\". The ", prop,
- " property may contain the generator-expression \"$<LINK_",
- linkPattern.match(3),
- ":...>\" which may be used to specify how the libraries are "
- "linked."));
- }
- }
-}
-
cmTarget* cmMakefile::FindLocalNonAliasTarget(const std::string& name) const
{
auto i = this->Targets.find(name);
diff --git a/Source/cmMakefile.h b/Source/cmMakefile.h
index e7b9716..27838b2 100644
--- a/Source/cmMakefile.h
+++ b/Source/cmMakefile.h
@@ -794,7 +794,6 @@ public:
cmValue GetProperty(const std::string& prop, bool chain) const;
bool GetPropertyAsBool(const std::string& prop) const;
std::vector<std::string> GetPropertyKeys() const;
- void CheckProperty(const std::string& prop) const;
//! Initialize a makefile from its parent
void InitializeFromParent(cmMakefile* parent);
diff --git a/Source/cmTarget.cxx b/Source/cmTarget.cxx
index 5838dd2..cbe5d7d 100644
--- a/Source/cmTarget.cxx
+++ b/Source/cmTarget.cxx
@@ -1881,6 +1881,40 @@ void cmTarget::AppendBuildInterfaceIncludes()
}
}
+namespace {
+bool CheckLinkLibraryPattern(cm::string_view property,
+ const std::vector<BT<std::string>>& value,
+ cmake* context)
+{
+ // Look for <LINK_LIBRARY:> and </LINK_LIBRARY:> internal tags
+ static cmsys::RegularExpression linkPattern(
+ "(^|;)(</?LINK_(LIBRARY|GROUP):[^;>]*>)(;|$)");
+
+ bool isValid = true;
+
+ for (const auto& item : value) {
+ if (!linkPattern.find(item.Value)) {
+ continue;
+ }
+
+ isValid = false;
+
+ // Report an error.
+ context->IssueMessage(
+ MessageType::FATAL_ERROR,
+ cmStrCat(
+ "Property ", property, " contains the invalid item \"",
+ linkPattern.match(2), "\". The ", property,
+ " property may contain the generator-expression \"$<LINK_",
+ linkPattern.match(3),
+ ":...>\" which may be used to specify how the libraries are linked."),
+ item.Backtrace);
+ }
+
+ return isValid;
+}
+}
+
void cmTarget::FinalizeTargetConfiguration(
const cmBTStringRange& noConfigCompileDefinitions,
cm::optional<std::map<std::string, cmValue>>& perConfigCompileDefinitions)
@@ -1889,6 +1923,18 @@ void cmTarget::FinalizeTargetConfiguration(
return;
}
+ if (!CheckLinkLibraryPattern("LINK_LIBRARIES"_s,
+ this->impl->LinkImplementationPropertyEntries,
+ this->GetMakefile()->GetCMakeInstance()) ||
+ !CheckLinkLibraryPattern("INTERFACE_LINK_LIBRARIES"_s,
+ this->impl->LinkInterfacePropertyEntries,
+ this->GetMakefile()->GetCMakeInstance()) ||
+ !CheckLinkLibraryPattern("INTERFACE_LINK_LIBRARIES_DIRECT"_s,
+ this->impl->LinkInterfaceDirectPropertyEntries,
+ this->GetMakefile()->GetCMakeInstance())) {
+ return;
+ }
+
this->AppendBuildInterfaceIncludes();
if (this->GetType() == cmStateEnums::INTERFACE_LIBRARY) {
@@ -1969,27 +2015,6 @@ void cmTarget::InsertPrecompileHeader(BT<std::string> const& entry)
}
namespace {
-void CheckLinkLibraryPattern(const std::string& property,
- const std::string& value, cmMakefile* context)
-{
- // Look for <LINK_LIBRARY:> and </LINK_LIBRARY:> internal tags
- static cmsys::RegularExpression linkPattern(
- "(^|;)(</?LINK_(LIBRARY|GROUP):[^;>]*>)(;|$)");
- if (!linkPattern.find(value)) {
- return;
- }
-
- // Report an error.
- context->IssueMessage(
- MessageType::FATAL_ERROR,
- cmStrCat(
- "Property ", property, " contains the invalid item \"",
- linkPattern.match(2), "\". The ", property,
- " property may contain the generator-expression \"$<LINK_",
- linkPattern.match(3),
- ":...>\" which may be used to specify how the libraries are linked."));
-}
-
void CheckLINK_INTERFACE_LIBRARIES(const std::string& prop,
const std::string& value,
cmMakefile* context, bool imported)
@@ -2024,13 +2049,6 @@ void CheckLINK_INTERFACE_LIBRARIES(const std::string& prop,
}
context->IssueMessage(MessageType::FATAL_ERROR, e.str());
}
-
- CheckLinkLibraryPattern(base, value, context);
-}
-
-void CheckLINK_LIBRARIES(const std::string& value, cmMakefile* context)
-{
- CheckLinkLibraryPattern("LINK_LIBRARIES", value, context);
}
void CheckINTERFACE_LINK_LIBRARIES(const std::string& value,
@@ -2051,8 +2069,6 @@ void CheckINTERFACE_LINK_LIBRARIES(const std::string& value,
context->IssueMessage(MessageType::FATAL_ERROR, e.str());
}
-
- CheckLinkLibraryPattern("INTERFACE_LINK_LIBRARIES", value, context);
}
void CheckIMPORTED_GLOBAL(const cmTarget* target, cmMakefile* context)
@@ -2085,10 +2101,6 @@ void cmTarget::CheckProperty(const std::string& prop,
if (cmValue value = this->GetProperty(prop)) {
CheckLINK_INTERFACE_LIBRARIES(prop, *value, context, true);
}
- } else if (prop == "LINK_LIBRARIES") {
- if (cmValue value = this->GetProperty(prop)) {
- CheckLINK_LIBRARIES(*value, context);
- }
} else if (prop == "INTERFACE_LINK_LIBRARIES") {
if (cmValue value = this->GetProperty(prop)) {
CheckINTERFACE_LINK_LIBRARIES(*value, context);
diff --git a/Source/cmTargetLinkLibrariesCommand.cxx b/Source/cmTargetLinkLibrariesCommand.cxx
index ba901d0..af870da 100644
--- a/Source/cmTargetLinkLibrariesCommand.cxx
+++ b/Source/cmTargetLinkLibrariesCommand.cxx
@@ -379,9 +379,6 @@ bool cmTargetLinkLibrariesCommand(std::vector<std::string> const& args,
target->SetProperty("LINK_INTERFACE_LIBRARIES", "");
}
- target->CheckProperty("LINK_LIBRARIES", &mf);
- target->CheckProperty("INTERFACE_LINK_LIBRARIES", &mf);
-
return true;
}
diff --git a/Tests/RunCMake/GenEx-LINK_GROUP/forbidden-arguments-stderr.txt b/Tests/RunCMake/GenEx-LINK_GROUP/forbidden-arguments-stderr.txt
index bae6505..b29303b 100644
--- a/Tests/RunCMake/GenEx-LINK_GROUP/forbidden-arguments-stderr.txt
+++ b/Tests/RunCMake/GenEx-LINK_GROUP/forbidden-arguments-stderr.txt
@@ -1,6 +1,6 @@
-CMake Error at forbidden-arguments.cmake:[0-9]+ \(link_libraries\):
- Property LINK_LIBRARIES contains the invalid item "<LINK_GROUP:feat>". The
- LINK_LIBRARIES property may contain the generator-expression
+CMake Error at forbidden-arguments.cmake:[0-9]+ \(add_library\):
+ Property LINK_LIBRARIES contains the invalid item "</LINK_GROUP:feat>".
+ The LINK_LIBRARIES property may contain the generator-expression
"\$<LINK_GROUP:...>" which may be used to specify how the libraries are
linked.
Call Stack \(most recent call first\):
diff --git a/Tests/RunCMake/GenEx-LINK_LIBRARY/forbidden-arguments-stderr.txt b/Tests/RunCMake/GenEx-LINK_LIBRARY/forbidden-arguments-stderr.txt
index 5245dd8..fc8e383 100644
--- a/Tests/RunCMake/GenEx-LINK_LIBRARY/forbidden-arguments-stderr.txt
+++ b/Tests/RunCMake/GenEx-LINK_LIBRARY/forbidden-arguments-stderr.txt
@@ -1,5 +1,5 @@
-CMake Error at forbidden-arguments.cmake:[0-9]+ \(link_libraries\):
- Property LINK_LIBRARIES contains the invalid item "<LINK_LIBRARY:feat>".
+CMake Error at forbidden-arguments.cmake:[0-9]+ \(add_library\):
+ Property LINK_LIBRARIES contains the invalid item "</LINK_LIBRARY:feat>".
The LINK_LIBRARIES property may contain the generator-expression
"\$<LINK_LIBRARY:...>" which may be used to specify how the libraries are
linked.