From 85242b7df63a8097c5672c3053873aec371b6af7 Mon Sep 17 00:00:00 2001 From: Ben Boeckel Date: Mon, 3 Feb 2014 16:09:16 -0500 Subject: cmTarget: Use else/if trees rather than an if tree Skips lots of unnecessary string comparisons. --- Source/cmTarget.cxx | 88 +++++++++++++++++++++++------------------------------ 1 file changed, 38 insertions(+), 50 deletions(-) diff --git a/Source/cmTarget.cxx b/Source/cmTarget.cxx index b4688c4..641ac41 100644 --- a/Source/cmTarget.cxx +++ b/Source/cmTarget.cxx @@ -1750,15 +1750,14 @@ void cmTarget::SetProperty(const std::string& prop, const char* value) this->Makefile->IssueMessage(cmake::FATAL_ERROR, e.str()); return; } - - if (prop == "NAME") + else if (prop == "NAME") { cmOStringStream e; e << "NAME property is read-only\n"; this->Makefile->IssueMessage(cmake::FATAL_ERROR, e.str()); return; } - if(prop == "INCLUDE_DIRECTORIES") + else if(prop == "INCLUDE_DIRECTORIES") { cmListFileBacktrace lfbt = this->Makefile->GetBacktrace(); cmGeneratorExpression ge(&lfbt); @@ -1766,9 +1765,8 @@ void cmTarget::SetProperty(const std::string& prop, const char* value) cmsys::auto_ptr cge = ge.Parse(value); this->Internal->IncludeDirectoriesEntries.push_back( new cmTargetInternals::TargetPropertyEntry(cge)); - return; } - if(prop == "COMPILE_OPTIONS") + else if(prop == "COMPILE_OPTIONS") { cmListFileBacktrace lfbt = this->Makefile->GetBacktrace(); cmGeneratorExpression ge(&lfbt); @@ -1776,9 +1774,8 @@ void cmTarget::SetProperty(const std::string& prop, const char* value) cmsys::auto_ptr cge = ge.Parse(value); this->Internal->CompileOptionsEntries.push_back( new cmTargetInternals::TargetPropertyEntry(cge)); - return; } - if(prop == "COMPILE_FEATURES") + else if(prop == "COMPILE_FEATURES") { cmListFileBacktrace lfbt = this->Makefile->GetBacktrace(); cmGeneratorExpression ge(&lfbt); @@ -1786,9 +1783,8 @@ void cmTarget::SetProperty(const std::string& prop, const char* value) cmsys::auto_ptr cge = ge.Parse(value); this->Internal->CompileFeaturesEntries.push_back( new cmTargetInternals::TargetPropertyEntry(cge)); - return; } - if(prop == "COMPILE_DEFINITIONS") + else if(prop == "COMPILE_DEFINITIONS") { cmListFileBacktrace lfbt = this->Makefile->GetBacktrace(); cmGeneratorExpression ge(&lfbt); @@ -1796,25 +1792,22 @@ void cmTarget::SetProperty(const std::string& prop, const char* value) cmsys::auto_ptr cge = ge.Parse(value); this->Internal->CompileDefinitionsEntries.push_back( new cmTargetInternals::TargetPropertyEntry(cge)); - return; } - if(prop == "EXPORT_NAME" && this->IsImported()) + else if(prop == "EXPORT_NAME" && this->IsImported()) { cmOStringStream e; e << "EXPORT_NAME property can't be set on imported targets (\"" << this->Name << "\")\n"; this->Makefile->IssueMessage(cmake::FATAL_ERROR, e.str()); - return; } - if (prop == "LINK_LIBRARIES") + else if (prop == "LINK_LIBRARIES") { this->Internal->LinkImplementationPropertyEntries.clear(); cmListFileBacktrace lfbt = this->Makefile->GetBacktrace(); cmValueWithOrigin entry(value, lfbt); this->Internal->LinkImplementationPropertyEntries.push_back(entry); - return; } - if (prop == "SOURCES") + else if (prop == "SOURCES") { if(this->IsImported()) { @@ -1831,10 +1824,12 @@ void cmTarget::SetProperty(const std::string& prop, const char* value) cmsys::auto_ptr cge = ge.Parse(value); this->Internal->SourceEntries.push_back( new cmTargetInternals::TargetPropertyEntry(cge)); - return; } - this->Properties.SetProperty(prop, value, cmProperty::TARGET); - this->MaybeInvalidatePropertyCache(prop); + else + { + this->Properties.SetProperty(prop, value, cmProperty::TARGET); + this->MaybeInvalidatePropertyCache(prop); + } } //---------------------------------------------------------------------------- @@ -1850,61 +1845,55 @@ void cmTarget::AppendProperty(const std::string& prop, const char* value, this->Makefile->IssueMessage(cmake::FATAL_ERROR, e.str()); return; } - if (prop == "NAME") + else if (prop == "NAME") { cmOStringStream e; e << "NAME property is read-only\n"; this->Makefile->IssueMessage(cmake::FATAL_ERROR, e.str()); return; } - if(prop == "INCLUDE_DIRECTORIES") + else if(prop == "INCLUDE_DIRECTORIES") { cmListFileBacktrace lfbt = this->Makefile->GetBacktrace(); cmGeneratorExpression ge(&lfbt); this->Internal->IncludeDirectoriesEntries.push_back( new cmTargetInternals::TargetPropertyEntry(ge.Parse(value))); - return; } - if(prop == "COMPILE_OPTIONS") + else if(prop == "COMPILE_OPTIONS") { cmListFileBacktrace lfbt = this->Makefile->GetBacktrace(); cmGeneratorExpression ge(&lfbt); this->Internal->CompileOptionsEntries.push_back( new cmTargetInternals::TargetPropertyEntry(ge.Parse(value))); - return; } - if(prop == "COMPILE_FEATURES") + else if(prop == "COMPILE_FEATURES") { cmListFileBacktrace lfbt = this->Makefile->GetBacktrace(); cmGeneratorExpression ge(&lfbt); this->Internal->CompileFeaturesEntries.push_back( new cmTargetInternals::TargetPropertyEntry(ge.Parse(value))); - return; } - if(prop == "COMPILE_DEFINITIONS") + else if(prop == "COMPILE_DEFINITIONS") { cmListFileBacktrace lfbt = this->Makefile->GetBacktrace(); cmGeneratorExpression ge(&lfbt); this->Internal->CompileDefinitionsEntries.push_back( new cmTargetInternals::TargetPropertyEntry(ge.Parse(value))); - return; } - if(prop == "EXPORT_NAME" && this->IsImported()) + else if(prop == "EXPORT_NAME" && this->IsImported()) { cmOStringStream e; e << "EXPORT_NAME property can't be set on imported targets (\"" << this->Name << "\")\n"; this->Makefile->IssueMessage(cmake::FATAL_ERROR, e.str()); - return; } - if (prop == "LINK_LIBRARIES") + else if (prop == "LINK_LIBRARIES") { cmListFileBacktrace lfbt = this->Makefile->GetBacktrace(); cmValueWithOrigin entry(value, lfbt); this->Internal->LinkImplementationPropertyEntries.push_back(entry); - return; } - if (prop == "SOURCES") + else if (prop == "SOURCES") { if(this->IsImported()) { @@ -1920,10 +1909,12 @@ void cmTarget::AppendProperty(const std::string& prop, const char* value, cmsys::auto_ptr cge = ge.Parse(value); this->Internal->SourceEntries.push_back( new cmTargetInternals::TargetPropertyEntry(cge)); - return; } - this->Properties.AppendProperty(prop, value, cmProperty::TARGET, asString); - this->MaybeInvalidatePropertyCache(prop); + else + { + this->Properties.AppendProperty(prop, value, cmProperty::TARGET, asString); + this->MaybeInvalidatePropertyCache(prop); + } } //---------------------------------------------------------------------------- @@ -3022,11 +3013,6 @@ const char *cmTarget::GetProperty(const std::string& prop, return 0; } - if (prop == "NAME") - { - return this->GetName().c_str(); - } - // Watch for special "computed" properties that are dependent on // other properties or variables. Always recompute them. if(this->GetType() == cmTarget::EXECUTABLE || @@ -3106,7 +3092,7 @@ const char *cmTarget::GetProperty(const std::string& prop, } return output.c_str(); } - if(prop == "COMPILE_OPTIONS") + else if(prop == "COMPILE_OPTIONS") { if (this->Internal->CompileOptionsEntries.empty()) { @@ -3129,7 +3115,7 @@ const char *cmTarget::GetProperty(const std::string& prop, } return output.c_str(); } - if(prop == "COMPILE_FEATURES") + else if(prop == "COMPILE_FEATURES") { if (this->Internal->CompileFeaturesEntries.empty()) { @@ -3152,7 +3138,7 @@ const char *cmTarget::GetProperty(const std::string& prop, } return output.c_str(); } - if(prop == "COMPILE_DEFINITIONS") + else if(prop == "COMPILE_DEFINITIONS") { if (this->Internal->CompileDefinitionsEntries.empty()) { @@ -3175,7 +3161,7 @@ const char *cmTarget::GetProperty(const std::string& prop, } return output.c_str(); } - if(prop == "LINK_LIBRARIES") + else if(prop == "LINK_LIBRARIES") { if (this->Internal->LinkImplementationPropertyEntries.empty()) { @@ -3196,13 +3182,15 @@ const char *cmTarget::GetProperty(const std::string& prop, } return output.c_str(); } - - if (prop == "IMPORTED") + else if (prop == "IMPORTED") { return this->IsImported()?"TRUE":"FALSE"; } - - if(prop == "SOURCES") + else if (prop == "NAME") + { + return this->GetName().c_str(); + } + else if(prop == "SOURCES") { if (this->Internal->SourceEntries.empty()) { @@ -3299,12 +3287,12 @@ const char *cmTarget::GetProperty(const std::string& prop, this->Properties.SetProperty("SOURCES", ss.str().c_str(), cmProperty::TARGET); } - // the type property returns what type the target is - if (prop == "TYPE") + else if (prop == "TYPE") { return cmTarget::GetTargetTypeName(this->GetType()); } + bool chain = false; const char *retVal = this->Properties.GetPropertyValue(prop, cmProperty::TARGET, chain); -- cgit v0.12 From 4cfa918a9ae983274a7995ca89fb46fdf570b00c Mon Sep 17 00:00:00 2001 From: Ben Boeckel Date: Sat, 8 Feb 2014 05:27:24 -0500 Subject: cmTarget: Factor out common code --- Source/cmTarget.cxx | 72 +++++++++++++++-------------------------------------- 1 file changed, 20 insertions(+), 52 deletions(-) diff --git a/Source/cmTarget.cxx b/Source/cmTarget.cxx index 641ac41..8be14f3 100644 --- a/Source/cmTarget.cxx +++ b/Source/cmTarget.cxx @@ -2994,6 +2994,22 @@ bool cmTarget::HandleLocationPropertyPolicy(cmMakefile* context) const } //---------------------------------------------------------------------------- +static void MakePropertyList(std::string& output, + std::vector const& values) +{ + output = ""; + std::string sep; + for (std::vector::const_iterator + it = values.begin(), end = values.end(); + it != end; ++it) + { + output += sep; + output += (*it)->ge->GetInput(); + sep = ";"; + } +} + +//---------------------------------------------------------------------------- const char *cmTarget::GetProperty(const std::string& prop) const { return this->GetProperty(prop, this->Makefile); @@ -3077,19 +3093,7 @@ const char *cmTarget::GetProperty(const std::string& prop, } static std::string output; - output = ""; - std::string sep; - typedef cmTargetInternals::TargetPropertyEntry - TargetPropertyEntry; - for (std::vector::const_iterator - it = this->Internal->IncludeDirectoriesEntries.begin(), - end = this->Internal->IncludeDirectoriesEntries.end(); - it != end; ++it) - { - output += sep; - output += (*it)->ge->GetInput(); - sep = ";"; - } + MakePropertyList(output, this->Internal->IncludeDirectoriesEntries); return output.c_str(); } else if(prop == "COMPILE_OPTIONS") @@ -3100,19 +3104,7 @@ const char *cmTarget::GetProperty(const std::string& prop, } static std::string output; - output = ""; - std::string sep; - typedef cmTargetInternals::TargetPropertyEntry - TargetPropertyEntry; - for (std::vector::const_iterator - it = this->Internal->CompileOptionsEntries.begin(), - end = this->Internal->CompileOptionsEntries.end(); - it != end; ++it) - { - output += sep; - output += (*it)->ge->GetInput(); - sep = ";"; - } + MakePropertyList(output, this->Internal->CompileOptionsEntries); return output.c_str(); } else if(prop == "COMPILE_FEATURES") @@ -3123,19 +3115,7 @@ const char *cmTarget::GetProperty(const std::string& prop, } static std::string output; - output = ""; - std::string sep; - typedef cmTargetInternals::TargetPropertyEntry - TargetPropertyEntry; - for (std::vector::const_iterator - it = this->Internal->CompileFeaturesEntries.begin(), - end = this->Internal->CompileFeaturesEntries.end(); - it != end; ++it) - { - output += sep; - output += (*it)->ge->GetInput(); - sep = ";"; - } + MakePropertyList(output, this->Internal->CompileFeaturesEntries); return output.c_str(); } else if(prop == "COMPILE_DEFINITIONS") @@ -3146,19 +3126,7 @@ const char *cmTarget::GetProperty(const std::string& prop, } static std::string output; - output = ""; - std::string sep; - typedef cmTargetInternals::TargetPropertyEntry - TargetPropertyEntry; - for (std::vector::const_iterator - it = this->Internal->CompileDefinitionsEntries.begin(), - end = this->Internal->CompileDefinitionsEntries.end(); - it != end; ++it) - { - output += sep; - output += (*it)->ge->GetInput(); - sep = ";"; - } + MakePropertyList(output, this->Internal->CompileDefinitionsEntries); return output.c_str(); } else if(prop == "LINK_LIBRARIES") -- cgit v0.12 From 97ce676e75900dfeeb30ea1c6ba5a139befe9562 Mon Sep 17 00:00:00 2001 From: Ben Boeckel Date: Sat, 8 Feb 2014 05:27:45 -0500 Subject: cmTarget: Fast path for regular properties --- Source/cmTarget.cxx | 298 +++++++++++++++++++++++++++------------------------- 1 file changed, 157 insertions(+), 141 deletions(-) diff --git a/Source/cmTarget.cxx b/Source/cmTarget.cxx index 8be14f3..62b30fd 100644 --- a/Source/cmTarget.cxx +++ b/Source/cmTarget.cxx @@ -3085,180 +3085,196 @@ const char *cmTarget::GetProperty(const std::string& prop, } } } - if(prop == "INCLUDE_DIRECTORIES") + static std::set specialProps; + if(specialProps.empty()) { - if (this->Internal->IncludeDirectoriesEntries.empty()) - { - return 0; - } - - static std::string output; - MakePropertyList(output, this->Internal->IncludeDirectoriesEntries); - return output.c_str(); + specialProps.insert("INCLUDE_DIRECTORIES"); + specialProps.insert("COMPILE_FEATURES"); + specialProps.insert("COMPILE_OPTIONS"); + specialProps.insert("COMPILE_DEFINITIONS"); + specialProps.insert("LINK_LIBRARIES"); + specialProps.insert("IMPORTED"); + specialProps.insert("NAME"); + specialProps.insert("SOURCES"); + specialProps.insert("TYPE"); } - else if(prop == "COMPILE_OPTIONS") + if(specialProps.count(prop)) { - if (this->Internal->CompileOptionsEntries.empty()) + if(prop == "INCLUDE_DIRECTORIES") { - return 0; - } + if (this->Internal->IncludeDirectoriesEntries.empty()) + { + return 0; + } - static std::string output; - MakePropertyList(output, this->Internal->CompileOptionsEntries); - return output.c_str(); - } - else if(prop == "COMPILE_FEATURES") - { - if (this->Internal->CompileFeaturesEntries.empty()) - { - return 0; + static std::string output; + MakePropertyList(output, this->Internal->IncludeDirectoriesEntries); + return output.c_str(); } - - static std::string output; - MakePropertyList(output, this->Internal->CompileFeaturesEntries); - return output.c_str(); - } - else if(prop == "COMPILE_DEFINITIONS") - { - if (this->Internal->CompileDefinitionsEntries.empty()) + else if(prop == "COMPILE_OPTIONS") { - return 0; + if (this->Internal->CompileOptionsEntries.empty()) + { + return 0; + } + + static std::string output; + MakePropertyList(output, this->Internal->CompileOptionsEntries); + return output.c_str(); } + else if(prop == "COMPILE_FEATURES") + { + if (this->Internal->CompileFeaturesEntries.empty()) + { + return 0; + } - static std::string output; - MakePropertyList(output, this->Internal->CompileDefinitionsEntries); - return output.c_str(); - } - else if(prop == "LINK_LIBRARIES") - { - if (this->Internal->LinkImplementationPropertyEntries.empty()) + static std::string output; + MakePropertyList(output, this->Internal->CompileFeaturesEntries); + return output.c_str(); + } + else if(prop == "COMPILE_DEFINITIONS") { - return 0; + if (this->Internal->CompileDefinitionsEntries.empty()) + { + return 0; + } + + static std::string output; + MakePropertyList(output, this->Internal->CompileDefinitionsEntries); + return output.c_str(); } + else if(prop == "LINK_LIBRARIES") + { + if (this->Internal->LinkImplementationPropertyEntries.empty()) + { + return 0; + } - static std::string output; - output = ""; - std::string sep; - for (std::vector::const_iterator - it = this->Internal->LinkImplementationPropertyEntries.begin(), - end = this->Internal->LinkImplementationPropertyEntries.end(); - it != end; ++it) + static std::string output; + output = ""; + std::string sep; + for (std::vector::const_iterator + it = this->Internal->LinkImplementationPropertyEntries.begin(), + end = this->Internal->LinkImplementationPropertyEntries.end(); + it != end; ++it) + { + output += sep; + output += it->Value; + sep = ";"; + } + return output.c_str(); + } + else if (prop == "IMPORTED") { - output += sep; - output += it->Value; - sep = ";"; + return this->IsImported()?"TRUE":"FALSE"; } - return output.c_str(); - } - else if (prop == "IMPORTED") - { - return this->IsImported()?"TRUE":"FALSE"; - } - else if (prop == "NAME") - { - return this->GetName().c_str(); - } - else if(prop == "SOURCES") - { - if (this->Internal->SourceEntries.empty()) + else if (prop == "NAME") { - return 0; + return this->GetName().c_str(); } - - cmOStringStream ss; - const char* sep = ""; - typedef cmTargetInternals::TargetPropertyEntry - TargetPropertyEntry; - for(std::vector::const_iterator - i = this->Internal->SourceEntries.begin(); - i != this->Internal->SourceEntries.end(); ++i) + else if(prop == "SOURCES") { - std::string entry = (*i)->ge->GetInput(); + if (this->Internal->SourceEntries.empty()) + { + return 0; + } - std::vector files; - cmSystemTools::ExpandListArgument(entry, files); - for (std::vector::const_iterator - li = files.begin(); li != files.end(); ++li) + cmOStringStream ss; + const char* sep = ""; + typedef cmTargetInternals::TargetPropertyEntry + TargetPropertyEntry; + for(std::vector::const_iterator + i = this->Internal->SourceEntries.begin(); + i != this->Internal->SourceEntries.end(); ++i) { - if(cmHasLiteralPrefix(*li, "$size() - 1] == '>') - { - std::string objLibName = li->substr(17, li->size()-18); + std::string entry = (*i)->ge->GetInput(); - if (cmGeneratorExpression::Find(objLibName) != std::string::npos) + std::vector files; + cmSystemTools::ExpandListArgument(entry, files); + for (std::vector::const_iterator + li = files.begin(); li != files.end(); ++li) + { + if(cmHasLiteralPrefix(*li, "$size() - 1] == '>') { - ss << sep; - sep = ";"; - ss << *li; - continue; - } + std::string objLibName = li->substr(17, li->size()-18); - bool addContent = false; - bool noMessage = true; - cmOStringStream e; - cmake::MessageType messageType = cmake::AUTHOR_WARNING; - switch(context->GetPolicyStatus(cmPolicies::CMP0051)) - { - case cmPolicies::WARN: - e << (this->Makefile->GetPolicies() - ->GetPolicyWarning(cmPolicies::CMP0051)) << "\n"; - noMessage = false; - case cmPolicies::OLD: - break; - case cmPolicies::REQUIRED_ALWAYS: - case cmPolicies::REQUIRED_IF_USED: - case cmPolicies::NEW: - addContent = true; - } - if (!noMessage) - { - e << "Target \"" << this->Name << "\" contains $ " - "generator expression in its sources list. This content was not " - "previously part of the SOURCES property when that property was " - "read at configure time. Code reading that property needs to be " - "adapted to ignore the generator expression using the " - "string(GENEX_STRIP) command."; - context->IssueMessage(messageType, e.str()); + if (cmGeneratorExpression::Find(objLibName) != std::string::npos) + { + ss << sep; + sep = ";"; + ss << *li; + continue; + } + + bool addContent = false; + bool noMessage = true; + cmOStringStream e; + cmake::MessageType messageType = cmake::AUTHOR_WARNING; + switch(context->GetPolicyStatus(cmPolicies::CMP0051)) + { + case cmPolicies::WARN: + e << (this->Makefile->GetPolicies() + ->GetPolicyWarning(cmPolicies::CMP0051)) << "\n"; + noMessage = false; + case cmPolicies::OLD: + break; + case cmPolicies::REQUIRED_ALWAYS: + case cmPolicies::REQUIRED_IF_USED: + case cmPolicies::NEW: + addContent = true; + } + if (!noMessage) + { + e << "Target \"" << this->Name << "\" contains " + "$ generator expression in its sources list. " + "This content was not previously part of the SOURCES property " + "when that property was read at configure time. Code reading " + "that property needs to be adapted to ignore the generator " + "expression using the string(GENEX_STRIP) command."; + context->IssueMessage(messageType, e.str()); + } + if (addContent) + { + ss << sep; + sep = ";"; + ss << *li; + } } - if (addContent) + else if (cmGeneratorExpression::Find(*li) == std::string::npos) { ss << sep; sep = ";"; ss << *li; } - } - else if (cmGeneratorExpression::Find(*li) == std::string::npos) - { - ss << sep; - sep = ";"; - ss << *li; - } - else - { - cmSourceFile *sf = this->Makefile->GetOrCreateSource(*li); - // Construct what is known about this source file location. - cmSourceFileLocation const& location = sf->GetLocation(); - std::string sname = location.GetDirectory(); - if(!sname.empty()) + else { - sname += "/"; - } - sname += location.GetName(); + cmSourceFile *sf = this->Makefile->GetOrCreateSource(*li); + // Construct what is known about this source file location. + cmSourceFileLocation const& location = sf->GetLocation(); + std::string sname = location.GetDirectory(); + if(!sname.empty()) + { + sname += "/"; + } + sname += location.GetName(); - ss << sep; - sep = ";"; - // Append this list entry. - ss << sname; + ss << sep; + sep = ";"; + // Append this list entry. + ss << sname; + } } } + this->Properties.SetProperty("SOURCES", ss.str().c_str(), + cmProperty::TARGET); + } + // the type property returns what type the target is + else if (prop == "TYPE") + { + return cmTarget::GetTargetTypeName(this->GetType()); } - this->Properties.SetProperty("SOURCES", ss.str().c_str(), - cmProperty::TARGET); - } - // the type property returns what type the target is - else if (prop == "TYPE") - { - return cmTarget::GetTargetTypeName(this->GetType()); } bool chain = false; -- cgit v0.12 From cebefa71fad223f134529a2b859006360e465a80 Mon Sep 17 00:00:00 2001 From: Ben Boeckel Date: Sat, 8 Feb 2014 12:11:32 -0500 Subject: cmTarget: Sort special property checks The LINK_LIBRARIES property is by *far* the most popular. Move it to the top. TYPE is second, but with more generator expression usage, that may change in the future. --- Source/cmTarget.cxx | 54 ++++++++++++++++++++++++++--------------------------- 1 file changed, 27 insertions(+), 27 deletions(-) diff --git a/Source/cmTarget.cxx b/Source/cmTarget.cxx index 62b30fd..09eb8a4 100644 --- a/Source/cmTarget.cxx +++ b/Source/cmTarget.cxx @@ -3100,26 +3100,41 @@ const char *cmTarget::GetProperty(const std::string& prop, } if(specialProps.count(prop)) { - if(prop == "INCLUDE_DIRECTORIES") + if(prop == "LINK_LIBRARIES") { - if (this->Internal->IncludeDirectoriesEntries.empty()) + if (this->Internal->LinkImplementationPropertyEntries.empty()) { return 0; } static std::string output; - MakePropertyList(output, this->Internal->IncludeDirectoriesEntries); + output = ""; + std::string sep; + for (std::vector::const_iterator + it = this->Internal->LinkImplementationPropertyEntries.begin(), + end = this->Internal->LinkImplementationPropertyEntries.end(); + it != end; ++it) + { + output += sep; + output += it->Value; + sep = ";"; + } return output.c_str(); } - else if(prop == "COMPILE_OPTIONS") + // the type property returns what type the target is + else if (prop == "TYPE") { - if (this->Internal->CompileOptionsEntries.empty()) + return cmTarget::GetTargetTypeName(this->GetType()); + } + else if(prop == "INCLUDE_DIRECTORIES") + { + if (this->Internal->IncludeDirectoriesEntries.empty()) { return 0; } static std::string output; - MakePropertyList(output, this->Internal->CompileOptionsEntries); + MakePropertyList(output, this->Internal->IncludeDirectoriesEntries); return output.c_str(); } else if(prop == "COMPILE_FEATURES") @@ -3133,36 +3148,26 @@ const char *cmTarget::GetProperty(const std::string& prop, MakePropertyList(output, this->Internal->CompileFeaturesEntries); return output.c_str(); } - else if(prop == "COMPILE_DEFINITIONS") + else if(prop == "COMPILE_OPTIONS") { - if (this->Internal->CompileDefinitionsEntries.empty()) + if (this->Internal->CompileOptionsEntries.empty()) { return 0; } static std::string output; - MakePropertyList(output, this->Internal->CompileDefinitionsEntries); + MakePropertyList(output, this->Internal->CompileOptionsEntries); return output.c_str(); } - else if(prop == "LINK_LIBRARIES") + else if(prop == "COMPILE_DEFINITIONS") { - if (this->Internal->LinkImplementationPropertyEntries.empty()) + if (this->Internal->CompileDefinitionsEntries.empty()) { return 0; } static std::string output; - output = ""; - std::string sep; - for (std::vector::const_iterator - it = this->Internal->LinkImplementationPropertyEntries.begin(), - end = this->Internal->LinkImplementationPropertyEntries.end(); - it != end; ++it) - { - output += sep; - output += it->Value; - sep = ";"; - } + MakePropertyList(output, this->Internal->CompileDefinitionsEntries); return output.c_str(); } else if (prop == "IMPORTED") @@ -3270,11 +3275,6 @@ const char *cmTarget::GetProperty(const std::string& prop, this->Properties.SetProperty("SOURCES", ss.str().c_str(), cmProperty::TARGET); } - // the type property returns what type the target is - else if (prop == "TYPE") - { - return cmTarget::GetTargetTypeName(this->GetType()); - } } bool chain = false; -- cgit v0.12 From 660769151a7f628f92eb28d77bcae854eaae54c2 Mon Sep 17 00:00:00 2001 From: Ben Boeckel Date: Sat, 8 Feb 2014 12:12:27 -0500 Subject: cmTarget: Use static strings for special property names The function is called enough that the std::string/cstr comparisons are expensive from the strlen. Cache the strings for faster comparisons. --- Source/cmTarget.cxx | 91 ++++++++++++++++++++++++++++++++--------------------- 1 file changed, 55 insertions(+), 36 deletions(-) diff --git a/Source/cmTarget.cxx b/Source/cmTarget.cxx index 09eb8a4..2424fe7 100644 --- a/Source/cmTarget.cxx +++ b/Source/cmTarget.cxx @@ -3037,7 +3037,8 @@ const char *cmTarget::GetProperty(const std::string& prop, this->GetType() == cmTarget::MODULE_LIBRARY || this->GetType() == cmTarget::UNKNOWN_LIBRARY) { - if(prop == "LOCATION") + static const std::string propLOCATION = "LOCATION"; + if(prop == propLOCATION) { if (!this->HandleLocationPropertyPolicy(context)) { @@ -3053,12 +3054,12 @@ const char *cmTarget::GetProperty(const std::string& prop, // cannot take into account the per-configuration name of the // target because the configuration type may not be known at // CMake time. - this->Properties.SetProperty("LOCATION", this->GetLocationForBuild(), + this->Properties.SetProperty(propLOCATION, this->GetLocationForBuild(), cmProperty::TARGET); } // Support "LOCATION_". - if(cmHasLiteralPrefix(prop, "LOCATION_")) + else if(cmHasLiteralPrefix(prop, "LOCATION_")) { if (!this->HandleLocationPropertyPolicy(context)) { @@ -3086,21 +3087,33 @@ const char *cmTarget::GetProperty(const std::string& prop, } } static std::set specialProps; +#define MAKE_STATIC_PROP(PROP) \ + static const std::string prop##PROP = #PROP + MAKE_STATIC_PROP(LINK_LIBRARIES); + MAKE_STATIC_PROP(TYPE); + MAKE_STATIC_PROP(INCLUDE_DIRECTORIES); + MAKE_STATIC_PROP(COMPILE_FEATURES); + MAKE_STATIC_PROP(COMPILE_OPTIONS); + MAKE_STATIC_PROP(COMPILE_DEFINITIONS); + MAKE_STATIC_PROP(IMPORTED); + MAKE_STATIC_PROP(NAME); + MAKE_STATIC_PROP(SOURCES); +#undef MAKE_STATIC_PROP if(specialProps.empty()) { - specialProps.insert("INCLUDE_DIRECTORIES"); - specialProps.insert("COMPILE_FEATURES"); - specialProps.insert("COMPILE_OPTIONS"); - specialProps.insert("COMPILE_DEFINITIONS"); - specialProps.insert("LINK_LIBRARIES"); - specialProps.insert("IMPORTED"); - specialProps.insert("NAME"); - specialProps.insert("SOURCES"); - specialProps.insert("TYPE"); + specialProps.insert(propLINK_LIBRARIES); + specialProps.insert(propTYPE); + specialProps.insert(propINCLUDE_DIRECTORIES); + specialProps.insert(propCOMPILE_FEATURES); + specialProps.insert(propCOMPILE_OPTIONS); + specialProps.insert(propCOMPILE_DEFINITIONS); + specialProps.insert(propIMPORTED); + specialProps.insert(propNAME); + specialProps.insert(propSOURCES); } if(specialProps.count(prop)) { - if(prop == "LINK_LIBRARIES") + if(prop == propLINK_LIBRARIES) { if (this->Internal->LinkImplementationPropertyEntries.empty()) { @@ -3122,11 +3135,11 @@ const char *cmTarget::GetProperty(const std::string& prop, return output.c_str(); } // the type property returns what type the target is - else if (prop == "TYPE") + else if (prop == propTYPE) { return cmTarget::GetTargetTypeName(this->GetType()); } - else if(prop == "INCLUDE_DIRECTORIES") + else if(prop == propINCLUDE_DIRECTORIES) { if (this->Internal->IncludeDirectoriesEntries.empty()) { @@ -3137,7 +3150,7 @@ const char *cmTarget::GetProperty(const std::string& prop, MakePropertyList(output, this->Internal->IncludeDirectoriesEntries); return output.c_str(); } - else if(prop == "COMPILE_FEATURES") + else if(prop == propCOMPILE_FEATURES) { if (this->Internal->CompileFeaturesEntries.empty()) { @@ -3148,7 +3161,7 @@ const char *cmTarget::GetProperty(const std::string& prop, MakePropertyList(output, this->Internal->CompileFeaturesEntries); return output.c_str(); } - else if(prop == "COMPILE_OPTIONS") + else if(prop == propCOMPILE_OPTIONS) { if (this->Internal->CompileOptionsEntries.empty()) { @@ -3159,7 +3172,7 @@ const char *cmTarget::GetProperty(const std::string& prop, MakePropertyList(output, this->Internal->CompileOptionsEntries); return output.c_str(); } - else if(prop == "COMPILE_DEFINITIONS") + else if(prop == propCOMPILE_DEFINITIONS) { if (this->Internal->CompileDefinitionsEntries.empty()) { @@ -3170,15 +3183,15 @@ const char *cmTarget::GetProperty(const std::string& prop, MakePropertyList(output, this->Internal->CompileDefinitionsEntries); return output.c_str(); } - else if (prop == "IMPORTED") + else if (prop == propIMPORTED) { return this->IsImported()?"TRUE":"FALSE"; } - else if (prop == "NAME") + else if (prop == propNAME) { return this->GetName().c_str(); } - else if(prop == "SOURCES") + else if(prop == propSOURCES) { if (this->Internal->SourceEntries.empty()) { @@ -4795,12 +4808,13 @@ bool cmTarget::IsNullImpliedByLinkLibraries(const std::string &p) const //---------------------------------------------------------------------------- template -PropertyType getTypedProperty(cmTarget const* tgt, const char *prop, +PropertyType getTypedProperty(cmTarget const* tgt, const std::string& prop, PropertyType *); //---------------------------------------------------------------------------- template<> -bool getTypedProperty(cmTarget const* tgt, const char *prop, bool *) +bool getTypedProperty(cmTarget const* tgt, const std::string& prop, + bool *) { return tgt->GetPropertyAsBool(prop); } @@ -4808,7 +4822,7 @@ bool getTypedProperty(cmTarget const* tgt, const char *prop, bool *) //---------------------------------------------------------------------------- template<> const char *getTypedProperty(cmTarget const* tgt, - const char *prop, + const std::string& prop, const char **) { return tgt->GetProperty(prop); @@ -5047,7 +5061,7 @@ PropertyType checkInterfacePropertyCompatibility(cmTarget const* tgt, CompatibleType t, PropertyType *) { - PropertyType propContent = getTypedProperty(tgt, p.c_str(), + PropertyType propContent = getTypedProperty(tgt, p, 0); const bool explicitlySet = tgt->GetProperties() .find(p) @@ -5083,6 +5097,7 @@ PropertyType checkInterfacePropertyCompatibility(cmTarget const* tgt, report += "\" property not set.\n"; } + std::string interfaceProperty = "INTERFACE_" + p; for(std::vector::const_iterator li = deps.begin(); li != deps.end(); ++li) @@ -5096,11 +5111,11 @@ PropertyType checkInterfacePropertyCompatibility(cmTarget const* tgt, cmTarget const* theTarget = *li; const bool ifaceIsSet = theTarget->GetProperties() - .find("INTERFACE_" + p) + .find(interfaceProperty) != theTarget->GetProperties().end(); PropertyType ifacePropContent = getTypedProperty(theTarget, - ("INTERFACE_" + p).c_str(), 0); + interfaceProperty, 0); std::string reportEntry; if (ifaceIsSet) @@ -6167,7 +6182,7 @@ cmTargetInternals::ComputeLinkInterfaceLibraries( // Compare the link implementation fallback link interface to the // preferred new link interface property and warn if different. std::vector ifaceLibs; - std::string newProp = "INTERFACE_LINK_LIBRARIES"; + static const std::string newProp = "INTERFACE_LINK_LIBRARIES"; if(const char* newExplicitLibraries = thisTarget->GetProperty(newProp)) { thisTarget->ExpandLinkItems(newProp, newExplicitLibraries, config, @@ -6752,9 +6767,13 @@ void cmTarget::CheckPropertyCompatibility(cmComputeLinkInformation *info, const cmComputeLinkInformation::ItemVector &deps = info->GetItems(); std::set emittedBools; + static std::string strBool = "COMPATIBLE_INTERFACE_BOOL"; std::set emittedStrings; + static std::string strString = "COMPATIBLE_INTERFACE_STRING"; std::set emittedMinNumbers; + static std::string strNumMin = "COMPATIBLE_INTERFACE_NUMBER_MIN"; std::set emittedMaxNumbers; + static std::string strNumMax = "COMPATIBLE_INTERFACE_NUMBER_MAX"; for(cmComputeLinkInformation::ItemVector::const_iterator li = deps.begin(); @@ -6766,14 +6785,14 @@ void cmTarget::CheckPropertyCompatibility(cmComputeLinkInformation *info, } checkPropertyConsistency(this, li->Target, - std::string("COMPATIBLE_INTERFACE_BOOL"), + strBool, emittedBools, config, BoolType, 0); if (cmSystemTools::GetErrorOccuredFlag()) { return; } checkPropertyConsistency(this, li->Target, - std::string("COMPATIBLE_INTERFACE_STRING"), + strString, emittedStrings, config, StringType, 0); if (cmSystemTools::GetErrorOccuredFlag()) @@ -6781,7 +6800,7 @@ void cmTarget::CheckPropertyCompatibility(cmComputeLinkInformation *info, return; } checkPropertyConsistency(this, li->Target, - std::string("COMPATIBLE_INTERFACE_NUMBER_MIN"), + strNumMin, emittedMinNumbers, config, NumberMinType, 0); if (cmSystemTools::GetErrorOccuredFlag()) @@ -6789,7 +6808,7 @@ void cmTarget::CheckPropertyCompatibility(cmComputeLinkInformation *info, return; } checkPropertyConsistency(this, li->Target, - std::string("COMPATIBLE_INTERFACE_NUMBER_MAX"), + strNumMax, emittedMaxNumbers, config, NumberMaxType, 0); if (cmSystemTools::GetErrorOccuredFlag()) @@ -6809,22 +6828,22 @@ void cmTarget::CheckPropertyCompatibility(cmComputeLinkInformation *info, std::set::const_iterator i = emittedBools.find(prop); if (i != emittedBools.end()) { - props.insert("COMPATIBLE_INTERFACE_BOOL"); + props.insert(strBool); } i = emittedStrings.find(prop); if (i != emittedStrings.end()) { - props.insert("COMPATIBLE_INTERFACE_STRING"); + props.insert(strString); } i = emittedMinNumbers.find(prop); if (i != emittedMinNumbers.end()) { - props.insert("COMPATIBLE_INTERFACE_NUMBER_MIN"); + props.insert(strNumMin); } i = emittedMaxNumbers.find(prop); if (i != emittedMaxNumbers.end()) { - props.insert("COMPATIBLE_INTERFACE_NUMBER_MAX"); + props.insert(strNumMax); } std::string propsString = *props.begin(); -- cgit v0.12 From b75fc0e1ad343173f5231819cfcdbdee9a8b076a Mon Sep 17 00:00:00 2001 From: Ben Boeckel Date: Wed, 12 Mar 2014 14:05:52 -0400 Subject: cmTarget: Don't set properties on custom targets Properties are not required on custom targets. --- Source/cmTarget.cxx | 80 ++++++++++++++++++++++++++++------------------------- 1 file changed, 43 insertions(+), 37 deletions(-) diff --git a/Source/cmTarget.cxx b/Source/cmTarget.cxx index 2424fe7..41d370c 100644 --- a/Source/cmTarget.cxx +++ b/Source/cmTarget.cxx @@ -328,7 +328,7 @@ void cmTarget::SetMakefile(cmMakefile* mf) this->IsApple = this->Makefile->IsOn("APPLE"); // Setup default property values. - if (this->GetType() != INTERFACE_LIBRARY) + if (this->GetType() != INTERFACE_LIBRARY && this->GetType() != UTILITY) { this->SetPropertyDefault("INSTALL_NAME_DIR", 0); this->SetPropertyDefault("INSTALL_RPATH", ""); @@ -369,41 +369,44 @@ void cmTarget::SetMakefile(cmMakefile* mf) mf->GetConfigurations(configNames); // Setup per-configuration property default values. - const char* configProps[] = { - "ARCHIVE_OUTPUT_DIRECTORY_", - "LIBRARY_OUTPUT_DIRECTORY_", - "RUNTIME_OUTPUT_DIRECTORY_", - "PDB_OUTPUT_DIRECTORY_", - "COMPILE_PDB_OUTPUT_DIRECTORY_", - "MAP_IMPORTED_CONFIG_", - 0}; - for(std::vector::iterator ci = configNames.begin(); - ci != configNames.end(); ++ci) - { - std::string configUpper = cmSystemTools::UpperCase(*ci); - for(const char** p = configProps; *p; ++p) - { - if (this->TargetTypeValue == INTERFACE_LIBRARY - && strcmp(*p, "MAP_IMPORTED_CONFIG_") != 0) + if (this->GetType() != UTILITY) + { + const char* configProps[] = { + "ARCHIVE_OUTPUT_DIRECTORY_", + "LIBRARY_OUTPUT_DIRECTORY_", + "RUNTIME_OUTPUT_DIRECTORY_", + "PDB_OUTPUT_DIRECTORY_", + "COMPILE_PDB_OUTPUT_DIRECTORY_", + "MAP_IMPORTED_CONFIG_", + 0}; + for(std::vector::iterator ci = configNames.begin(); + ci != configNames.end(); ++ci) + { + std::string configUpper = cmSystemTools::UpperCase(*ci); + for(const char** p = configProps; *p; ++p) { - continue; + if (this->TargetTypeValue == INTERFACE_LIBRARY + && strcmp(*p, "MAP_IMPORTED_CONFIG_") != 0) + { + continue; + } + std::string property = *p; + property += configUpper; + this->SetPropertyDefault(property, 0); } - std::string property = *p; - property += configUpper; - this->SetPropertyDefault(property, 0); - } - // Initialize per-configuration name postfix property from the - // variable only for non-executable targets. This preserves - // compatibility with previous CMake versions in which executables - // did not support this variable. Projects may still specify the - // property directly. - if(this->TargetTypeValue != cmTarget::EXECUTABLE - && this->TargetTypeValue != cmTarget::INTERFACE_LIBRARY) - { - std::string property = cmSystemTools::UpperCase(*ci); - property += "_POSTFIX"; - this->SetPropertyDefault(property, 0); + // Initialize per-configuration name postfix property from the + // variable only for non-executable targets. This preserves + // compatibility with previous CMake versions in which executables + // did not support this variable. Projects may still specify the + // property directly. + if(this->TargetTypeValue != cmTarget::EXECUTABLE + && this->TargetTypeValue != cmTarget::INTERFACE_LIBRARY) + { + std::string property = cmSystemTools::UpperCase(*ci); + property += "_POSTFIX"; + this->SetPropertyDefault(property, 0); + } } } @@ -442,7 +445,7 @@ void cmTarget::SetMakefile(cmMakefile* mf) } } - if (this->GetType() != INTERFACE_LIBRARY) + if (this->GetType() != INTERFACE_LIBRARY && this->GetType() != UTILITY) { this->SetPropertyDefault("C_VISIBILITY_PRESET", 0); this->SetPropertyDefault("CXX_VISIBILITY_PRESET", 0); @@ -454,7 +457,7 @@ void cmTarget::SetMakefile(cmMakefile* mf) { this->SetProperty("POSITION_INDEPENDENT_CODE", "True"); } - if (this->GetType() != INTERFACE_LIBRARY) + if (this->GetType() != INTERFACE_LIBRARY && this->GetType() != UTILITY) { this->SetPropertyDefault("POSITION_INDEPENDENT_CODE", 0); } @@ -476,8 +479,11 @@ void cmTarget::SetMakefile(cmMakefile* mf) this->PolicyStatusCMP0022 = cmPolicies::NEW; } - this->SetPropertyDefault("JOB_POOL_COMPILE", 0); - this->SetPropertyDefault("JOB_POOL_LINK", 0); + if (this->GetType() != INTERFACE_LIBRARY && this->GetType() != UTILITY) + { + this->SetPropertyDefault("JOB_POOL_COMPILE", 0); + this->SetPropertyDefault("JOB_POOL_LINK", 0); + } } //---------------------------------------------------------------------------- -- cgit v0.12 From cd54f1dbeb5c71b400ccb0db81a0fcea45df46b8 Mon Sep 17 00:00:00 2001 From: Ben Boeckel Date: Mon, 10 Feb 2014 01:24:42 -0500 Subject: cmTarget: Only copy GenEx expansions when necessary --- Source/cmTarget.cxx | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/Source/cmTarget.cxx b/Source/cmTarget.cxx index 41d370c..5836d7b 100644 --- a/Source/cmTarget.cxx +++ b/Source/cmTarget.cxx @@ -2266,25 +2266,32 @@ static void processCompileOptionsInternal(cmTarget const* tgt, for (std::vector::const_iterator it = entries.begin(), end = entries.end(); it != end; ++it) { - bool cacheOptions = false; - std::vector entryOptions = (*it)->CachedEntries; - if(entryOptions.empty()) + std::vector& entriesRef = (*it)->CachedEntries; + std::vector localEntries; + std::vector* entryOptions = &entriesRef; + if(entryOptions->empty()) { cmSystemTools::ExpandListArgument((*it)->ge->Evaluate(mf, config, false, tgt, dagChecker), - entryOptions); + localEntries); if (mf->IsGeneratingBuildSystem() && !(*it)->ge->GetHadContextSensitiveCondition()) { - cacheOptions = true; + // Cache the result. + *entryOptions = localEntries; + } + else + { + // Use the context-sensitive results here. + entryOptions = &localEntries; } } std::string usedOptions; for(std::vector::iterator - li = entryOptions.begin(); li != entryOptions.end(); ++li) + li = entryOptions->begin(); li != entryOptions->end(); ++li) { std::string opt = *li; @@ -2297,10 +2304,6 @@ static void processCompileOptionsInternal(cmTarget const* tgt, } } } - if (cacheOptions) - { - (*it)->CachedEntries = entryOptions; - } if (!usedOptions.empty()) { mf->GetCMakeInstance()->IssueMessage(cmake::LOG, -- cgit v0.12 From 23d6520daae729e433fc9325eb53acb541979d0f Mon Sep 17 00:00:00 2001 From: Ben Boeckel Date: Wed, 30 Apr 2014 15:41:19 -0400 Subject: cmTarget: Allow caching of empty genex expansions --- Source/cmTarget.cxx | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Source/cmTarget.cxx b/Source/cmTarget.cxx index 5836d7b..67b3c11 100644 --- a/Source/cmTarget.cxx +++ b/Source/cmTarget.cxx @@ -176,10 +176,11 @@ public: public: TargetPropertyEntry(cmsys::auto_ptr cge, cmLinkImplItem const& item = NoLinkImplItem) - : ge(cge), LinkImplItem(item) + : ge(cge), Cached(false), LinkImplItem(item) {} const cmsys::auto_ptr ge; std::vector CachedEntries; + bool Cached; cmLinkImplItem const& LinkImplItem; }; std::vector IncludeDirectoriesEntries; @@ -2269,7 +2270,7 @@ static void processCompileOptionsInternal(cmTarget const* tgt, std::vector& entriesRef = (*it)->CachedEntries; std::vector localEntries; std::vector* entryOptions = &entriesRef; - if(entryOptions->empty()) + if(!(*it)->Cached) { cmSystemTools::ExpandListArgument((*it)->ge->Evaluate(mf, config, @@ -2282,6 +2283,7 @@ static void processCompileOptionsInternal(cmTarget const* tgt, { // Cache the result. *entryOptions = localEntries; + (*it)->Cached = true; } else { -- cgit v0.12 From 679f3deeb79a7b19fb47b96bb520817c1c529f36 Mon Sep 17 00:00:00 2001 From: Ben Boeckel Date: Tue, 10 Jun 2014 10:29:16 -0400 Subject: cmTarget: use hash_set for sets of strings --- Source/cmTarget.cxx | 79 ++++++++++++++++++++++++++++------------------------- 1 file changed, 42 insertions(+), 37 deletions(-) diff --git a/Source/cmTarget.cxx b/Source/cmTarget.cxx index 67b3c11..155232d 100644 --- a/Source/cmTarget.cxx +++ b/Source/cmTarget.cxx @@ -25,6 +25,12 @@ #include // required for atof #include #include +#if defined(CMAKE_BUILD_WITH_CMAKE) +#include +#define UNORDERED_SET cmsys::hash_set +#else +#define UNORDERED_SET std::set +#endif const char* cmTarget::GetTargetTypeName(TargetType targetType) { @@ -642,7 +648,7 @@ bool cmTarget::IsBundleOnApple() const static bool processSources(cmTarget const* tgt, const std::vector &entries, std::vector &srcs, - std::set &uniqueSrcs, + UNORDERED_SET &uniqueSrcs, cmGeneratorExpressionDAGChecker *dagChecker, std::string const& config, bool debugSources) { @@ -784,7 +790,7 @@ void cmTarget::GetSourceFiles(std::vector &files, cmGeneratorExpressionDAGChecker dagChecker(this->GetName(), "SOURCES", 0, 0); - std::set uniqueSrcs; + UNORDERED_SET uniqueSrcs; bool contextDependentDirectSources = processSources(this, this->Internal->SourceEntries, files, @@ -1298,7 +1304,7 @@ void cmTarget::GetTllSignatureTraces(cmOStringStream &s, = (sig == cmTarget::KeywordTLLSignature ? "keyword" : "plain"); s << "The uses of the " << sigString << " signature are here:\n"; - std::set emitted; + UNORDERED_SET emitted; for(std::vector::iterator it = sigs.begin(); it != sigs.end(); ++it) { @@ -1717,22 +1723,20 @@ static bool whiteListedInterfaceProperty(const std::string& prop) { return true; } - static const char* builtIns[] = { - // ###: This must remain sorted. It is processed with a binary search. - "COMPATIBLE_INTERFACE_BOOL", - "COMPATIBLE_INTERFACE_NUMBER_MAX", - "COMPATIBLE_INTERFACE_NUMBER_MIN", - "COMPATIBLE_INTERFACE_STRING", - "EXPORT_NAME", - "IMPORTED", - "NAME", - "TYPE" - }; + static UNORDERED_SET builtIns; + if (builtIns.empty()) + { + builtIns.insert("COMPATIBLE_INTERFACE_BOOL"); + builtIns.insert("COMPATIBLE_INTERFACE_NUMBER_MAX"); + builtIns.insert("COMPATIBLE_INTERFACE_NUMBER_MIN"); + builtIns.insert("COMPATIBLE_INTERFACE_STRING"); + builtIns.insert("EXPORT_NAME"); + builtIns.insert("IMPORTED"); + builtIns.insert("NAME"); + builtIns.insert("TYPE"); + } - if (std::binary_search(cmArrayBegin(builtIns), - cmArrayEnd(builtIns), - prop.c_str(), - cmStrCmp(prop))) + if (builtIns.count(prop)) { return true; } @@ -2017,7 +2021,7 @@ void cmTarget::InsertCompileDefinition(const cmValueWithOrigin &entry) static void processIncludeDirectories(cmTarget const* tgt, const std::vector &entries, std::vector &includes, - std::set &uniqueIncludes, + UNORDERED_SET &uniqueIncludes, cmGeneratorExpressionDAGChecker *dagChecker, const std::string& config, bool debugIncludes) { @@ -2166,7 +2170,7 @@ std::vector cmTarget::GetIncludeDirectories(const std::string& config) const { std::vector includes; - std::set uniqueIncludes; + UNORDERED_SET uniqueIncludes; cmGeneratorExpressionDAGChecker dagChecker(this->GetName(), "INCLUDE_DIRECTORIES", 0, 0); @@ -2258,7 +2262,7 @@ cmTarget::GetIncludeDirectories(const std::string& config) const static void processCompileOptionsInternal(cmTarget const* tgt, const std::vector &entries, std::vector &options, - std::set &uniqueOptions, + UNORDERED_SET &uniqueOptions, cmGeneratorExpressionDAGChecker *dagChecker, const std::string& config, bool debugOptions, const char *logName) { @@ -2321,7 +2325,7 @@ static void processCompileOptionsInternal(cmTarget const* tgt, static void processCompileOptions(cmTarget const* tgt, const std::vector &entries, std::vector &options, - std::set &uniqueOptions, + UNORDERED_SET &uniqueOptions, cmGeneratorExpressionDAGChecker *dagChecker, const std::string& config, bool debugOptions) { @@ -2358,7 +2362,7 @@ void cmTarget::GetAutoUicOptions(std::vector &result, void cmTarget::GetCompileOptions(std::vector &result, const std::string& config) const { - std::set uniqueOptions; + UNORDERED_SET uniqueOptions; cmGeneratorExpressionDAGChecker dagChecker(this->GetName(), "COMPILE_OPTIONS", 0, 0); @@ -2419,7 +2423,7 @@ void cmTarget::GetCompileOptions(std::vector &result, static void processCompileDefinitions(cmTarget const* tgt, const std::vector &entries, std::vector &options, - std::set &uniqueOptions, + UNORDERED_SET &uniqueOptions, cmGeneratorExpressionDAGChecker *dagChecker, const std::string& config, bool debugOptions) { @@ -2432,7 +2436,7 @@ static void processCompileDefinitions(cmTarget const* tgt, void cmTarget::GetCompileDefinitions(std::vector &list, const std::string& config) const { - std::set uniqueOptions; + UNORDERED_SET uniqueOptions; cmGeneratorExpressionDAGChecker dagChecker(this->GetName(), "COMPILE_DEFINITIONS", 0, 0); @@ -2530,7 +2534,7 @@ void cmTarget::GetCompileDefinitions(std::vector &list, static void processCompileFeatures(cmTarget const* tgt, const std::vector &entries, std::vector &options, - std::set &uniqueOptions, + UNORDERED_SET &uniqueOptions, cmGeneratorExpressionDAGChecker *dagChecker, const std::string& config, bool debugOptions) { @@ -2542,7 +2546,7 @@ static void processCompileFeatures(cmTarget const* tgt, void cmTarget::GetCompileFeatures(std::vector &result, const std::string& config) const { - std::set uniqueFeatures; + UNORDERED_SET uniqueFeatures; cmGeneratorExpressionDAGChecker dagChecker(this->GetName(), "COMPILE_FEATURES", @@ -3082,7 +3086,7 @@ const char *cmTarget::GetProperty(const std::string& prop, cmProperty::TARGET); } // Support "_LOCATION". - if(cmHasLiteralSuffix(prop, "_LOCATION")) + else if(cmHasLiteralSuffix(prop, "_LOCATION")) { std::string configName(prop.c_str(), prop.size() - 9); if(configName != "IMPORTED") @@ -3097,7 +3101,7 @@ const char *cmTarget::GetProperty(const std::string& prop, } } } - static std::set specialProps; + static UNORDERED_SET specialProps; #define MAKE_STATIC_PROP(PROP) \ static const std::string prop##PROP = #PROP MAKE_STATIC_PROP(LINK_LIBRARIES); @@ -3323,7 +3327,7 @@ class cmTargetCollectLinkLanguages public: cmTargetCollectLinkLanguages(cmTarget const* target, const std::string& config, - std::set& languages, + UNORDERED_SET& languages, cmTarget const* head): Config(config), Languages(languages), HeadTarget(head), Makefile(target->GetMakefile()), Target(target) @@ -3393,7 +3397,7 @@ public: } private: std::string Config; - std::set& Languages; + UNORDERED_SET& Languages; cmTarget const* HeadTarget; cmMakefile* Makefile; const cmTarget* Target; @@ -3430,7 +3434,7 @@ class cmTargetSelectLinker cmTarget const* Target; cmMakefile* Makefile; cmGlobalGenerator* GG; - std::set Preferred; + UNORDERED_SET Preferred; public: cmTargetSelectLinker(cmTarget const* target): Preference(0), Target(target) { @@ -3462,7 +3466,7 @@ public: e << "Target " << this->Target->GetName() << " contains multiple languages with the highest linker preference" << " (" << this->Preference << "):\n"; - for(std::set::const_iterator + for(UNORDERED_SET::const_iterator li = this->Preferred.begin(); li != this->Preferred.end(); ++li) { e << " " << *li << "\n"; @@ -3481,7 +3485,7 @@ void cmTarget::ComputeLinkClosure(const std::string& config, LinkClosure& lc) const { // Get languages built in this target. - std::set languages; + UNORDERED_SET languages; LinkImplementation const* impl = this->GetLinkImplementation(config); for(std::vector::const_iterator li = impl->Languages.begin(); li != impl->Languages.end(); ++li) @@ -3499,7 +3503,7 @@ void cmTarget::ComputeLinkClosure(const std::string& config, } // Store the transitive closure of languages. - for(std::set::const_iterator li = languages.begin(); + for(UNORDERED_SET::const_iterator li = languages.begin(); li != languages.end(); ++li) { lc.Languages.push_back(*li); @@ -3527,7 +3531,7 @@ void cmTarget::ComputeLinkClosure(const std::string& config, } // Now consider languages that propagate from linked targets. - for(std::set::const_iterator sit = languages.begin(); + for(UNORDERED_SET::const_iterator sit = languages.begin(); sit != languages.end(); ++sit) { std::string propagates = "CMAKE_"+*sit+"_LINKER_PREFERENCE_PROPAGATES"; @@ -6261,7 +6265,7 @@ void cmTargetInternals::ComputeLinkInterface(cmTarget const* thisTarget, { // Shared libraries may have runtime implementation dependencies // on other shared libraries that are not in the interface. - std::set emitted; + UNORDERED_SET emitted; for(std::vector::const_iterator li = iface.Libraries.begin(); li != iface.Libraries.end(); ++li) { @@ -6835,6 +6839,7 @@ void cmTarget::CheckPropertyCompatibility(cmComputeLinkInformation *info, if (!prop.empty()) { + // Use a std::set to keep the error message sorted. std::set props; std::set::const_iterator i = emittedBools.find(prop); if (i != emittedBools.end()) -- cgit v0.12 From bcb6dbc1cb0bfeb0627c0b48ced41beea9d4c51a Mon Sep 17 00:00:00 2001 From: Ben Boeckel Date: Tue, 10 Jun 2014 13:07:12 -0400 Subject: cmTarget: help the optimizer a bit --- Source/cmTarget.cxx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Source/cmTarget.cxx b/Source/cmTarget.cxx index 155232d..843761f 100644 --- a/Source/cmTarget.cxx +++ b/Source/cmTarget.cxx @@ -224,7 +224,7 @@ public: cmLinkImplItem cmTargetInternals::TargetPropertyEntry::NoLinkImplItem; //---------------------------------------------------------------------------- -void deleteAndClear( +static void deleteAndClear( std::vector &entries) { for (std::vector::const_iterator @@ -238,7 +238,7 @@ void deleteAndClear( } //---------------------------------------------------------------------------- -void deleteAndClear( +static void deleteAndClear( std::map > &entries) { @@ -2299,7 +2299,7 @@ static void processCompileOptionsInternal(cmTarget const* tgt, for(std::vector::iterator li = entryOptions->begin(); li != entryOptions->end(); ++li) { - std::string opt = *li; + std::string const& opt = *li; if(uniqueOptions.insert(opt).second) { -- cgit v0.12 From a9c9b66c272d1d63918c1a5040c63d6cb169be91 Mon Sep 17 00:00:00 2001 From: Ben Boeckel Date: Tue, 10 Jun 2014 13:07:24 -0400 Subject: cmTarget: use a hash_map for cmTargets typedef --- Source/cmTarget.h | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Source/cmTarget.h b/Source/cmTarget.h index 4005443..9064eec 100644 --- a/Source/cmTarget.h +++ b/Source/cmTarget.h @@ -18,6 +18,9 @@ #include "cmListFileCache.h" #include +#if defined(CMAKE_BUILD_WITH_CMAKE) +#include +#endif #define CM_FOR_EACH_TARGET_POLICY(F) \ F(CMP0003) \ @@ -831,7 +834,11 @@ private: mutable bool LinkImplementationLanguageIsContextDependent; }; +#ifdef CMAKE_BUILD_WITH_CMAKE +typedef cmsys::hash_map cmTargets; +#else typedef std::map cmTargets; +#endif class cmTargetSet: public std::set {}; class cmTargetManifest: public std::map {}; -- cgit v0.12