diff options
Diffstat (limited to 'Source/cmGraphVizWriter.cxx')
-rw-r--r-- | Source/cmGraphVizWriter.cxx | 344 |
1 files changed, 215 insertions, 129 deletions
diff --git a/Source/cmGraphVizWriter.cxx b/Source/cmGraphVizWriter.cxx index 7e953cef1..e0d545d86 100644 --- a/Source/cmGraphVizWriter.cxx +++ b/Source/cmGraphVizWriter.cxx @@ -2,8 +2,9 @@ file Copyright.txt or https://cmake.org/licensing for details. */ #include "cmGraphVizWriter.h" -#include "cmConfigure.h" +#include <cstddef> #include <iostream> +#include <memory> #include <sstream> #include <utility> @@ -12,13 +13,41 @@ #include "cmGlobalGenerator.h" #include "cmLocalGenerator.h" #include "cmMakefile.h" +#include "cmState.h" #include "cmStateSnapshot.h" +#include "cmStringAlgorithms.h" #include "cmSystemTools.h" #include "cmTarget.h" -#include "cm_auto_ptr.hxx" #include "cmake.h" -static const char* getShapeForTarget(const cmGeneratorTarget* target) +namespace { +enum LinkLibraryScopeType +{ + LLT_SCOPE_PUBLIC, + LLT_SCOPE_PRIVATE, + LLT_SCOPE_INTERFACE +}; + +const char* const GRAPHVIZ_PRIVATE_EDEGE_STYLE = "dashed"; +const char* const GRAPHVIZ_INTERFACE_EDEGE_STYLE = "dotted"; + +std::string getLinkLibraryStyle(const LinkLibraryScopeType& type) +{ + std::string style; + switch (type) { + case LLT_SCOPE_PRIVATE: + style = "[style = " + std::string(GRAPHVIZ_PRIVATE_EDEGE_STYLE) + "]"; + break; + case LLT_SCOPE_INTERFACE: + style = "[style = " + std::string(GRAPHVIZ_INTERFACE_EDEGE_STYLE) + "]"; + break; + default: + break; + } + return style; +} + +const char* getShapeForTarget(const cmGeneratorTarget* target) { if (!target) { return "ellipse"; @@ -40,17 +69,102 @@ static const char* getShapeForTarget(const cmGeneratorTarget* target) return "box"; } -cmGraphVizWriter::cmGraphVizWriter( - const std::vector<cmLocalGenerator*>& localGenerators) +std::map<std::string, LinkLibraryScopeType> getScopedLinkLibrariesFromTarget( + cmTarget* Target, const cmGlobalGenerator* globalGenerator) +{ + char sep = ';'; + std::map<std::string, LinkLibraryScopeType> tokens; + size_t start = 0; + size_t end = 0; + + const char* pInterfaceLinkLibraries = + Target->GetProperty("INTERFACE_LINK_LIBRARIES"); + const char* pLinkLibraries = Target->GetProperty("LINK_LIBRARIES"); + + if (!pInterfaceLinkLibraries && !pLinkLibraries) { + return tokens; // target is not linked against any other libraries + } + + // make sure we don't touch a null-ptr + auto interfaceLinkLibraries = + std::string(pInterfaceLinkLibraries ? pInterfaceLinkLibraries : ""); + auto linkLibraries = std::string(pLinkLibraries ? pLinkLibraries : ""); + + // first extract interfaceLinkLibraries + while (start < interfaceLinkLibraries.length()) { + + if ((end = interfaceLinkLibraries.find(sep, start)) == std::string::npos) { + end = interfaceLinkLibraries.length(); + } + + std::string element = interfaceLinkLibraries.substr(start, end - start); + if (globalGenerator->IsAlias(element)) { + const auto tgt = globalGenerator->FindTarget(element); + if (tgt) { + element = tgt->GetName(); + } + } + + if (std::string::npos == element.find("$<LINK_ONLY:", 0)) { + // we assume first, that this library is an interface library. + // if we find it again in the linklibraries property, we promote it to an + // public library. + tokens[element] = LLT_SCOPE_INTERFACE; + } else { + // this is an private linked static library. + // we take care of this case in the second iterator. + } + start = end + 1; + } + + // second extract linkLibraries + start = 0; + while (start < linkLibraries.length()) { + + if ((end = linkLibraries.find(sep, start)) == std::string::npos) { + end = linkLibraries.length(); + } + + std::string element = linkLibraries.substr(start, end - start); + if (globalGenerator->IsAlias(element)) { + const auto tgt = globalGenerator->FindTarget(element); + if (tgt) { + element = tgt->GetName(); + } + } + + if (tokens.find(element) == tokens.end()) { + // this library is not found in interfaceLinkLibraries but in + // linkLibraries. + // this results in a private linked library. + tokens[element] = LLT_SCOPE_PRIVATE; + } else if (LLT_SCOPE_INTERFACE == tokens[element]) { + // this library is found in interfaceLinkLibraries and linkLibraries. + // this results in a public linked library. + tokens[element] = LLT_SCOPE_PUBLIC; + } else { + // private and public linked libraries should not be changed anymore. + } + + start = end + 1; + } + + return tokens; +} +} + +cmGraphVizWriter::cmGraphVizWriter(const cmGlobalGenerator* globalGenerator) : GraphType("digraph") , GraphName("GG") , GraphHeader("node [\n fontsize = \"12\"\n];") , GraphNodePrefix("node") - , LocalGenerators(localGenerators) + , GlobalGenerator(globalGenerator) + , LocalGenerators(globalGenerator->GetLocalGenerators()) , GenerateForExecutables(true) , GenerateForStaticLibs(true) , GenerateForSharedLibs(true) , GenerateForModuleLibs(true) + , GenerateForInterface(true) , GenerateForExternals(true) , GeneratePerTarget(true) , GenerateDependers(true) @@ -58,19 +172,19 @@ cmGraphVizWriter::cmGraphVizWriter( { } -void cmGraphVizWriter::ReadSettings(const char* settingsFileName, - const char* fallbackSettingsFileName) +void cmGraphVizWriter::ReadSettings( + const std::string& settingsFileName, + const std::string& fallbackSettingsFileName) { - cmake cm(cmake::RoleScript); + cmake cm(cmake::RoleScript, cmState::Unknown); cm.SetHomeDirectory(""); cm.SetHomeOutputDirectory(""); cm.GetCurrentSnapshot().SetDefaultDefinitions(); cmGlobalGenerator ggi(&cm); - CM_AUTO_PTR<cmMakefile> mf(new cmMakefile(&ggi, cm.GetCurrentSnapshot())); - CM_AUTO_PTR<cmLocalGenerator> lg(ggi.CreateLocalGenerator(mf.get())); - - const char* inFileName = settingsFileName; + cmMakefile mf(&ggi, cm.GetCurrentSnapshot()); + std::unique_ptr<cmLocalGenerator> lg(ggi.CreateLocalGenerator(&mf)); + std::string inFileName = settingsFileName; if (!cmSystemTools::FileExists(inFileName)) { inFileName = fallbackSettingsFileName; if (!cmSystemTools::FileExists(inFileName)) { @@ -78,8 +192,8 @@ void cmGraphVizWriter::ReadSettings(const char* settingsFileName, } } - if (!mf->ReadListFile(inFileName)) { - cmSystemTools::Error("Problem opening GraphViz options file: ", + if (!mf.ReadListFile(inFileName)) { + cmSystemTools::Error("Problem opening GraphViz options file: " + inFileName); return; } @@ -87,12 +201,12 @@ void cmGraphVizWriter::ReadSettings(const char* settingsFileName, std::cout << "Reading GraphViz options file: " << inFileName << std::endl; #define __set_if_set(var, cmakeDefinition) \ - { \ - const char* value = mf->GetDefinition(cmakeDefinition); \ + do { \ + const char* value = mf.GetDefinition(cmakeDefinition); \ if (value) { \ (var) = value; \ } \ - } + } while (false) __set_if_set(this->GraphType, "GRAPHVIZ_GRAPH_TYPE"); __set_if_set(this->GraphName, "GRAPHVIZ_GRAPH_NAME"); @@ -100,17 +214,18 @@ void cmGraphVizWriter::ReadSettings(const char* settingsFileName, __set_if_set(this->GraphNodePrefix, "GRAPHVIZ_NODE_PREFIX"); #define __set_bool_if_set(var, cmakeDefinition) \ - { \ - const char* value = mf->GetDefinition(cmakeDefinition); \ + do { \ + const char* value = mf.GetDefinition(cmakeDefinition); \ if (value) { \ - (var) = mf->IsOn(cmakeDefinition); \ + (var) = mf.IsOn(cmakeDefinition); \ } \ - } + } while (false) __set_bool_if_set(this->GenerateForExecutables, "GRAPHVIZ_EXECUTABLES"); __set_bool_if_set(this->GenerateForStaticLibs, "GRAPHVIZ_STATIC_LIBS"); __set_bool_if_set(this->GenerateForSharedLibs, "GRAPHVIZ_SHARED_LIBS"); __set_bool_if_set(this->GenerateForModuleLibs, "GRAPHVIZ_MODULE_LIBS"); + __set_bool_if_set(this->GenerateForInterface, "GRAPHVIZ_INTERFACE"); __set_bool_if_set(this->GenerateForExternals, "GRAPHVIZ_EXTERNAL_LIBS"); __set_bool_if_set(this->GeneratePerTarget, "GRAPHVIZ_GENERATE_PER_TARGET"); __set_bool_if_set(this->GenerateDependers, "GRAPHVIZ_GENERATE_DEPENDERS"); @@ -120,26 +235,22 @@ void cmGraphVizWriter::ReadSettings(const char* settingsFileName, this->TargetsToIgnoreRegex.clear(); if (!ignoreTargetsRegexes.empty()) { - std::vector<std::string> ignoreTargetsRegExVector; - cmSystemTools::ExpandListArgument(ignoreTargetsRegexes, - ignoreTargetsRegExVector); - for (std::vector<std::string>::const_iterator itvIt = - ignoreTargetsRegExVector.begin(); - itvIt != ignoreTargetsRegExVector.end(); ++itvIt) { - std::string currentRegexString(*itvIt); + std::vector<std::string> ignoreTargetsRegExVector = + cmExpandedList(ignoreTargetsRegexes); + for (std::string const& currentRegexString : ignoreTargetsRegExVector) { cmsys::RegularExpression currentRegex; - if (!currentRegex.compile(currentRegexString.c_str())) { + if (!currentRegex.compile(currentRegexString)) { std::cerr << "Could not compile bad regex \"" << currentRegexString << "\"" << std::endl; } - this->TargetsToIgnoreRegex.push_back(currentRegex); + this->TargetsToIgnoreRegex.push_back(std::move(currentRegex)); } } } // Iterate over all targets and write for each one a graph which shows // which other targets depend on it. -void cmGraphVizWriter::WriteTargetDependersFiles(const char* fileName) +void cmGraphVizWriter::WriteTargetDependersFiles(const std::string& fileName) { if (!this->GenerateDependers) { return; @@ -147,23 +258,19 @@ void cmGraphVizWriter::WriteTargetDependersFiles(const char* fileName) this->CollectTargetsAndLibs(); - for (std::map<std::string, const cmGeneratorTarget*>::const_iterator ptrIt = - this->TargetPtrs.begin(); - ptrIt != this->TargetPtrs.end(); ++ptrIt) { - if (ptrIt->second == CM_NULLPTR) { + for (auto const& ptr : this->TargetPtrs) { + if (ptr.second == nullptr) { continue; } - if (!this->GenerateForTargetType(ptrIt->second->GetType())) { + if (!this->GenerateForTargetType(ptr.second->GetType())) { continue; } - std::string currentFilename = fileName; - currentFilename += "."; - currentFilename += ptrIt->first; - currentFilename += ".dependers"; + std::string currentFilename = + cmStrCat(fileName, '.', ptr.first, ".dependers"); - cmGeneratedFileStream str(currentFilename.c_str()); + cmGeneratedFileStream str(currentFilename); if (!str) { return; } @@ -174,7 +281,7 @@ void cmGraphVizWriter::WriteTargetDependersFiles(const char* fileName) std::cout << "Writing " << currentFilename << "..." << std::endl; this->WriteHeader(str); - this->WriteDependerConnections(ptrIt->first, insertedNodes, + this->WriteDependerConnections(ptr.first, insertedNodes, insertedConnections, str); this->WriteFooter(str); @@ -183,7 +290,7 @@ void cmGraphVizWriter::WriteTargetDependersFiles(const char* fileName) // Iterate over all targets and write for each one a graph which shows // on which targets it depends. -void cmGraphVizWriter::WritePerTargetFiles(const char* fileName) +void cmGraphVizWriter::WritePerTargetFiles(const std::string& fileName) { if (!this->GeneratePerTarget) { return; @@ -191,24 +298,20 @@ void cmGraphVizWriter::WritePerTargetFiles(const char* fileName) this->CollectTargetsAndLibs(); - for (std::map<std::string, const cmGeneratorTarget*>::const_iterator ptrIt = - this->TargetPtrs.begin(); - ptrIt != this->TargetPtrs.end(); ++ptrIt) { - if (ptrIt->second == CM_NULLPTR) { + for (auto const& ptr : this->TargetPtrs) { + if (ptr.second == nullptr) { continue; } - if (!this->GenerateForTargetType(ptrIt->second->GetType())) { + if (!this->GenerateForTargetType(ptr.second->GetType())) { continue; } std::set<std::string> insertedConnections; std::set<std::string> insertedNodes; - std::string currentFilename = fileName; - currentFilename += "."; - currentFilename += ptrIt->first; - cmGeneratedFileStream str(currentFilename.c_str()); + std::string currentFilename = cmStrCat(fileName, '.', ptr.first); + cmGeneratedFileStream str(currentFilename); if (!str) { return; } @@ -216,13 +319,12 @@ void cmGraphVizWriter::WritePerTargetFiles(const char* fileName) std::cout << "Writing " << currentFilename << "..." << std::endl; this->WriteHeader(str); - this->WriteConnections(ptrIt->first, insertedNodes, insertedConnections, - str); + this->WriteConnections(ptr.first, insertedNodes, insertedConnections, str); this->WriteFooter(str); } } -void cmGraphVizWriter::WriteGlobalFile(const char* fileName) +void cmGraphVizWriter::WriteGlobalFile(const std::string& fileName) { this->CollectTargetsAndLibs(); @@ -237,19 +339,16 @@ void cmGraphVizWriter::WriteGlobalFile(const char* fileName) std::set<std::string> insertedConnections; std::set<std::string> insertedNodes; - for (std::map<std::string, const cmGeneratorTarget*>::const_iterator ptrIt = - this->TargetPtrs.begin(); - ptrIt != this->TargetPtrs.end(); ++ptrIt) { - if (ptrIt->second == CM_NULLPTR) { + for (auto const& ptr : this->TargetPtrs) { + if (ptr.second == nullptr) { continue; } - if (!this->GenerateForTargetType(ptrIt->second->GetType())) { + if (!this->GenerateForTargetType(ptr.second->GetType())) { continue; } - this->WriteConnections(ptrIt->first, insertedNodes, insertedConnections, - str); + this->WriteConnections(ptr.first, insertedNodes, insertedConnections, str); } this->WriteFooter(str); } @@ -269,8 +368,7 @@ void cmGraphVizWriter::WriteConnections( const std::string& targetName, std::set<std::string>& insertedNodes, std::set<std::string>& insertedConnections, cmGeneratedFileStream& str) const { - std::map<std::string, const cmGeneratorTarget*>::const_iterator targetPtrIt = - this->TargetPtrs.find(targetName); + auto targetPtrIt = this->TargetPtrs.find(targetName); if (targetPtrIt == this->TargetPtrs.end()) // not found at all { @@ -279,30 +377,26 @@ void cmGraphVizWriter::WriteConnections( this->WriteNode(targetName, targetPtrIt->second, insertedNodes, str); - if (targetPtrIt->second == CM_NULLPTR) // it's an external library + if (targetPtrIt->second == nullptr) // it's an external library { return; } std::string myNodeName = this->TargetNamesNodes.find(targetName)->second; + std::map<std::string, LinkLibraryScopeType> ll = + getScopedLinkLibrariesFromTarget(targetPtrIt->second->Target, + GlobalGenerator); - const cmTarget::LinkLibraryVectorType* ll = - &(targetPtrIt->second->Target->GetOriginalLinkLibraries()); - - for (cmTarget::LinkLibraryVectorType::const_iterator llit = ll->begin(); - llit != ll->end(); ++llit) { - const char* libName = llit->first.c_str(); - std::map<std::string, std::string>::const_iterator libNameIt = - this->TargetNamesNodes.find(libName); + for (auto const& llit : ll) { + const std::string& libName = llit.first; + auto libNameIt = this->TargetNamesNodes.find(libName); // can happen e.g. if GRAPHVIZ_TARGET_IGNORE_REGEX is used if (libNameIt == this->TargetNamesNodes.end()) { continue; } - std::string connectionName = myNodeName; - connectionName += "-"; - connectionName += libNameIt->second; + std::string connectionName = cmStrCat(myNodeName, '-', libNameIt->second); if (insertedConnections.find(connectionName) == insertedConnections.end()) { insertedConnections.insert(connectionName); @@ -310,6 +404,9 @@ void cmGraphVizWriter::WriteConnections( insertedNodes, str); str << " \"" << myNodeName << "\" -> \"" << libNameIt->second << "\""; + + str << getLinkLibraryStyle(llit.second); + str << " // " << targetName << " -> " << libName << std::endl; this->WriteConnections(libName, insertedNodes, insertedConnections, str); } @@ -320,8 +417,7 @@ void cmGraphVizWriter::WriteDependerConnections( const std::string& targetName, std::set<std::string>& insertedNodes, std::set<std::string>& insertedConnections, cmGeneratedFileStream& str) const { - std::map<std::string, const cmGeneratorTarget*>::const_iterator targetPtrIt = - this->TargetPtrs.find(targetName); + auto targetPtrIt = this->TargetPtrs.find(targetName); if (targetPtrIt == this->TargetPtrs.end()) // not found at all { @@ -330,7 +426,7 @@ void cmGraphVizWriter::WriteDependerConnections( this->WriteNode(targetName, targetPtrIt->second, insertedNodes, str); - if (targetPtrIt->second == CM_NULLPTR) // it's an external library + if (targetPtrIt->second == nullptr) // it's an external library { return; } @@ -338,46 +434,39 @@ void cmGraphVizWriter::WriteDependerConnections( std::string myNodeName = this->TargetNamesNodes.find(targetName)->second; // now search who links against me - for (std::map<std::string, const cmGeneratorTarget*>::const_iterator - dependerIt = this->TargetPtrs.begin(); - dependerIt != this->TargetPtrs.end(); ++dependerIt) { - if (dependerIt->second == CM_NULLPTR) { + for (auto const& tptr : this->TargetPtrs) { + if (tptr.second == nullptr) { continue; } - if (!this->GenerateForTargetType(dependerIt->second->GetType())) { + if (!this->GenerateForTargetType(tptr.second->GetType())) { continue; } // Now we have a target, check whether it links against targetName. // If so, draw a connection, and then continue with dependers on that one. - const cmTarget::LinkLibraryVectorType* ll = - &(dependerIt->second->Target->GetOriginalLinkLibraries()); + std::map<std::string, LinkLibraryScopeType> ll = + getScopedLinkLibrariesFromTarget(tptr.second->Target, GlobalGenerator); - for (cmTarget::LinkLibraryVectorType::const_iterator llit = ll->begin(); - llit != ll->end(); ++llit) { - std::string libName = llit->first; - if (libName == targetName) { + for (auto const& llit : ll) { + if (llit.first == targetName) { // So this target links against targetName. - std::map<std::string, std::string>::const_iterator dependerNodeNameIt = - this->TargetNamesNodes.find(dependerIt->first); + auto dependerNodeNameIt = this->TargetNamesNodes.find(tptr.first); if (dependerNodeNameIt != this->TargetNamesNodes.end()) { - std::string connectionName = dependerNodeNameIt->second; - connectionName += "-"; - connectionName += myNodeName; + std::string connectionName = + cmStrCat(dependerNodeNameIt->second, '-', myNodeName); if (insertedConnections.find(connectionName) == insertedConnections.end()) { insertedConnections.insert(connectionName); - this->WriteNode(dependerIt->first, dependerIt->second, - insertedNodes, str); + this->WriteNode(tptr.first, tptr.second, insertedNodes, str); str << " \"" << dependerNodeNameIt->second << "\" -> \"" << myNodeName << "\""; - str << " // " << targetName << " -> " << dependerIt->first - << std::endl; - this->WriteDependerConnections(dependerIt->first, insertedNodes, + str << " // " << targetName << " -> " << tptr.first << std::endl; + str << getLinkLibraryStyle(llit.second); + this->WriteDependerConnections(tptr.first, insertedNodes, insertedConnections, str); } } @@ -394,8 +483,7 @@ void cmGraphVizWriter::WriteNode(const std::string& targetName, { if (insertedNodes.find(targetName) == insertedNodes.end()) { insertedNodes.insert(targetName); - std::map<std::string, std::string>::const_iterator nameIt = - this->TargetNamesNodes.find(targetName); + auto nameIt = this->TargetNamesNodes.find(targetName); str << " \"" << nameIt->second << "\" [ label=\"" << targetName << "\" shape=\"" << getShapeForTarget(target) << "\"];" << std::endl; @@ -417,13 +505,10 @@ int cmGraphVizWriter::CollectAllTargets() { int cnt = 0; // First pass get the list of all cmake targets - for (std::vector<cmLocalGenerator*>::const_iterator lit = - this->LocalGenerators.begin(); - lit != this->LocalGenerators.end(); ++lit) { - std::vector<cmGeneratorTarget*> targets = (*lit)->GetGeneratorTargets(); - for (std::vector<cmGeneratorTarget*>::const_iterator it = targets.begin(); - it != targets.end(); ++it) { - const char* realTargetName = (*it)->GetName().c_str(); + for (cmLocalGenerator* lg : this->LocalGenerators) { + const std::vector<cmGeneratorTarget*>& targets = lg->GetGeneratorTargets(); + for (cmGeneratorTarget* target : targets) { + const std::string& realTargetName = target->GetName(); if (this->IgnoreThisTarget(realTargetName)) { // Skip ignored targets continue; @@ -432,7 +517,7 @@ int cmGraphVizWriter::CollectAllTargets() std::ostringstream ostr; ostr << this->GraphNodePrefix << cnt++; this->TargetNamesNodes[realTargetName] = ostr.str(); - this->TargetPtrs[realTargetName] = *it; + this->TargetPtrs[realTargetName] = target; } } @@ -442,34 +527,36 @@ int cmGraphVizWriter::CollectAllTargets() int cmGraphVizWriter::CollectAllExternalLibs(int cnt) { // Ok, now find all the stuff we link to that is not in cmake - for (std::vector<cmLocalGenerator*>::const_iterator lit = - this->LocalGenerators.begin(); - lit != this->LocalGenerators.end(); ++lit) { - std::vector<cmGeneratorTarget*> targets = (*lit)->GetGeneratorTargets(); - for (std::vector<cmGeneratorTarget*>::const_iterator it = targets.begin(); - it != targets.end(); ++it) { - const char* realTargetName = (*it)->GetName().c_str(); + for (cmLocalGenerator* lg : this->LocalGenerators) { + const std::vector<cmGeneratorTarget*>& targets = lg->GetGeneratorTargets(); + for (cmGeneratorTarget* target : targets) { + const std::string& realTargetName = target->GetName(); if (this->IgnoreThisTarget(realTargetName)) { // Skip ignored targets continue; } const cmTarget::LinkLibraryVectorType* ll = - &((*it)->Target->GetOriginalLinkLibraries()); - for (cmTarget::LinkLibraryVectorType::const_iterator llit = ll->begin(); - llit != ll->end(); ++llit) { - const char* libName = llit->first.c_str(); + &(target->Target->GetOriginalLinkLibraries()); + for (auto const& llit : *ll) { + std::string libName = llit.first; if (this->IgnoreThisTarget(libName)) { // Skip ignored targets continue; } - std::map<std::string, const cmGeneratorTarget*>::const_iterator tarIt = - this->TargetPtrs.find(libName); + if (GlobalGenerator->IsAlias(libName)) { + const auto tgt = GlobalGenerator->FindTarget(libName); + if (tgt) { + libName = tgt->GetName(); + } + } + + auto tarIt = this->TargetPtrs.find(libName); if (tarIt == this->TargetPtrs.end()) { std::ostringstream ostr; ostr << this->GraphNodePrefix << cnt++; this->TargetNamesNodes[libName] = ostr.str(); - this->TargetPtrs[libName] = CM_NULLPTR; + this->TargetPtrs[libName] = nullptr; // str << " \"" << ostr << "\" [ label=\"" << libName // << "\" shape=\"ellipse\"];" << std::endl; } @@ -481,10 +568,7 @@ int cmGraphVizWriter::CollectAllExternalLibs(int cnt) bool cmGraphVizWriter::IgnoreThisTarget(const std::string& name) { - for (std::vector<cmsys::RegularExpression>::iterator itvIt = - this->TargetsToIgnoreRegex.begin(); - itvIt != this->TargetsToIgnoreRegex.end(); ++itvIt) { - cmsys::RegularExpression& regEx = *itvIt; + for (cmsys::RegularExpression& regEx : this->TargetsToIgnoreRegex) { if (regEx.is_valid()) { if (regEx.find(name)) { return true; @@ -507,6 +591,8 @@ bool cmGraphVizWriter::GenerateForTargetType( return this->GenerateForSharedLibs; case cmStateEnums::MODULE_LIBRARY: return this->GenerateForModuleLibs; + case cmStateEnums::INTERFACE_LIBRARY: + return this->GenerateForInterface; default: break; } |