[cfe-commits] r65254 - /cfe/trunk/tools/ccc/ccclib/Driver.py

Daniel Dunbar daniel at zuster.org
Sat Feb 21 17:23:52 PST 2009


Author: ddunbar
Date: Sat Feb 21 19:23:52 2009
New Revision: 65254

URL: http://llvm.org/viewvc/llvm-project?rev=65254&view=rev
Log:
ccc: Remove temporary files used in compilation, and remove
compilation results on failures.

Modified:
    cfe/trunk/tools/ccc/ccclib/Driver.py

Modified: cfe/trunk/tools/ccc/ccclib/Driver.py
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/ccc/ccclib/Driver.py?rev=65254&r1=65253&r2=65254&view=diff

==============================================================================
--- cfe/trunk/tools/ccc/ccclib/Driver.py (original)
+++ cfe/trunk/tools/ccc/ccclib/Driver.py Sat Feb 21 19:23:52 2009
@@ -37,6 +37,11 @@
         # Certain options suppress the 'no input files' warning.
         self.suppressMissingInputWarning = False
 
+        # Temporary files used in compilation, removed on exit.
+        self.tempFiles = []
+        # Result files produced by compilation, removed on error.
+        self.resultFiles = []
+
     # Host queries which can be forcibly over-riden by the user for
     # testing purposes.
     #
@@ -219,6 +224,24 @@
                     raise ValueError,'Encountered unknown job.'
             sys.exit(0)
 
+        try:
+            try:
+                self.executeJobs(args, jobs)
+            except:
+                for f in self.resultFiles:
+                    # Fail if removing a result fails:
+                    if os.path.exists(f):
+                        os.remove(f)
+                raise
+        finally:
+            for f in self.tempFiles:
+                # Ignore failures in removing temporary files
+                try:
+                    os.remove(f)
+                except:
+                    pass
+    
+    def executeJobs(self, args, jobs):
         vArg = args.getLastArg(self.parser.vOption)
         for j in jobs.iterjobs():
             if isinstance(j, Jobs.Command):
@@ -807,9 +830,6 @@
                 jobs.addJob(output)
         else:
             # Figure out what the derived output location would be.
-            # 
-            # FIXME: gcc has some special case in here so that it doesn't
-            # create output files if they would conflict with an input.
             if phase.type is Types.ImageType:
                 namedOutput = "a.out"
             else:
@@ -821,9 +841,12 @@
                     base,_ = os.path.splitext(inputName)
                     namedOutput = base + '.' + phase.type.tempSuffix
 
+            isTemp = False
             # Output to user requested destination?
             if atTopLevel and finalOutput:
                 output = finalOutput
+                self.resultFiles.append(args.getValue(finalOutput))
+
             # Contruct a named destination?
             elif atTopLevel or hasSaveTemps:
                 # As an annoying special case, pch generation
@@ -834,9 +857,12 @@
                     outputName = os.path.basename(namedOutput)
                 output = args.makeSeparateArg(outputName,
                                               self.parser.oOption)
+                self.resultFiles.append(outputName)
+
             else:
                 # Output to temp file...
                 fd,filename = tempfile.mkstemp(suffix='.'+phase.type.tempSuffix)
                 output = args.makeSeparateArg(filename,
                                               self.parser.oOption)
+                self.tempFiles.append(filename)
         return output,jobList





More information about the cfe-commits mailing list