From 370bb92c10cd8fec7770267c93515623e4168012 Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Thu, 8 Oct 2015 23:28:46 +0200 Subject: cmGeneratorTarget: Issue messages through the local generator. --- Source/cmGeneratorTarget.cxx | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/Source/cmGeneratorTarget.cxx b/Source/cmGeneratorTarget.cxx index 3fb0dc7..1a0bbe8 100644 --- a/Source/cmGeneratorTarget.cxx +++ b/Source/cmGeneratorTarget.cxx @@ -402,7 +402,8 @@ std::string cmGeneratorTarget::GetOutputName(const std::string& config, { // An empty map entry indicates we have been called recursively // from the above block. - this->Makefile->GetCMakeInstance()->IssueMessage( + this->LocalGenerator->GetCMakeInstance() + ->IssueMessage( cmake::FATAL_ERROR, "Target '" + this->GetName() + "' OUTPUT_NAME depends on itself.", this->Target->GetBacktrace()); @@ -951,7 +952,7 @@ static bool processSources(cmGeneratorTarget const* tgt, } if (!usedSources.empty()) { - mf->GetCMakeInstance()->IssueMessage(cmake::LOG, + tgt->GetLocalGenerator()->GetCMakeInstance()->IssueMessage(cmake::LOG, std::string("Used sources for target ") + tgt->GetName() + ":\n" + usedSources, (*it)->ge->GetBacktrace()); @@ -1521,7 +1522,7 @@ public: << "\" but the target was not found. Perhaps a find_package() " "call is missing for an IMPORTED target, or an ALIAS target is " "missing?"; - this->Makefile->GetCMakeInstance()->IssueMessage( + this->Target->GetLocalGenerator()->GetCMakeInstance()->IssueMessage( messageType, e.str(), this->Target->Target->GetBacktrace()); } } @@ -2444,7 +2445,7 @@ static void processIncludeDirectories(cmGeneratorTarget const* tgt, } if (!usedIncludes.empty()) { - mf->GetCMakeInstance()->IssueMessage(cmake::LOG, + tgt->GetLocalGenerator()->GetCMakeInstance()->IssueMessage(cmake::LOG, std::string("Used includes for target ") + tgt->GetName() + ":\n" + usedIncludes, (*it)->ge->GetBacktrace()); @@ -2577,7 +2578,7 @@ static void processCompileOptionsInternal(cmGeneratorTarget const* tgt, } if (!usedOptions.empty()) { - mf->GetCMakeInstance()->IssueMessage(cmake::LOG, + tgt->GetLocalGenerator()->GetCMakeInstance()->IssueMessage(cmake::LOG, std::string("Used compile ") + logName + std::string(" for target ") + tgt->GetName() + ":\n" @@ -4212,7 +4213,7 @@ cmGeneratorTarget::ReportPropertyOrigin(const std::string &p, areport += result; areport += "\"):\n" + report; - this->Makefile->GetCMakeInstance()->IssueMessage(cmake::LOG, areport); + this->LocalGenerator->GetCMakeInstance()->IssueMessage(cmake::LOG, areport); } //---------------------------------------------------------------------------- -- cgit v0.12 From a8429a402da4aeb717f4af234c8d14d1c4e10ed7 Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Wed, 5 Aug 2015 17:37:51 +0200 Subject: cmTarget: Split storage of link implementation from backtraces. --- Source/cmListFileCache.h | 9 --------- Source/cmTarget.cxx | 36 +++++++++++++++--------------------- 2 files changed, 15 insertions(+), 30 deletions(-) diff --git a/Source/cmListFileCache.h b/Source/cmListFileCache.h index 0afd7f5..5f1a310 100644 --- a/Source/cmListFileCache.h +++ b/Source/cmListFileCache.h @@ -111,13 +111,4 @@ struct cmListFile std::vector Functions; }; -struct cmValueWithOrigin { - cmValueWithOrigin(const std::string &value, - const cmListFileBacktrace &bt) - : Value(value), Backtrace(bt) - {} - std::string Value; - cmListFileBacktrace Backtrace; -}; - #endif diff --git a/Source/cmTarget.cxx b/Source/cmTarget.cxx index abfc40b..63c7740 100644 --- a/Source/cmTarget.cxx +++ b/Source/cmTarget.cxx @@ -114,7 +114,8 @@ public: std::vector CompileDefinitionsBacktraces; std::vector SourceEntries; std::vector SourceBacktraces; - std::vector LinkImplementationPropertyEntries; + std::vector LinkImplementationPropertyEntries; + std::vector LinkImplementationPropertyBacktraces; }; //---------------------------------------------------------------------------- @@ -1380,11 +1381,12 @@ void cmTarget::SetProperty(const std::string& prop, const char* value) else if (prop == "LINK_LIBRARIES") { this->Internal->LinkImplementationPropertyEntries.clear(); + this->Internal->LinkImplementationPropertyBacktraces.clear(); if (value) { cmListFileBacktrace lfbt = this->Makefile->GetBacktrace(); - cmValueWithOrigin entry(value, lfbt); - this->Internal->LinkImplementationPropertyEntries.push_back(entry); + this->Internal->LinkImplementationPropertyEntries.push_back(value); + this->Internal->LinkImplementationPropertyBacktraces.push_back(lfbt); } } else if (prop == "SOURCES") @@ -1482,8 +1484,8 @@ void cmTarget::AppendProperty(const std::string& prop, const char* value, if (value && *value) { cmListFileBacktrace lfbt = this->Makefile->GetBacktrace(); - cmValueWithOrigin entry(value, lfbt); - this->Internal->LinkImplementationPropertyEntries.push_back(entry); + this->Internal->LinkImplementationPropertyEntries.push_back(value); + this->Internal->LinkImplementationPropertyBacktraces.push_back(lfbt); } } else if (prop == "SOURCES") @@ -2048,17 +2050,7 @@ const char *cmTarget::GetProperty(const std::string& prop, } 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 = ";"; - } + output = cmJoin(this->Internal->LinkImplementationPropertyEntries, ";"); return output.c_str(); } // the type property returns what type the target is @@ -3223,19 +3215,21 @@ void cmTarget::ComputeLinkImplementationLibraries( cmOptionalLinkImplementation& impl, cmTarget const* head) const { + std::vector::const_iterator btIt = + this->Internal->LinkImplementationPropertyBacktraces.begin(); // Collect libraries directly linked in this configuration. - for (std::vector::const_iterator + for (std::vector::const_iterator le = this->Internal->LinkImplementationPropertyEntries.begin(), end = this->Internal->LinkImplementationPropertyEntries.end(); - le != end; ++le) + le != end; ++le, ++btIt) { std::vector llibs; cmGeneratorExpressionDAGChecker dagChecker( this->GetName(), "LINK_LIBRARIES", 0, 0); - cmGeneratorExpression ge(le->Backtrace); + cmGeneratorExpression ge(*btIt); cmsys::auto_ptr const cge = - ge.Parse(le->Value); + ge.Parse(*le); std::string const evaluated = cge->Evaluate(this->Makefile, config, false, head, &dagChecker); cmSystemTools::ExpandListArgument(evaluated, llibs); @@ -3290,7 +3284,7 @@ void cmTarget::ComputeLinkImplementationLibraries( // The entry is meant for this configuration. impl.Libraries.push_back( cmLinkImplItem(name, this->FindTargetToLink(name), - le->Backtrace, evaluated != le->Value)); + *btIt, evaluated != *le)); } std::set const& seenProps = cge->GetSeenTargetProperties(); -- cgit v0.12 From df42dbb3558a6ba604ab584b21dfe7f8722eb025 Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Wed, 5 Aug 2015 18:17:55 +0200 Subject: cmGeneratorTarget: Move link implementation from cmTarget. --- Source/cmGeneratorExpressionNode.cxx | 2 +- Source/cmGeneratorTarget.cxx | 172 +++++++++++++++++++++++++++++--- Source/cmGeneratorTarget.h | 23 +++++ Source/cmLocalGenerator.cxx | 4 +- Source/cmTarget.cxx | 185 ++--------------------------------- Source/cmTarget.h | 26 +---- 6 files changed, 200 insertions(+), 212 deletions(-) diff --git a/Source/cmGeneratorExpressionNode.cxx b/Source/cmGeneratorExpressionNode.cxx index 1c350ab..b61e26f 100644 --- a/Source/cmGeneratorExpressionNode.cxx +++ b/Source/cmGeneratorExpressionNode.cxx @@ -1122,7 +1122,7 @@ static const struct TargetPropertyNode : public cmGeneratorExpressionNode else if(!interfacePropertyName.empty()) { if(cmLinkImplementationLibraries const* impl = - target->GetLinkImplementationLibraries(context->Config)) + gtgt->GetLinkImplementationLibraries(context->Config)) { linkedTargetsContent = getLinkedTargetsContent(impl->Libraries, target, diff --git a/Source/cmGeneratorTarget.cxx b/Source/cmGeneratorTarget.cxx index 1a0bbe8..278194e 100644 --- a/Source/cmGeneratorTarget.cxx +++ b/Source/cmGeneratorTarget.cxx @@ -847,7 +847,7 @@ static void AddInterfaceEntries( std::vector& entries) { if(cmLinkImplementationLibraries const* impl = - thisTarget->Target->GetLinkImplementationLibraries(config)) + thisTarget->GetLinkImplementationLibraries(config)) { for (std::vector::const_iterator it = impl->Libraries.begin(), end = impl->Libraries.end(); @@ -1901,7 +1901,7 @@ cmGeneratorTarget::GetLinkImplementationClosure( std::set emitted; cmLinkImplementationLibraries const* impl - = this->Target->GetLinkImplementationLibraries(config); + = this->GetLinkImplementationLibraries(config); for(std::vector::const_iterator it = impl->Libraries.begin(); @@ -2501,7 +2501,7 @@ cmGeneratorTarget::GetIncludeDirectories(const std::string& config, if(this->Makefile->IsOn("APPLE")) { cmLinkImplementationLibraries const* impl = - this->Target->GetLinkImplementationLibraries(config); + this->GetLinkImplementationLibraries(config); for(std::vector::const_iterator it = impl->Libraries.begin(); it != impl->Libraries.end(); ++it) @@ -4363,8 +4363,7 @@ void cmGeneratorTarget::ComputeLinkInterface(const std::string& config, { // The link implementation is the default link interface. cmLinkImplementationLibraries const* - impl = this->Target->GetLinkImplementationLibrariesInternal(config, - headTarget); + impl = this->GetLinkImplementationLibrariesInternal(config, headTarget); iface.ImplementationIsInterface = true; iface.WrongConfigLibraries = impl->WrongConfigLibraries; } @@ -4558,8 +4557,7 @@ cmGeneratorTarget::ComputeLinkInterfaceLibraries( { // The link implementation is the default link interface. cmLinkImplementationLibraries const* impl = - this->Target->GetLinkImplementationLibrariesInternal(config, - headTarget); + this->GetLinkImplementationLibrariesInternal(config, headTarget); iface.Libraries.insert(iface.Libraries.end(), impl->Libraries.begin(), impl->Libraries.end()); if(this->Target->GetPolicyStatusCMP0022() == cmPolicies::WARN && @@ -4674,12 +4672,12 @@ cmGeneratorTarget::GetLinkImplementation(const std::string& config) const return 0; } - cmOptionalLinkImplementation& impl = this->Target->GetLinkImplMap(config); + std::string CONFIG = cmSystemTools::UpperCase(config); + cmOptionalLinkImplementation& impl = this->LinkImplMap[CONFIG][this->Target]; if(!impl.LibrariesDone) { impl.LibrariesDone = true; - this->Target->ComputeLinkImplementationLibraries(config, impl, - this->Target); + this->ComputeLinkImplementationLibraries(config, impl, this->Target); } if(!impl.LanguagesDone) { @@ -4819,9 +4817,161 @@ bool cmGeneratorTarget::HaveBuildTreeRPATH(const std::string& config) const return false; } if(cmLinkImplementationLibraries const* impl = - this->Target->GetLinkImplementationLibraries(config)) + this->GetLinkImplementationLibraries(config)) { return !impl->Libraries.empty(); } return false; } + +//---------------------------------------------------------------------------- +cmLinkImplementationLibraries const* +cmGeneratorTarget::GetLinkImplementationLibraries( + const std::string& config) const +{ + return this->GetLinkImplementationLibrariesInternal(config, this->Target); +} + +//---------------------------------------------------------------------------- +cmLinkImplementationLibraries const* +cmGeneratorTarget::GetLinkImplementationLibrariesInternal( + const std::string& config, cmTarget const* head) const +{ + // There is no link implementation for imported targets. + if(this->IsImported()) + { + return 0; + } + + // Populate the link implementation libraries for this configuration. + std::string CONFIG = cmSystemTools::UpperCase(config); + HeadToLinkImplementationMap& hm = + this->LinkImplMap[CONFIG]; + + // If the link implementation does not depend on the head target + // then return the one we computed first. + if(!hm.empty() && !hm.begin()->second.HadHeadSensitiveCondition) + { + return &hm.begin()->second; + } + + cmOptionalLinkImplementation& impl = hm[head]; + if(!impl.LibrariesDone) + { + impl.LibrariesDone = true; + this->ComputeLinkImplementationLibraries(config, impl, head); + } + return &impl; +} + +//---------------------------------------------------------------------------- +void cmGeneratorTarget::ComputeLinkImplementationLibraries( + const std::string& config, + cmOptionalLinkImplementation& impl, + cmTarget const* head) const +{ + cmStringRange entryRange = + this->Target->GetLinkImplementationEntries(); + cmBacktraceRange btRange = + this->Target->GetLinkImplementationBacktraces(); + cmBacktraceRange::const_iterator btIt = btRange.begin(); + // Collect libraries directly linked in this configuration. + for (cmStringRange::const_iterator le = entryRange.begin(), + end = entryRange.end(); le != end; ++le, ++btIt) + { + std::vector llibs; + cmGeneratorExpressionDAGChecker dagChecker( + this->GetName(), + "LINK_LIBRARIES", 0, 0); + cmGeneratorExpression ge(*btIt); + cmsys::auto_ptr const cge = + ge.Parse(*le); + std::string const evaluated = + cge->Evaluate(this->Makefile, config, false, head, &dagChecker); + cmSystemTools::ExpandListArgument(evaluated, llibs); + if(cge->GetHadHeadSensitiveCondition()) + { + impl.HadHeadSensitiveCondition = true; + } + + for(std::vector::const_iterator li = llibs.begin(); + li != llibs.end(); ++li) + { + // Skip entries that resolve to the target itself or are empty. + std::string name = this->Target->CheckCMP0004(*li); + if(name == this->GetName() || name.empty()) + { + if(name == this->GetName()) + { + bool noMessage = false; + cmake::MessageType messageType = cmake::FATAL_ERROR; + std::ostringstream e; + switch(this->Target->GetPolicyStatusCMP0038()) + { + case cmPolicies::WARN: + { + e << cmPolicies::GetPolicyWarning(cmPolicies::CMP0038) << "\n"; + messageType = cmake::AUTHOR_WARNING; + } + break; + case cmPolicies::OLD: + noMessage = true; + case cmPolicies::REQUIRED_IF_USED: + case cmPolicies::REQUIRED_ALWAYS: + case cmPolicies::NEW: + // Issue the fatal message. + break; + } + + if(!noMessage) + { + e << "Target \"" << this->GetName() << "\" links to itself."; + this->LocalGenerator->GetCMakeInstance()->IssueMessage( + messageType, e.str(), this->Target->GetBacktrace()); + if (messageType == cmake::FATAL_ERROR) + { + return; + } + } + } + continue; + } + + // The entry is meant for this configuration. + impl.Libraries.push_back( + cmLinkImplItem(name, this->Target->FindTargetToLink(name), + *btIt, evaluated != *le)); + } + + std::set const& seenProps = cge->GetSeenTargetProperties(); + for (std::set::const_iterator it = seenProps.begin(); + it != seenProps.end(); ++it) + { + if (!this->GetProperty(*it)) + { + this->Target->LinkImplicitNullProperties.insert(*it); + } + } + cge->GetMaxLanguageStandard(this->Target, + this->MaxLanguageStandards); + } + + cmTarget::LinkLibraryType linkType = this->Target->ComputeLinkType(config); + cmTarget::LinkLibraryVectorType const& oldllibs = + this->Target->GetOriginalLinkLibraries(); + for(cmTarget::LinkLibraryVectorType::const_iterator li = oldllibs.begin(); + li != oldllibs.end(); ++li) + { + if(li->second != cmTarget::GENERAL && li->second != linkType) + { + std::string name = this->Target->CheckCMP0004(li->first); + if(name == this->GetName() || name.empty()) + { + continue; + } + // Support OLD behavior for CMP0003. + impl.WrongConfigLibraries.push_back( + cmLinkItem(name, this->Target->FindTargetToLink(name))); + } + } +} diff --git a/Source/cmGeneratorTarget.h b/Source/cmGeneratorTarget.h index e8c5e04..f5805f1 100644 --- a/Source/cmGeneratorTarget.h +++ b/Source/cmGeneratorTarget.h @@ -207,6 +207,13 @@ public: cmOptionalLinkImplementation& impl ) const; + cmLinkImplementationLibraries const* + GetLinkImplementationLibraries(const std::string& config) const; + + void ComputeLinkImplementationLibraries(const std::string& config, + cmOptionalLinkImplementation& impl, + cmTarget const* head) const; + // Compute the set of languages compiled by the target. This is // computed every time it is called because the languages can change // when source file properties are changed and we do not have enough @@ -462,6 +469,16 @@ private: void GetSourceFiles(std::vector& files, const std::string& config) const; + struct HeadToLinkImplementationMap: + public std::map {}; + typedef std::map LinkImplMapType; + mutable LinkImplMapType LinkImplMap; + + cmLinkImplementationLibraries const* + GetLinkImplementationLibrariesInternal(const std::string& config, + cmTarget const* head) const; + typedef std::pair OutputNameKey; typedef std::map OutputNameMapType; mutable OutputNameMapType OutputNameMap; @@ -477,6 +494,12 @@ public: std::vector const& GetLinkImplementationClosure(const std::string& config) const; + mutable std::map MaxLanguageStandards; + std::map const& + GetMaxLanguageStandards() const + { + return this->MaxLanguageStandards; + } }; struct cmStrictTargetComparison { diff --git a/Source/cmLocalGenerator.cxx b/Source/cmLocalGenerator.cxx index 6647894..06eb004 100644 --- a/Source/cmLocalGenerator.cxx +++ b/Source/cmLocalGenerator.cxx @@ -1152,8 +1152,8 @@ void cmLocalGenerator::AddCompileOptions( } for(std::map::const_iterator it - = target->GetMaxLanguageStandards().begin(); - it != target->GetMaxLanguageStandards().end(); ++it) + = gtgt->GetMaxLanguageStandards().begin(); + it != gtgt->GetMaxLanguageStandards().end(); ++it) { const char* standard = target->GetProperty(it->first + "_STANDARD"); if(!standard) diff --git a/Source/cmTarget.cxx b/Source/cmTarget.cxx index 63c7740..e1642cc 100644 --- a/Source/cmTarget.cxx +++ b/Source/cmTarget.cxx @@ -95,12 +95,6 @@ public: typedef std::map ImportInfoMapType; ImportInfoMapType ImportInfoMap; - struct HeadToLinkImplementationMap: - public std::map {}; - typedef std::map LinkImplMapType; - LinkImplMapType LinkImplMap; - std::set UtilityItems; bool UtilityItemsDone; @@ -405,7 +399,6 @@ void cmTarget::FinishConfigure() // on-demand during the configuration. This ensures that build // system generation uses up-to-date information even if other cache // invalidation code in this source file is buggy. - this->ClearLinkMaps(); #if defined(_WIN32) && !defined(__CYGWIN__) // Do old-style link dependency analysis only for CM_USE_OLD_VS6. @@ -417,12 +410,6 @@ void cmTarget::FinishConfigure() } //---------------------------------------------------------------------------- -void cmTarget::ClearLinkMaps() -{ - this->Internal->LinkImplMap.clear(); -} - -//---------------------------------------------------------------------------- cmListFileBacktrace const& cmTarget::GetBacktrace() const { return this->Internal->Backtrace; @@ -884,7 +871,6 @@ void cmTarget::AddLinkLibrary(cmMakefile& mf, this->LinkLibrariesForVS6.push_back( tmp ); #endif this->OriginalLinkLibraries.push_back(tmp); - this->ClearLinkMaps(); // Add the explicit dependency information for this target. This is // simply a set of libraries separated by ";". There should always @@ -983,6 +969,16 @@ cmBacktraceRange cmTarget::GetSourceBacktraces() const return cmMakeRange(this->Internal->SourceBacktraces); } +cmStringRange cmTarget::GetLinkImplementationEntries() const +{ + return cmMakeRange(this->Internal->LinkImplementationPropertyEntries); +} + +cmBacktraceRange cmTarget::GetLinkImplementationBacktraces() const +{ + return cmMakeRange(this->Internal->LinkImplementationPropertyBacktraces); +} + #if defined(_WIN32) && !defined(__CYGWIN__) //---------------------------------------------------------------------------- void @@ -1611,10 +1607,6 @@ void cmTarget::MaybeInvalidatePropertyCache(const std::string& prop) { this->Internal->ImportInfoMap.clear(); } - if(!this->IsImported() && cmHasLiteralPrefix(prop, "LINK_INTERFACE_")) - { - this->ClearLinkMaps(); - } } //---------------------------------------------------------------------------- @@ -3162,163 +3154,6 @@ void cmTarget::ComputeImportInfo(std::string const& desired_config, } } -cmOptionalLinkImplementation& -cmTarget::GetLinkImplMap(std::string const& config) const -{ - // Populate the link implementation for this configuration. - std::string CONFIG = cmSystemTools::UpperCase(config); - return Internal->LinkImplMap[CONFIG][this]; -} - -//---------------------------------------------------------------------------- -cmLinkImplementationLibraries const* -cmTarget::GetLinkImplementationLibraries(const std::string& config) const -{ - return this->GetLinkImplementationLibrariesInternal(config, this); -} - -//---------------------------------------------------------------------------- -cmLinkImplementationLibraries const* -cmTarget::GetLinkImplementationLibrariesInternal(const std::string& config, - cmTarget const* head) const -{ - // There is no link implementation for imported targets. - if(this->IsImported()) - { - return 0; - } - - // Populate the link implementation libraries for this configuration. - std::string CONFIG = cmSystemTools::UpperCase(config); - cmTargetInternals::HeadToLinkImplementationMap& hm = - this->Internal->LinkImplMap[CONFIG]; - - // If the link implementation does not depend on the head target - // then return the one we computed first. - if(!hm.empty() && !hm.begin()->second.HadHeadSensitiveCondition) - { - return &hm.begin()->second; - } - - cmOptionalLinkImplementation& impl = hm[head]; - if(!impl.LibrariesDone) - { - impl.LibrariesDone = true; - this->ComputeLinkImplementationLibraries(config, impl, head); - } - return &impl; -} - -//---------------------------------------------------------------------------- -void cmTarget::ComputeLinkImplementationLibraries( - const std::string& config, - cmOptionalLinkImplementation& impl, - cmTarget const* head) const -{ - std::vector::const_iterator btIt = - this->Internal->LinkImplementationPropertyBacktraces.begin(); - // Collect libraries directly linked in this configuration. - for (std::vector::const_iterator - le = this->Internal->LinkImplementationPropertyEntries.begin(), - end = this->Internal->LinkImplementationPropertyEntries.end(); - le != end; ++le, ++btIt) - { - std::vector llibs; - cmGeneratorExpressionDAGChecker dagChecker( - this->GetName(), - "LINK_LIBRARIES", 0, 0); - cmGeneratorExpression ge(*btIt); - cmsys::auto_ptr const cge = - ge.Parse(*le); - std::string const evaluated = - cge->Evaluate(this->Makefile, config, false, head, &dagChecker); - cmSystemTools::ExpandListArgument(evaluated, llibs); - if(cge->GetHadHeadSensitiveCondition()) - { - impl.HadHeadSensitiveCondition = true; - } - - for(std::vector::const_iterator li = llibs.begin(); - li != llibs.end(); ++li) - { - // Skip entries that resolve to the target itself or are empty. - std::string name = this->CheckCMP0004(*li); - if(name == this->GetName() || name.empty()) - { - if(name == this->GetName()) - { - bool noMessage = false; - cmake::MessageType messageType = cmake::FATAL_ERROR; - std::ostringstream e; - switch(this->GetPolicyStatusCMP0038()) - { - case cmPolicies::WARN: - { - e << cmPolicies::GetPolicyWarning(cmPolicies::CMP0038) << "\n"; - messageType = cmake::AUTHOR_WARNING; - } - break; - case cmPolicies::OLD: - noMessage = true; - case cmPolicies::REQUIRED_IF_USED: - case cmPolicies::REQUIRED_ALWAYS: - case cmPolicies::NEW: - // Issue the fatal message. - break; - } - - if(!noMessage) - { - e << "Target \"" << this->GetName() << "\" links to itself."; - this->Makefile->GetCMakeInstance()->IssueMessage( - messageType, e.str(), this->GetBacktrace()); - if (messageType == cmake::FATAL_ERROR) - { - return; - } - } - } - continue; - } - - // The entry is meant for this configuration. - impl.Libraries.push_back( - cmLinkImplItem(name, this->FindTargetToLink(name), - *btIt, evaluated != *le)); - } - - std::set const& seenProps = cge->GetSeenTargetProperties(); - for (std::set::const_iterator it = seenProps.begin(); - it != seenProps.end(); ++it) - { - if (!this->GetProperty(*it)) - { - this->LinkImplicitNullProperties.insert(*it); - } - } - cge->GetMaxLanguageStandard(this, this->MaxLanguageStandards); - } - - cmTarget::LinkLibraryType linkType = this->ComputeLinkType(config); - cmTarget::LinkLibraryVectorType const& oldllibs = - this->GetOriginalLinkLibraries(); - for(cmTarget::LinkLibraryVectorType::const_iterator li = oldllibs.begin(); - li != oldllibs.end(); ++li) - { - if(li->second != cmTarget::GENERAL && li->second != linkType) - { - std::string name = this->CheckCMP0004(li->first); - if(name == this->GetName() || name.empty()) - { - continue; - } - // Support OLD behavior for CMP0003. - impl.WrongConfigLibraries.push_back( - cmLinkItem(name, this->FindTargetToLink(name))); - } - } -} - //---------------------------------------------------------------------------- cmTarget const* cmTarget::FindTargetToLink(std::string const& name) const { diff --git a/Source/cmTarget.h b/Source/cmTarget.h index 354eda2..aab9582 100644 --- a/Source/cmTarget.h +++ b/Source/cmTarget.h @@ -225,16 +225,6 @@ public: void GetObjectLibrariesCMP0026(std::vector& objlibs) const; - cmLinkImplementationLibraries const* - GetLinkImplementationLibraries(const std::string& config) const; - - void ComputeLinkImplementationLibraries(const std::string& config, - cmOptionalLinkImplementation& impl, - cmTarget const* head) const; - - cmOptionalLinkImplementation& - GetLinkImplMap(std::string const& config) const; - cmTarget const* FindTargetToLink(std::string const& name) const; /** Strip off leading and trailing whitespace from an item named in @@ -365,12 +355,6 @@ public: bool LinkLanguagePropagatesToDependents() const { return this->TargetTypeValue == STATIC_LIBRARY; } - std::map const& - GetMaxLanguageStandards() const - { - return this->MaxLanguageStandards; - } - cmStringRange GetIncludeDirectoriesEntries() const; cmBacktraceRange GetIncludeDirectoriesBacktraces() const; @@ -385,6 +369,9 @@ public: cmStringRange GetSourceEntries() const; cmBacktraceRange GetSourceBacktraces() const; + cmStringRange GetLinkImplementationEntries() const; + cmBacktraceRange GetLinkImplementationBacktraces() const; + #if defined(_WIN32) && !defined(__CYGWIN__) const LinkLibraryVectorType &GetLinkLibrariesForVS6() const { @@ -471,7 +458,6 @@ private: std::set Utilities; mutable std::set LinkImplicitNullProperties; std::map UtilityBacktraces; - mutable std::map MaxLanguageStandards; cmPolicies::PolicyMap PolicyMap; std::string Name; std::string InstallPath; @@ -529,14 +515,8 @@ private: void ComputeImportInfo(std::string const& desired_config, ImportInfo& info) const; - cmLinkImplementationLibraries const* - GetLinkImplementationLibrariesInternal(const std::string& config, - cmTarget const* head) const; - std::string ProcessSourceItemCMP0049(const std::string& s); - void ClearLinkMaps(); - void MaybeInvalidatePropertyCache(const std::string& prop); // Internal representation details. -- cgit v0.12 From e0261a1e20f14cc2ca593bb978479b52954397d8 Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Thu, 8 Oct 2015 23:00:30 +0200 Subject: cmTarget: Make OutputInfo definition public. --- Source/cmTarget.cxx | 10 ---------- Source/cmTarget.h | 10 +++++++++- 2 files changed, 9 insertions(+), 11 deletions(-) diff --git a/Source/cmTarget.cxx b/Source/cmTarget.cxx index e1642cc..825f3eb 100644 --- a/Source/cmTarget.cxx +++ b/Source/cmTarget.cxx @@ -61,16 +61,6 @@ const char* cmTarget::GetTargetTypeName(TargetType targetType) } //---------------------------------------------------------------------------- -struct cmTarget::OutputInfo -{ - std::string OutDir; - std::string ImpDir; - std::string PdbDir; - bool empty() const - { return OutDir.empty() && ImpDir.empty() && PdbDir.empty(); } -}; - -//---------------------------------------------------------------------------- class cmTargetInternals { public: diff --git a/Source/cmTarget.h b/Source/cmTarget.h index aab9582..96cdb5e 100644 --- a/Source/cmTarget.h +++ b/Source/cmTarget.h @@ -488,7 +488,15 @@ private: #endif // Cache target output paths for each configuration. - struct OutputInfo; + struct OutputInfo + { + std::string OutDir; + std::string ImpDir; + std::string PdbDir; + bool empty() const + { return OutDir.empty() && ImpDir.empty() && PdbDir.empty(); } + }; + OutputInfo const* GetOutputInfo(const std::string& config) const; bool ComputeOutputDir(const std::string& config, -- cgit v0.12 From 8b0168863ed121c7d9f05e3282e2f59490ff6c42 Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Mon, 20 Oct 2014 20:31:47 +0200 Subject: cmGeneratorTarget: Move GetDirectory from cmTarget. --- Source/cmGeneratorExpressionNode.cxx | 2 +- Source/cmGeneratorTarget.cxx | 32 +++++++++++++++++++++----- Source/cmGeneratorTarget.h | 7 ++++++ Source/cmGlobalXCodeGenerator.cxx | 4 ++-- Source/cmInstallTargetGenerator.cxx | 2 +- Source/cmLocalVisualStudio6Generator.cxx | 24 +++++++++++-------- Source/cmLocalVisualStudio7Generator.cxx | 14 +++++------ Source/cmLocalVisualStudioGenerator.cxx | 6 +++-- Source/cmMakefileExecutableTargetGenerator.cxx | 4 ++-- Source/cmMakefileLibraryTargetGenerator.cxx | 8 +++---- Source/cmNinjaNormalTargetGenerator.cxx | 8 +++---- Source/cmNinjaTargetGenerator.cxx | 2 +- Source/cmTarget.cxx | 19 --------------- Source/cmTarget.h | 7 ------ Source/cmVisualStudio10TargetGenerator.cxx | 5 ++-- 15 files changed, 76 insertions(+), 68 deletions(-) diff --git a/Source/cmGeneratorExpressionNode.cxx b/Source/cmGeneratorExpressionNode.cxx index b61e26f..961705f 100644 --- a/Source/cmGeneratorExpressionNode.cxx +++ b/Source/cmGeneratorExpressionNode.cxx @@ -1586,7 +1586,7 @@ struct TargetFilesystemArtifactResultCreator "SHARED libraries."); return std::string(); } - std::string result = target->Target->GetDirectory(context->Config); + std::string result = target->GetDirectory(context->Config); result += "/"; result += target->GetSOName(context->Config); return result; diff --git a/Source/cmGeneratorTarget.cxx b/Source/cmGeneratorTarget.cxx index 278194e..b8a87a2 100644 --- a/Source/cmGeneratorTarget.cxx +++ b/Source/cmGeneratorTarget.cxx @@ -748,7 +748,7 @@ const char* cmGeneratorTarget::GetLocationForBuild() const } // Now handle the deprecated build-time configuration location. - location = this->Target->GetDirectory(); + location = this->GetDirectory(); const char* cfgid = this->Makefile->GetDefinition("CMAKE_CFG_INTDIR"); if(cfgid && strcmp(cfgid, ".") != 0) { @@ -1434,7 +1434,7 @@ cmGeneratorTarget::GetInstallNameDirForBuildTree( } else { - dir = this->Target->GetDirectory(config); + dir = this->GetDirectory(config); } dir += "/"; return dir; @@ -1735,7 +1735,7 @@ cmGeneratorTarget::GetMacContentDirectory(const std::string& config, bool implib) const { // Start with the output directory for the target. - std::string fpath = this->Target->GetDirectory(config, implib); + std::string fpath = this->GetDirectory(config, implib); fpath += "/"; bool contentOnly = true; if(this->Target->IsFrameworkOnApple()) @@ -2860,7 +2860,7 @@ void cmGeneratorTarget::ComputeTargetManifest( } // Get the directory. - std::string dir = this->Target->GetDirectory(config, false); + std::string dir = this->GetDirectory(config, false); // Add each name. std::string f; @@ -2894,7 +2894,7 @@ void cmGeneratorTarget::ComputeTargetManifest( } if(!impName.empty()) { - f = this->Target->GetDirectory(config, true); + f = this->GetDirectory(config, true); f += "/"; f += impName; gg->AddToManifest(f); @@ -2919,7 +2919,7 @@ std::string cmGeneratorTarget::NormalGetFullPath(const std::string& config, bool implib, bool realname) const { - std::string fpath = this->Target->GetDirectory(config, implib); + std::string fpath = this->GetDirectory(config, implib); fpath += "/"; if(this->Target->IsAppBundleOnApple()) { @@ -4454,6 +4454,26 @@ cmGeneratorTarget::GetLinkInterfaceLibraries(const std::string& config, } //---------------------------------------------------------------------------- +std::string cmGeneratorTarget::GetDirectory(const std::string& config, + bool implib) const +{ + if (this->Target->IsImported()) + { + // Return the directory from which the target is imported. + return + cmSystemTools::GetFilenamePath( + this->Target->ImportedGetFullPath(config, implib)); + } + else if(cmTarget::OutputInfo const* info = + this->Target->GetOutputInfo(config)) + { + // Return the directory in which the target will be built. + return implib? info->ImpDir : info->OutDir; + } + return ""; +} + +//---------------------------------------------------------------------------- void cmGeneratorTarget::ComputeLinkInterfaceLibraries( const std::string& config, diff --git a/Source/cmGeneratorTarget.h b/Source/cmGeneratorTarget.h index f5805f1..43b7922 100644 --- a/Source/cmGeneratorTarget.h +++ b/Source/cmGeneratorTarget.h @@ -268,6 +268,13 @@ public: */ void TraceDependencies(); + /** Get the directory in which this target will be built. If the + configuration name is given then the generator will add its + subdirectory for that configuration. Otherwise just the canonical + output directory is given. */ + std::string GetDirectory(const std::string& config = "", + bool implib = false) const; + /** Get the directory in which to place the target compiler .pdb file. If the configuration name is given then the generator will add its subdirectory for that configuration. Otherwise just the canonical diff --git a/Source/cmGlobalXCodeGenerator.cxx b/Source/cmGlobalXCodeGenerator.cxx index 3d52e3a..4144020 100644 --- a/Source/cmGlobalXCodeGenerator.cxx +++ b/Source/cmGlobalXCodeGenerator.cxx @@ -1977,7 +1977,7 @@ void cmGlobalXCodeGenerator::CreateBuildSettings(cmTarget& target, { if(!target.UsesDefaultOutputDir(configName, false)) { - std::string pncdir = target.GetDirectory(configName); + std::string pncdir = gtgt->GetDirectory(configName); buildSettings->AddAttribute("CONFIGURATION_BUILD_DIR", this->CreateString(pncdir.c_str())); } @@ -1986,7 +1986,7 @@ void cmGlobalXCodeGenerator::CreateBuildSettings(cmTarget& target, { buildSettings->AddAttribute("OBJROOT", this->CreateString(pndir.c_str())); - pndir = target.GetDirectory(configName); + pndir = gtgt->GetDirectory(configName); } if(target.IsFrameworkOnApple() || target.IsCFBundleOnApple()) diff --git a/Source/cmInstallTargetGenerator.cxx b/Source/cmInstallTargetGenerator.cxx index 30cf175..383ee00 100644 --- a/Source/cmInstallTargetGenerator.cxx +++ b/Source/cmInstallTargetGenerator.cxx @@ -83,7 +83,7 @@ void cmInstallTargetGenerator::GenerateScriptForConfig(std::ostream& os, else { fromDirConfig = - this->Target->Target->GetDirectory(config, this->ImportLibrary); + this->Target->GetDirectory(config, this->ImportLibrary); fromDirConfig += "/"; } std::string toDir = diff --git a/Source/cmLocalVisualStudio6Generator.cxx b/Source/cmLocalVisualStudio6Generator.cxx index ab215d1..862ab2d 100644 --- a/Source/cmLocalVisualStudio6Generator.cxx +++ b/Source/cmLocalVisualStudio6Generator.cxx @@ -805,7 +805,11 @@ cmLocalVisualStudio6Generator::MaybeCreateOutputDir(cmTarget& target, // VS6 forgets to create the output directory for archives if it // differs from the intermediate directory. if(target.GetType() != cmTarget::STATIC_LIBRARY) { return pcc; } - std::string outDir = target.GetDirectory(config, false); + + cmGeneratorTarget* gt = + this->GlobalGenerator->GetGeneratorTarget(&target); + + std::string outDir = gt->GetDirectory(config, false); // Add a pre-link event to create the directory. cmCustomCommandLine command; @@ -1363,20 +1367,20 @@ void cmLocalVisualStudio6Generator #ifdef CM_USE_OLD_VS6 outputDirOld = removeQuotes(this->ConvertToOutputFormat - (target.GetDirectory().c_str(), SHELL)); + (gt->GetDirectory().c_str(), SHELL)); #endif outputDirDebug = removeQuotes(this->ConvertToOutputFormat( - target.GetDirectory("Debug").c_str(), SHELL)); + gt->GetDirectory("Debug").c_str(), SHELL)); outputDirRelease = removeQuotes(this->ConvertToOutputFormat( - target.GetDirectory("Release").c_str(), SHELL)); + gt->GetDirectory("Release").c_str(), SHELL)); outputDirMinSizeRel = removeQuotes(this->ConvertToOutputFormat( - target.GetDirectory("MinSizeRel").c_str(), SHELL)); + gt->GetDirectory("MinSizeRel").c_str(), SHELL)); outputDirRelWithDebInfo = removeQuotes(this->ConvertToOutputFormat( - target.GetDirectory("RelWithDebInfo").c_str(), SHELL)); + gt->GetDirectory("RelWithDebInfo").c_str(), SHELL)); } else if(target.GetType() == cmTarget::OBJECT_LIBRARY) { @@ -1424,12 +1428,12 @@ void cmLocalVisualStudio6Generator target.GetType() == cmTarget::MODULE_LIBRARY || target.GetType() == cmTarget::EXECUTABLE) { - std::string fullPathImpDebug = target.GetDirectory("Debug", true); - std::string fullPathImpRelease = target.GetDirectory("Release", true); + std::string fullPathImpDebug = gt->GetDirectory("Debug", true); + std::string fullPathImpRelease = gt->GetDirectory("Release", true); std::string fullPathImpMinSizeRel = - target.GetDirectory("MinSizeRel", true); + gt->GetDirectory("MinSizeRel", true); std::string fullPathImpRelWithDebInfo = - target.GetDirectory("RelWithDebInfo", true); + gt->GetDirectory("RelWithDebInfo", true); fullPathImpDebug += "/"; fullPathImpRelease += "/"; fullPathImpMinSizeRel += "/"; diff --git a/Source/cmLocalVisualStudio7Generator.cxx b/Source/cmLocalVisualStudio7Generator.cxx index 8924564..e7fe61e 100644 --- a/Source/cmLocalVisualStudio7Generator.cxx +++ b/Source/cmLocalVisualStudio7Generator.cxx @@ -792,7 +792,7 @@ void cmLocalVisualStudio7Generator::WriteConfiguration(std::ostream& fout, { std::string const& outDir = target.GetType() == cmTarget::OBJECT_LIBRARY? - intermediateDir : target.GetDirectory(configName); + intermediateDir : gt->GetDirectory(configName); fout << "\t\t\tOutputDirectory=\"" << this->ConvertToXMLOutputPathSingle(outDir.c_str()) << "\"\n"; } @@ -1004,7 +1004,7 @@ void cmLocalVisualStudio7Generator::WriteConfiguration(std::ostream& fout, // Check if we need the FAT32 workaround. // Check the filesystem type where the target will be written. - if (cmLVS6G_IsFAT(target.GetDirectory(configName).c_str())) + if (cmLVS6G_IsFAT(gt->GetDirectory(configName).c_str())) { // Add a flag telling the manifest tool to use a workaround // for FAT32 file systems, which can cause an empty manifest @@ -1130,7 +1130,7 @@ void cmLocalVisualStudio7Generator::OutputBuildTool(std::ostream& fout, case cmTarget::STATIC_LIBRARY: { std::string targetNameFull = gt->GetFullName(configName); - std::string libpath = target.GetDirectory(configName); + std::string libpath = gt->GetDirectory(configName); libpath += "/"; libpath += targetNameFull; const char* tool = "VCLibrarianTool"; @@ -1210,7 +1210,7 @@ void cmLocalVisualStudio7Generator::OutputBuildTool(std::ostream& fout, fout << " "; this->Internal->OutputLibraries(fout, cli.GetItems()); fout << "\"\n"; - temp = target.GetDirectory(configName); + temp = gt->GetDirectory(configName); temp += "/"; temp += targetNameFull; fout << "\t\t\t\tOutputFile=\"" @@ -1248,7 +1248,7 @@ void cmLocalVisualStudio7Generator::OutputBuildTool(std::ostream& fout, { fout << "\t\t\t\tStackReserveSize=\"" << stackVal << "\"\n"; } - temp = target.GetDirectory(configName, true); + temp = gt->GetDirectory(configName, true); temp += "/"; temp += targetNameImport; fout << "\t\t\t\tImportLibrary=\"" @@ -1309,7 +1309,7 @@ void cmLocalVisualStudio7Generator::OutputBuildTool(std::ostream& fout, fout << " "; this->Internal->OutputLibraries(fout, cli.GetItems()); fout << "\"\n"; - temp = target.GetDirectory(configName); + temp = gt->GetDirectory(configName); temp += "/"; temp += targetNameFull; fout << "\t\t\t\tOutputFile=\"" @@ -1367,7 +1367,7 @@ void cmLocalVisualStudio7Generator::OutputBuildTool(std::ostream& fout, { fout << "\t\t\t\tStackReserveSize=\"" << stackVal << "\""; } - temp = target.GetDirectory(configName, true); + temp = gt->GetDirectory(configName, true); temp += "/"; temp += targetNameImport; fout << "\t\t\t\tImportLibrary=\"" diff --git a/Source/cmLocalVisualStudioGenerator.cxx b/Source/cmLocalVisualStudioGenerator.cxx index c0072de..c830a82 100644 --- a/Source/cmLocalVisualStudioGenerator.cxx +++ b/Source/cmLocalVisualStudioGenerator.cxx @@ -92,8 +92,10 @@ cmLocalVisualStudioGenerator::MaybeCreateImplibDir(cmTarget& target, if(target.GetType() != cmTarget::EXECUTABLE && !(isFortran && target.GetType() == cmTarget::SHARED_LIBRARY)) { return pcc; } - std::string outDir = target.GetDirectory(config, false); - std::string impDir = target.GetDirectory(config, true); + cmGeneratorTarget* gt = + this->GetGlobalGenerator()->GetGeneratorTarget(&target); + std::string outDir = gt->GetDirectory(config, false); + std::string impDir = gt->GetDirectory(config, true); if(impDir == outDir) { return pcc; } // Add a pre-build event to create the directory. diff --git a/Source/cmMakefileExecutableTargetGenerator.cxx b/Source/cmMakefileExecutableTargetGenerator.cxx index 90f679e..eebee83 100644 --- a/Source/cmMakefileExecutableTargetGenerator.cxx +++ b/Source/cmMakefileExecutableTargetGenerator.cxx @@ -99,7 +99,7 @@ void cmMakefileExecutableTargetGenerator::WriteExecutableRule(bool relink) this->ConfigName); // Construct the full path version of the names. - std::string outpath = this->Target->GetDirectory(this->ConfigName); + std::string outpath = this->GeneratorTarget->GetDirectory(this->ConfigName); if(this->Target->IsAppBundleOnApple()) { this->OSXBundleGenerator->CreateAppBundle(targetName, outpath); @@ -123,7 +123,7 @@ void cmMakefileExecutableTargetGenerator::WriteExecutableRule(bool relink) cmSystemTools::MakeDirectory(outpath.c_str()); if(!targetNameImport.empty()) { - outpathImp = this->Target->GetDirectory(this->ConfigName, true); + outpathImp = this->GeneratorTarget->GetDirectory(this->ConfigName, true); cmSystemTools::MakeDirectory(outpathImp.c_str()); outpathImp += "/"; } diff --git a/Source/cmMakefileLibraryTargetGenerator.cxx b/Source/cmMakefileLibraryTargetGenerator.cxx index cd387a0..d12142a 100644 --- a/Source/cmMakefileLibraryTargetGenerator.cxx +++ b/Source/cmMakefileLibraryTargetGenerator.cxx @@ -275,13 +275,13 @@ void cmMakefileLibraryTargetGenerator::WriteLibraryRules std::string outpathImp; if(this->Target->IsFrameworkOnApple()) { - outpath = this->Target->GetDirectory(this->ConfigName); + outpath = this->GeneratorTarget->GetDirectory(this->ConfigName); this->OSXBundleGenerator->CreateFramework(targetName, outpath); outpath += "/"; } else if(this->Target->IsCFBundleOnApple()) { - outpath = this->Target->GetDirectory(this->ConfigName); + outpath = this->GeneratorTarget->GetDirectory(this->ConfigName); this->OSXBundleGenerator->CreateCFBundle(targetName, outpath); outpath += "/"; } @@ -299,12 +299,12 @@ void cmMakefileLibraryTargetGenerator::WriteLibraryRules } else { - outpath = this->Target->GetDirectory(this->ConfigName); + outpath = this->GeneratorTarget->GetDirectory(this->ConfigName); cmSystemTools::MakeDirectory(outpath.c_str()); outpath += "/"; if(!targetNameImport.empty()) { - outpathImp = this->Target->GetDirectory(this->ConfigName, true); + outpathImp = this->GeneratorTarget->GetDirectory(this->ConfigName, true); cmSystemTools::MakeDirectory(outpathImp.c_str()); outpathImp += "/"; } diff --git a/Source/cmNinjaNormalTargetGenerator.cxx b/Source/cmNinjaNormalTargetGenerator.cxx index 24fcaf4..f8743d9 100644 --- a/Source/cmNinjaNormalTargetGenerator.cxx +++ b/Source/cmNinjaNormalTargetGenerator.cxx @@ -59,7 +59,7 @@ cmNinjaNormalTargetGenerator(cmGeneratorTarget* target) { // on Windows the output dir is already needed at compile time // ensure the directory exists (OutDir test) - EnsureDirectoryExists(target->Target->GetDirectory(this->GetConfigName())); + EnsureDirectoryExists(target->GetDirectory(this->GetConfigName())); } this->OSXBundleGenerator = new cmOSXBundleGenerator(target, @@ -413,7 +413,7 @@ void cmNinjaNormalTargetGenerator::WriteLinkStatement() if (target.IsAppBundleOnApple()) { // Create the app bundle - std::string outpath = target.GetDirectory(cfgName); + std::string outpath = gt.GetDirectory(cfgName); this->OSXBundleGenerator->CreateAppBundle(this->TargetNameOut, outpath); // Calculate the output path @@ -430,13 +430,13 @@ void cmNinjaNormalTargetGenerator::WriteLinkStatement() { // Create the library framework. this->OSXBundleGenerator->CreateFramework(this->TargetNameOut, - target.GetDirectory(cfgName)); + gt.GetDirectory(cfgName)); } else if(target.IsCFBundleOnApple()) { // Create the core foundation bundle. this->OSXBundleGenerator->CreateCFBundle(this->TargetNameOut, - target.GetDirectory(cfgName)); + gt.GetDirectory(cfgName)); } // Write comments. diff --git a/Source/cmNinjaTargetGenerator.cxx b/Source/cmNinjaTargetGenerator.cxx index 6e6dc60..33e08a3 100644 --- a/Source/cmNinjaTargetGenerator.cxx +++ b/Source/cmNinjaTargetGenerator.cxx @@ -254,7 +254,7 @@ cmNinjaTargetGenerator std::string cmNinjaTargetGenerator::GetTargetOutputDir() const { - std::string dir = this->Target->GetDirectory(this->GetConfigName()); + std::string dir = this->GeneratorTarget->GetDirectory(this->GetConfigName()); return ConvertToNinjaPath(dir); } diff --git a/Source/cmTarget.cxx b/Source/cmTarget.cxx index 825f3eb..0f8b3b0 100644 --- a/Source/cmTarget.cxx +++ b/Source/cmTarget.cxx @@ -1771,25 +1771,6 @@ cmTarget::OutputInfo const* cmTarget::GetOutputInfo( } //---------------------------------------------------------------------------- -std::string cmTarget::GetDirectory(const std::string& config, - bool implib) const -{ - if (this->IsImported()) - { - // Return the directory from which the target is imported. - return - cmSystemTools::GetFilenamePath( - this->ImportedGetFullPath(config, implib)); - } - else if(OutputInfo const* info = this->GetOutputInfo(config)) - { - // Return the directory in which the target will be built. - return implib? info->ImpDir : info->OutDir; - } - return ""; -} - -//---------------------------------------------------------------------------- std::string cmTarget::GetPDBDirectory(const std::string& config) const { if(OutputInfo const* info = this->GetOutputInfo(config)) diff --git a/Source/cmTarget.h b/Source/cmTarget.h index 96cdb5e..507ea7d 100644 --- a/Source/cmTarget.h +++ b/Source/cmTarget.h @@ -231,13 +231,6 @@ public: the link dependencies of this target. */ std::string CheckCMP0004(std::string const& item) const; - /** Get the directory in which this target will be built. If the - configuration name is given then the generator will add its - subdirectory for that configuration. Otherwise just the canonical - output directory is given. */ - std::string GetDirectory(const std::string& config = "", - bool implib = false) const; - /** Get the directory in which this targets .pdb files will be placed. If the configuration name is given then the generator will add its subdirectory for that configuration. Otherwise just the canonical diff --git a/Source/cmVisualStudio10TargetGenerator.cxx b/Source/cmVisualStudio10TargetGenerator.cxx index 2395ce7..4c9b82b 100644 --- a/Source/cmVisualStudio10TargetGenerator.cxx +++ b/Source/cmVisualStudio10TargetGenerator.cxx @@ -1780,7 +1780,7 @@ void cmVisualStudio10TargetGenerator::WritePathAndIncrementalLinkOptions() } else { - outDir = this->Target->GetDirectory(config->c_str()) + "/"; + outDir = this->GeneratorTarget->GetDirectory(config->c_str()) + "/"; targetNameFull = this->GeneratorTarget->GetFullName(config->c_str()); } this->ConvertToWindowsSlash(intermediateDir); @@ -2584,7 +2584,8 @@ cmVisualStudio10TargetGenerator::ComputeLinkOptions(std::string const& config) std::string pdb = this->Target->GetPDBDirectory(config.c_str()); pdb += "/"; pdb += targetNamePDB; - std::string imLib = this->Target->GetDirectory(config.c_str(), true); + std::string imLib = + this->GeneratorTarget->GetDirectory(config.c_str(), true); imLib += "/"; imLib += targetNameImport; -- cgit v0.12 From 50dc9b44404f4f31aa24cf17247f10539c3807b2 Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Wed, 5 Aug 2015 18:39:17 +0200 Subject: cmGeneratorTarget: Move GetPDBDirectory from cmTarget. --- Source/cmGeneratorExpressionNode.cxx | 2 +- Source/cmGeneratorTarget.cxx | 14 +++++++++++++- Source/cmGeneratorTarget.h | 6 ++++++ Source/cmLocalVisualStudio7Generator.cxx | 4 ++-- Source/cmMakefileExecutableTargetGenerator.cxx | 3 ++- Source/cmMakefileLibraryTargetGenerator.cxx | 3 ++- Source/cmMakefileTargetGenerator.cxx | 3 ++- Source/cmNinjaTargetGenerator.cxx | 2 +- Source/cmTarget.cxx | 11 ----------- Source/cmTarget.h | 6 ------ Source/cmVisualStudio10TargetGenerator.cxx | 2 +- 11 files changed, 30 insertions(+), 26 deletions(-) diff --git a/Source/cmGeneratorExpressionNode.cxx b/Source/cmGeneratorExpressionNode.cxx index 961705f..fdacc82 100644 --- a/Source/cmGeneratorExpressionNode.cxx +++ b/Source/cmGeneratorExpressionNode.cxx @@ -1631,7 +1631,7 @@ struct TargetFilesystemArtifactResultCreator return std::string(); } - std::string result = target->Target->GetPDBDirectory(context->Config); + std::string result = target->GetPDBDirectory(context->Config); result += "/"; result += target->GetPDBName(context->Config); return result; diff --git a/Source/cmGeneratorTarget.cxx b/Source/cmGeneratorTarget.cxx index b8a87a2..a2423cc 100644 --- a/Source/cmGeneratorTarget.cxx +++ b/Source/cmGeneratorTarget.cxx @@ -1130,7 +1130,7 @@ cmGeneratorTarget::GetCompilePDBPath(const std::string& config) const std::string name = this->GetCompilePDBName(config); if(dir.empty() && !name.empty()) { - dir = this->Target->GetPDBDirectory(config); + dir = this->GetPDBDirectory(config); } if(!dir.empty()) { @@ -4995,3 +4995,15 @@ void cmGeneratorTarget::ComputeLinkImplementationLibraries( } } } + +//---------------------------------------------------------------------------- +std::string +cmGeneratorTarget::GetPDBDirectory(const std::string& config) const +{ + if(cmTarget::OutputInfo const* info = this->Target->GetOutputInfo(config)) + { + // Return the directory in which the target will be built. + return info->PdbDir; + } + return ""; +} diff --git a/Source/cmGeneratorTarget.h b/Source/cmGeneratorTarget.h index 43b7922..b39ba9f 100644 --- a/Source/cmGeneratorTarget.h +++ b/Source/cmGeneratorTarget.h @@ -359,6 +359,12 @@ public: /** Return true if builtin chrpath will work for this target */ bool IsChrpathUsed(const std::string& config) const; + /** Get the directory in which this targets .pdb files will be placed. + If the configuration name is given then the generator will add its + subdirectory for that configuration. Otherwise just the canonical + pdb output directory is given. */ + std::string GetPDBDirectory(const std::string& config) const; + ///! Return the preferred linker language for this target std::string GetLinkerLanguage(const std::string& config = "") const; diff --git a/Source/cmLocalVisualStudio7Generator.cxx b/Source/cmLocalVisualStudio7Generator.cxx index e7fe61e..e3c28ee 100644 --- a/Source/cmLocalVisualStudio7Generator.cxx +++ b/Source/cmLocalVisualStudio7Generator.cxx @@ -1220,7 +1220,7 @@ void cmLocalVisualStudio7Generator::OutputBuildTool(std::ostream& fout, fout << "\t\t\t\tAdditionalLibraryDirectories=\""; this->OutputLibraryDirectories(fout, cli.GetDirectories()); fout << "\"\n"; - temp = target.GetPDBDirectory(configName); + temp = gt->GetPDBDirectory(configName); temp += "/"; temp += targetNamePDB; fout << "\t\t\t\tProgramDatabaseFile=\"" << @@ -1320,7 +1320,7 @@ void cmLocalVisualStudio7Generator::OutputBuildTool(std::ostream& fout, this->OutputLibraryDirectories(fout, cli.GetDirectories()); fout << "\"\n"; std::string path = this->ConvertToXMLOutputPathSingle( - target.GetPDBDirectory(configName).c_str()); + gt->GetPDBDirectory(configName).c_str()); fout << "\t\t\t\tProgramDatabaseFile=\"" << path << "/" << targetNamePDB << "\"\n"; diff --git a/Source/cmMakefileExecutableTargetGenerator.cxx b/Source/cmMakefileExecutableTargetGenerator.cxx index eebee83..f6b907e 100644 --- a/Source/cmMakefileExecutableTargetGenerator.cxx +++ b/Source/cmMakefileExecutableTargetGenerator.cxx @@ -133,7 +133,8 @@ void cmMakefileExecutableTargetGenerator::WriteExecutableRule(bool relink) this->GeneratorTarget->GetCompilePDBDirectory(this->ConfigName); cmSystemTools::MakeDirectory(compilePdbOutputPath.c_str()); - std::string pdbOutputPath = this->Target->GetPDBDirectory(this->ConfigName); + std::string pdbOutputPath = + this->GeneratorTarget->GetPDBDirectory(this->ConfigName); cmSystemTools::MakeDirectory(pdbOutputPath.c_str()); pdbOutputPath += "/"; diff --git a/Source/cmMakefileLibraryTargetGenerator.cxx b/Source/cmMakefileLibraryTargetGenerator.cxx index d12142a..3b3f63e 100644 --- a/Source/cmMakefileLibraryTargetGenerator.cxx +++ b/Source/cmMakefileLibraryTargetGenerator.cxx @@ -314,7 +314,8 @@ void cmMakefileLibraryTargetGenerator::WriteLibraryRules this->GeneratorTarget->GetCompilePDBDirectory(this->ConfigName); cmSystemTools::MakeDirectory(compilePdbOutputPath.c_str()); - std::string pdbOutputPath = this->Target->GetPDBDirectory(this->ConfigName); + std::string pdbOutputPath = + this->GeneratorTarget->GetPDBDirectory(this->ConfigName); cmSystemTools::MakeDirectory(pdbOutputPath.c_str()); pdbOutputPath += "/"; diff --git a/Source/cmMakefileTargetGenerator.cxx b/Source/cmMakefileTargetGenerator.cxx index cd499f6..6eafeae 100644 --- a/Source/cmMakefileTargetGenerator.cxx +++ b/Source/cmMakefileTargetGenerator.cxx @@ -546,7 +546,8 @@ cmMakefileTargetGenerator { targetFullPathReal = this->GeneratorTarget->GetFullPath(this->ConfigName, false, true); - targetFullPathPDB = this->Target->GetPDBDirectory(this->ConfigName); + targetFullPathPDB = + this->GeneratorTarget->GetPDBDirectory(this->ConfigName); targetFullPathPDB += "/"; targetFullPathPDB += this->GeneratorTarget->GetPDBName(this->ConfigName); } diff --git a/Source/cmNinjaTargetGenerator.cxx b/Source/cmNinjaTargetGenerator.cxx index 33e08a3..c2daa63 100644 --- a/Source/cmNinjaTargetGenerator.cxx +++ b/Source/cmNinjaTargetGenerator.cxx @@ -289,7 +289,7 @@ bool cmNinjaTargetGenerator::SetMsvcTargetPdbVariable(cmNinjaVars& vars) const this->Target->GetType() == cmTarget::SHARED_LIBRARY || this->Target->GetType() == cmTarget::MODULE_LIBRARY) { - pdbPath = this->Target->GetPDBDirectory(this->GetConfigName()); + pdbPath = this->GeneratorTarget->GetPDBDirectory(this->GetConfigName()); pdbPath += "/"; pdbPath += this->GeneratorTarget->GetPDBName(this->GetConfigName()); } diff --git a/Source/cmTarget.cxx b/Source/cmTarget.cxx index 0f8b3b0..0fc0423 100644 --- a/Source/cmTarget.cxx +++ b/Source/cmTarget.cxx @@ -1771,17 +1771,6 @@ cmTarget::OutputInfo const* cmTarget::GetOutputInfo( } //---------------------------------------------------------------------------- -std::string cmTarget::GetPDBDirectory(const std::string& config) const -{ - if(OutputInfo const* info = this->GetOutputInfo(config)) - { - // Return the directory in which the target will be built. - return info->PdbDir; - } - return ""; -} - -//---------------------------------------------------------------------------- const char* cmTarget::ImportedGetLocation(const std::string& config) const { static std::string location; diff --git a/Source/cmTarget.h b/Source/cmTarget.h index 507ea7d..2f9a94b 100644 --- a/Source/cmTarget.h +++ b/Source/cmTarget.h @@ -231,12 +231,6 @@ public: the link dependencies of this target. */ std::string CheckCMP0004(std::string const& item) const; - /** Get the directory in which this targets .pdb files will be placed. - If the configuration name is given then the generator will add its - subdirectory for that configuration. Otherwise just the canonical - pdb output directory is given. */ - std::string GetPDBDirectory(const std::string& config) const; - const char* ImportedGetLocation(const std::string& config) const; /** Get the target major and minor version numbers interpreted from diff --git a/Source/cmVisualStudio10TargetGenerator.cxx b/Source/cmVisualStudio10TargetGenerator.cxx index 4c9b82b..a4b0bc3 100644 --- a/Source/cmVisualStudio10TargetGenerator.cxx +++ b/Source/cmVisualStudio10TargetGenerator.cxx @@ -2581,7 +2581,7 @@ cmVisualStudio10TargetGenerator::ComputeLinkOptions(std::string const& config) { linkOptions.AddFlag("GenerateDebugInformation", "false"); } - std::string pdb = this->Target->GetPDBDirectory(config.c_str()); + std::string pdb = this->GeneratorTarget->GetPDBDirectory(config.c_str()); pdb += "/"; pdb += targetNamePDB; std::string imLib = -- cgit v0.12 From 1abc20d81df3ee9845904b356960870526fe3276 Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Wed, 5 Aug 2015 18:47:35 +0200 Subject: cmGeneratorTarget: Move UsesDefaultOutputDir from cmTarget. --- Source/cmGeneratorTarget.cxx | 8 ++++++++ Source/cmGeneratorTarget.h | 4 ++++ Source/cmGlobalXCodeGenerator.cxx | 2 +- Source/cmTarget.cxx | 8 -------- Source/cmTarget.h | 4 ---- 5 files changed, 13 insertions(+), 13 deletions(-) diff --git a/Source/cmGeneratorTarget.cxx b/Source/cmGeneratorTarget.cxx index a2423cc..9f46909 100644 --- a/Source/cmGeneratorTarget.cxx +++ b/Source/cmGeneratorTarget.cxx @@ -4474,6 +4474,14 @@ std::string cmGeneratorTarget::GetDirectory(const std::string& config, } //---------------------------------------------------------------------------- +bool cmGeneratorTarget::UsesDefaultOutputDir(const std::string& config, + bool implib) const +{ + std::string dir; + return this->Target->ComputeOutputDir(config, implib, dir); +} + +//---------------------------------------------------------------------------- void cmGeneratorTarget::ComputeLinkInterfaceLibraries( const std::string& config, diff --git a/Source/cmGeneratorTarget.h b/Source/cmGeneratorTarget.h index b39ba9f..a1ad477 100644 --- a/Source/cmGeneratorTarget.h +++ b/Source/cmGeneratorTarget.h @@ -285,6 +285,10 @@ public: std::vector const* GetSourceDepends(cmSourceFile const* sf) const; + /** Return whether this target uses the default value for its output + directory. */ + bool UsesDefaultOutputDir(const std::string& config, bool implib) const; + /** Get the name of the pdb file for the target. */ std::string GetPDBName(const std::string& config="") const; diff --git a/Source/cmGlobalXCodeGenerator.cxx b/Source/cmGlobalXCodeGenerator.cxx index 4144020..0370d74 100644 --- a/Source/cmGlobalXCodeGenerator.cxx +++ b/Source/cmGlobalXCodeGenerator.cxx @@ -1975,7 +1975,7 @@ void cmGlobalXCodeGenerator::CreateBuildSettings(cmTarget& target, { if(this->XcodeVersion >= 21) { - if(!target.UsesDefaultOutputDir(configName, false)) + if(!gtgt->UsesDefaultOutputDir(configName, false)) { std::string pncdir = gtgt->GetDirectory(configName); buildSettings->AddAttribute("CONFIGURATION_BUILD_DIR", diff --git a/Source/cmTarget.cxx b/Source/cmTarget.cxx index 0fc0423..bf8b8a9 100644 --- a/Source/cmTarget.cxx +++ b/Source/cmTarget.cxx @@ -2667,14 +2667,6 @@ bool cmTarget::ComputePDBOutputDir(const std::string& kind, } //---------------------------------------------------------------------------- -bool cmTarget::UsesDefaultOutputDir(const std::string& config, - bool implib) const -{ - std::string dir; - return this->ComputeOutputDir(config, implib, dir); -} - -//---------------------------------------------------------------------------- std::string cmTarget::GetFrameworkVersion() const { assert(this->GetType() != INTERFACE_LIBRARY); diff --git a/Source/cmTarget.h b/Source/cmTarget.h index 2f9a94b..3130660 100644 --- a/Source/cmTarget.h +++ b/Source/cmTarget.h @@ -312,10 +312,6 @@ public: /** Get a build-tree directory in which to place target support files. */ std::string GetSupportDirectory() const; - /** Return whether this target uses the default value for its output - directory. */ - bool UsesDefaultOutputDir(const std::string& config, bool implib) const; - /** @return whether this target have a well defined output file name. */ bool HaveWellDefinedOutputFiles() const; -- cgit v0.12 From 0bae4a416f9f1b9090499d26f8508660f4f3fc95 Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Wed, 5 Aug 2015 18:55:14 +0200 Subject: cmGeneratorTarget: Move output info from cmTarget. --- Source/cmGeneratorTarget.cxx | 161 +++++++++++++++++++++++++++++++++++++++++-- Source/cmGeneratorTarget.h | 18 +++++ Source/cmTarget.cxx | 158 ------------------------------------------ Source/cmTarget.h | 14 ---- 4 files changed, 175 insertions(+), 176 deletions(-) diff --git a/Source/cmGeneratorTarget.cxx b/Source/cmGeneratorTarget.cxx index 9f46909..2f2fb3b 100644 --- a/Source/cmGeneratorTarget.cxx +++ b/Source/cmGeneratorTarget.cxx @@ -4464,8 +4464,7 @@ std::string cmGeneratorTarget::GetDirectory(const std::string& config, cmSystemTools::GetFilenamePath( this->Target->ImportedGetFullPath(config, implib)); } - else if(cmTarget::OutputInfo const* info = - this->Target->GetOutputInfo(config)) + else if(OutputInfo const* info = this->GetOutputInfo(config)) { // Return the directory in which the target will be built. return implib? info->ImpDir : info->OutDir; @@ -4478,7 +4477,161 @@ bool cmGeneratorTarget::UsesDefaultOutputDir(const std::string& config, bool implib) const { std::string dir; - return this->Target->ComputeOutputDir(config, implib, dir); + return this->ComputeOutputDir(config, implib, dir); +} + +//---------------------------------------------------------------------------- +cmGeneratorTarget::OutputInfo const* cmGeneratorTarget::GetOutputInfo( + const std::string& config) const +{ + // There is no output information for imported targets. + if(this->IsImported()) + { + return 0; + } + + // Only libraries and executables have well-defined output files. + if(!this->Target->HaveWellDefinedOutputFiles()) + { + std::string msg = "cmGeneratorTarget::GetOutputInfo called for "; + msg += this->GetName(); + msg += " which has type "; + msg += cmTarget::GetTargetTypeName(cmTarget::TargetType(this->GetType())); + this->LocalGenerator->IssueMessage(cmake::INTERNAL_ERROR, msg); + return 0; + } + + // Lookup/compute/cache the output information for this configuration. + std::string config_upper; + if(!config.empty()) + { + config_upper = cmSystemTools::UpperCase(config); + } + OutputInfoMapType::iterator i = + this->OutputInfoMap.find(config_upper); + if(i == this->OutputInfoMap.end()) + { + // Add empty info in map to detect potential recursion. + OutputInfo info; + OutputInfoMapType::value_type entry(config_upper, info); + i = this->OutputInfoMap.insert(entry).first; + + // Compute output directories. + this->ComputeOutputDir(config, false, info.OutDir); + this->ComputeOutputDir(config, true, info.ImpDir); + if(!this->Target->ComputePDBOutputDir("PDB", config, info.PdbDir)) + { + info.PdbDir = info.OutDir; + } + + // Now update the previously-prepared map entry. + i->second = info; + } + else if(i->second.empty()) + { + // An empty map entry indicates we have been called recursively + // from the above block. + this->LocalGenerator->GetCMakeInstance()->IssueMessage( + cmake::FATAL_ERROR, + "Target '" + this->GetName() + "' OUTPUT_DIRECTORY depends on itself.", + this->Target->GetBacktrace()); + return 0; + } + return &i->second; +} + +//---------------------------------------------------------------------------- +bool cmGeneratorTarget::ComputeOutputDir(const std::string& config, + bool implib, std::string& out) const +{ + bool usesDefaultOutputDir = false; + std::string conf = config; + + // Look for a target property defining the target output directory + // based on the target type. + std::string targetTypeName = this->Target->GetOutputTargetType(implib); + const char* propertyName = 0; + std::string propertyNameStr = targetTypeName; + if(!propertyNameStr.empty()) + { + propertyNameStr += "_OUTPUT_DIRECTORY"; + propertyName = propertyNameStr.c_str(); + } + + // Check for a per-configuration output directory target property. + std::string configUpper = cmSystemTools::UpperCase(conf); + const char* configProp = 0; + std::string configPropStr = targetTypeName; + if(!configPropStr.empty()) + { + configPropStr += "_OUTPUT_DIRECTORY_"; + configPropStr += configUpper; + configProp = configPropStr.c_str(); + } + + // Select an output directory. + if(const char* config_outdir = this->GetProperty(configProp)) + { + // Use the user-specified per-configuration output directory. + cmGeneratorExpression ge; + cmsys::auto_ptr cge = + ge.Parse(config_outdir); + out = cge->Evaluate(this->Makefile, config); + + // Skip per-configuration subdirectory. + conf = ""; + } + else if(const char* outdir = this->Target->GetProperty(propertyName)) + { + // Use the user-specified output directory. + cmGeneratorExpression ge; + cmsys::auto_ptr cge = + ge.Parse(outdir); + out = cge->Evaluate(this->Makefile, config); + + // Skip per-configuration subdirectory if the value contained a + // generator expression. + if (out != outdir) + { + conf = ""; + } + } + else if(this->GetType() == cmTarget::EXECUTABLE) + { + // Lookup the output path for executables. + out = this->Makefile->GetSafeDefinition("EXECUTABLE_OUTPUT_PATH"); + } + else if(this->GetType() == cmTarget::STATIC_LIBRARY || + this->GetType() == cmTarget::SHARED_LIBRARY || + this->GetType() == cmTarget::MODULE_LIBRARY) + { + // Lookup the output path for libraries. + out = this->Makefile->GetSafeDefinition("LIBRARY_OUTPUT_PATH"); + } + if(out.empty()) + { + // Default to the current output directory. + usesDefaultOutputDir = true; + out = "."; + } + + // Convert the output path to a full path in case it is + // specified as a relative path. Treat a relative path as + // relative to the current output directory for this makefile. + out = (cmSystemTools::CollapseFullPath + (out, this->Makefile->GetCurrentBinaryDirectory())); + + // The generator may add the configuration's subdirectory. + if(!conf.empty()) + { + bool iosPlatform = this->Makefile->PlatformIsAppleIos(); + std::string suffix = + usesDefaultOutputDir && iosPlatform ? "${EFFECTIVE_PLATFORM_NAME}" : ""; + this->LocalGenerator->GetGlobalGenerator()-> + AppendDirectoryForConfig("/", conf, suffix, out); + } + + return usesDefaultOutputDir; } //---------------------------------------------------------------------------- @@ -5008,7 +5161,7 @@ void cmGeneratorTarget::ComputeLinkImplementationLibraries( std::string cmGeneratorTarget::GetPDBDirectory(const std::string& config) const { - if(cmTarget::OutputInfo const* info = this->Target->GetOutputInfo(config)) + if(OutputInfo const* info = this->GetOutputInfo(config)) { // Return the directory in which the target will be built. return info->PdbDir; diff --git a/Source/cmGeneratorTarget.h b/Source/cmGeneratorTarget.h index a1ad477..77d3b99 100644 --- a/Source/cmGeneratorTarget.h +++ b/Source/cmGeneratorTarget.h @@ -289,6 +289,18 @@ public: directory. */ bool UsesDefaultOutputDir(const std::string& config, bool implib) const; + // Cache target output paths for each configuration. + struct OutputInfo + { + std::string OutDir; + std::string ImpDir; + std::string PdbDir; + bool empty() const + { return OutDir.empty() && ImpDir.empty() && PdbDir.empty(); } + }; + + OutputInfo const* GetOutputInfo(const std::string& config) const; + /** Get the name of the pdb file for the target. */ std::string GetPDBName(const std::string& config="") const; @@ -495,6 +507,12 @@ private: cmLinkImplementationLibraries const* GetLinkImplementationLibrariesInternal(const std::string& config, cmTarget const* head) const; + bool + ComputeOutputDir(const std::string& config, + bool implib, std::string& out) const; + + typedef std::map OutputInfoMapType; + mutable OutputInfoMapType OutputInfoMap; typedef std::pair OutputNameKey; typedef std::map OutputNameMapType; diff --git a/Source/cmTarget.cxx b/Source/cmTarget.cxx index bf8b8a9..c20ce83 100644 --- a/Source/cmTarget.cxx +++ b/Source/cmTarget.cxx @@ -79,9 +79,6 @@ public: // The backtrace when the target was created. cmListFileBacktrace Backtrace; - typedef std::map OutputInfoMapType; - OutputInfoMapType OutputInfoMap; - typedef std::map ImportInfoMapType; ImportInfoMapType ImportInfoMap; @@ -1710,67 +1707,6 @@ bool cmTarget::HaveWellDefinedOutputFiles() const } //---------------------------------------------------------------------------- -cmTarget::OutputInfo const* cmTarget::GetOutputInfo( - const std::string& config) const -{ - // There is no output information for imported targets. - if(this->IsImported()) - { - return 0; - } - - // Only libraries and executables have well-defined output files. - if(!this->HaveWellDefinedOutputFiles()) - { - std::string msg = "cmTarget::GetOutputInfo called for "; - msg += this->GetName(); - msg += " which has type "; - msg += cmTarget::GetTargetTypeName(this->GetType()); - this->GetMakefile()->IssueMessage(cmake::INTERNAL_ERROR, msg); - return 0; - } - - // Lookup/compute/cache the output information for this configuration. - std::string config_upper; - if(!config.empty()) - { - config_upper = cmSystemTools::UpperCase(config); - } - typedef cmTargetInternals::OutputInfoMapType OutputInfoMapType; - OutputInfoMapType::iterator i = - this->Internal->OutputInfoMap.find(config_upper); - if(i == this->Internal->OutputInfoMap.end()) - { - // Add empty info in map to detect potential recursion. - OutputInfo info; - OutputInfoMapType::value_type entry(config_upper, info); - i = this->Internal->OutputInfoMap.insert(entry).first; - - // Compute output directories. - this->ComputeOutputDir(config, false, info.OutDir); - this->ComputeOutputDir(config, true, info.ImpDir); - if(!this->ComputePDBOutputDir("PDB", config, info.PdbDir)) - { - info.PdbDir = info.OutDir; - } - - // Now update the previously-prepared map entry. - i->second = info; - } - else if(i->second.empty()) - { - // An empty map entry indicates we have been called recursively - // from the above block. - this->Makefile->GetCMakeInstance()->IssueMessage( - cmake::FATAL_ERROR, - "Target '" + this->GetName() + "' OUTPUT_DIRECTORY depends on itself.", - this->GetBacktrace()); - return 0; - } - return &i->second; -} - -//---------------------------------------------------------------------------- const char* cmTarget::ImportedGetLocation(const std::string& config) const { static std::string location; @@ -2512,100 +2448,6 @@ const char* cmTarget::GetOutputTargetType(bool implib) const } //---------------------------------------------------------------------------- -bool cmTarget::ComputeOutputDir(const std::string& config, - bool implib, std::string& out) const -{ - bool usesDefaultOutputDir = false; - std::string conf = config; - - // Look for a target property defining the target output directory - // based on the target type. - std::string targetTypeName = this->GetOutputTargetType(implib); - const char* propertyName = 0; - std::string propertyNameStr = targetTypeName; - if(!propertyNameStr.empty()) - { - propertyNameStr += "_OUTPUT_DIRECTORY"; - propertyName = propertyNameStr.c_str(); - } - - // Check for a per-configuration output directory target property. - std::string configUpper = cmSystemTools::UpperCase(conf); - const char* configProp = 0; - std::string configPropStr = targetTypeName; - if(!configPropStr.empty()) - { - configPropStr += "_OUTPUT_DIRECTORY_"; - configPropStr += configUpper; - configProp = configPropStr.c_str(); - } - - // Select an output directory. - if(const char* config_outdir = this->GetProperty(configProp)) - { - // Use the user-specified per-configuration output directory. - cmGeneratorExpression ge; - cmsys::auto_ptr cge = - ge.Parse(config_outdir); - out = cge->Evaluate(this->Makefile, config); - - // Skip per-configuration subdirectory. - conf = ""; - } - else if(const char* outdir = this->GetProperty(propertyName)) - { - // Use the user-specified output directory. - cmGeneratorExpression ge; - cmsys::auto_ptr cge = - ge.Parse(outdir); - out = cge->Evaluate(this->Makefile, config); - - // Skip per-configuration subdirectory if the value contained a - // generator expression. - if (out != outdir) - { - conf = ""; - } - } - else if(this->GetType() == cmTarget::EXECUTABLE) - { - // Lookup the output path for executables. - out = this->Makefile->GetSafeDefinition("EXECUTABLE_OUTPUT_PATH"); - } - else if(this->GetType() == cmTarget::STATIC_LIBRARY || - this->GetType() == cmTarget::SHARED_LIBRARY || - this->GetType() == cmTarget::MODULE_LIBRARY) - { - // Lookup the output path for libraries. - out = this->Makefile->GetSafeDefinition("LIBRARY_OUTPUT_PATH"); - } - if(out.empty()) - { - // Default to the current output directory. - usesDefaultOutputDir = true; - out = "."; - } - - // Convert the output path to a full path in case it is - // specified as a relative path. Treat a relative path as - // relative to the current output directory for this makefile. - out = (cmSystemTools::CollapseFullPath - (out, this->Makefile->GetCurrentBinaryDirectory())); - - // The generator may add the configuration's subdirectory. - if(!conf.empty()) - { - bool iosPlatform = this->Makefile->PlatformIsAppleIos(); - std::string suffix = - usesDefaultOutputDir && iosPlatform ? "${EFFECTIVE_PLATFORM_NAME}" : ""; - this->Makefile->GetGlobalGenerator()-> - AppendDirectoryForConfig("/", conf, suffix, out); - } - - return usesDefaultOutputDir; -} - -//---------------------------------------------------------------------------- bool cmTarget::ComputePDBOutputDir(const std::string& kind, const std::string& config, std::string& out) const diff --git a/Source/cmTarget.h b/Source/cmTarget.h index 3130660..dda5384 100644 --- a/Source/cmTarget.h +++ b/Source/cmTarget.h @@ -470,20 +470,6 @@ private: bool LinkLibrariesForVS6Analyzed; #endif - // Cache target output paths for each configuration. - struct OutputInfo - { - std::string OutDir; - std::string ImpDir; - std::string PdbDir; - bool empty() const - { return OutDir.empty() && ImpDir.empty() && PdbDir.empty(); } - }; - - OutputInfo const* GetOutputInfo(const std::string& config) const; - bool - ComputeOutputDir(const std::string& config, - bool implib, std::string& out) const; bool ComputePDBOutputDir(const std::string& kind, const std::string& config, std::string& out) const; -- cgit v0.12 From 49017cddab23702d8228a195f64934e61ab7667e Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Wed, 5 Aug 2015 18:41:53 +0200 Subject: cmGeneratorTarget: Move IsNullImpliedByLinkLibraries from cmTarget. --- Source/cmGeneratorTarget.cxx | 12 ++++++++++-- Source/cmGeneratorTarget.h | 3 +++ Source/cmTarget.cxx | 7 ------- Source/cmTarget.h | 3 --- 4 files changed, 13 insertions(+), 12 deletions(-) diff --git a/Source/cmGeneratorTarget.cxx b/Source/cmGeneratorTarget.cxx index 2f2fb3b..3651da6 100644 --- a/Source/cmGeneratorTarget.cxx +++ b/Source/cmGeneratorTarget.cxx @@ -3928,7 +3928,7 @@ PropertyType checkInterfacePropertyCompatibility(cmGeneratorTarget const* tgt, .find(p) != tgt->Target->GetProperties().end(); const bool impliedByUse = - tgt->Target->IsNullImpliedByLinkLibraries(p); + tgt->IsNullImpliedByLinkLibraries(p); assert((impliedByUse ^ explicitlySet) || (!impliedByUse && !explicitlySet)); @@ -5046,6 +5046,14 @@ cmGeneratorTarget::GetLinkImplementationLibrariesInternal( } //---------------------------------------------------------------------------- +bool +cmGeneratorTarget::IsNullImpliedByLinkLibraries(const std::string &p) const +{ + return this->LinkImplicitNullProperties.find(p) + != this->LinkImplicitNullProperties.end(); +} + +//---------------------------------------------------------------------------- void cmGeneratorTarget::ComputeLinkImplementationLibraries( const std::string& config, cmOptionalLinkImplementation& impl, @@ -5130,7 +5138,7 @@ void cmGeneratorTarget::ComputeLinkImplementationLibraries( { if (!this->GetProperty(*it)) { - this->Target->LinkImplicitNullProperties.insert(*it); + this->LinkImplicitNullProperties.insert(*it); } } cge->GetMaxLanguageStandard(this->Target, diff --git a/Source/cmGeneratorTarget.h b/Source/cmGeneratorTarget.h index 77d3b99..f0f6d41 100644 --- a/Source/cmGeneratorTarget.h +++ b/Source/cmGeneratorTarget.h @@ -317,6 +317,8 @@ public: typedef std::map CompileInfoMapType; mutable CompileInfoMapType CompileInfoMap; + bool IsNullImpliedByLinkLibraries(const std::string &p) const; + /** Get the name of the compiler pdb file for the target. */ std::string GetCompilePDBName(const std::string& config="") const; @@ -486,6 +488,7 @@ private: std::vector CompileFeaturesEntries; std::vector CompileDefinitionsEntries; std::vector SourceEntries; + mutable std::set LinkImplicitNullProperties; void ExpandLinkItems(std::string const& prop, std::string const& value, std::string const& config, cmTarget const* headTarget, diff --git a/Source/cmTarget.cxx b/Source/cmTarget.cxx index c20ce83..af7fe2e 100644 --- a/Source/cmTarget.cxx +++ b/Source/cmTarget.cxx @@ -2554,13 +2554,6 @@ const char* cmTarget::GetExportMacro() const } //---------------------------------------------------------------------------- -bool cmTarget::IsNullImpliedByLinkLibraries(const std::string &p) const -{ - return this->LinkImplicitNullProperties.find(p) - != this->LinkImplicitNullProperties.end(); -} - -//---------------------------------------------------------------------------- void cmTarget::GetObjectLibrariesCMP0026(std::vector& objlibs) const { diff --git a/Source/cmTarget.h b/Source/cmTarget.h index dda5384..a3a8063 100644 --- a/Source/cmTarget.h +++ b/Source/cmTarget.h @@ -326,8 +326,6 @@ public: void AppendBuildInterfaceIncludes(); - bool IsNullImpliedByLinkLibraries(const std::string &p) const; - std::string GetDebugGeneratorExpressions(const std::string &value, cmTarget::LinkLibraryType llt) const; @@ -439,7 +437,6 @@ private: std::set SystemIncludeDirectories; std::set LinkDirectoriesEmmitted; std::set Utilities; - mutable std::set LinkImplicitNullProperties; std::map UtilityBacktraces; cmPolicies::PolicyMap PolicyMap; std::string Name; -- cgit v0.12 From bf5eb4a3f394051d9245a7f0c3a18b4a1d2c948a Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Wed, 5 Aug 2015 19:01:23 +0200 Subject: cmGeneratorTarget: Move ComputePDBOutputDir from cmTarget. --- Source/cmGeneratorTarget.cxx | 66 ++++++++++++++++++++++++++++++++++++++++++-- Source/cmGeneratorTarget.h | 3 ++ Source/cmTarget.cxx | 61 ---------------------------------------- Source/cmTarget.h | 3 -- 4 files changed, 66 insertions(+), 67 deletions(-) diff --git a/Source/cmGeneratorTarget.cxx b/Source/cmGeneratorTarget.cxx index 3651da6..3a67d2c 100644 --- a/Source/cmGeneratorTarget.cxx +++ b/Source/cmGeneratorTarget.cxx @@ -1780,8 +1780,7 @@ cmGeneratorTarget::CompileInfo const* cmGeneratorTarget::GetCompileInfo( if(i == this->CompileInfoMap.end()) { CompileInfo info; - this->Target - ->ComputePDBOutputDir("COMPILE_PDB", config, info.CompilePdbDir); + this->ComputePDBOutputDir("COMPILE_PDB", config, info.CompilePdbDir); CompileInfoMapType::value_type entry(config_upper, info); i = this->CompileInfoMap.insert(entry).first; } @@ -4519,7 +4518,7 @@ cmGeneratorTarget::OutputInfo const* cmGeneratorTarget::GetOutputInfo( // Compute output directories. this->ComputeOutputDir(config, false, info.OutDir); this->ComputeOutputDir(config, true, info.ImpDir); - if(!this->Target->ComputePDBOutputDir("PDB", config, info.PdbDir)) + if(!this->ComputePDBOutputDir("PDB", config, info.PdbDir)) { info.PdbDir = info.OutDir; } @@ -4635,6 +4634,67 @@ bool cmGeneratorTarget::ComputeOutputDir(const std::string& config, } //---------------------------------------------------------------------------- +bool cmGeneratorTarget::ComputePDBOutputDir(const std::string& kind, + const std::string& config, + std::string& out) const +{ + // Look for a target property defining the target output directory + // based on the target type. + const char* propertyName = 0; + std::string propertyNameStr = kind; + if(!propertyNameStr.empty()) + { + propertyNameStr += "_OUTPUT_DIRECTORY"; + propertyName = propertyNameStr.c_str(); + } + std::string conf = config; + + // Check for a per-configuration output directory target property. + std::string configUpper = cmSystemTools::UpperCase(conf); + const char* configProp = 0; + std::string configPropStr = kind; + if(!configPropStr.empty()) + { + configPropStr += "_OUTPUT_DIRECTORY_"; + configPropStr += configUpper; + configProp = configPropStr.c_str(); + } + + // Select an output directory. + if(const char* config_outdir = this->GetProperty(configProp)) + { + // Use the user-specified per-configuration output directory. + out = config_outdir; + + // Skip per-configuration subdirectory. + conf = ""; + } + else if(const char* outdir = this->GetProperty(propertyName)) + { + // Use the user-specified output directory. + out = outdir; + } + if(out.empty()) + { + return false; + } + + // Convert the output path to a full path in case it is + // specified as a relative path. Treat a relative path as + // relative to the current output directory for this makefile. + out = (cmSystemTools::CollapseFullPath + (out, this->Makefile->GetCurrentBinaryDirectory())); + + // The generator may add the configuration's subdirectory. + if(!conf.empty()) + { + this->LocalGenerator->GetGlobalGenerator()-> + AppendDirectoryForConfig("/", conf, "", out); + } + return true; +} + +//---------------------------------------------------------------------------- void cmGeneratorTarget::ComputeLinkInterfaceLibraries( const std::string& config, diff --git a/Source/cmGeneratorTarget.h b/Source/cmGeneratorTarget.h index f0f6d41..4ca0447 100644 --- a/Source/cmGeneratorTarget.h +++ b/Source/cmGeneratorTarget.h @@ -528,6 +528,9 @@ private: mutable bool DebugSourcesDone; mutable bool LinkImplementationLanguageIsContextDependent; + bool ComputePDBOutputDir(const std::string& kind, const std::string& config, + std::string& out) const; + public: std::vector const& GetLinkImplementationClosure(const std::string& config) const; diff --git a/Source/cmTarget.cxx b/Source/cmTarget.cxx index af7fe2e..40f93a3 100644 --- a/Source/cmTarget.cxx +++ b/Source/cmTarget.cxx @@ -2448,67 +2448,6 @@ const char* cmTarget::GetOutputTargetType(bool implib) const } //---------------------------------------------------------------------------- -bool cmTarget::ComputePDBOutputDir(const std::string& kind, - const std::string& config, - std::string& out) const -{ - // Look for a target property defining the target output directory - // based on the target type. - const char* propertyName = 0; - std::string propertyNameStr = kind; - if(!propertyNameStr.empty()) - { - propertyNameStr += "_OUTPUT_DIRECTORY"; - propertyName = propertyNameStr.c_str(); - } - std::string conf = config; - - // Check for a per-configuration output directory target property. - std::string configUpper = cmSystemTools::UpperCase(conf); - const char* configProp = 0; - std::string configPropStr = kind; - if(!configPropStr.empty()) - { - configPropStr += "_OUTPUT_DIRECTORY_"; - configPropStr += configUpper; - configProp = configPropStr.c_str(); - } - - // Select an output directory. - if(const char* config_outdir = this->GetProperty(configProp)) - { - // Use the user-specified per-configuration output directory. - out = config_outdir; - - // Skip per-configuration subdirectory. - conf = ""; - } - else if(const char* outdir = this->GetProperty(propertyName)) - { - // Use the user-specified output directory. - out = outdir; - } - if(out.empty()) - { - return false; - } - - // Convert the output path to a full path in case it is - // specified as a relative path. Treat a relative path as - // relative to the current output directory for this makefile. - out = (cmSystemTools::CollapseFullPath - (out, this->Makefile->GetCurrentBinaryDirectory())); - - // The generator may add the configuration's subdirectory. - if(!conf.empty()) - { - this->Makefile->GetGlobalGenerator()-> - AppendDirectoryForConfig("/", conf, "", out); - } - return true; -} - -//---------------------------------------------------------------------------- std::string cmTarget::GetFrameworkVersion() const { assert(this->GetType() != INTERFACE_LIBRARY); diff --git a/Source/cmTarget.h b/Source/cmTarget.h index a3a8063..d37f934 100644 --- a/Source/cmTarget.h +++ b/Source/cmTarget.h @@ -467,9 +467,6 @@ private: bool LinkLibrariesForVS6Analyzed; #endif - bool ComputePDBOutputDir(const std::string& kind, const std::string& config, - std::string& out) const; - // Cache import information from properties for each configuration. struct ImportInfo { -- cgit v0.12 From c5718217ad242ca0fc6e6b15f4ee670e4a332c93 Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Wed, 5 Aug 2015 19:02:45 +0200 Subject: cmGeneratorTarget: Move HaveInstallTreeRPATH from cmTarget. --- Source/cmComputeLinkInformation.cxx | 2 +- Source/cmGeneratorTarget.cxx | 10 +++++++++- Source/cmGeneratorTarget.h | 2 ++ Source/cmTarget.cxx | 8 -------- Source/cmTarget.h | 2 -- 5 files changed, 12 insertions(+), 12 deletions(-) diff --git a/Source/cmComputeLinkInformation.cxx b/Source/cmComputeLinkInformation.cxx index d35b566..d907dd0 100644 --- a/Source/cmComputeLinkInformation.cxx +++ b/Source/cmComputeLinkInformation.cxx @@ -1920,7 +1920,7 @@ void cmComputeLinkInformation::GetRPath(std::vector& runtimeDirs, (for_install || this->Target->Target->GetPropertyAsBool("BUILD_WITH_INSTALL_RPATH")); bool use_install_rpath = - (outputRuntime && this->Target->Target->HaveInstallTreeRPATH() && + (outputRuntime && this->Target->HaveInstallTreeRPATH() && linking_for_install); bool use_build_rpath = (outputRuntime && this->Target->HaveBuildTreeRPATH(this->Config) && diff --git a/Source/cmGeneratorTarget.cxx b/Source/cmGeneratorTarget.cxx index 3a67d2c..6ad6c69 100644 --- a/Source/cmGeneratorTarget.cxx +++ b/Source/cmGeneratorTarget.cxx @@ -1212,7 +1212,7 @@ cmGeneratorTarget::NeedRelinkBeforeInstall(const std::string& config) const // will likely change between the build tree and install tree and // this target must be relinked. return this->HaveBuildTreeRPATH(config) - || this->Target->HaveInstallTreeRPATH(); + || this->HaveInstallTreeRPATH(); } //---------------------------------------------------------------------------- @@ -4695,6 +4695,14 @@ bool cmGeneratorTarget::ComputePDBOutputDir(const std::string& kind, } //---------------------------------------------------------------------------- +bool cmGeneratorTarget::HaveInstallTreeRPATH() const +{ + const char* install_rpath = this->GetProperty("INSTALL_RPATH"); + return (install_rpath && *install_rpath) && + !this->Makefile->IsOn("CMAKE_SKIP_INSTALL_RPATH"); +} + +//---------------------------------------------------------------------------- void cmGeneratorTarget::ComputeLinkInterfaceLibraries( const std::string& config, diff --git a/Source/cmGeneratorTarget.h b/Source/cmGeneratorTarget.h index 4ca0447..f068cae 100644 --- a/Source/cmGeneratorTarget.h +++ b/Source/cmGeneratorTarget.h @@ -407,6 +407,8 @@ public: class TargetPropertyEntry; + bool HaveInstallTreeRPATH() const; + private: friend class cmTargetTraceDependencies; struct SourceEntry { std::vector Depends; }; diff --git a/Source/cmTarget.cxx b/Source/cmTarget.cxx index 40f93a3..dd1d405 100644 --- a/Source/cmTarget.cxx +++ b/Source/cmTarget.cxx @@ -2384,14 +2384,6 @@ void cmTarget::SetPropertyDefault(const std::string& property, } //---------------------------------------------------------------------------- -bool cmTarget::HaveInstallTreeRPATH() const -{ - const char* install_rpath = this->GetProperty("INSTALL_RPATH"); - return (install_rpath && *install_rpath) && - !this->Makefile->IsOn("CMAKE_SKIP_INSTALL_RPATH"); -} - -//---------------------------------------------------------------------------- const char* cmTarget::GetOutputTargetType(bool implib) const { switch(this->GetType()) diff --git a/Source/cmTarget.h b/Source/cmTarget.h index d37f934..4b369d3 100644 --- a/Source/cmTarget.h +++ b/Source/cmTarget.h @@ -262,8 +262,6 @@ public: bool GetImplibGNUtoMS(std::string const& gnuName, std::string& out, const char* newExt = 0) const; - bool HaveInstallTreeRPATH() const; - // Get the properties cmPropertyMap &GetProperties() const { return this->Properties; } -- cgit v0.12 From e73916992c6893572f24ee4fa631b33445d6cdf6 Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Wed, 5 Aug 2015 19:07:03 +0200 Subject: cmGeneratorTarget: Move HasMacOSXRpathInstallNameDir from cmTarget. --- Source/cmComputeLinkInformation.cxx | 4 +- Source/cmGeneratorTarget.cxx | 118 +++++++++++++++++++++++++++++++++++- Source/cmGeneratorTarget.h | 6 ++ Source/cmLocalXCodeGenerator.cxx | 6 +- Source/cmTarget.cxx | 112 ---------------------------------- Source/cmTarget.h | 6 -- 6 files changed, 128 insertions(+), 124 deletions(-) diff --git a/Source/cmComputeLinkInformation.cxx b/Source/cmComputeLinkInformation.cxx index d907dd0..b8e2284 100644 --- a/Source/cmComputeLinkInformation.cxx +++ b/Source/cmComputeLinkInformation.cxx @@ -1783,12 +1783,13 @@ void cmComputeLinkInformation::AddLibraryRuntimeInfo(std::string const& fullPath, cmTarget const* target) { + cmGeneratorTarget *gtgt = this->GlobalGenerator->GetGeneratorTarget(target); // Ignore targets on Apple where install_name is not @rpath. // The dependenty library can be found with other means such as // @loader_path or full paths. if(this->Makefile->IsOn("CMAKE_PLATFORM_HAS_INSTALLNAME")) { - if(!target->HasMacOSXRpathInstallNameDir(this->Config)) + if(!gtgt->HasMacOSXRpathInstallNameDir(this->Config)) { return; } @@ -1810,7 +1811,6 @@ cmComputeLinkInformation::AddLibraryRuntimeInfo(std::string const& fullPath, // Try to get the soname of the library. Only files with this name // could possibly conflict. - cmGeneratorTarget *gtgt = this->GlobalGenerator->GetGeneratorTarget(target); std::string soName = gtgt->GetSOName(this->Config); const char* soname = soName.empty()? 0 : soName.c_str(); diff --git a/Source/cmGeneratorTarget.cxx b/Source/cmGeneratorTarget.cxx index 6ad6c69..b253836 100644 --- a/Source/cmGeneratorTarget.cxx +++ b/Source/cmGeneratorTarget.cxx @@ -1284,6 +1284,120 @@ bool cmGeneratorTarget::IsChrpathUsed(const std::string& config) const //---------------------------------------------------------------------------- +bool cmGeneratorTarget::HasMacOSXRpathInstallNameDir( + const std::string& config) const +{ + bool install_name_is_rpath = false; + bool macosx_rpath = false; + + if(!this->IsImported()) + { + if(this->GetType() != cmTarget::SHARED_LIBRARY) + { + return false; + } + const char* install_name = this->GetProperty("INSTALL_NAME_DIR"); + bool use_install_name = + this->GetPropertyAsBool("BUILD_WITH_INSTALL_RPATH"); + if(install_name && use_install_name && + std::string(install_name) == "@rpath") + { + install_name_is_rpath = true; + } + else if(install_name && use_install_name) + { + return false; + } + if(!install_name_is_rpath) + { + macosx_rpath = this->MacOSXRpathInstallNameDirDefault(); + } + } + else + { + // Lookup the imported soname. + if(cmTarget::ImportInfo const* info = this->Target->GetImportInfo(config)) + { + if(!info->NoSOName && !info->SOName.empty()) + { + if(info->SOName.find("@rpath/") == 0) + { + install_name_is_rpath = true; + } + } + else + { + std::string install_name; + cmSystemTools::GuessLibraryInstallName(info->Location, install_name); + if(install_name.find("@rpath") != std::string::npos) + { + install_name_is_rpath = true; + } + } + } + } + + if(!install_name_is_rpath && !macosx_rpath) + { + return false; + } + + if(!this->Makefile->IsSet("CMAKE_SHARED_LIBRARY_RUNTIME_C_FLAG")) + { + std::ostringstream w; + w << "Attempting to use"; + if(macosx_rpath) + { + w << " MACOSX_RPATH"; + } + else + { + w << " @rpath"; + } + w << " without CMAKE_SHARED_LIBRARY_RUNTIME_C_FLAG being set."; + w << " This could be because you are using a Mac OS X version"; + w << " less than 10.5 or because CMake's platform configuration is"; + w << " corrupt."; + cmake* cm = this->Makefile->GetCMakeInstance(); + cm->IssueMessage(cmake::FATAL_ERROR, w.str(), + this->Target->GetBacktrace()); + } + + return true; +} + +//---------------------------------------------------------------------------- +bool cmGeneratorTarget::MacOSXRpathInstallNameDirDefault() const +{ + // we can't do rpaths when unsupported + if(!this->Makefile->IsSet("CMAKE_SHARED_LIBRARY_RUNTIME_C_FLAG")) + { + return false; + } + + const char* macosx_rpath_str = this->GetProperty("MACOSX_RPATH"); + if(macosx_rpath_str) + { + return this->GetPropertyAsBool("MACOSX_RPATH"); + } + + cmPolicies::PolicyStatus cmp0042 = this->Target->GetPolicyStatusCMP0042(); + + if(cmp0042 == cmPolicies::WARN) + { + this->Makefile->GetGlobalGenerator()-> + AddCMP0042WarnTarget(this->GetName()); + } + + if(cmp0042 == cmPolicies::NEW) + { + return true; + } + + return false; +} + +//---------------------------------------------------------------------------- std::string cmGeneratorTarget::GetSOName(const std::string& config) const { if(this->Target->IsImported()) @@ -1428,7 +1542,7 @@ cmGeneratorTarget::GetInstallNameDirForBuildTree( !this->GetPropertyAsBool("SKIP_BUILD_RPATH")) { std::string dir; - if(this->Target->MacOSXRpathInstallNameDirDefault()) + if(this->MacOSXRpathInstallNameDirDefault()) { dir = "@rpath"; } @@ -1464,7 +1578,7 @@ std::string cmGeneratorTarget::GetInstallNameDirForInstallTree() const } if(!install_name_dir) { - if(this->Target->MacOSXRpathInstallNameDirDefault()) + if(this->MacOSXRpathInstallNameDirDefault()) { dir = "@rpath/"; } diff --git a/Source/cmGeneratorTarget.h b/Source/cmGeneratorTarget.h index f068cae..fd4ee56 100644 --- a/Source/cmGeneratorTarget.h +++ b/Source/cmGeneratorTarget.h @@ -409,6 +409,12 @@ public: bool HaveInstallTreeRPATH() const; + /** Whether this library has \@rpath and platform supports it. */ + bool HasMacOSXRpathInstallNameDir(const std::string& config) const; + + /** Whether this library defaults to \@rpath. */ + bool MacOSXRpathInstallNameDirDefault() const; + private: friend class cmTargetTraceDependencies; struct SourceEntry { std::vector Depends; }; diff --git a/Source/cmLocalXCodeGenerator.cxx b/Source/cmLocalXCodeGenerator.cxx index b19112d..70997bf 100644 --- a/Source/cmLocalXCodeGenerator.cxx +++ b/Source/cmLocalXCodeGenerator.cxx @@ -56,7 +56,8 @@ void cmLocalXCodeGenerator::Generate() iter != targets.end(); ++iter) { cmTarget* t = &iter->second; - t->HasMacOSXRpathInstallNameDir(""); + cmGeneratorTarget* gt = this->GlobalGenerator->GetGeneratorTarget(t); + gt->HasMacOSXRpathInstallNameDir(""); } } @@ -70,7 +71,8 @@ void cmLocalXCodeGenerator::GenerateInstallRules() iter != targets.end(); ++iter) { cmTarget* t = &iter->second; - t->HasMacOSXRpathInstallNameDir(""); + cmGeneratorTarget* gt = this->GlobalGenerator->GetGeneratorTarget(t); + gt->HasMacOSXRpathInstallNameDir(""); } } diff --git a/Source/cmTarget.cxx b/Source/cmTarget.cxx index dd1d405..0b2d9fc 100644 --- a/Source/cmTarget.cxx +++ b/Source/cmTarget.cxx @@ -2178,118 +2178,6 @@ const char* cmTarget::GetPrefixVariableInternal(bool implib) const } //---------------------------------------------------------------------------- -bool cmTarget::HasMacOSXRpathInstallNameDir(const std::string& config) const -{ - bool install_name_is_rpath = false; - bool macosx_rpath = false; - - if(!this->IsImportedTarget) - { - if(this->GetType() != cmTarget::SHARED_LIBRARY) - { - return false; - } - const char* install_name = this->GetProperty("INSTALL_NAME_DIR"); - bool use_install_name = - this->GetPropertyAsBool("BUILD_WITH_INSTALL_RPATH"); - if(install_name && use_install_name && - std::string(install_name) == "@rpath") - { - install_name_is_rpath = true; - } - else if(install_name && use_install_name) - { - return false; - } - if(!install_name_is_rpath) - { - macosx_rpath = this->MacOSXRpathInstallNameDirDefault(); - } - } - else - { - // Lookup the imported soname. - if(cmTarget::ImportInfo const* info = this->GetImportInfo(config)) - { - if(!info->NoSOName && !info->SOName.empty()) - { - if(info->SOName.find("@rpath/") == 0) - { - install_name_is_rpath = true; - } - } - else - { - std::string install_name; - cmSystemTools::GuessLibraryInstallName(info->Location, install_name); - if(install_name.find("@rpath") != std::string::npos) - { - install_name_is_rpath = true; - } - } - } - } - - if(!install_name_is_rpath && !macosx_rpath) - { - return false; - } - - if(!this->Makefile->IsSet("CMAKE_SHARED_LIBRARY_RUNTIME_C_FLAG")) - { - std::ostringstream w; - w << "Attempting to use"; - if(macosx_rpath) - { - w << " MACOSX_RPATH"; - } - else - { - w << " @rpath"; - } - w << " without CMAKE_SHARED_LIBRARY_RUNTIME_C_FLAG being set."; - w << " This could be because you are using a Mac OS X version"; - w << " less than 10.5 or because CMake's platform configuration is"; - w << " corrupt."; - cmake* cm = this->Makefile->GetCMakeInstance(); - cm->IssueMessage(cmake::FATAL_ERROR, w.str(), this->GetBacktrace()); - } - - return true; -} - -//---------------------------------------------------------------------------- -bool cmTarget::MacOSXRpathInstallNameDirDefault() const -{ - // we can't do rpaths when unsupported - if(!this->Makefile->IsSet("CMAKE_SHARED_LIBRARY_RUNTIME_C_FLAG")) - { - return false; - } - - const char* macosx_rpath_str = this->GetProperty("MACOSX_RPATH"); - if(macosx_rpath_str) - { - return this->GetPropertyAsBool("MACOSX_RPATH"); - } - - cmPolicies::PolicyStatus cmp0042 = this->GetPolicyStatusCMP0042(); - - if(cmp0042 == cmPolicies::WARN) - { - this->Makefile->GetGlobalGenerator()-> - AddCMP0042WarnTarget(this->GetName()); - } - - if(cmp0042 == cmPolicies::NEW) - { - return true; - } - - return false; -} - -//---------------------------------------------------------------------------- bool cmTarget::IsImportedSharedLibWithoutSOName( const std::string& config) const { diff --git a/Source/cmTarget.h b/Source/cmTarget.h index 4b369d3..3cbee76 100644 --- a/Source/cmTarget.h +++ b/Source/cmTarget.h @@ -244,12 +244,6 @@ public: void GetTargetVersion(bool soversion, int& major, int& minor, int& patch) const; - /** Whether this library has \@rpath and platform supports it. */ - bool HasMacOSXRpathInstallNameDir(const std::string& config) const; - - /** Whether this library defaults to \@rpath. */ - bool MacOSXRpathInstallNameDirDefault() const; - /** Test for special case of a third-party shared library that has no soname at all. */ bool IsImportedSharedLibWithoutSOName(const std::string& config) const; -- cgit v0.12 From 110fd2fba1cbd6c3d89f5460d3f58a94d52d4546 Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Wed, 5 Aug 2015 19:11:48 +0200 Subject: cmGeneratorTarget: Move GetOutputTargetType from cmTarget. --- Source/cmGeneratorTarget.cxx | 60 ++++++++++++++++++++++++++++++++++++++++++-- Source/cmGeneratorTarget.h | 3 +++ Source/cmTarget.cxx | 56 ----------------------------------------- Source/cmTarget.h | 3 --- 4 files changed, 61 insertions(+), 61 deletions(-) diff --git a/Source/cmGeneratorTarget.cxx b/Source/cmGeneratorTarget.cxx index b253836..8663593 100644 --- a/Source/cmGeneratorTarget.cxx +++ b/Source/cmGeneratorTarget.cxx @@ -340,6 +340,62 @@ const char *cmGeneratorTarget::GetProperty(const std::string& prop) const } //---------------------------------------------------------------------------- +const char* cmGeneratorTarget::GetOutputTargetType(bool implib) const +{ + switch(this->GetType()) + { + case cmTarget::SHARED_LIBRARY: + if(this->Target->IsDLLPlatform()) + { + if(implib) + { + // A DLL import library is treated as an archive target. + return "ARCHIVE"; + } + else + { + // A DLL shared library is treated as a runtime target. + return "RUNTIME"; + } + } + else + { + // For non-DLL platforms shared libraries are treated as + // library targets. + return "LIBRARY"; + } + case cmTarget::STATIC_LIBRARY: + // Static libraries are always treated as archive targets. + return "ARCHIVE"; + case cmTarget::MODULE_LIBRARY: + if(implib) + { + // Module libraries are always treated as library targets. + return "ARCHIVE"; + } + else + { + // Module import libraries are treated as archive targets. + return "LIBRARY"; + } + case cmTarget::EXECUTABLE: + if(implib) + { + // Executable import libraries are treated as archive targets. + return "ARCHIVE"; + } + else + { + // Executables are always treated as runtime targets. + return "RUNTIME"; + } + default: + break; + } + return ""; +} + +//---------------------------------------------------------------------------- std::string cmGeneratorTarget::GetOutputName(const std::string& config, bool implib) const { @@ -355,7 +411,7 @@ std::string cmGeneratorTarget::GetOutputName(const std::string& config, // Compute output name. std::vector props; - std::string type = this->Target->GetOutputTargetType(implib); + std::string type = this->GetOutputTargetType(implib); std::string configUpper = cmSystemTools::UpperCase(config); if(!type.empty() && !configUpper.empty()) { @@ -4662,7 +4718,7 @@ bool cmGeneratorTarget::ComputeOutputDir(const std::string& config, // Look for a target property defining the target output directory // based on the target type. - std::string targetTypeName = this->Target->GetOutputTargetType(implib); + std::string targetTypeName = this->GetOutputTargetType(implib); const char* propertyName = 0; std::string propertyNameStr = targetTypeName; if(!propertyNameStr.empty()) diff --git a/Source/cmGeneratorTarget.h b/Source/cmGeneratorTarget.h index fd4ee56..0e41661 100644 --- a/Source/cmGeneratorTarget.h +++ b/Source/cmGeneratorTarget.h @@ -439,6 +439,9 @@ private: typedef std::map LinkClosureMapType; mutable LinkClosureMapType LinkClosureMap; + // Returns ARCHIVE, LIBRARY, or RUNTIME based on platform and type. + const char* GetOutputTargetType(bool implib) const; + struct CompatibleInterfacesBase { std::set PropsBool; diff --git a/Source/cmTarget.cxx b/Source/cmTarget.cxx index 0b2d9fc..88bda67 100644 --- a/Source/cmTarget.cxx +++ b/Source/cmTarget.cxx @@ -2272,62 +2272,6 @@ void cmTarget::SetPropertyDefault(const std::string& property, } //---------------------------------------------------------------------------- -const char* cmTarget::GetOutputTargetType(bool implib) const -{ - switch(this->GetType()) - { - case cmTarget::SHARED_LIBRARY: - if(this->DLLPlatform) - { - if(implib) - { - // A DLL import library is treated as an archive target. - return "ARCHIVE"; - } - else - { - // A DLL shared library is treated as a runtime target. - return "RUNTIME"; - } - } - else - { - // For non-DLL platforms shared libraries are treated as - // library targets. - return "LIBRARY"; - } - case cmTarget::STATIC_LIBRARY: - // Static libraries are always treated as archive targets. - return "ARCHIVE"; - case cmTarget::MODULE_LIBRARY: - if(implib) - { - // Module libraries are always treated as library targets. - return "ARCHIVE"; - } - else - { - // Module import libraries are treated as archive targets. - return "LIBRARY"; - } - case cmTarget::EXECUTABLE: - if(implib) - { - // Executable import libraries are treated as archive targets. - return "ARCHIVE"; - } - else - { - // Executables are always treated as runtime targets. - return "RUNTIME"; - } - default: - break; - } - return ""; -} - -//---------------------------------------------------------------------------- std::string cmTarget::GetFrameworkVersion() const { assert(this->GetType() != INTERFACE_LIBRARY); diff --git a/Source/cmTarget.h b/Source/cmTarget.h index 3cbee76..6ba9772 100644 --- a/Source/cmTarget.h +++ b/Source/cmTarget.h @@ -415,9 +415,6 @@ private: void SetPropertyDefault(const std::string& property, const char* default_value); - // Returns ARCHIVE, LIBRARY, or RUNTIME based on platform and type. - const char* GetOutputTargetType(bool implib) const; - std::string GetFullNameImported(const std::string& config, bool implib) const; -- cgit v0.12 From 3e428fdcb4640411f8cbc4adc42c30b9c8b8032e Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Wed, 5 Aug 2015 19:19:50 +0200 Subject: cmGeneratorTarget: Move IsImportedSharedLibWithoutSOName from cmTarget. --- Source/cmComputeLinkInformation.cxx | 3 ++- Source/cmGeneratorTarget.cxx | 13 +++++++++++++ Source/cmGeneratorTarget.h | 4 ++++ Source/cmTarget.cxx | 14 -------------- Source/cmTarget.h | 4 ---- 5 files changed, 19 insertions(+), 19 deletions(-) diff --git a/Source/cmComputeLinkInformation.cxx b/Source/cmComputeLinkInformation.cxx index b8e2284..9371546 100644 --- a/Source/cmComputeLinkInformation.cxx +++ b/Source/cmComputeLinkInformation.cxx @@ -1101,9 +1101,10 @@ void cmComputeLinkInformation::AddTargetItem(std::string const& item, this->SharedLibrariesLinked.insert(target); } + cmGeneratorTarget *gtgt = this->GlobalGenerator->GetGeneratorTarget(target); // Handle case of an imported shared library with no soname. if(this->NoSONameUsesPath && - target->IsImportedSharedLibWithoutSOName(this->Config)) + gtgt->IsImportedSharedLibWithoutSOName(this->Config)) { this->AddSharedLibNoSOName(item); return; diff --git a/Source/cmGeneratorTarget.cxx b/Source/cmGeneratorTarget.cxx index 8663593..8ff78e0 100644 --- a/Source/cmGeneratorTarget.cxx +++ b/Source/cmGeneratorTarget.cxx @@ -1338,6 +1338,19 @@ bool cmGeneratorTarget::IsChrpathUsed(const std::string& config) const return false; } +//---------------------------------------------------------------------------- +bool cmGeneratorTarget::IsImportedSharedLibWithoutSOName( + const std::string& config) const +{ + if(this->IsImported() && this->GetType() == cmTarget::SHARED_LIBRARY) + { + if(cmTarget::ImportInfo const* info = this->Target->GetImportInfo(config)) + { + return info->NoSOName; + } + } + return false; +} //---------------------------------------------------------------------------- bool cmGeneratorTarget::HasMacOSXRpathInstallNameDir( diff --git a/Source/cmGeneratorTarget.h b/Source/cmGeneratorTarget.h index 0e41661..49de632 100644 --- a/Source/cmGeneratorTarget.h +++ b/Source/cmGeneratorTarget.h @@ -415,6 +415,10 @@ public: /** Whether this library defaults to \@rpath. */ bool MacOSXRpathInstallNameDirDefault() const; + /** Test for special case of a third-party shared library that has + no soname at all. */ + bool IsImportedSharedLibWithoutSOName(const std::string& config) const; + private: friend class cmTargetTraceDependencies; struct SourceEntry { std::vector Depends; }; diff --git a/Source/cmTarget.cxx b/Source/cmTarget.cxx index 88bda67..3de7efe 100644 --- a/Source/cmTarget.cxx +++ b/Source/cmTarget.cxx @@ -2178,20 +2178,6 @@ const char* cmTarget::GetPrefixVariableInternal(bool implib) const } //---------------------------------------------------------------------------- -bool cmTarget::IsImportedSharedLibWithoutSOName( - const std::string& config) const -{ - if(this->IsImported() && this->GetType() == cmTarget::SHARED_LIBRARY) - { - if(cmTarget::ImportInfo const* info = this->GetImportInfo(config)) - { - return info->NoSOName; - } - } - return false; -} - -//---------------------------------------------------------------------------- std::string cmTarget::GetFullNameImported(const std::string& config, bool implib) const { diff --git a/Source/cmTarget.h b/Source/cmTarget.h index 6ba9772..16d0121 100644 --- a/Source/cmTarget.h +++ b/Source/cmTarget.h @@ -244,10 +244,6 @@ public: void GetTargetVersion(bool soversion, int& major, int& minor, int& patch) const; - /** Test for special case of a third-party shared library that has - no soname at all. */ - bool IsImportedSharedLibWithoutSOName(const std::string& config) const; - /** Does this target have a GNU implib to convert to MS format? */ bool HasImplibGNUtoMS() const; -- cgit v0.12 From 064c2488119269e88422ea444f87bdd44c4f6589 Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Thu, 8 Oct 2015 00:41:15 +0200 Subject: cmComputeLinkDepends: Port some API to cmGeneratorTarget. --- Source/cmComputeLinkDepends.cxx | 30 ++++++++++++++---------------- Source/cmComputeLinkDepends.h | 3 +-- Source/cmComputeLinkInformation.cxx | 33 ++++++++++++++------------------- Source/cmComputeLinkInformation.h | 4 ++-- 4 files changed, 31 insertions(+), 39 deletions(-) diff --git a/Source/cmComputeLinkDepends.cxx b/Source/cmComputeLinkDepends.cxx index 1b5c9f4..a9e8cfc 100644 --- a/Source/cmComputeLinkDepends.cxx +++ b/Source/cmComputeLinkDepends.cxx @@ -268,7 +268,7 @@ cmComputeLinkDepends::Compute() { int i = *li; LinkEntry const& e = this->EntryList[i]; - cmTarget const* t = e.Target; + cmGeneratorTarget const* t = e.Target; // Entries that we know the linker will re-use do not need to be repeated. bool uniquify = t && t->GetType() == cmTarget::SHARED_LIBRARY; if(!uniquify || emmitted.insert(i).second) @@ -320,7 +320,8 @@ int cmComputeLinkDepends::AddLinkEntry(cmLinkItem const& item) int index = lei->second; LinkEntry& entry = this->EntryList[index]; entry.Item = item; - entry.Target = item.Target; + entry.Target = + item.Target ? this->GlobalGenerator->GetGeneratorTarget(item.Target) : 0; entry.IsFlag = (!entry.Target && item[0] == '-' && item[1] != 'l' && item.substr(0, 10) != "-framework"); @@ -362,11 +363,9 @@ void cmComputeLinkDepends::FollowLinkEntry(BFSEntry const& qe) // Follow the item's dependencies. if(entry.Target) { - cmGeneratorTarget* gtgt = - this->GlobalGenerator->GetGeneratorTarget(entry.Target); // Follow the target dependencies. if(cmLinkInterface const* iface = - gtgt->GetLinkInterface(this->Config, this->Target->Target)) + entry.Target->GetLinkInterface(this->Config, this->Target->Target)) { const bool isIface = entry.Target->GetType() == cmTarget::INTERFACE_LIBRARY; @@ -444,7 +443,9 @@ void cmComputeLinkDepends::HandleSharedDependency(SharedDepEntry const& dep) // Initialize the item entry. LinkEntry& entry = this->EntryList[lei->second]; entry.Item = dep.Item; - entry.Target = dep.Item.Target; + entry.Target = + dep.Item.Target ? + this->GlobalGenerator->GetGeneratorTarget(dep.Item.Target) : 0; // This item was added specifically because it is a dependent // shared library. It may get special treatment @@ -463,10 +464,8 @@ void cmComputeLinkDepends::HandleSharedDependency(SharedDepEntry const& dep) // Target items may have their own dependencies. if(entry.Target) { - cmGeneratorTarget* gtgt = - this->GlobalGenerator->GetGeneratorTarget(entry.Target); if(cmLinkInterface const* iface = - gtgt->GetLinkInterface(this->Config, this->Target->Target)) + entry.Target->GetLinkInterface(this->Config, this->Target->Target)) { // Follow public and private dependencies transitively. this->FollowSharedDeps(index, iface, true); @@ -639,15 +638,16 @@ cmTarget const* cmComputeLinkDepends::FindTargetToLink(int depender_index, const std::string& name) { // Look for a target in the scope of the depender. - cmTarget const* from = this->Target->Target; + cmGeneratorTarget const* from = this->Target; if(depender_index >= 0) { - if(cmTarget const* depender = this->EntryList[depender_index].Target) + if(cmGeneratorTarget const* depender = + this->EntryList[depender_index].Target) { from = depender; } } - return from->FindTargetToLink(name); + return from->Target->FindTargetToLink(name); } //---------------------------------------------------------------------------- @@ -934,12 +934,10 @@ int cmComputeLinkDepends::ComputeComponentCount(NodeList const& nl) int count = 2; for(NodeList::const_iterator ni = nl.begin(); ni != nl.end(); ++ni) { - if(cmTarget const* target = this->EntryList[*ni].Target) + if(cmGeneratorTarget const* target = this->EntryList[*ni].Target) { - cmGeneratorTarget* gtgt = - this->GlobalGenerator->GetGeneratorTarget(target); if(cmLinkInterface const* iface = - gtgt->GetLinkInterface(this->Config, this->Target->Target)) + target->GetLinkInterface(this->Config, this->Target->Target)) { if(iface->Multiplicity > count) { diff --git a/Source/cmComputeLinkDepends.h b/Source/cmComputeLinkDepends.h index 2cbb430..5ad8714 100644 --- a/Source/cmComputeLinkDepends.h +++ b/Source/cmComputeLinkDepends.h @@ -23,7 +23,6 @@ class cmComputeComponentGraph; class cmGlobalGenerator; class cmMakefile; class cmGeneratorTarget; -class cmTarget; class cmake; /** \class cmComputeLinkDepends @@ -40,7 +39,7 @@ public: struct LinkEntry { std::string Item; - cmTarget const* Target; + cmGeneratorTarget const* Target; bool IsSharedDep; bool IsFlag; LinkEntry(): Item(), Target(0), IsSharedDep(false), IsFlag(false) {} diff --git a/Source/cmComputeLinkInformation.cxx b/Source/cmComputeLinkInformation.cxx index 9371546..7e34611 100644 --- a/Source/cmComputeLinkInformation.cxx +++ b/Source/cmComputeLinkInformation.cxx @@ -632,11 +632,11 @@ void cmComputeLinkInformation::AddImplicitLinkInfo(std::string const& lang) //---------------------------------------------------------------------------- void cmComputeLinkInformation::AddItem(std::string const& item, - cmTarget const* tgt) + cmGeneratorTarget const* tgt) { // Compute the proper name to use to link this library. const std::string& config = this->Config; - bool impexe = (tgt && tgt->IsExecutableWithExports()); + bool impexe = (tgt && tgt->Target->IsExecutableWithExports()); if(impexe && !this->UseImportLibrary && !this->LoaderFlag) { // Skip linking to executables on platforms with no import @@ -644,9 +644,8 @@ void cmComputeLinkInformation::AddItem(std::string const& item, return; } - if(tgt && tgt->IsLinkable()) + if(tgt && tgt->Target->IsLinkable()) { - cmGeneratorTarget *gtgt = this->GlobalGenerator->GetGeneratorTarget(tgt); // This is a CMake target. Ask the target for its real name. if(impexe && this->LoaderFlag) { @@ -656,10 +655,10 @@ void cmComputeLinkInformation::AddItem(std::string const& item, std::string linkItem; linkItem = this->LoaderFlag; - std::string exe = gtgt->GetFullPath(config, this->UseImportLibrary, + std::string exe = tgt->GetFullPath(config, this->UseImportLibrary, true); linkItem += exe; - this->Items.push_back(Item(linkItem, true, tgt)); + this->Items.push_back(Item(linkItem, true, tgt->Target)); this->Depends.push_back(exe); } else if(tgt->GetType() == cmTarget::INTERFACE_LIBRARY) @@ -667,7 +666,7 @@ void cmComputeLinkInformation::AddItem(std::string const& item, // Add the interface library as an item so it can be considered as part // of COMPATIBLE_INTERFACE_ enforcement. The generators will ignore // this for the actual link line. - this->Items.push_back(Item(std::string(), true, tgt)); + this->Items.push_back(Item(std::string(), true, tgt->Target)); } else { @@ -677,15 +676,15 @@ void cmComputeLinkInformation::AddItem(std::string const& item, (impexe || tgt->GetType() == cmTarget::SHARED_LIBRARY)); // Pass the full path to the target file. - std::string lib = gtgt->GetFullPath(config, implib, true); + std::string lib = tgt->GetFullPath(config, implib, true); if(!this->LinkDependsNoShared || tgt->GetType() != cmTarget::SHARED_LIBRARY) { this->Depends.push_back(lib); } - this->AddTargetItem(lib, tgt); - this->AddLibraryRuntimeInfo(lib, tgt); + this->AddTargetItem(lib, tgt->Target); + this->AddLibraryRuntimeInfo(lib, tgt->Target); } } else @@ -716,7 +715,7 @@ void cmComputeLinkInformation::AddItem(std::string const& item, //---------------------------------------------------------------------------- void cmComputeLinkInformation::AddSharedDepItem(std::string const& item, - cmTarget const* tgt) + const cmGeneratorTarget* tgt) { // If dropping shared library dependencies, ignore them. if(this->SharedDependencyMode == SharedDepModeNone) @@ -760,18 +759,14 @@ void cmComputeLinkInformation::AddSharedDepItem(std::string const& item, return; } - cmGeneratorTarget *gtgt = 0; - // Get a full path to the dependent shared library. // Add it to the runtime path computation so that the target being // linked will be able to find it. std::string lib; if(tgt) { - gtgt = this->GlobalGenerator->GetGeneratorTarget(tgt); - - lib = gtgt->GetFullPath(this->Config, this->UseImportLibrary); - this->AddLibraryRuntimeInfo(lib, tgt); + lib = tgt->GetFullPath(this->Config, this->UseImportLibrary); + this->AddLibraryRuntimeInfo(lib, tgt->Target); } else { @@ -795,9 +790,9 @@ void cmComputeLinkInformation::AddSharedDepItem(std::string const& item, } if(order) { - if(gtgt) + if(tgt) { - std::string soName = gtgt->GetSOName(this->Config); + std::string soName = tgt->GetSOName(this->Config); const char* soname = soName.empty()? 0 : soName.c_str(); order->AddRuntimeLibrary(lib, soname); } diff --git a/Source/cmComputeLinkInformation.h b/Source/cmComputeLinkInformation.h index 8b83574..b1e7e46 100644 --- a/Source/cmComputeLinkInformation.h +++ b/Source/cmComputeLinkInformation.h @@ -62,8 +62,8 @@ public: std::string const& GetRPathLinkFlag() const { return this->RPathLinkFlag; } std::string GetRPathLinkString(); private: - void AddItem(std::string const& item, cmTarget const* tgt); - void AddSharedDepItem(std::string const& item, cmTarget const* tgt); + void AddItem(std::string const& item, const cmGeneratorTarget* tgt); + void AddSharedDepItem(std::string const& item, cmGeneratorTarget const* tgt); // Output information. ItemVector Items; -- cgit v0.12 From 1c5d70f9c2b9b7e2aeaf1515ef72a6e9282ecde0 Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Wed, 16 Sep 2015 04:40:14 +0200 Subject: cmGeneratorTarget: Port processILibs away from cmTarget. --- Source/cmGeneratorTarget.cxx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Source/cmGeneratorTarget.cxx b/Source/cmGeneratorTarget.cxx index 8ff78e0..71506d1 100644 --- a/Source/cmGeneratorTarget.cxx +++ b/Source/cmGeneratorTarget.cxx @@ -2047,7 +2047,7 @@ void cmGeneratorTarget::GetAutoUicOptions(std::vector &result, //---------------------------------------------------------------------------- void processILibs(const std::string& config, - cmTarget const* headTarget, + cmGeneratorTarget const* headTarget, cmLinkItem const& item, cmGlobalGenerator* gg, std::vector& tgts, @@ -2058,7 +2058,7 @@ void processILibs(const std::string& config, tgts.push_back(item.Target); cmGeneratorTarget* gt = gg->GetGeneratorTarget(item.Target); if(cmLinkInterfaceLibraries const* iface = - gt->GetLinkInterfaceLibraries(config, headTarget, true)) + gt->GetLinkInterfaceLibraries(config, headTarget->Target, true)) { for(std::vector::const_iterator it = iface->Libraries.begin(); @@ -2089,7 +2089,7 @@ cmGeneratorTarget::GetLinkImplementationClosure( it = impl->Libraries.begin(); it != impl->Libraries.end(); ++it) { - processILibs(config, this->Target, *it, + processILibs(config, this, *it, this->LocalGenerator->GetGlobalGenerator(), tgts , emitted); } -- cgit v0.12 From f539da126b55933fae6f40feea35e820cb632877 Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Wed, 16 Sep 2015 04:45:43 +0200 Subject: cmGeneratorTarget: Port GetLinkInterfaceLibraries away from cmTarget. --- Source/cmGeneratorExpressionNode.cxx | 5 ++++- Source/cmGeneratorTarget.cxx | 10 +++++----- Source/cmGeneratorTarget.h | 2 +- 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/Source/cmGeneratorExpressionNode.cxx b/Source/cmGeneratorExpressionNode.cxx index fdacc82..78a5b6f 100644 --- a/Source/cmGeneratorExpressionNode.cxx +++ b/Source/cmGeneratorExpressionNode.cxx @@ -1109,8 +1109,11 @@ static const struct TargetPropertyNode : public cmGeneratorExpressionNode if(isInterfaceProperty) { + cmGeneratorTarget* gHeadTarget = + context->Makefile->GetGlobalGenerator() + ->GetGeneratorTarget(headTarget); if(cmLinkInterfaceLibraries const* iface = - gtgt->GetLinkInterfaceLibraries(context->Config, headTarget, true)) + gtgt->GetLinkInterfaceLibraries(context->Config, gHeadTarget, true)) { linkedTargetsContent = getLinkedTargetsContent(iface->Libraries, target, diff --git a/Source/cmGeneratorTarget.cxx b/Source/cmGeneratorTarget.cxx index 71506d1..99d1013 100644 --- a/Source/cmGeneratorTarget.cxx +++ b/Source/cmGeneratorTarget.cxx @@ -2058,7 +2058,7 @@ void processILibs(const std::string& config, tgts.push_back(item.Target); cmGeneratorTarget* gt = gg->GetGeneratorTarget(item.Target); if(cmLinkInterfaceLibraries const* iface = - gt->GetLinkInterfaceLibraries(config, headTarget->Target, true)) + gt->GetLinkInterfaceLibraries(config, headTarget, true)) { for(std::vector::const_iterator it = iface->Libraries.begin(); @@ -4592,13 +4592,13 @@ void cmGeneratorTarget::ComputeLinkInterface(const std::string& config, //---------------------------------------------------------------------------- const cmLinkInterfaceLibraries * cmGeneratorTarget::GetLinkInterfaceLibraries(const std::string& config, - cmTarget const* head, + cmGeneratorTarget const* head, bool usage_requirements_only) const { // Imported targets have their own link interface. if(this->IsImported()) { - return this->GetImportLinkInterface(config, head, + return this->GetImportLinkInterface(config, head->Target, usage_requirements_only); } @@ -4624,12 +4624,12 @@ cmGeneratorTarget::GetLinkInterfaceLibraries(const std::string& config, return &hm.begin()->second; } - cmOptionalLinkInterface& iface = hm[head]; + cmOptionalLinkInterface& iface = hm[head->Target]; if(!iface.LibrariesDone) { iface.LibrariesDone = true; this->ComputeLinkInterfaceLibraries( - config, iface, head, usage_requirements_only); + config, iface, head->Target, usage_requirements_only); } return iface.Exists? &iface : 0; diff --git a/Source/cmGeneratorTarget.h b/Source/cmGeneratorTarget.h index 49de632..c36117d 100644 --- a/Source/cmGeneratorTarget.h +++ b/Source/cmGeneratorTarget.h @@ -116,7 +116,7 @@ public: cmLinkInterfaceLibraries const* GetLinkInterfaceLibraries(const std::string& config, - cmTarget const* headTarget, + const cmGeneratorTarget* headTarget, bool usage_requirements_only) const; void ComputeLinkInterfaceLibraries(const std::string& config, -- cgit v0.12 From eaa5b9cbb1b145b76eb0448df1ce3a3c63ee13c6 Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Wed, 16 Sep 2015 04:46:15 +0200 Subject: cmGeneratorTarget: Port cmTargetCollectLinkLanguages away from cmTarget. --- Source/cmGeneratorTarget.cxx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Source/cmGeneratorTarget.cxx b/Source/cmGeneratorTarget.cxx index 99d1013..13ef2a0 100644 --- a/Source/cmGeneratorTarget.cxx +++ b/Source/cmGeneratorTarget.cxx @@ -1667,7 +1667,7 @@ public: cmTargetCollectLinkLanguages(cmGeneratorTarget const* target, const std::string& config, UNORDERED_SET& languages, - cmTarget const* head): + cmGeneratorTarget const* head): Config(config), Languages(languages), HeadTarget(head), Makefile(target->Target->GetMakefile()), Target(target) { this->Visited.insert(target->Target); } @@ -1719,7 +1719,7 @@ public: this->Target->GetLocalGenerator()->GetGlobalGenerator() ->GetGeneratorTarget(item.Target); cmLinkInterface const* iface = - gtgt->GetLinkInterface(this->Config, this->HeadTarget); + gtgt->GetLinkInterface(this->Config, this->HeadTarget->Target); if(!iface) { return; } for(std::vector::const_iterator @@ -1737,7 +1737,7 @@ public: private: std::string Config; UNORDERED_SET& Languages; - cmTarget const* HeadTarget; + cmGeneratorTarget const* HeadTarget; cmMakefile* Makefile; const cmGeneratorTarget* Target; std::set Visited; @@ -1830,7 +1830,7 @@ void cmGeneratorTarget::ComputeLinkClosure(const std::string& config, } // Add interface languages from linked targets. - cmTargetCollectLinkLanguages cll(this, config, languages, this->Target); + cmTargetCollectLinkLanguages cll(this, config, languages, this); for(std::vector::const_iterator li = impl->Libraries.begin(); li != impl->Libraries.end(); ++li) { -- cgit v0.12 From 922c89014f372ca38303b4258345c23027046616 Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Wed, 16 Sep 2015 04:49:37 +0200 Subject: cmGeneratorTarget: Port GetLinkInterface away from cmTarget. --- Source/cmComputeLinkDepends.cxx | 6 +++--- Source/cmComputeTargetDepends.cxx | 2 +- Source/cmExportFileGenerator.cxx | 4 ++-- Source/cmGeneratorTarget.cxx | 12 ++++++------ Source/cmGeneratorTarget.h | 2 +- 5 files changed, 13 insertions(+), 13 deletions(-) diff --git a/Source/cmComputeLinkDepends.cxx b/Source/cmComputeLinkDepends.cxx index a9e8cfc..7d20827 100644 --- a/Source/cmComputeLinkDepends.cxx +++ b/Source/cmComputeLinkDepends.cxx @@ -365,7 +365,7 @@ void cmComputeLinkDepends::FollowLinkEntry(BFSEntry const& qe) { // Follow the target dependencies. if(cmLinkInterface const* iface = - entry.Target->GetLinkInterface(this->Config, this->Target->Target)) + entry.Target->GetLinkInterface(this->Config, this->Target)) { const bool isIface = entry.Target->GetType() == cmTarget::INTERFACE_LIBRARY; @@ -465,7 +465,7 @@ void cmComputeLinkDepends::HandleSharedDependency(SharedDepEntry const& dep) if(entry.Target) { if(cmLinkInterface const* iface = - entry.Target->GetLinkInterface(this->Config, this->Target->Target)) + entry.Target->GetLinkInterface(this->Config, this->Target)) { // Follow public and private dependencies transitively. this->FollowSharedDeps(index, iface, true); @@ -937,7 +937,7 @@ int cmComputeLinkDepends::ComputeComponentCount(NodeList const& nl) if(cmGeneratorTarget const* target = this->EntryList[*ni].Target) { if(cmLinkInterface const* iface = - target->GetLinkInterface(this->Config, this->Target->Target)) + target->GetLinkInterface(this->Config, this->Target)) { if(iface->Multiplicity > count) { diff --git a/Source/cmComputeTargetDepends.cxx b/Source/cmComputeTargetDepends.cxx index 9e37c35..18aad10 100644 --- a/Source/cmComputeTargetDepends.cxx +++ b/Source/cmComputeTargetDepends.cxx @@ -297,7 +297,7 @@ void cmComputeTargetDepends::AddInterfaceDepends(int depender_index, cmGeneratorTarget const* depender = this->Targets[depender_index]; if(cmLinkInterface const* iface = dependee->GetLinkInterface(config, - depender->Target)) + depender)) { for(std::vector::const_iterator lib = iface->Libraries.begin(); diff --git a/Source/cmExportFileGenerator.cxx b/Source/cmExportFileGenerator.cxx index 881acee..d6149b3 100644 --- a/Source/cmExportFileGenerator.cxx +++ b/Source/cmExportFileGenerator.cxx @@ -799,7 +799,7 @@ cmExportFileGenerator { // Add the transitive link dependencies for this configuration. cmLinkInterface const* iface = target->GetLinkInterface(config, - target->Target); + target); if (!iface) { return; @@ -911,7 +911,7 @@ cmExportFileGenerator // Add the transitive link dependencies for this configuration. if(cmLinkInterface const* iface = - target->GetLinkInterface(config, target->Target)) + target->GetLinkInterface(config, target)) { this->SetImportLinkProperty(suffix, target, "IMPORTED_LINK_INTERFACE_LANGUAGES", diff --git a/Source/cmGeneratorTarget.cxx b/Source/cmGeneratorTarget.cxx index 13ef2a0..67920af 100644 --- a/Source/cmGeneratorTarget.cxx +++ b/Source/cmGeneratorTarget.cxx @@ -1719,7 +1719,7 @@ public: this->Target->GetLocalGenerator()->GetGlobalGenerator() ->GetGeneratorTarget(item.Target); cmLinkInterface const* iface = - gtgt->GetLinkInterface(this->Config, this->HeadTarget->Target); + gtgt->GetLinkInterface(this->Config, this->HeadTarget); if(!iface) { return; } for(std::vector::const_iterator @@ -4446,12 +4446,12 @@ void cmGeneratorTarget::ExpandLinkItems(std::string const& prop, //---------------------------------------------------------------------------- cmLinkInterface const* cmGeneratorTarget::GetLinkInterface(const std::string& config, - cmTarget const* head) const + cmGeneratorTarget const* head) const { // Imported targets have their own link interface. if(this->IsImported()) { - return this->GetImportLinkInterface(config, head, false); + return this->GetImportLinkInterface(config, head->Target, false); } // Link interfaces are not supported for executables that do not @@ -4473,19 +4473,19 @@ cmGeneratorTarget::GetLinkInterface(const std::string& config, return &hm.begin()->second; } - cmOptionalLinkInterface& iface = hm[head]; + cmOptionalLinkInterface& iface = hm[head->Target]; if(!iface.LibrariesDone) { iface.LibrariesDone = true; this->ComputeLinkInterfaceLibraries( - config, iface, head, false); + config, iface, head->Target, false); } if(!iface.AllDone) { iface.AllDone = true; if(iface.Exists) { - this->ComputeLinkInterface(config, iface, head); + this->ComputeLinkInterface(config, iface, head->Target); } } diff --git a/Source/cmGeneratorTarget.h b/Source/cmGeneratorTarget.h index c36117d..f3eaccd 100644 --- a/Source/cmGeneratorTarget.h +++ b/Source/cmGeneratorTarget.h @@ -109,7 +109,7 @@ public: const std::string& config) const; cmLinkInterface const* GetLinkInterface(const std::string& config, - cmTarget const* headTarget) const; + const cmGeneratorTarget* headTarget) const; void ComputeLinkInterface(const std::string& config, cmOptionalLinkInterface& iface, cmTarget const* head) const; -- cgit v0.12 From 654002feb88a9a219e2d6b6011c7dccc791627b1 Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Wed, 16 Sep 2015 04:50:32 +0200 Subject: cmGeneratorTarget: Port ComputeLinkInterfaceLibraries away from cmTarget. --- Source/cmGeneratorTarget.cxx | 15 ++++++++------- Source/cmGeneratorTarget.h | 2 +- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/Source/cmGeneratorTarget.cxx b/Source/cmGeneratorTarget.cxx index 67920af..a15d016 100644 --- a/Source/cmGeneratorTarget.cxx +++ b/Source/cmGeneratorTarget.cxx @@ -4478,7 +4478,7 @@ cmGeneratorTarget::GetLinkInterface(const std::string& config, { iface.LibrariesDone = true; this->ComputeLinkInterfaceLibraries( - config, iface, head->Target, false); + config, iface, head, false); } if(!iface.AllDone) { @@ -4629,7 +4629,7 @@ cmGeneratorTarget::GetLinkInterfaceLibraries(const std::string& config, { iface.LibrariesDone = true; this->ComputeLinkInterfaceLibraries( - config, iface, head->Target, usage_requirements_only); + config, iface, head, usage_requirements_only); } return iface.Exists? &iface : 0; @@ -4890,7 +4890,7 @@ void cmGeneratorTarget::ComputeLinkInterfaceLibraries( const std::string& config, cmOptionalLinkInterface& iface, - cmTarget const* headTarget, + cmGeneratorTarget const* headTarget, bool usage_requirements_only) const { // Construct the property name suffix for this configuration. @@ -4976,7 +4976,7 @@ cmGeneratorTarget::ComputeLinkInterfaceLibraries( // The interface libraries have been explicitly set. this->ExpandLinkItems(linkIfaceProp, explicitLibraries, config, - headTarget, usage_requirements_only, + headTarget->Target, usage_requirements_only, iface.Libraries, iface.HadHeadSensitiveCondition); } @@ -4989,7 +4989,7 @@ cmGeneratorTarget::ComputeLinkInterfaceLibraries( { // The link implementation is the default link interface. cmLinkImplementationLibraries const* impl = - this->GetLinkImplementationLibrariesInternal(config, headTarget); + this->GetLinkImplementationLibrariesInternal(config, headTarget->Target); iface.Libraries.insert(iface.Libraries.end(), impl->Libraries.begin(), impl->Libraries.end()); if(this->Target->GetPolicyStatusCMP0022() == cmPolicies::WARN && @@ -5003,8 +5003,9 @@ cmGeneratorTarget::ComputeLinkInterfaceLibraries( { bool hadHeadSensitiveConditionDummy = false; this->ExpandLinkItems(newProp, newExplicitLibraries, config, - headTarget, usage_requirements_only, - ifaceLibs, hadHeadSensitiveConditionDummy); + headTarget->Target, + usage_requirements_only, + ifaceLibs, hadHeadSensitiveConditionDummy); } if (ifaceLibs != iface.Libraries) { diff --git a/Source/cmGeneratorTarget.h b/Source/cmGeneratorTarget.h index f3eaccd..bbd06a6 100644 --- a/Source/cmGeneratorTarget.h +++ b/Source/cmGeneratorTarget.h @@ -121,7 +121,7 @@ public: void ComputeLinkInterfaceLibraries(const std::string& config, cmOptionalLinkInterface &iface, - cmTarget const* head, + const cmGeneratorTarget* head, bool usage_requirements_only) const; /** Get the full path to the target according to the settings in its -- cgit v0.12 From a6e1f05c154d123b01bfe75c13d3e016c9074f72 Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Wed, 16 Sep 2015 04:55:52 +0200 Subject: cmGeneratorTarget: Port ComputeLinkInterface away from cmTarget. --- Source/cmGeneratorTarget.cxx | 7 ++++--- Source/cmGeneratorTarget.h | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/Source/cmGeneratorTarget.cxx b/Source/cmGeneratorTarget.cxx index a15d016..e7399ed 100644 --- a/Source/cmGeneratorTarget.cxx +++ b/Source/cmGeneratorTarget.cxx @@ -4485,7 +4485,7 @@ cmGeneratorTarget::GetLinkInterface(const std::string& config, iface.AllDone = true; if(iface.Exists) { - this->ComputeLinkInterface(config, iface, head->Target); + this->ComputeLinkInterface(config, iface, head); } } @@ -4495,7 +4495,7 @@ cmGeneratorTarget::GetLinkInterface(const std::string& config, //---------------------------------------------------------------------------- void cmGeneratorTarget::ComputeLinkInterface(const std::string& config, cmOptionalLinkInterface &iface, - cmTarget const* headTarget) const + cmGeneratorTarget const* headTarget) const { if(iface.ExplicitLibraries) { @@ -4545,7 +4545,8 @@ void cmGeneratorTarget::ComputeLinkInterface(const std::string& config, { // The link implementation is the default link interface. cmLinkImplementationLibraries const* - impl = this->GetLinkImplementationLibrariesInternal(config, headTarget); + impl = this->GetLinkImplementationLibrariesInternal(config, + headTarget->Target); iface.ImplementationIsInterface = true; iface.WrongConfigLibraries = impl->WrongConfigLibraries; } diff --git a/Source/cmGeneratorTarget.h b/Source/cmGeneratorTarget.h index bbd06a6..b832eea 100644 --- a/Source/cmGeneratorTarget.h +++ b/Source/cmGeneratorTarget.h @@ -112,7 +112,7 @@ public: const cmGeneratorTarget* headTarget) const; void ComputeLinkInterface(const std::string& config, cmOptionalLinkInterface& iface, - cmTarget const* head) const; + const cmGeneratorTarget* head) const; cmLinkInterfaceLibraries const* GetLinkInterfaceLibraries(const std::string& config, -- cgit v0.12 From c1f687b1ad2fe3ed7a8a2d300f1e12df59161cbc Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Wed, 16 Sep 2015 04:56:37 +0200 Subject: cmGeneratorTarget: Port GetLinkImplementationLibrariesInternal. --- Source/cmGeneratorTarget.cxx | 12 ++++++------ Source/cmGeneratorTarget.h | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Source/cmGeneratorTarget.cxx b/Source/cmGeneratorTarget.cxx index e7399ed..5734edf 100644 --- a/Source/cmGeneratorTarget.cxx +++ b/Source/cmGeneratorTarget.cxx @@ -4546,7 +4546,7 @@ void cmGeneratorTarget::ComputeLinkInterface(const std::string& config, // The link implementation is the default link interface. cmLinkImplementationLibraries const* impl = this->GetLinkImplementationLibrariesInternal(config, - headTarget->Target); + headTarget); iface.ImplementationIsInterface = true; iface.WrongConfigLibraries = impl->WrongConfigLibraries; } @@ -4990,7 +4990,7 @@ cmGeneratorTarget::ComputeLinkInterfaceLibraries( { // The link implementation is the default link interface. cmLinkImplementationLibraries const* impl = - this->GetLinkImplementationLibrariesInternal(config, headTarget->Target); + this->GetLinkImplementationLibrariesInternal(config, headTarget); iface.Libraries.insert(iface.Libraries.end(), impl->Libraries.begin(), impl->Libraries.end()); if(this->Target->GetPolicyStatusCMP0022() == cmPolicies::WARN && @@ -5263,13 +5263,13 @@ cmLinkImplementationLibraries const* cmGeneratorTarget::GetLinkImplementationLibraries( const std::string& config) const { - return this->GetLinkImplementationLibrariesInternal(config, this->Target); + return this->GetLinkImplementationLibrariesInternal(config, this); } //---------------------------------------------------------------------------- cmLinkImplementationLibraries const* cmGeneratorTarget::GetLinkImplementationLibrariesInternal( - const std::string& config, cmTarget const* head) const + const std::string& config, cmGeneratorTarget const* head) const { // There is no link implementation for imported targets. if(this->IsImported()) @@ -5289,11 +5289,11 @@ cmGeneratorTarget::GetLinkImplementationLibrariesInternal( return &hm.begin()->second; } - cmOptionalLinkImplementation& impl = hm[head]; + cmOptionalLinkImplementation& impl = hm[head->Target]; if(!impl.LibrariesDone) { impl.LibrariesDone = true; - this->ComputeLinkImplementationLibraries(config, impl, head); + this->ComputeLinkImplementationLibraries(config, impl, head->Target); } return &impl; } diff --git a/Source/cmGeneratorTarget.h b/Source/cmGeneratorTarget.h index b832eea..7588a59 100644 --- a/Source/cmGeneratorTarget.h +++ b/Source/cmGeneratorTarget.h @@ -524,7 +524,7 @@ private: cmLinkImplementationLibraries const* GetLinkImplementationLibrariesInternal(const std::string& config, - cmTarget const* head) const; + const cmGeneratorTarget* head) const; bool ComputeOutputDir(const std::string& config, bool implib, std::string& out) const; -- cgit v0.12 From 1988255448d7e0f92f4d2f12cc8fc17b1429c328 Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Wed, 16 Sep 2015 05:03:14 +0200 Subject: cmGeneratorTarget: Port handleSystemIncludesDep away from cmTarget. --- Source/cmGeneratorTarget.cxx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Source/cmGeneratorTarget.cxx b/Source/cmGeneratorTarget.cxx index 5734edf..b20921f 100644 --- a/Source/cmGeneratorTarget.cxx +++ b/Source/cmGeneratorTarget.cxx @@ -511,7 +511,7 @@ cmGeneratorTarget::GetSourceDepends(cmSourceFile const* sf) const static void handleSystemIncludesDep(cmMakefile *mf, cmTarget const* depTgt, const std::string& config, - cmTarget *headTarget, + cmGeneratorTarget const* headTarget, cmGeneratorExpressionDAGChecker *dagChecker, std::vector& result, bool excludeImported) @@ -522,7 +522,7 @@ static void handleSystemIncludesDep(cmMakefile *mf, cmTarget const* depTgt, cmGeneratorExpression ge; cmSystemTools::ExpandListArgument(ge.Parse(dirs) ->Evaluate(mf, - config, false, headTarget, + config, false, headTarget->Target, depTgt, dagChecker), result); } if (!depTgt->IsImported() || excludeImported) @@ -536,7 +536,7 @@ static void handleSystemIncludesDep(cmMakefile *mf, cmTarget const* depTgt, cmGeneratorExpression ge; cmSystemTools::ExpandListArgument(ge.Parse(dirs) ->Evaluate(mf, - config, false, headTarget, + config, false, headTarget->Target, depTgt, dagChecker), result); } } @@ -869,7 +869,7 @@ bool cmGeneratorTarget::IsSystemIncludeDirectory(const std::string& dir, for(std::vector::const_iterator li = deps.begin(), le = deps.end(); li != le; ++li) { - handleSystemIncludesDep(this->Makefile, *li, config, this->Target, + handleSystemIncludesDep(this->Makefile, *li, config, this, &dagChecker, result, excludeImported); } -- cgit v0.12 From 83c29e3903f947f9d4b5ed79a535f850b3b946e2 Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Wed, 16 Sep 2015 05:04:51 +0200 Subject: cmGeneratorTarget: Port ComputeLinkImplementationLibraries away from cmTarget. --- Source/cmGeneratorTarget.cxx | 8 ++++---- Source/cmGeneratorTarget.h | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Source/cmGeneratorTarget.cxx b/Source/cmGeneratorTarget.cxx index b20921f..8a550bf 100644 --- a/Source/cmGeneratorTarget.cxx +++ b/Source/cmGeneratorTarget.cxx @@ -5111,7 +5111,7 @@ cmGeneratorTarget::GetLinkImplementation(const std::string& config) const if(!impl.LibrariesDone) { impl.LibrariesDone = true; - this->ComputeLinkImplementationLibraries(config, impl, this->Target); + this->ComputeLinkImplementationLibraries(config, impl, this); } if(!impl.LanguagesDone) { @@ -5293,7 +5293,7 @@ cmGeneratorTarget::GetLinkImplementationLibrariesInternal( if(!impl.LibrariesDone) { impl.LibrariesDone = true; - this->ComputeLinkImplementationLibraries(config, impl, head->Target); + this->ComputeLinkImplementationLibraries(config, impl, head); } return &impl; } @@ -5310,7 +5310,7 @@ cmGeneratorTarget::IsNullImpliedByLinkLibraries(const std::string &p) const void cmGeneratorTarget::ComputeLinkImplementationLibraries( const std::string& config, cmOptionalLinkImplementation& impl, - cmTarget const* head) const + cmGeneratorTarget const* head) const { cmStringRange entryRange = this->Target->GetLinkImplementationEntries(); @@ -5329,7 +5329,7 @@ void cmGeneratorTarget::ComputeLinkImplementationLibraries( cmsys::auto_ptr const cge = ge.Parse(*le); std::string const evaluated = - cge->Evaluate(this->Makefile, config, false, head, &dagChecker); + cge->Evaluate(this->Makefile, config, false, head->Target, &dagChecker); cmSystemTools::ExpandListArgument(evaluated, llibs); if(cge->GetHadHeadSensitiveCondition()) { diff --git a/Source/cmGeneratorTarget.h b/Source/cmGeneratorTarget.h index 7588a59..15b1b80 100644 --- a/Source/cmGeneratorTarget.h +++ b/Source/cmGeneratorTarget.h @@ -212,7 +212,7 @@ public: void ComputeLinkImplementationLibraries(const std::string& config, cmOptionalLinkImplementation& impl, - cmTarget const* head) const; + const cmGeneratorTarget* head) const; // Compute the set of languages compiled by the target. This is // computed every time it is called because the languages can change -- cgit v0.12 From c66084f5d7df57c991d0f498de04a5f00ae0fcc1 Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Wed, 16 Sep 2015 05:07:06 +0200 Subject: cmGeneratorTarget: Port GetImportLinkInterface away from cmTarget. --- Source/cmGeneratorTarget.cxx | 10 +++++----- Source/cmGeneratorTarget.h | 3 ++- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/Source/cmGeneratorTarget.cxx b/Source/cmGeneratorTarget.cxx index 8a550bf..26119c3 100644 --- a/Source/cmGeneratorTarget.cxx +++ b/Source/cmGeneratorTarget.cxx @@ -4451,7 +4451,7 @@ cmGeneratorTarget::GetLinkInterface(const std::string& config, // Imported targets have their own link interface. if(this->IsImported()) { - return this->GetImportLinkInterface(config, head->Target, false); + return this->GetImportLinkInterface(config, head, false); } // Link interfaces are not supported for executables that do not @@ -4599,7 +4599,7 @@ cmGeneratorTarget::GetLinkInterfaceLibraries(const std::string& config, // Imported targets have their own link interface. if(this->IsImported()) { - return this->GetImportLinkInterface(config, head->Target, + return this->GetImportLinkInterface(config, head, usage_requirements_only); } @@ -5040,7 +5040,7 @@ cmGeneratorTarget::ComputeLinkInterfaceLibraries( //---------------------------------------------------------------------------- const cmLinkInterface * cmGeneratorTarget::GetImportLinkInterface(const std::string& config, - cmTarget const* headTarget, + cmGeneratorTarget const* headTarget, bool usage_requirements_only) const { cmTarget::ImportInfo const* info = this->Target->GetImportInfo(config); @@ -5062,7 +5062,7 @@ cmGeneratorTarget::GetImportLinkInterface(const std::string& config, return &hm.begin()->second; } - cmOptionalLinkInterface& iface = hm[headTarget]; + cmOptionalLinkInterface& iface = hm[headTarget->Target]; if(!iface.AllDone) { iface.AllDone = true; @@ -5070,7 +5070,7 @@ cmGeneratorTarget::GetImportLinkInterface(const std::string& config, cmSystemTools::ExpandListArgument(info->Languages, iface.Languages); this->ExpandLinkItems(info->LibrariesProp, info->Libraries, config, - headTarget, usage_requirements_only, + headTarget->Target, usage_requirements_only, iface.Libraries, iface.HadHeadSensitiveCondition); std::vector deps; diff --git a/Source/cmGeneratorTarget.h b/Source/cmGeneratorTarget.h index 15b1b80..03548e2 100644 --- a/Source/cmGeneratorTarget.h +++ b/Source/cmGeneratorTarget.h @@ -491,7 +491,8 @@ private: std::string const& config) const; cmLinkInterface const* - GetImportLinkInterface(const std::string& config, cmTarget const* head, + GetImportLinkInterface(const std::string& config, + const cmGeneratorTarget* head, bool usage_requirements_only) const; typedef std::map > -- cgit v0.12 From 1c1c2a1201682d17491026cb392c31ae5e63e1a5 Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Wed, 16 Sep 2015 05:07:31 +0200 Subject: cmGeneratorTarget: Port ExpandLinkItems away from cmTarget. --- Source/cmGeneratorTarget.cxx | 10 +++++----- Source/cmGeneratorTarget.h | 3 ++- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/Source/cmGeneratorTarget.cxx b/Source/cmGeneratorTarget.cxx index 26119c3..f39a67d 100644 --- a/Source/cmGeneratorTarget.cxx +++ b/Source/cmGeneratorTarget.cxx @@ -4418,7 +4418,7 @@ void cmGeneratorTarget::LookupLinkItems(std::vector const& names, void cmGeneratorTarget::ExpandLinkItems(std::string const& prop, std::string const& value, std::string const& config, - cmTarget const* headTarget, + cmGeneratorTarget const* headTarget, bool usage_requirements_only, std::vector& items, bool& hadHeadSensitiveCondition) const @@ -4437,7 +4437,7 @@ void cmGeneratorTarget::ExpandLinkItems(std::string const& prop, this->Makefile, config, false, - headTarget, + headTarget->Target, this->Target, &dagChecker), libs); this->LookupLinkItems(libs, items); hadHeadSensitiveCondition = cge->GetHadHeadSensitiveCondition(); @@ -4977,7 +4977,7 @@ cmGeneratorTarget::ComputeLinkInterfaceLibraries( // The interface libraries have been explicitly set. this->ExpandLinkItems(linkIfaceProp, explicitLibraries, config, - headTarget->Target, usage_requirements_only, + headTarget, usage_requirements_only, iface.Libraries, iface.HadHeadSensitiveCondition); } @@ -5004,7 +5004,7 @@ cmGeneratorTarget::ComputeLinkInterfaceLibraries( { bool hadHeadSensitiveConditionDummy = false; this->ExpandLinkItems(newProp, newExplicitLibraries, config, - headTarget->Target, + headTarget, usage_requirements_only, ifaceLibs, hadHeadSensitiveConditionDummy); } @@ -5070,7 +5070,7 @@ cmGeneratorTarget::GetImportLinkInterface(const std::string& config, cmSystemTools::ExpandListArgument(info->Languages, iface.Languages); this->ExpandLinkItems(info->LibrariesProp, info->Libraries, config, - headTarget->Target, usage_requirements_only, + headTarget, usage_requirements_only, iface.Libraries, iface.HadHeadSensitiveCondition); std::vector deps; diff --git a/Source/cmGeneratorTarget.h b/Source/cmGeneratorTarget.h index 03548e2..799110c 100644 --- a/Source/cmGeneratorTarget.h +++ b/Source/cmGeneratorTarget.h @@ -507,7 +507,8 @@ private: mutable std::set LinkImplicitNullProperties; void ExpandLinkItems(std::string const& prop, std::string const& value, - std::string const& config, cmTarget const* headTarget, + std::string const& config, + const cmGeneratorTarget* headTarget, bool usage_requirements_only, std::vector& items, bool& hadHeadSensitiveCondition) const; -- cgit v0.12