فهرست منبع

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.
Brad King 5 سال پیش
والد
کامیت
706c48301d
1فایلهای تغییر یافته به همراه28 افزوده شده و 11 حذف شده
  1. 28 11
      Source/cmCustomCommandGenerator.cxx

+ 28 - 11
Source/cmCustomCommandGenerator.cxx

@@ -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()) {