Browse Source

cmGccDepfileReader: Add new function ensuring paths are valid

And cmTransformDepfile now rely on this new function.
Marc Chevrier 5 years ago
parent
commit
a526f71266
3 changed files with 43 additions and 15 deletions
  1. 34 0
      Source/cmGccDepfileReader.cxx
  2. 8 0
      Source/cmGccDepfileReader.h
  3. 1 15
      Source/cmTransformDepfile.cxx

+ 34 - 0
Source/cmGccDepfileReader.cxx

@@ -4,10 +4,13 @@
 
 #include <type_traits>
 #include <utility>
+#include <vector>
 
 #include <cm/optional>
 
 #include "cmGccDepfileLexerHelper.h"
+#include "cmStringAlgorithms.h"
+#include "cmSystemTools.h"
 
 cm::optional<cmGccDepfileContent> cmReadGccDepfile(const char* filePath)
 {
@@ -17,3 +20,34 @@ cm::optional<cmGccDepfileContent> cmReadGccDepfile(const char* filePath)
   }
   return cm::nullopt;
 }
+
+cm::optional<cmGccDepfileContent> cmReadGccDepfile(const char* filePath,
+                                                   const std::string& prefix)
+{
+  auto deps = cmReadGccDepfile(filePath);
+
+  if (prefix.empty() || !deps) {
+    return deps;
+  }
+
+  for (auto& dep : *deps) {
+    for (auto& rule : dep.rules) {
+      if (!cmSystemTools::FileIsFullPath(rule)) {
+        rule = cmStrCat(prefix, rule);
+      }
+      if (cmSystemTools::FileIsFullPath(rule)) {
+        rule = cmSystemTools::CollapseFullPath(rule);
+      }
+    }
+    for (auto& path : dep.paths) {
+      if (!cmSystemTools::FileIsFullPath(path)) {
+        path = cmStrCat(prefix, path);
+      }
+      if (cmSystemTools::FileIsFullPath(path)) {
+        path = cmSystemTools::CollapseFullPath(path);
+      }
+    }
+  }
+
+  return deps;
+}

+ 8 - 0
Source/cmGccDepfileReader.h

@@ -2,8 +2,16 @@
    file Copyright.txt or https://cmake.org/licensing for details.  */
 #pragma once
 
+#include <string>
+
 #include <cm/optional>
 
 #include "cmGccDepfileReaderTypes.h"
 
 cm::optional<cmGccDepfileContent> cmReadGccDepfile(const char* filePath);
+
+/*
+ * Read dependencies file and append prefix to all relative paths
+ */
+cm::optional<cmGccDepfileContent> cmReadGccDepfile(const char* filePath,
+                                                   const std::string& prefix);

+ 1 - 15
Source/cmTransformDepfile.cxx

@@ -13,7 +13,6 @@
 
 #include "cmGccDepfileReader.h"
 #include "cmGccDepfileReaderTypes.h"
-#include "cmStringAlgorithms.h"
 #include "cmSystemTools.h"
 
 namespace {
@@ -79,26 +78,13 @@ bool cmTransformDepfile(cmDepfileFormat format, const std::string& prefix,
 {
   cmGccDepfileContent content;
   if (cmSystemTools::FileExists(infile)) {
-    auto result = cmReadGccDepfile(infile.c_str());
+    auto result = cmReadGccDepfile(infile.c_str(), prefix);
     if (!result) {
       return false;
     }
     content = *std::move(result);
   }
 
-  for (auto& dep : content) {
-    for (auto& rule : dep.rules) {
-      if (!cmSystemTools::FileIsFullPath(rule)) {
-        rule = cmStrCat(prefix, rule);
-      }
-    }
-    for (auto& path : dep.paths) {
-      if (!cmSystemTools::FileIsFullPath(path)) {
-        path = cmStrCat(prefix, path);
-      }
-    }
-  }
-
   cmsys::ofstream fout(outfile.c_str());
   if (!fout) {
     return false;