From 52311484dd8c7d3882f7f4c75efe0c3855c2f982 Mon Sep 17 00:00:00 2001 From: Brad King Date: Tue, 25 Sep 2018 11:21:00 -0400 Subject: cmLocalGenerator: Make MoveSystemIncludesToEnd file-local --- Source/cmLocalGenerator.cxx | 11 ++++++----- Source/cmLocalGenerator.h | 4 ---- 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/Source/cmLocalGenerator.cxx b/Source/cmLocalGenerator.cxx index 941d787..7d922d7 100644 --- a/Source/cmLocalGenerator.cxx +++ b/Source/cmLocalGenerator.cxx @@ -202,9 +202,10 @@ void cmLocalGenerator::ComputeObjectMaxPath() this->ObjectMaxPathViolations.clear(); } -void cmLocalGenerator::MoveSystemIncludesToEnd( - std::vector& includeDirs, const std::string& config, - const std::string& lang, const cmGeneratorTarget* target) const +static void MoveSystemIncludesToEnd(std::vector& includeDirs, + const std::string& config, + const std::string& lang, + const cmGeneratorTarget* target) { if (!target) { return; @@ -707,7 +708,7 @@ std::string cmLocalGenerator::GetIncludeFlags( } std::vector includes = includeDirs; - this->MoveSystemIncludesToEnd(includes, config, lang, target); + MoveSystemIncludesToEnd(includes, config, lang, target); OutputFormat shellFormat = forResponseFile ? RESPONSE : SHELL; std::ostringstream includeFlags; @@ -960,7 +961,7 @@ void cmLocalGenerator::GetIncludeDirectories(std::vector& dirs, } } - this->MoveSystemIncludesToEnd(dirs, config, lang, target); + MoveSystemIncludesToEnd(dirs, config, lang, target); // Add standard include directories for this language. { diff --git a/Source/cmLocalGenerator.h b/Source/cmLocalGenerator.h index f8d70ca..acdad64 100644 --- a/Source/cmLocalGenerator.h +++ b/Source/cmLocalGenerator.h @@ -414,10 +414,6 @@ private: int targetType); void ComputeObjectMaxPath(); - void MoveSystemIncludesToEnd(std::vector& includeDirs, - const std::string& config, - const std::string& lang, - cmGeneratorTarget const* target) const; }; #if defined(CMAKE_BUILD_WITH_CMAKE) -- cgit v0.12 From 753ab3c978fa763fc5b7d9fc3d08b1a4d7b46e5e Mon Sep 17 00:00:00 2001 From: Brad King Date: Mon, 24 Sep 2018 10:54:51 -0400 Subject: Add generator APIs to get build settings with backtraces In cmGeneratorTarget and cmLocalGenerator we offer several APIs to get build settings like include directories, compile definitions, source files, etc. Add corresponding APIs that include backtrace information. --- Source/cmGeneratorTarget.cxx | 267 +++++++++++++++++++++++++++++++------------ Source/cmGeneratorTarget.h | 31 ++++- Source/cmLocalGenerator.cxx | 125 ++++++++++++++------ Source/cmLocalGenerator.h | 18 ++- 4 files changed, 329 insertions(+), 112 deletions(-) diff --git a/Source/cmGeneratorTarget.cxx b/Source/cmGeneratorTarget.cxx index fa489e2..b8c9598 100644 --- a/Source/cmGeneratorTarget.cxx +++ b/Source/cmGeneratorTarget.cxx @@ -439,7 +439,7 @@ static void handleSystemIncludesDep( KindedSources const& kinded = this->GetKindedSources(config); \ for (SourceAndKind const& s : kinded.Sources) { \ if (s.Kind == KIND) { \ - data.push_back(s.Source); \ + data.push_back(s.Source.Value); \ } \ } \ } @@ -865,7 +865,8 @@ static void AddObjectEntries( static bool processSources( cmGeneratorTarget const* tgt, const std::vector& entries, - std::vector& srcs, std::unordered_set& uniqueSrcs, + std::vector>& srcs, + std::unordered_set& uniqueSrcs, cmGeneratorExpressionDAGChecker* dagChecker, std::string const& config, bool debugSources) { @@ -916,7 +917,7 @@ static bool processSources( std::string usedSources; for (std::string const& src : entrySources) { if (uniqueSrcs.insert(src).second) { - srcs.push_back(src); + srcs.emplace_back(src, entry->ge->GetBacktrace()); if (debugSources) { usedSources += " * " + src + "\n"; } @@ -933,9 +934,10 @@ static bool processSources( return contextDependent; } -void cmGeneratorTarget::GetSourceFiles(std::vector& files, - const std::string& config) const +std::vector> cmGeneratorTarget::GetSourceFilePaths( + std::string const& config) const { + std::vector> files; assert(this->GetType() != cmStateEnums::INTERFACE_LIBRARY); if (!this->LocalGenerator->GetGlobalGenerator()->GetConfigureDoneCMP0026()) { @@ -957,7 +959,7 @@ void cmGeneratorTarget::GetSourceFiles(std::vector& files, files.push_back(item); } } - return; + return files; } std::vector debugProperties; @@ -1009,11 +1011,23 @@ void cmGeneratorTarget::GetSourceFiles(std::vector& files, cmDeleteAll(linkInterfaceSourcesEntries); cmDeleteAll(linkObjectsEntries); + return files; } void cmGeneratorTarget::GetSourceFiles(std::vector& files, const std::string& config) const { + std::vector> tmp = this->GetSourceFiles(config); + files.reserve(tmp.size()); + for (BT& v : tmp) { + files.push_back(v.Value); + } +} + +std::vector> cmGeneratorTarget::GetSourceFiles( + std::string const& config) const +{ + std::vector> files; if (!this->GlobalGenerator->GetConfigureDoneCMP0026()) { // Since we are still configuring not all sources may exist yet, // so we need to avoid full source classification because that @@ -1021,16 +1035,15 @@ void cmGeneratorTarget::GetSourceFiles(std::vector& files, // Since this is only for compatibility with old policies that // projects should not depend on anymore, just compute the files // without memoizing them. - std::vector srcs; - this->GetSourceFiles(srcs, config); + std::vector> srcs = this->GetSourceFilePaths(config); std::set emitted; - for (std::string const& s : srcs) { - cmSourceFile* sf = this->Makefile->GetOrCreateSource(s); + for (BT const& s : srcs) { + cmSourceFile* sf = this->Makefile->GetOrCreateSource(s.Value); if (emitted.insert(sf).second) { - files.push_back(sf); + files.emplace_back(sf, s.Backtrace); } } - return; + return files; } KindedSources const& kinded = this->GetKindedSources(config); @@ -1038,18 +1051,33 @@ void cmGeneratorTarget::GetSourceFiles(std::vector& files, for (SourceAndKind const& si : kinded.Sources) { files.push_back(si.Source); } + return files; } void cmGeneratorTarget::GetSourceFilesWithoutObjectLibraries( std::vector& files, const std::string& config) const { + std::vector> tmp = + this->GetSourceFilesWithoutObjectLibraries(config); + files.reserve(tmp.size()); + for (BT& v : tmp) { + files.push_back(v.Value); + } +} + +std::vector> +cmGeneratorTarget::GetSourceFilesWithoutObjectLibraries( + std::string const& config) const +{ + std::vector> files; KindedSources const& kinded = this->GetKindedSources(config); files.reserve(kinded.Sources.size()); for (SourceAndKind const& si : kinded.Sources) { - if (si.Source->GetObjectLibrary().empty()) { + if (si.Source.Value->GetObjectLibrary().empty()) { files.push_back(si.Source); } } + return files; } cmGeneratorTarget::KindedSources const& cmGeneratorTarget::GetKindedSources( @@ -1089,16 +1117,15 @@ void cmGeneratorTarget::ComputeKindedSources(KindedSources& files, std::string const& config) const { // Get the source file paths by string. - std::vector srcs; - this->GetSourceFiles(srcs, config); + std::vector> srcs = this->GetSourceFilePaths(config); cmsys::RegularExpression header_regex(CM_HEADER_REGEX); std::vector badObjLib; std::set emitted; - for (std::string const& s : srcs) { + for (BT const& s : srcs) { // Create each source at most once. - cmSourceFile* sf = this->Makefile->GetOrCreateSource(s); + cmSourceFile* sf = this->Makefile->GetOrCreateSource(s.Value); if (!emitted.insert(sf).second) { continue; } @@ -1161,7 +1188,7 @@ void cmGeneratorTarget::ComputeKindedSources(KindedSources& files, } // Save this classified source file in the result vector. - files.Sources.push_back({ sf, kind }); + files.Sources.push_back({ BT(sf, s.Backtrace), kind }); } if (!badObjLib.empty()) { @@ -1197,14 +1224,14 @@ void cmGeneratorTarget::ComputeAllConfigSources() const KindedSources const& sources = this->GetKindedSources(configs[ci]); for (SourceAndKind const& src : sources.Sources) { std::map::iterator mi = - index.find(src.Source); + index.find(src.Source.Value); if (mi == index.end()) { AllConfigSource acs; - acs.Source = src.Source; + acs.Source = src.Source.Value; acs.Kind = src.Kind; this->AllConfigSources.push_back(std::move(acs)); std::map::value_type entry( - src.Source, this->AllConfigSources.size() - 1); + src.Source.Value, this->AllConfigSources.size() - 1); mi = index.insert(entry).first; } this->AllConfigSources[mi->second].Configs.push_back(ci); @@ -2474,7 +2501,7 @@ std::string cmGeneratorTarget::GetCreateRuleVariable( static void processIncludeDirectories( cmGeneratorTarget const* tgt, const std::vector& entries, - std::vector& includes, + std::vector>& includes, std::unordered_set& uniqueIncludes, cmGeneratorExpressionDAGChecker* dagChecker, const std::string& config, bool debugIncludes, const std::string& language) @@ -2566,7 +2593,7 @@ static void processIncludeDirectories( std::string inc = entryInclude; if (uniqueIncludes.insert(inc).second) { - includes.push_back(inc); + includes.emplace_back(inc, entry->ge->GetBacktrace()); if (debugIncludes) { usedIncludes += " * " + inc + "\n"; } @@ -2582,10 +2609,10 @@ static void processIncludeDirectories( } } -std::vector cmGeneratorTarget::GetIncludeDirectories( +std::vector> cmGeneratorTarget::GetIncludeDirectories( const std::string& config, const std::string& lang) const { - std::vector includes; + std::vector> includes; std::unordered_set uniqueIncludes; cmGeneratorExpressionDAGChecker dagChecker(this, "INCLUDE_DIRECTORIES", @@ -2655,7 +2682,7 @@ enum class OptionsParse static void processOptionsInternal( cmGeneratorTarget const* tgt, const std::vector& entries, - std::vector& options, + std::vector>& options, std::unordered_set& uniqueOptions, cmGeneratorExpressionDAGChecker* dagChecker, const std::string& config, bool debugOptions, const char* logName, std::string const& language, @@ -2672,9 +2699,13 @@ static void processOptionsInternal( if (uniqueOptions.insert(opt).second) { if (parse == OptionsParse::Shell && cmHasLiteralPrefix(opt, "SHELL:")) { - cmSystemTools::ParseUnixCommandLine(opt.c_str() + 6, options); + std::vector tmp; + cmSystemTools::ParseUnixCommandLine(opt.c_str() + 6, tmp); + for (std::string& o : tmp) { + options.emplace_back(std::move(o), entry->ge->GetBacktrace()); + } } else { - options.push_back(opt); + options.emplace_back(opt, entry->ge->GetBacktrace()); } if (debugOptions) { usedOptions += " * " + opt + "\n"; @@ -2694,7 +2725,7 @@ static void processOptionsInternal( static void processCompileOptions( cmGeneratorTarget const* tgt, const std::vector& entries, - std::vector& options, + std::vector>& options, std::unordered_set& uniqueOptions, cmGeneratorExpressionDAGChecker* dagChecker, const std::string& config, bool debugOptions, std::string const& language) @@ -2708,6 +2739,17 @@ void cmGeneratorTarget::GetCompileOptions(std::vector& result, const std::string& config, const std::string& language) const { + std::vector> tmp = this->GetCompileOptions(config, language); + result.reserve(tmp.size()); + for (BT& v : tmp) { + result.emplace_back(std::move(v.Value)); + } +} + +std::vector> cmGeneratorTarget::GetCompileOptions( + std::string const& config, std::string const& language) const +{ + std::vector> result; std::unordered_set uniqueOptions; cmGeneratorExpressionDAGChecker dagChecker(this, "COMPILE_OPTIONS", nullptr, @@ -2743,12 +2785,13 @@ void cmGeneratorTarget::GetCompileOptions(std::vector& result, language); cmDeleteAll(linkInterfaceCompileOptionsEntries); + return result; } static void processCompileFeatures( cmGeneratorTarget const* tgt, const std::vector& entries, - std::vector& options, + std::vector>& options, std::unordered_set& uniqueOptions, cmGeneratorExpressionDAGChecker* dagChecker, const std::string& config, bool debugOptions) @@ -2761,6 +2804,17 @@ static void processCompileFeatures( void cmGeneratorTarget::GetCompileFeatures(std::vector& result, const std::string& config) const { + std::vector> tmp = this->GetCompileFeatures(config); + result.reserve(tmp.size()); + for (BT& v : tmp) { + result.emplace_back(std::move(v.Value)); + } +} + +std::vector> cmGeneratorTarget::GetCompileFeatures( + std::string const& config) const +{ + std::vector> result; std::unordered_set uniqueFeatures; cmGeneratorExpressionDAGChecker dagChecker(this, "COMPILE_FEATURES", nullptr, @@ -2793,12 +2847,13 @@ void cmGeneratorTarget::GetCompileFeatures(std::vector& result, uniqueFeatures, &dagChecker, config, debugFeatures); cmDeleteAll(linkInterfaceCompileFeaturesEntries); + return result; } static void processCompileDefinitions( cmGeneratorTarget const* tgt, const std::vector& entries, - std::vector& options, + std::vector>& options, std::unordered_set& uniqueOptions, cmGeneratorExpressionDAGChecker* dagChecker, const std::string& config, bool debugOptions, std::string const& language) @@ -2809,9 +2864,21 @@ static void processCompileDefinitions( } void cmGeneratorTarget::GetCompileDefinitions( - std::vector& list, const std::string& config, + std::vector& result, const std::string& config, const std::string& language) const { + std::vector> tmp = + this->GetCompileDefinitions(config, language); + result.reserve(tmp.size()); + for (BT& v : tmp) { + result.emplace_back(std::move(v.Value)); + } +} + +std::vector> cmGeneratorTarget::GetCompileDefinitions( + std::string const& config, std::string const& language) const +{ + std::vector> list; std::unordered_set uniqueOptions; cmGeneratorExpressionDAGChecker dagChecker(this, "COMPILE_DEFINITIONS", @@ -2872,13 +2939,14 @@ void cmGeneratorTarget::GetCompileDefinitions( language); cmDeleteAll(linkInterfaceCompileDefinitionsEntries); + return list; } namespace { void processLinkOptions( cmGeneratorTarget const* tgt, const std::vector& entries, - std::vector& options, + std::vector>& options, std::unordered_set& uniqueOptions, cmGeneratorExpressionDAGChecker* dagChecker, const std::string& config, bool debugOptions, std::string const& language) @@ -2893,6 +2961,17 @@ void cmGeneratorTarget::GetLinkOptions(std::vector& result, const std::string& config, const std::string& language) const { + std::vector> tmp = this->GetLinkOptions(config, language); + result.reserve(tmp.size()); + for (BT& v : tmp) { + result.emplace_back(std::move(v.Value)); + } +} + +std::vector> cmGeneratorTarget::GetLinkOptions( + std::string const& config, std::string const& language) const +{ + std::vector> result; std::unordered_set uniqueOptions; cmGeneratorExpressionDAGChecker dagChecker(this, "LINK_OPTIONS", nullptr, @@ -2946,21 +3025,24 @@ void cmGeneratorTarget::GetLinkOptions(std::vector& result, const std::string SHELL{ "SHELL:" }; const std::string LINKER_SHELL = LINKER + SHELL; - std::vector::iterator entry; + std::vector>::iterator entry; while ((entry = std::find_if(result.begin(), result.end(), - [&LINKER](const std::string& item) -> bool { - return item.compare(0, LINKER.length(), - LINKER) == 0; + [&LINKER](BT const& item) -> bool { + return item.Value.compare(0, LINKER.length(), + LINKER) == 0; })) != result.end()) { + std::string value = std::move(entry->Value); + cmListFileBacktrace bt = std::move(entry->Backtrace); + entry = result.erase(entry); + std::vector linkerOptions; - if (entry->compare(0, LINKER_SHELL.length(), LINKER_SHELL) == 0) { + if (value.compare(0, LINKER_SHELL.length(), LINKER_SHELL) == 0) { cmSystemTools::ParseUnixCommandLine( - entry->c_str() + LINKER_SHELL.length(), linkerOptions); + value.c_str() + LINKER_SHELL.length(), linkerOptions); } else { linkerOptions = - cmSystemTools::tokenize(entry->substr(LINKER.length()), ","); + cmSystemTools::tokenize(value.substr(LINKER.length()), ","); } - entry = result.erase(entry); if (linkerOptions.empty() || (linkerOptions.size() == 1 && linkerOptions.front().empty())) { @@ -2976,56 +3058,64 @@ void cmGeneratorTarget::GetLinkOptions(std::vector& result, cmake::FATAL_ERROR, "'SHELL:' prefix is not supported as part of 'LINKER:' arguments.", this->GetBacktrace()); - return; + return result; } + std::vector> options; if (wrapperFlag.empty()) { // nothing specified, insert elements as is - result.insert(entry, linkerOptions.begin(), linkerOptions.end()); + options.reserve(linkerOptions.size()); + for (std::string& o : linkerOptions) { + options.emplace_back(std::move(o), bt); + } } else { - std::vector options; - if (!wrapperSep.empty()) { if (concatFlagAndArgs) { // insert flag elements except last one - options.insert(options.end(), wrapperFlag.begin(), - wrapperFlag.end() - 1); + for (auto i = wrapperFlag.begin(); i != wrapperFlag.end() - 1; ++i) { + options.emplace_back(*i, bt); + } // concatenate last flag element and all LINKER list values // in one option - options.push_back(wrapperFlag.back() + - cmJoin(linkerOptions, wrapperSep)); + options.emplace_back( + wrapperFlag.back() + cmJoin(linkerOptions, wrapperSep), bt); } else { - options.insert(options.end(), wrapperFlag.begin(), - wrapperFlag.end()); + for (std::string const& i : wrapperFlag) { + options.emplace_back(i, bt); + } // concatenate all LINKER list values in one option - options.push_back(cmJoin(linkerOptions, wrapperSep)); + options.emplace_back(cmJoin(linkerOptions, wrapperSep), bt); } } else { // prefix each element of LINKER list with wrapper if (concatFlagAndArgs) { - std::transform( - linkerOptions.begin(), linkerOptions.end(), linkerOptions.begin(), - [&wrapperFlag](const std::string& value) -> std::string { - return wrapperFlag.back() + value; - }); + std::transform(linkerOptions.begin(), linkerOptions.end(), + linkerOptions.begin(), + [&wrapperFlag](std::string const& o) -> std::string { + return wrapperFlag.back() + o; + }); } - for (const auto& value : linkerOptions) { - options.insert(options.end(), wrapperFlag.begin(), - concatFlagAndArgs ? wrapperFlag.end() - 1 - : wrapperFlag.end()); - options.push_back(value); + for (std::string& o : linkerOptions) { + for (auto i = wrapperFlag.begin(), + e = concatFlagAndArgs ? wrapperFlag.end() - 1 + : wrapperFlag.end(); + i != e; ++i) { + options.emplace_back(*i, bt); + } + options.emplace_back(std::move(o), bt); } } - result.insert(entry, options.begin(), options.end()); } + result.insert(entry, options.begin(), options.end()); } + return result; } namespace { void processStaticLibraryLinkOptions( cmGeneratorTarget const* tgt, const std::vector& entries, - std::vector& options, + std::vector>& options, std::unordered_set& uniqueOptions, cmGeneratorExpressionDAGChecker* dagChecker, const std::string& config, std::string const& language) @@ -3040,6 +3130,18 @@ void cmGeneratorTarget::GetStaticLibraryLinkOptions( std::vector& result, const std::string& config, const std::string& language) const { + std::vector> tmp = + this->GetStaticLibraryLinkOptions(config, language); + result.reserve(tmp.size()); + for (BT& v : tmp) { + result.emplace_back(std::move(v.Value)); + } +} + +std::vector> cmGeneratorTarget::GetStaticLibraryLinkOptions( + std::string const& config, std::string const& language) const +{ + std::vector> result; std::vector entries; std::unordered_set uniqueOptions; @@ -3060,13 +3162,14 @@ void cmGeneratorTarget::GetStaticLibraryLinkOptions( &dagChecker, config, language); cmDeleteAll(entries); + return result; } namespace { void processLinkDirectories( cmGeneratorTarget const* tgt, const std::vector& entries, - std::vector& directories, + std::vector>& directories, std::unordered_set& uniqueDirectories, cmGeneratorExpressionDAGChecker* dagChecker, const std::string& config, bool debugDirectories, std::string const& language) @@ -3145,6 +3248,18 @@ void cmGeneratorTarget::GetLinkDirectories(std::vector& result, const std::string& config, const std::string& language) const { + std::vector> tmp = + this->GetLinkDirectories(config, language); + result.reserve(tmp.size()); + for (BT& v : tmp) { + result.emplace_back(std::move(v.Value)); + } +} + +std::vector> cmGeneratorTarget::GetLinkDirectories( + std::string const& config, std::string const& language) const +{ + std::vector> result; std::unordered_set uniqueDirectories; cmGeneratorExpressionDAGChecker dagChecker(this, "LINK_DIRECTORIES", nullptr, @@ -3180,13 +3295,14 @@ void cmGeneratorTarget::GetLinkDirectories(std::vector& result, debugDirectories, language); cmDeleteAll(linkInterfaceLinkDirectoriesEntries); + return result; } namespace { void processLinkDepends( cmGeneratorTarget const* tgt, const std::vector& entries, - std::vector& options, + std::vector>& options, std::unordered_set& uniqueOptions, cmGeneratorExpressionDAGChecker* dagChecker, const std::string& config, std::string const& language) @@ -3201,6 +3317,17 @@ void cmGeneratorTarget::GetLinkDepends(std::vector& result, const std::string& config, const std::string& language) const { + std::vector> tmp = this->GetLinkDepends(config, language); + result.reserve(tmp.size()); + for (BT& v : tmp) { + result.emplace_back(std::move(v.Value)); + } +} + +std::vector> cmGeneratorTarget::GetLinkDepends( + std::string const& config, std::string const& language) const +{ + std::vector> result; std::vector linkDependsEntries; std::unordered_set uniqueOptions; cmGeneratorExpressionDAGChecker dagChecker(this, "LINK_DEPENDS", nullptr, @@ -3222,6 +3349,7 @@ void cmGeneratorTarget::GetLinkDepends(std::vector& result, &dagChecker, config, language); cmDeleteAll(linkDependsEntries); + return result; } void cmGeneratorTarget::ComputeTargetManifest(const std::string& config) const @@ -3287,10 +3415,9 @@ void cmGeneratorTarget::ComputeTargetManifest(const std::string& config) const bool cmGeneratorTarget::ComputeCompileFeatures(std::string const& config) const { - std::vector features; - this->GetCompileFeatures(features, config); - for (std::string const& f : features) { - if (!this->Makefile->AddRequiredTargetFeature(this->Target, f)) { + std::vector> features = this->GetCompileFeatures(config); + for (BT const& f : features) { + if (!this->Makefile->AddRequiredTargetFeature(this->Target, f.Value)) { return false; } } diff --git a/Source/cmGeneratorTarget.h b/Source/cmGeneratorTarget.h index 7de306e..4c32558 100644 --- a/Source/cmGeneratorTarget.h +++ b/Source/cmGeneratorTarget.h @@ -75,8 +75,8 @@ public: bool GetPropertyAsBool(const std::string& prop) const; void GetSourceFiles(std::vector& files, const std::string& config) const; - void GetSourceFilesWithoutObjectLibraries(std::vector& files, - const std::string& config) const; + std::vector> GetSourceFiles( + std::string const& config) const; /** Source file kinds (classifications). Generators use this to decide how to treat a source file. */ @@ -99,7 +99,7 @@ public: /** A source file paired with a kind (classification). */ struct SourceAndKind { - cmSourceFile* Source; + BT Source; SourceKind Kind; }; @@ -412,34 +412,49 @@ public: std::string const& config) const; /** Get the include directories for this target. */ - std::vector GetIncludeDirectories( + std::vector> GetIncludeDirectories( const std::string& config, const std::string& lang) const; void GetCompileOptions(std::vector& result, const std::string& config, const std::string& language) const; + std::vector> GetCompileOptions( + std::string const& config, std::string const& language) const; void GetCompileFeatures(std::vector& features, const std::string& config) const; + std::vector> GetCompileFeatures( + std::string const& config) const; void GetCompileDefinitions(std::vector& result, const std::string& config, const std::string& language) const; + std::vector> GetCompileDefinitions( + std::string const& config, std::string const& language) const; void GetLinkOptions(std::vector& result, const std::string& config, const std::string& language) const; + std::vector> GetLinkOptions( + std::string const& config, std::string const& language) const; + void GetStaticLibraryLinkOptions(std::vector& result, const std::string& config, const std::string& language) const; + std::vector> GetStaticLibraryLinkOptions( + std::string const& config, std::string const& language) const; void GetLinkDirectories(std::vector& result, const std::string& config, const std::string& language) const; + std::vector> GetLinkDirectories( + std::string const& config, std::string const& language) const; void GetLinkDepends(std::vector& result, const std::string& config, const std::string& language) const; + std::vector> GetLinkDepends( + std::string const& config, std::string const& language) const; bool IsSystemIncludeDirectory(const std::string& dir, const std::string& config, @@ -841,8 +856,12 @@ private: cmListFileBacktrace const& bt, std::vector& items) const; - void GetSourceFiles(std::vector& files, - const std::string& config) const; + std::vector> GetSourceFilePaths( + std::string const& config) const; + std::vector> GetSourceFilesWithoutObjectLibraries( + std::string const& config) const; + void GetSourceFilesWithoutObjectLibraries(std::vector& files, + const std::string& config) const; struct HeadToLinkImplementationMap : public std::map diff --git a/Source/cmLocalGenerator.cxx b/Source/cmLocalGenerator.cxx index 7d922d7..7beeb71 100644 --- a/Source/cmLocalGenerator.cxx +++ b/Source/cmLocalGenerator.cxx @@ -219,6 +219,24 @@ static void MoveSystemIncludesToEnd(std::vector& includeDirs, }); } +static void MoveSystemIncludesToEnd(std::vector>& includeDirs, + const std::string& config, + const std::string& lang, + const cmGeneratorTarget* target) +{ + if (!target) { + return; + } + + std::stable_sort(includeDirs.begin(), includeDirs.end(), + [target, &config, &lang](BT const& a, + BT const& b) { + return !target->IsSystemIncludeDirectory(a.Value, config, + lang) && + target->IsSystemIncludeDirectory(b.Value, config, lang); + }); +} + void cmLocalGenerator::TraceDependencies() { std::vector configs; @@ -869,6 +887,21 @@ void cmLocalGenerator::GetIncludeDirectories(std::vector& dirs, bool stripImplicitDirs, bool appendAllImplicitDirs) const { + std::vector> tmp = this->GetIncludeDirectories( + target, lang, config, stripImplicitDirs, appendAllImplicitDirs); + dirs.reserve(tmp.size()); + for (BT& v : tmp) { + dirs.emplace_back(std::move(v.Value)); + } +} + +std::vector> cmLocalGenerator::GetIncludeDirectories( + cmGeneratorTarget const* target, std::string const& lang, + std::string const& config, bool stripImplicitDirs, + bool appendAllImplicitDirs) const +{ + std::vector> result; + // Do not repeat an include path. std::set emitted; @@ -885,7 +918,7 @@ void cmLocalGenerator::GetIncludeDirectories(std::vector& dirs, std::string binDir = this->StateSnapshot.GetDirectory().GetCurrentBinary(); if (emitted.insert(binDir).second) { - dirs.push_back(std::move(binDir)); + result.emplace_back(std::move(binDir)); } } // Current source directory @@ -893,13 +926,13 @@ void cmLocalGenerator::GetIncludeDirectories(std::vector& dirs, std::string srcDir = this->StateSnapshot.GetDirectory().GetCurrentSource(); if (emitted.insert(srcDir).second) { - dirs.push_back(std::move(srcDir)); + result.emplace_back(std::move(srcDir)); } } } if (!target) { - return; + return result; } // Implicit include directories @@ -932,7 +965,7 @@ void cmLocalGenerator::GetIncludeDirectories(std::vector& dirs, } // Get the target-specific include directories. - std::vector userDirs = + std::vector> userDirs = target->GetIncludeDirectories(config, lang); // Support putting all the in-project include directories first if @@ -940,44 +973,44 @@ void cmLocalGenerator::GetIncludeDirectories(std::vector& dirs, if (this->Makefile->IsOn("CMAKE_INCLUDE_DIRECTORIES_PROJECT_BEFORE")) { std::string const &topSourceDir = this->GetState()->GetSourceDirectory(), &topBinaryDir = this->GetState()->GetBinaryDirectory(); - for (std::string const& i : userDirs) { + for (BT const& i : userDirs) { // Emit this directory only if it is a subdirectory of the // top-level source or binary tree. - if (cmSystemTools::ComparePath(i, topSourceDir) || - cmSystemTools::ComparePath(i, topBinaryDir) || - cmSystemTools::IsSubDirectory(i, topSourceDir) || - cmSystemTools::IsSubDirectory(i, topBinaryDir)) { - if (emitted.insert(i).second) { - dirs.push_back(i); + if (cmSystemTools::ComparePath(i.Value, topSourceDir) || + cmSystemTools::ComparePath(i.Value, topBinaryDir) || + cmSystemTools::IsSubDirectory(i.Value, topSourceDir) || + cmSystemTools::IsSubDirectory(i.Value, topBinaryDir)) { + if (emitted.insert(i.Value).second) { + result.push_back(i); } } } } // Construct the final ordered include directory list. - for (std::string const& i : userDirs) { - if (emitted.insert(i).second) { - dirs.push_back(i); + for (BT const& i : userDirs) { + if (emitted.insert(i.Value).second) { + result.push_back(i); } } - MoveSystemIncludesToEnd(dirs, config, lang, target); + MoveSystemIncludesToEnd(result, config, lang, target); // Add standard include directories for this language. { - std::vector::size_type const before = userDirs.size(); + std::vector userStandardDirs; { std::string key = "CMAKE_"; key += lang; key += "_STANDARD_INCLUDE_DIRECTORIES"; std::string const value = this->Makefile->GetSafeDefinition(key); - cmSystemTools::ExpandListArgument(value, userDirs); + cmSystemTools::ExpandListArgument(value, userStandardDirs); } - for (std::vector::iterator i = userDirs.begin() + before, - ie = userDirs.end(); - i != ie; ++i) { - cmSystemTools::ConvertToUnixSlashes(*i); - dirs.push_back(*i); + userDirs.reserve(userDirs.size() + userStandardDirs.size()); + for (std::string& d : userStandardDirs) { + cmSystemTools::ConvertToUnixSlashes(d); + result.emplace_back(d); + userDirs.emplace_back(std::move(d)); } } @@ -985,18 +1018,20 @@ void cmLocalGenerator::GetIncludeDirectories(std::vector& dirs, // Append only implicit directories that were requested by the user for (std::string const& i : implicitDirs) { if (std::find(userDirs.begin(), userDirs.end(), i) != userDirs.end()) { - dirs.push_back(i); + result.emplace_back(i); } } // Append remaining implicit directories on demand if (appendAllImplicitDirs) { for (std::string const& i : implicitDirs) { - if (std::find(dirs.begin(), dirs.end(), i) == dirs.end()) { - dirs.push_back(i); + if (std::find(result.begin(), result.end(), i) == result.end()) { + result.emplace_back(i); } } } } + + return result; } void cmLocalGenerator::GetStaticLibraryFlags(std::string& flags, @@ -1253,15 +1288,29 @@ void cmLocalGenerator::GetTargetDefines(cmGeneratorTarget const* target, std::string const& lang, std::set& defines) const { + std::set> tmp = this->GetTargetDefines(target, config, lang); + for (BT const& v : tmp) { + defines.emplace(v.Value); + } +} + +std::set> cmLocalGenerator::GetTargetDefines( + cmGeneratorTarget const* target, std::string const& config, + std::string const& lang) const +{ + std::set> defines; + // Add the export symbol definition for shared library objects. if (const std::string* exportMacro = target->GetExportMacro()) { this->AppendDefines(defines, *exportMacro); } // Add preprocessor definitions for this target and configuration. - std::vector targetDefines; - target->GetCompileDefinitions(targetDefines, config, lang); + std::vector> targetDefines = + target->GetCompileDefinitions(config, lang); this->AppendDefines(defines, targetDefines); + + return defines; } std::string cmLocalGenerator::GetTargetFortranFlags( @@ -2061,24 +2110,32 @@ void cmLocalGenerator::AppendIncludeDirectories( void cmLocalGenerator::AppendDefines(std::set& defines, const char* defines_list) const { + std::set> tmp; + this->AppendDefines(tmp, ExpandListWithBacktrace(defines_list)); + for (BT const& i : tmp) { + defines.emplace(i.Value); + } +} + +void cmLocalGenerator::AppendDefines(std::set>& defines, + const char* defines_list) const +{ // Short-circuit if there are no definitions. if (!defines_list) { return; } // Expand the list of definitions. - std::vector defines_vec; - cmSystemTools::ExpandListArgument(defines_list, defines_vec); - this->AppendDefines(defines, defines_vec); + this->AppendDefines(defines, ExpandListWithBacktrace(defines_list)); } void cmLocalGenerator::AppendDefines( - std::set& defines, - const std::vector& defines_vec) const + std::set>& defines, + const std::vector>& defines_vec) const { - for (std::string const& d : defines_vec) { + for (BT const& d : defines_vec) { // Skip unsupported definitions. - if (!this->CheckDefinition(d)) { + if (!this->CheckDefinition(d.Value)) { continue; } defines.insert(d); diff --git a/Source/cmLocalGenerator.h b/Source/cmLocalGenerator.h index acdad64..95a8a6a 100644 --- a/Source/cmLocalGenerator.h +++ b/Source/cmLocalGenerator.h @@ -175,8 +175,15 @@ public: { this->AppendDefines(defines, defines_list.c_str()); } - void AppendDefines(std::set& defines, - const std::vector& defines_vec) const; + void AppendDefines(std::set>& defines, + const char* defines_list) const; + void AppendDefines(std::set>& defines, + std::string const& defines_list) const + { + this->AppendDefines(defines, defines_list.c_str()); + } + void AppendDefines(std::set>& defines, + const std::vector>& defines_vec) const; /** * Encode a list of compile options for the compiler @@ -249,6 +256,10 @@ public: const std::string& config = "", bool stripImplicitDirs = true, bool appendAllImplicitDirs = false) const; + std::vector> GetIncludeDirectories( + cmGeneratorTarget const* target, std::string const& lang = "C", + std::string const& config = "", bool stripImplicitDirs = true, + bool appendAllImplicitDirs = false) const; void AddCompileOptions(std::string& flags, cmGeneratorTarget* target, const std::string& lang, const std::string& config); @@ -332,6 +343,9 @@ public: void GetTargetDefines(cmGeneratorTarget const* target, std::string const& config, std::string const& lang, std::set& defines) const; + std::set> GetTargetDefines(cmGeneratorTarget const* target, + std::string const& config, + std::string const& lang) const; void GetTargetCompileFlags(cmGeneratorTarget* target, std::string const& config, std::string const& lang, std::string& flags); -- cgit v0.12 From dd4f8b2a48c7962dfa9cf856c36aa1c235248b2d Mon Sep 17 00:00:00 2001 From: Brad King Date: Wed, 17 Oct 2018 07:25:50 -0400 Subject: install: Record TARGET mode backtraces internally --- Source/cmInstallCommand.cxx | 58 ++++++++++++++++++++----------------- Source/cmInstallTargetGenerator.cxx | 3 +- Source/cmInstallTargetGenerator.h | 15 ++++++---- 3 files changed, 43 insertions(+), 33 deletions(-) diff --git a/Source/cmInstallCommand.cxx b/Source/cmInstallCommand.cxx index 6e33cf7..fbc5278 100644 --- a/Source/cmInstallCommand.cxx +++ b/Source/cmInstallCommand.cxx @@ -20,6 +20,7 @@ #include "cmInstallGenerator.h" #include "cmInstallScriptGenerator.h" #include "cmInstallTargetGenerator.h" +#include "cmListFileCache.h" #include "cmMakefile.h" #include "cmPolicies.h" #include "cmStateTypes.h" @@ -32,7 +33,8 @@ class cmExecutionStatus; static cmInstallTargetGenerator* CreateInstallTargetGenerator( cmTarget& target, const cmInstallCommandArguments& args, bool impLib, - bool forceOpt = false, bool namelink = false) + cmListFileBacktrace const& backtrace, bool forceOpt = false, + bool namelink = false) { cmInstallGenerator::MessageLevel message = cmInstallGenerator::SelectMessageLevel(target.GetMakefile()); @@ -42,7 +44,8 @@ static cmInstallTargetGenerator* CreateInstallTargetGenerator( return new cmInstallTargetGenerator( target.GetName(), args.GetDestination().c_str(), impLib, args.GetPermissions().c_str(), args.GetConfigurations(), component, - message, args.GetExcludeFromAll(), args.GetOptional() || forceOpt); + message, args.GetExcludeFromAll(), args.GetOptional() || forceOpt, + backtrace); } static cmInstallFilesGenerator* CreateInstallFilesGenerator( @@ -435,13 +438,13 @@ bool cmInstallCommand::HandleTargetsMode(std::vector const& args) // This is a DLL platform. if (!archiveArgs.GetDestination().empty()) { // The import library uses the ARCHIVE properties. - archiveGenerator = - CreateInstallTargetGenerator(target, archiveArgs, true); + archiveGenerator = CreateInstallTargetGenerator( + target, archiveArgs, true, this->Makefile->GetBacktrace()); } if (!runtimeArgs.GetDestination().empty()) { // The DLL uses the RUNTIME properties. - runtimeGenerator = - CreateInstallTargetGenerator(target, runtimeArgs, false); + runtimeGenerator = CreateInstallTargetGenerator( + target, runtimeArgs, false, this->Makefile->GetBacktrace()); } if ((archiveGenerator == nullptr) && (runtimeGenerator == nullptr)) { this->SetError("Library TARGETS given no DESTINATION!"); @@ -459,8 +462,8 @@ bool cmInstallCommand::HandleTargetsMode(std::vector const& args) // Use the FRAMEWORK properties. if (!frameworkArgs.GetDestination().empty()) { - frameworkGenerator = - CreateInstallTargetGenerator(target, frameworkArgs, false); + frameworkGenerator = CreateInstallTargetGenerator( + target, frameworkArgs, false, this->Makefile->GetBacktrace()); } else { std::ostringstream e; e << "TARGETS given no FRAMEWORK DESTINATION for shared library " @@ -473,14 +476,15 @@ bool cmInstallCommand::HandleTargetsMode(std::vector const& args) // The shared library uses the LIBRARY properties. if (!libraryArgs.GetDestination().empty()) { if (namelinkMode != cmInstallTargetGenerator::NamelinkModeOnly) { - libraryGenerator = - CreateInstallTargetGenerator(target, libraryArgs, false); + libraryGenerator = CreateInstallTargetGenerator( + target, libraryArgs, false, this->Makefile->GetBacktrace()); libraryGenerator->SetNamelinkMode( cmInstallTargetGenerator::NamelinkModeSkip); } if (namelinkMode != cmInstallTargetGenerator::NamelinkModeSkip) { namelinkGenerator = CreateInstallTargetGenerator( - target, libraryArgs, false, false, true); + target, libraryArgs, false, this->Makefile->GetBacktrace(), + false, true); namelinkGenerator->SetNamelinkMode( cmInstallTargetGenerator::NamelinkModeOnly); } @@ -508,8 +512,8 @@ bool cmInstallCommand::HandleTargetsMode(std::vector const& args) // Use the FRAMEWORK properties. if (!frameworkArgs.GetDestination().empty()) { - frameworkGenerator = - CreateInstallTargetGenerator(target, frameworkArgs, false); + frameworkGenerator = CreateInstallTargetGenerator( + target, frameworkArgs, false, this->Makefile->GetBacktrace()); } else { std::ostringstream e; e << "TARGETS given no FRAMEWORK DESTINATION for static library " @@ -521,8 +525,8 @@ bool cmInstallCommand::HandleTargetsMode(std::vector const& args) } else { // Static libraries use ARCHIVE properties. if (!archiveArgs.GetDestination().empty()) { - archiveGenerator = - CreateInstallTargetGenerator(target, archiveArgs, false); + archiveGenerator = CreateInstallTargetGenerator( + target, archiveArgs, false, this->Makefile->GetBacktrace()); } else { std::ostringstream e; e << "TARGETS given no ARCHIVE DESTINATION for static library " @@ -536,8 +540,8 @@ bool cmInstallCommand::HandleTargetsMode(std::vector const& args) case cmStateEnums::MODULE_LIBRARY: { // Modules use LIBRARY properties. if (!libraryArgs.GetDestination().empty()) { - libraryGenerator = - CreateInstallTargetGenerator(target, libraryArgs, false); + libraryGenerator = CreateInstallTargetGenerator( + target, libraryArgs, false, this->Makefile->GetBacktrace()); libraryGenerator->SetNamelinkMode(namelinkMode); namelinkOnly = (namelinkMode == cmInstallTargetGenerator::NamelinkModeOnly); @@ -563,8 +567,8 @@ bool cmInstallCommand::HandleTargetsMode(std::vector const& args) return false; } - objectGenerator = - CreateInstallTargetGenerator(target, objectArgs, false); + objectGenerator = CreateInstallTargetGenerator( + target, objectArgs, false, this->Makefile->GetBacktrace()); } else { // Installing an OBJECT library without a destination transforms // it to an INTERFACE library. It installs no files but can be @@ -575,15 +579,15 @@ bool cmInstallCommand::HandleTargetsMode(std::vector const& args) if (target.IsAppBundleOnApple()) { // Application bundles use the BUNDLE properties. if (!bundleArgs.GetDestination().empty()) { - bundleGenerator = - CreateInstallTargetGenerator(target, bundleArgs, false); + bundleGenerator = CreateInstallTargetGenerator( + target, bundleArgs, false, this->Makefile->GetBacktrace()); } else if (!runtimeArgs.GetDestination().empty()) { bool failure = false; if (this->CheckCMP0006(failure)) { // For CMake 2.4 compatibility fallback to the RUNTIME // properties. - bundleGenerator = - CreateInstallTargetGenerator(target, runtimeArgs, false); + bundleGenerator = CreateInstallTargetGenerator( + target, runtimeArgs, false, this->Makefile->GetBacktrace()); } else if (failure) { return false; } @@ -599,8 +603,8 @@ bool cmInstallCommand::HandleTargetsMode(std::vector const& args) } else { // Executables use the RUNTIME properties. if (!runtimeArgs.GetDestination().empty()) { - runtimeGenerator = - CreateInstallTargetGenerator(target, runtimeArgs, false); + runtimeGenerator = CreateInstallTargetGenerator( + target, runtimeArgs, false, this->Makefile->GetBacktrace()); } else { std::ostringstream e; e << "TARGETS given no RUNTIME DESTINATION for executable " @@ -617,8 +621,8 @@ bool cmInstallCommand::HandleTargetsMode(std::vector const& args) if (dll_platform && !archiveArgs.GetDestination().empty() && target.IsExecutableWithExports()) { // The import library uses the ARCHIVE properties. - archiveGenerator = - CreateInstallTargetGenerator(target, archiveArgs, true, true); + archiveGenerator = CreateInstallTargetGenerator( + target, archiveArgs, true, this->Makefile->GetBacktrace(), true); } } break; case cmStateEnums::INTERFACE_LIBRARY: diff --git a/Source/cmInstallTargetGenerator.cxx b/Source/cmInstallTargetGenerator.cxx index 8b8f79b..ea3d522 100644 --- a/Source/cmInstallTargetGenerator.cxx +++ b/Source/cmInstallTargetGenerator.cxx @@ -24,7 +24,7 @@ cmInstallTargetGenerator::cmInstallTargetGenerator( const std::string& targetName, const char* dest, bool implib, const char* file_permissions, std::vector const& configurations, const char* component, MessageLevel message, bool exclude_from_all, - bool optional) + bool optional, cmListFileBacktrace const& backtrace) : cmInstallGenerator(dest, configurations, component, message, exclude_from_all) , TargetName(targetName) @@ -32,6 +32,7 @@ cmInstallTargetGenerator::cmInstallTargetGenerator( , FilePermissions(file_permissions) , ImportLibrary(implib) , Optional(optional) + , Backtrace(backtrace) { this->ActionsPerConfig = true; this->NamelinkMode = NamelinkModeNone; diff --git a/Source/cmInstallTargetGenerator.h b/Source/cmInstallTargetGenerator.h index f6bec20..bf625d1 100644 --- a/Source/cmInstallTargetGenerator.h +++ b/Source/cmInstallTargetGenerator.h @@ -6,6 +6,7 @@ #include "cmConfigure.h" // IWYU pragma: keep #include "cmInstallGenerator.h" +#include "cmListFileCache.h" #include "cmScriptGenerator.h" #include @@ -21,11 +22,12 @@ class cmLocalGenerator; class cmInstallTargetGenerator : public cmInstallGenerator { public: - cmInstallTargetGenerator(std::string const& targetName, const char* dest, - bool implib, const char* file_permissions, - std::vector const& configurations, - const char* component, MessageLevel message, - bool exclude_from_all, bool optional); + cmInstallTargetGenerator( + std::string const& targetName, const char* dest, bool implib, + const char* file_permissions, + std::vector const& configurations, const char* component, + MessageLevel message, bool exclude_from_all, bool optional, + cmListFileBacktrace const& backtrace = cmListFileBacktrace()); ~cmInstallTargetGenerator() override; /** Select the policy for installing shared library linkable name @@ -64,6 +66,8 @@ public: std::string GetDestination(std::string const& config) const; + cmListFileBacktrace const& GetBacktrace() const { return this->Backtrace; } + protected: void GenerateScript(std::ostream& os) override; void GenerateScriptForConfig(std::ostream& os, const std::string& config, @@ -108,6 +112,7 @@ protected: NamelinkModeType NamelinkMode; bool ImportLibrary; bool Optional; + cmListFileBacktrace Backtrace; }; #endif -- cgit v0.12