From 5d23c5446e1a4645f00230f9d4beeb2429a39f31 Mon Sep 17 00:00:00 2001 From: Brad King Date: Tue, 27 Oct 2020 10:14:45 -0400 Subject: cmCustomCommandGenerator: Refactor OUTPUT and DEPENDS path evaluation * Use value semantics. * Normalize paths in a separate loop. * If CollapseFullPath is used, ConvertToUnixSlashes is unnecessary. --- Source/cmCustomCommandGenerator.cxx | 37 ++++++++++++++++++++----------------- 1 file changed, 20 insertions(+), 17 deletions(-) diff --git a/Source/cmCustomCommandGenerator.cxx b/Source/cmCustomCommandGenerator.cxx index 5970709..e099630 100644 --- a/Source/cmCustomCommandGenerator.cxx +++ b/Source/cmCustomCommandGenerator.cxx @@ -24,22 +24,25 @@ #include "cmTransformDepfile.h" namespace { -void AppendPaths(const std::vector& inputs, - cmGeneratorExpression const& ge, cmLocalGenerator* lg, - std::string const& config, std::vector& output) +std::vector EvaluatePaths(std::vector const& paths, + cmGeneratorExpression const& ge, + cmLocalGenerator* lg, + std::string const& config) { - for (std::string const& in : inputs) { - std::unique_ptr cge = ge.Parse(in); - std::vector result = - cmExpandedList(cge->Evaluate(lg, config)); - for (std::string& it : result) { - cmSystemTools::ConvertToUnixSlashes(it); - if (cmSystemTools::FileIsFullPath(it)) { - it = cmSystemTools::CollapseFullPath(it); - } + std::vector result; + for (std::string const& p : paths) { + std::unique_ptr cge = ge.Parse(p); + std::string const& ep = cge->Evaluate(lg, config); + cm::append(result, cmExpandedList(ep)); + } + for (std::string& p : result) { + if (cmSystemTools::FileIsFullPath(p)) { + p = cmSystemTools::CollapseFullPath(p); + } else { + cmSystemTools::ConvertToUnixSlashes(p); } - cm::append(output, result); } + return result; } } @@ -121,10 +124,10 @@ cmCustomCommandGenerator::cmCustomCommandGenerator(cmCustomCommand const& cc, this->CommandLines.push_back(std::move(argv)); } - AppendPaths(cc.GetOutputs(), ge, this->LG, this->Config, this->Outputs); - AppendPaths(cc.GetByproducts(), ge, this->LG, this->Config, - this->Byproducts); - AppendPaths(cc.GetDepends(), ge, this->LG, this->Config, this->Depends); + this->Outputs = EvaluatePaths(cc.GetOutputs(), ge, this->LG, this->Config); + this->Byproducts = + EvaluatePaths(cc.GetByproducts(), ge, this->LG, this->Config); + this->Depends = EvaluatePaths(cc.GetDepends(), ge, this->LG, this->Config); const std::string& workingdirectory = this->CC->GetWorkingDirectory(); if (!workingdirectory.empty()) { -- cgit v0.12