Commit 706c4830 authored by Brad King's avatar Brad King
Browse files

cmCustomCommandGenerator: Treat relative outputs w.r.t. build dir

The `add_custom_command` and `add_custom_target` commands already do
this for plain output and byproduct paths.  Perform the same conversion
for such paths discovered after generator expression evaluation too.
parent 5d23c544
......@@ -24,25 +24,42 @@
#include "cmTransformDepfile.h"
namespace {
std::vector<std::string> EvaluatePaths(std::vector<std::string> const& paths,
cmGeneratorExpression const& ge,
cmLocalGenerator* lg,
std::string const& config)
std::vector<std::string> EvaluateDepends(std::vector<std::string> const& paths,
cmGeneratorExpression const& ge,
cmLocalGenerator* lg,
std::string const& config)
{
std::vector<std::string> result;
std::vector<std::string> depends;
for (std::string const& p : paths) {
std::unique_ptr<cmCompiledGeneratorExpression> cge = ge.Parse(p);
std::string const& ep = cge->Evaluate(lg, config);
cm::append(result, cmExpandedList(ep));
cm::append(depends, cmExpandedList(ep));
}
for (std::string& p : result) {
for (std::string& p : depends) {
if (cmSystemTools::FileIsFullPath(p)) {
p = cmSystemTools::CollapseFullPath(p);
} else {
cmSystemTools::ConvertToUnixSlashes(p);
}
}
return result;
return depends;
}
std::vector<std::string> EvaluateOutputs(std::vector<std::string> const& paths,
cmGeneratorExpression const& ge,
cmLocalGenerator* lg,
std::string const& config)
{
std::vector<std::string> outputs;
for (std::string const& p : paths) {
std::unique_ptr<cmCompiledGeneratorExpression> cge = ge.Parse(p);
std::string const& ep = cge->Evaluate(lg, config);
cm::append(outputs, cmExpandedList(ep));
}
for (std::string& p : outputs) {
p = cmSystemTools::CollapseFullPath(p, lg->GetCurrentBinaryDirectory());
}
return outputs;
}
}
......@@ -124,10 +141,10 @@ cmCustomCommandGenerator::cmCustomCommandGenerator(cmCustomCommand const& cc,
this->CommandLines.push_back(std::move(argv));
}
this->Outputs = EvaluatePaths(cc.GetOutputs(), ge, this->LG, this->Config);
this->Outputs = EvaluateOutputs(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);
EvaluateOutputs(cc.GetByproducts(), ge, this->LG, this->Config);
this->Depends = EvaluateDepends(cc.GetDepends(), ge, this->LG, this->Config);
const std::string& workingdirectory = this->CC->GetWorkingDirectory();
if (!workingdirectory.empty()) {
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment