]> granicus.if.org Git - clang/commitdiff
Use "foo-12345.o.tmp" instead of "foo.o-12345" as temporary file name.
authorNico Weber <nicolasweber@gmx.de>
Tue, 8 Aug 2017 16:21:23 +0000 (16:21 +0000)
committerNico Weber <nicolasweber@gmx.de>
Tue, 8 Aug 2017 16:21:23 +0000 (16:21 +0000)
This helps some tools that do things based on the output's extension.

For example, we got reports from users on Windows that have a tool that scan a
build output dir (but skip .obj files). The tool would keep the "foo.obj-12345"
file open, and then when clang tried to rename the temp file to the final
output filename, that would fail. By making the tempfile end in ".obj.tmp",
tools like this could now have a rule to ignore .tmp files.
This is a less ambitious reland of https://reviews.llvm.org/D36238

https://reviews.llvm.org/D36413

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@310376 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Frontend/CompilerInstance.cpp

index bb6a665cb456599cca85b589e2e9207fb6c694e6..740dabea45a9d16bf2f13b57646c755667be16ed 100644 (file)
@@ -759,9 +759,15 @@ std::unique_ptr<llvm::raw_pwrite_stream> CompilerInstance::createOutputFile(
 
   if (UseTemporary) {
     // Create a temporary file.
-    SmallString<128> TempPath;
-    TempPath = OutFile;
+    // Insert -%%%%%%%% before the extension (if any), and because some tools
+    // (noticeable, clang's own GlobalModuleIndex.cpp) glob for build
+    // artifacts, also append .tmp.
+    StringRef OutputExtension = llvm::sys::path::extension(OutFile);
+    SmallString<128> TempPath =
+        StringRef(OutFile).drop_back(OutputExtension.size());
     TempPath += "-%%%%%%%%";
+    TempPath += OutputExtension;
+    TempPath += ".tmp";
     int fd;
     std::error_code EC =
         llvm::sys::fs::createUniqueFile(TempPath, fd, TempPath);