escape spaces with backslash when writing dep file
authorOleg Endo <olegendo@gcc.gnu.org>
Mon, 29 Apr 2019 07:13:34 +0000 (16:13 +0900)
committerOleg Endo <olegendo@gcc.gnu.org>
Mon, 29 Apr 2019 07:13:34 +0000 (16:13 +0900)
filenames are sparated by spaces in the dep file.  if a filename in the
dep file contains spaces they must be escaped, otherwise the tool that
reads the dep file will see multiple wrong filenames.

kernel/driver.cc
kernel/yosys.cc
kernel/yosys.h

index 1bc7a5935a41541b7114ea7dadeee00f90d7be7d..8c56d059bed0088f242127a9d1355f4112573393 100644 (file)
@@ -529,13 +529,13 @@ int main(int argc, char **argv)
                        log_error("Can't open dependencies file for writing: %s\n", strerror(errno));
                bool first = true;
                for (auto fn : yosys_output_files) {
-                       fprintf(f, "%s%s", first ? "" : " ", fn.c_str());
+                       fprintf(f, "%s%s", first ? "" : " ", escape_filename_spaces (fn).c_str());
                        first = false;
                }
                fprintf(f, ":");
                for (auto fn : yosys_input_files) {
                        if (yosys_output_files.count(fn) == 0)
-                               fprintf(f, " %s", fn.c_str());
+                               fprintf(f, " %s", escape_filename_spaces (fn).c_str());
                }
                fprintf(f, "\n");
        }
index a12355f1d509453bf54bc6b4414f019e90fcee73..267a7d01cb484da992bf46edc6aa447f196c0af4 100644 (file)
@@ -482,6 +482,20 @@ void remove_directory(std::string dirname)
 #endif
 }
 
+std::string escape_filename_spaces (const std::string& filename)
+{
+  std::string out;
+  out.reserve (filename.size ());
+  for (auto c : filename)
+  {
+    if (c == ' ')
+      out += "\\ ";
+    else
+      out.push_back (c);
+  }
+  return out;
+}
+
 int GetSize(RTLIL::Wire *wire)
 {
        return wire->width;
index 2cf6188b4607990e3065a4e8b67a6105a7b7b77e..d6490415172f2990b47adc278a5f7cad4b6d6a11 100644 (file)
@@ -257,6 +257,7 @@ std::string make_temp_dir(std::string template_str = "/tmp/yosys_XXXXXX");
 bool check_file_exists(std::string filename, bool is_exec = false);
 bool is_absolute_path(std::string filename);
 void remove_directory(std::string dirname);
+std::string escape_filename_spaces (const std::string& filename);
 
 template<typename T> int GetSize(const T &obj) { return obj.size(); }
 int GetSize(RTLIL::Wire *wire);