diff options
Diffstat (limited to 'Source')
| -rw-r--r-- | Source/QtDialog/QCMakeCacheView.cxx | 5 | ||||
| -rw-r--r-- | Source/cmGeneratorTarget.cxx | 3 | ||||
| -rw-r--r-- | Source/cmGhsMultiTargetGenerator.cxx | 5 | ||||
| -rw-r--r-- | Source/cmGlobalXCodeGenerator.cxx | 19 | ||||
| -rw-r--r-- | Source/cmGlobalXCodeGenerator.h | 2 | ||||
| -rw-r--r-- | Source/cmGraphVizWriter.cxx | 116 | ||||
| -rw-r--r-- | Source/cmGraphVizWriter.h | 36 | ||||
| -rw-r--r-- | Source/cmNinjaNormalTargetGenerator.cxx | 18 | ||||
| -rw-r--r-- | Source/cmStandardLexer.h | 4 | ||||
| -rw-r--r-- | Source/cmVisualStudio10TargetGenerator.cxx | 6 |
10 files changed, 198 insertions, 16 deletions
diff --git a/Source/QtDialog/QCMakeCacheView.cxx b/Source/QtDialog/QCMakeCacheView.cxx index b1f4a82..9b24fbd 100644 --- a/Source/QtDialog/QCMakeCacheView.cxx +++ b/Source/QtDialog/QCMakeCacheView.cxx @@ -226,8 +226,9 @@ void QCMakeCacheModel::setProperties(const QCMakePropertyList& props) #if QT_VERSION < QT_VERSION_CHECK(5, 14, 0) QSet<QCMakeProperty> oldProps = this->properties().toSet(); #else - QSet<QCMakeProperty> oldProps = QSet<QCMakeProperty>( - this->properties().begin(), this->properties().end()); + QCMakePropertyList const& oldPropsList = this->properties(); + QSet<QCMakeProperty> oldProps = + QSet<QCMakeProperty>(oldPropsList.begin(), oldPropsList.end()); #endif oldProps.intersect(newProps); newProps.subtract(oldProps); diff --git a/Source/cmGeneratorTarget.cxx b/Source/cmGeneratorTarget.cxx index f2011ee..c7baf2b 100644 --- a/Source/cmGeneratorTarget.cxx +++ b/Source/cmGeneratorTarget.cxx @@ -1309,6 +1309,9 @@ void AddSwiftImplicitIncludeDirectories( for (const cmLinkImplItem& library : libraries->Libraries) { if (const cmGeneratorTarget* dependency = library.Target) { + if (dependency->GetType() == cmStateEnums::INTERFACE_LIBRARY) { + continue; + } if (cm::contains(dependency->GetAllConfigCompileLanguages(), "Swift")) { EvaluatedTargetPropertyEntry entry{ library, library.Backtrace }; diff --git a/Source/cmGhsMultiTargetGenerator.cxx b/Source/cmGhsMultiTargetGenerator.cxx index 358d65a..97580d6 100644 --- a/Source/cmGhsMultiTargetGenerator.cxx +++ b/Source/cmGhsMultiTargetGenerator.cxx @@ -550,8 +550,9 @@ void cmGhsMultiTargetGenerator::WriteSources(std::ostream& fout_proj) */ for (auto& sg : groupFilesList) { std::ostream* fout; - bool useProjectFile = cmIsOn(*this->GeneratorTarget->GetProperty( - "GHS_NO_SOURCE_GROUP_FILE")) || + cmProp noSourceGroupFile = + this->GeneratorTarget->GetProperty("GHS_NO_SOURCE_GROUP_FILE"); + bool useProjectFile = (noSourceGroupFile && cmIsOn(*noSourceGroupFile)) || cmIsOn(this->Makefile->GetDefinition("CMAKE_GHS_NO_SOURCE_GROUP_FILE")); if (useProjectFile || sg.empty()) { fout = &fout_proj; diff --git a/Source/cmGlobalXCodeGenerator.cxx b/Source/cmGlobalXCodeGenerator.cxx index a5ce5d1..65828ce 100644 --- a/Source/cmGlobalXCodeGenerator.cxx +++ b/Source/cmGlobalXCodeGenerator.cxx @@ -12,6 +12,7 @@ #include <cm/memory> #include <cmext/algorithm> +#include <cmext/string_view> #include "cmsys/RegularExpression.hxx" @@ -271,6 +272,13 @@ std::string cmGlobalXCodeGenerator::FindXcodeBuildCommand() return makeProgram; } +bool cmGlobalXCodeGenerator::SetSystemName(std::string const& s, + cmMakefile* mf) +{ + this->SystemName = s; + return this->cmGlobalGenerator::SetSystemName(s, mf); +} + bool cmGlobalXCodeGenerator::SetGeneratorToolset(std::string const& ts, bool build, cmMakefile* mf) { @@ -3111,6 +3119,14 @@ bool cmGlobalXCodeGenerator::CreateXCodeObjects( if (archs.empty()) { // Tell Xcode to use NATIVE_ARCH instead of ARCHS. buildSettings->AddAttribute("ONLY_ACTIVE_ARCH", this->CreateString("YES")); + // When targeting macOS, use only the host architecture. + if (this->SystemName == "Darwin"_s && + (!sysroot || !*sysroot || + cmSystemTools::LowerCase(sysroot).find("macos") != + std::string::npos)) { + buildSettings->AddAttribute("ARCHS", + this->CreateString("$(NATIVE_ARCH_ACTUAL)")); + } } else { // Tell Xcode to use ARCHS (ONLY_ACTIVE_ARCH defaults to NO). buildSettings->AddAttribute("ARCHS", this->CreateString(archs)); @@ -3210,7 +3226,8 @@ void cmGlobalXCodeGenerator::ComputeArchitectures(cmMakefile* mf) } if (this->Architectures.empty()) { - // With no ARCHS we use ONLY_ACTIVE_ARCH. + // With no ARCHS we use ONLY_ACTIVE_ARCH and possibly a + // platform-specific default ARCHS placeholder value. // Look up the arch that Xcode chooses in this case. if (const char* arch = mf->GetDefinition("CMAKE_XCODE_ARCHS")) { this->ObjectDirArchDefault = arch; diff --git a/Source/cmGlobalXCodeGenerator.h b/Source/cmGlobalXCodeGenerator.h index e380f1c..e2d1b3a 100644 --- a/Source/cmGlobalXCodeGenerator.h +++ b/Source/cmGlobalXCodeGenerator.h @@ -109,6 +109,7 @@ public: bool ShouldStripResourcePath(cmMakefile*) const override; + bool SetSystemName(std::string const& s, cmMakefile* mf) override; bool SetGeneratorToolset(std::string const& ts, bool build, cmMakefile* mf) override; void AppendFlag(std::string& flags, std::string const& flag) const; @@ -298,6 +299,7 @@ private: std::vector<std::string> Architectures; std::string ObjectDirArchDefault; std::string ObjectDirArch; + std::string SystemName; std::string GeneratorToolset; std::map<cmGeneratorTarget const*, size_t> TargetOrderIndex; }; diff --git a/Source/cmGraphVizWriter.cxx b/Source/cmGraphVizWriter.cxx index 0fcda4e..c23156d 100644 --- a/Source/cmGraphVizWriter.cxx +++ b/Source/cmGraphVizWriter.cxx @@ -67,6 +67,36 @@ const char* getShapeForTarget(const cmLinkItem& item) return GRAPHVIZ_NODE_SHAPE_LIBRARY_UNKNOWN; } } + +struct DependeesDir +{ + template <typename T> + static const cmLinkItem& src(const T& con) + { + return con.src; + } + + template <typename T> + static const cmLinkItem& dst(const T& con) + { + return con.dst; + } +}; + +struct DependersDir +{ + template <typename T> + static const cmLinkItem& src(const T& con) + { + return con.dst; + } + + template <typename T> + static const cmLinkItem& dst(const T& con) + { + return con.src; + } +}; } cmGraphVizWriter::cmGraphVizWriter(std::string const& fileName, @@ -173,18 +203,16 @@ void cmGraphVizWriter::VisitLink(cmLinkItem const& depender, return; } + // write global data directly this->WriteConnection(this->GlobalFileStream, depender, dependee, scopeType); if (this->GeneratePerTarget) { - auto fileStream = PerTargetFileStreams[depender.AsStr()].get(); - this->WriteNode(*fileStream, dependee); - this->WriteConnection(*fileStream, depender, dependee, scopeType); + PerTargetConnections[depender].emplace_back(depender, dependee, scopeType); } if (this->GenerateDependers) { - auto fileStream = TargetDependersFileStreams[dependee.AsStr()].get(); - this->WriteNode(*fileStream, depender); - this->WriteConnection(*fileStream, depender, dependee, scopeType); + TargetDependersConnections[dependee].emplace_back(dependee, depender, + scopeType); } } @@ -288,10 +316,86 @@ void cmGraphVizWriter::Write() } } + // write global data and collect all connection data for per target graphs for (auto const gt : sortedGeneratorTargets) { auto item = cmLinkItem(gt, false, gt->GetBacktrace()); this->VisitItem(item); } + + if (this->GeneratePerTarget) { + WritePerTargetConnections<DependeesDir>(PerTargetConnections, + PerTargetFileStreams); + } + + if (this->GenerateDependers) { + WritePerTargetConnections<DependersDir>(TargetDependersConnections, + TargetDependersFileStreams); + } +} + +void cmGraphVizWriter::FindAllConnections(const ConnectionsMap& connectionMap, + const cmLinkItem& rootItem, + Connections& extendedCons, + std::set<cmLinkItem>& visitedItems) +{ + // some "targets" are not in map, e.g. linker flags as -lm or + // targets without dependency. + // in both cases we are finished with traversing the graph + if (connectionMap.find(rootItem) == connectionMap.cend()) { + return; + } + + const Connections& origCons = connectionMap.at(rootItem); + + for (const Connection& con : origCons) { + extendedCons.emplace_back(con); + const cmLinkItem& dstItem = con.dst; + bool const visited = visitedItems.find(dstItem) != visitedItems.cend(); + if (!visited) { + visitedItems.insert(dstItem); + FindAllConnections(connectionMap, dstItem, extendedCons, visitedItems); + } + } +} + +void cmGraphVizWriter::FindAllConnections(const ConnectionsMap& connectionMap, + const cmLinkItem& rootItem, + Connections& extendedCons) +{ + std::set<cmLinkItem> visitedItems = { rootItem }; + FindAllConnections(connectionMap, rootItem, extendedCons, visitedItems); +} + +template <typename DirFunc> +void cmGraphVizWriter::WritePerTargetConnections( + const ConnectionsMap& connections, const FileStreamMap& streams) +{ + // the per target connections must be extended by indirect dependencies + ConnectionsMap extendedConnections; + for (auto const& conPerTarget : connections) { + const cmLinkItem& rootItem = conPerTarget.first; + Connections& extendedCons = extendedConnections[conPerTarget.first]; + FindAllConnections(connections, rootItem, extendedCons); + } + + for (auto const& conPerTarget : extendedConnections) { + const cmLinkItem& rootItem = conPerTarget.first; + + // some of the nodes are excluded completely and are not written + if (this->ItemExcluded(rootItem)) { + continue; + } + + const Connections& cons = conPerTarget.second; + auto fileStream = streams.at(rootItem.AsStr()).get(); + + for (const Connection& con : cons) { + const cmLinkItem& src = DirFunc::src(con); + const cmLinkItem& dst = DirFunc::dst(con); + this->WriteNode(*fileStream, con.dst); + this->WriteConnection(*fileStream, src, dst, con.scopeType); + } + } } void cmGraphVizWriter::WriteHeader(cmGeneratedFileStream& fs, diff --git a/Source/cmGraphVizWriter.h b/Source/cmGraphVizWriter.h index 578660d..9766068 100644 --- a/Source/cmGraphVizWriter.h +++ b/Source/cmGraphVizWriter.h @@ -7,16 +7,18 @@ #include <map> #include <memory> +#include <set> #include <string> +#include <utility> #include <vector> #include "cmsys/RegularExpression.hxx" #include "cmGeneratedFileStream.h" +#include "cmLinkItem.h" #include "cmLinkItemGraphVisitor.h" #include "cmStateTypes.h" -class cmLinkItem; class cmGlobalGenerator; /** This class implements writing files for graphviz (dot) for graphs @@ -47,6 +49,22 @@ private: using FileStreamMap = std::map<std::string, std::unique_ptr<cmGeneratedFileStream>>; + struct Connection + { + Connection(cmLinkItem s, cmLinkItem d, std::string scope) + : src(std::move(s)) + , dst(std::move(d)) + , scopeType(std::move(scope)) + { + } + + cmLinkItem src; + cmLinkItem dst; + std::string scopeType; + }; + using Connections = std::vector<Connection>; + using ConnectionsMap = std::map<cmLinkItem, Connections>; + void VisitLink(cmLinkItem const& depender, cmLinkItem const& dependee, bool isDirectLink, std::string const& scopeType = ""); @@ -66,6 +84,19 @@ private: cmLinkItem const& dependeeTargetName, std::string const& edgeStyle); + void FindAllConnections(const ConnectionsMap& connectionMap, + const cmLinkItem& rootItem, + Connections& extendedCons, + std::set<cmLinkItem>& visitedItems); + + void FindAllConnections(const ConnectionsMap& connectionMap, + const cmLinkItem& rootItem, + Connections& extendedCons); + + template <typename DirFunc> + void WritePerTargetConnections(const ConnectionsMap& connections, + const FileStreamMap& streams); + bool ItemExcluded(cmLinkItem const& item); bool ItemNameFilteredOut(std::string const& itemName); bool TargetTypeEnabled(cmStateEnums::TargetType targetType) const; @@ -83,6 +114,9 @@ private: FileStreamMap PerTargetFileStreams; FileStreamMap TargetDependersFileStreams; + ConnectionsMap PerTargetConnections; + ConnectionsMap TargetDependersConnections; + std::string GraphName; std::string GraphHeader; std::string GraphNodePrefix; diff --git a/Source/cmNinjaNormalTargetGenerator.cxx b/Source/cmNinjaNormalTargetGenerator.cxx index b92548f..0f01f85 100644 --- a/Source/cmNinjaNormalTargetGenerator.cxx +++ b/Source/cmNinjaNormalTargetGenerator.cxx @@ -733,8 +733,13 @@ void cmNinjaNormalTargetGenerator::WriteDeviceLinkStatement( static_cast<int>(cmSystemTools::CalculateCommandLineLengthLimit()) - globalGen->GetRuleCmdLength(this->LanguageLinkerDeviceRule(config)); - build.RspFile = this->ConvertToNinjaPath(std::string("CMakeFiles/") + - genTarget->GetName() + ".rsp"); + std::string path = localGen.GetHomeRelativeOutputPath(); + if (!path.empty()) { + path += '/'; + } + build.RspFile = this->ConvertToNinjaPath( + cmStrCat(path, "CMakeFiles/", genTarget->GetName(), + globalGen->IsMultiConfig() ? cmStrCat('.', config) : "", ".rsp")); // Gather order-only dependencies. this->GetLocalGenerator()->AppendTargetDepends( @@ -1154,8 +1159,13 @@ void cmNinjaNormalTargetGenerator::WriteLinkStatement( globalGen->GetRuleCmdLength(linkBuild.Rule); } - linkBuild.RspFile = this->ConvertToNinjaPath(std::string("CMakeFiles/") + - gt->GetName() + ".rsp"); + std::string path = localGen.GetHomeRelativeOutputPath(); + if (!path.empty()) { + path += '/'; + } + linkBuild.RspFile = this->ConvertToNinjaPath( + cmStrCat(path, "CMakeFiles/", gt->GetName(), + globalGen->IsMultiConfig() ? cmStrCat('.', config) : "", ".rsp")); // Gather order-only dependencies. this->GetLocalGenerator()->AppendTargetDepends(gt, linkBuild.OrderOnlyDeps, diff --git a/Source/cmStandardLexer.h b/Source/cmStandardLexer.h index cc67ac2..e0b2116 100644 --- a/Source/cmStandardLexer.h +++ b/Source/cmStandardLexer.h @@ -3,6 +3,10 @@ #ifndef cmStandardLexer_h #define cmStandardLexer_h +#if defined(__linux) +/* Needed for glibc < 2.12 */ +# define _XOPEN_SOURCE 600 +#endif #if !defined(_WIN32) && !defined(__sun) /* POSIX APIs are needed */ # define _POSIX_C_SOURCE 200809L diff --git a/Source/cmVisualStudio10TargetGenerator.cxx b/Source/cmVisualStudio10TargetGenerator.cxx index a3ccd2b..a8e424d 100644 --- a/Source/cmVisualStudio10TargetGenerator.cxx +++ b/Source/cmVisualStudio10TargetGenerator.cxx @@ -2884,6 +2884,12 @@ bool cmVisualStudio10TargetGenerator::ComputeClOptions( clOptions.RemoveFlag("SpectreMitigation"); } + // Remove any target-wide -TC or -TP flag added by the project. + // Such flags are unnecessary and break our model of language selection. + if (langForClCompile == "C" || langForClCompile == "CXX") { + clOptions.RemoveFlag("CompileAs"); + } + this->ClOptions[configName] = std::move(pOptions); return true; } |
