diff options
author | Chris Lattner <sabre@nondot.org> | 2003-08-01 20:35:01 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2003-08-01 20:35:01 +0000 |
commit | e79c72d4cd68fce6ccb30b2cc222069619f7d503 (patch) | |
tree | 7c02823ab993f242146a0127716d3fb18bd0094f /support/tools/TableGen | |
parent | 02f7fa482a4391631c393a747566d4cf748a775c (diff) | |
download | external_llvm-e79c72d4cd68fce6ccb30b2cc222069619f7d503.zip external_llvm-e79c72d4cd68fce6ccb30b2cc222069619f7d503.tar.gz external_llvm-e79c72d4cd68fce6ccb30b2cc222069619f7d503.tar.bz2 |
Tablegen should only replace the output if it changes
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@7486 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'support/tools/TableGen')
-rw-r--r-- | support/tools/TableGen/TableGen.cpp | 22 |
1 files changed, 18 insertions, 4 deletions
diff --git a/support/tools/TableGen/TableGen.cpp b/support/tools/TableGen/TableGen.cpp index 088dcbe..1d8b60b 100644 --- a/support/tools/TableGen/TableGen.cpp +++ b/support/tools/TableGen/TableGen.cpp @@ -11,6 +11,7 @@ #include "Record.h" #include "Support/CommandLine.h" #include "Support/Signals.h" +#include "Support/FileUtilities.h" #include "CodeEmitterGen.h" #include "RegisterInfoEmitter.h" #include <algorithm> @@ -391,15 +392,18 @@ int main(int argc, char **argv) { std::ostream *Out = &std::cout; if (OutputFilename != "-") { - Out = new std::ofstream(OutputFilename.c_str()); + // Output to a .tmp file, because we don't actually want to overwrite the + // output file unless the generated file is different or the specified file + // does not exist. + Out = new std::ofstream((OutputFilename+".tmp").c_str()); if (!Out->good()) { - std::cerr << argv[0] << ": error opening " << OutputFilename << "!\n"; + std::cerr << argv[0] << ": error opening " << OutputFilename << ".tmp!\n"; return 1; } // Make sure the file gets removed if *gasp* tablegen crashes... - RemoveFileOnSignal(OutputFilename); + RemoveFileOnSignal(OutputFilename+".tmp"); } try { @@ -438,6 +442,16 @@ int main(int argc, char **argv) { return 1; } - if (Out != &std::cout) delete Out; + if (Out != &std::cout) { + delete Out; // Close the file + + // Now that we have generated the result, check to see if we either don't + // have the requested file, or if the requested file is different than the + // file we generated. If so, move the generated file over the requested + // file. Otherwise, just remove the file we just generated, so 'make' + // doesn't try to regenerate tons of dependencies. + // + MoveFileOverIfUpdated(OutputFilename+".tmp", OutputFilename); + } return 0; } |