diff options
| author | Daniel Dunbar <daniel@zuster.org> | 2009-08-03 05:12:16 +0000 | 
|---|---|---|
| committer | Daniel Dunbar <daniel@zuster.org> | 2009-08-03 05:12:16 +0000 | 
| commit | 05084716c13b4ea79ea29528dcb3c3f8a5271638 (patch) | |
| tree | 693b01d2752d9cd835c39110d4893e0f7acdec44 /utils/FileUpdate | |
| parent | defc85327a7cd0ad679cd3fe94f671d6549fe4a1 (diff) | |
| download | external_llvm-05084716c13b4ea79ea29528dcb3c3f8a5271638.zip external_llvm-05084716c13b4ea79ea29528dcb3c3f8a5271638.tar.gz external_llvm-05084716c13b4ea79ea29528dcb3c3f8a5271638.tar.bz2 | |
Add FileUpdate tool, conditionally updates its output based on its input.
 - Gratuitous and unused, but possibly useful one day.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@77954 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'utils/FileUpdate')
| -rw-r--r-- | utils/FileUpdate/CMakeLists.txt | 11 | ||||
| -rw-r--r-- | utils/FileUpdate/FileUpdate.cpp | 86 | ||||
| -rw-r--r-- | utils/FileUpdate/Makefile | 18 | 
3 files changed, 115 insertions, 0 deletions
| diff --git a/utils/FileUpdate/CMakeLists.txt b/utils/FileUpdate/CMakeLists.txt new file mode 100644 index 0000000..bacbd16 --- /dev/null +++ b/utils/FileUpdate/CMakeLists.txt @@ -0,0 +1,11 @@ +add_executable(FileUpdate +  FileUpdate.cpp +  ) + +target_link_libraries(FileUpdate LLVMSupport LLVMSystem) +if( MINGW ) +  target_link_libraries(FileUpdate imagehlp psapi) +endif( MINGW ) +if( LLVM_ENABLE_THREADS AND HAVE_LIBPTHREAD ) +  target_link_libraries(FileUpdate pthread) +endif() diff --git a/utils/FileUpdate/FileUpdate.cpp b/utils/FileUpdate/FileUpdate.cpp new file mode 100644 index 0000000..8d5d6b1 --- /dev/null +++ b/utils/FileUpdate/FileUpdate.cpp @@ -0,0 +1,86 @@ +//===- FileUpdate.cpp - Conditionally update a file -----------------------===// +// +//                     The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// FileUpdate is a utility for conditionally updating a file from its input +// based on whether the input differs from the output. It is used to avoid +// unnecessary modifications in a build system. +// +//===----------------------------------------------------------------------===// + +#include "llvm/Support/CommandLine.h" +#include "llvm/Support/MemoryBuffer.h" +#include "llvm/Support/PrettyStackTrace.h" +#include "llvm/Support/raw_ostream.h" +#include "llvm/System/Signals.h" +using namespace llvm; + +static cl::opt<bool> +Quiet("quiet", cl::desc("Don't print unnecessary status information"), +      cl::init(false)); + +static cl::opt<std::string> +InputFilename("input-file", cl::desc("Input file (defaults to stdin)"), +              cl::init("-"), cl::value_desc("filename")); + +static cl::opt<std::string> +OutputFilename(cl::Positional, cl::desc("<output-file>"), cl::Required); + +int main(int argc, char **argv) { +  sys::PrintStackTraceOnErrorSignal(); +  PrettyStackTraceProgram X(argc, argv); +  cl::ParseCommandLineOptions(argc, argv); + +  // Get the input data. +  std::string ErrorStr; +  MemoryBuffer *In = +    MemoryBuffer::getFileOrSTDIN(InputFilename.c_str(), &ErrorStr); +  if (In == 0) { +    errs() << argv[0] << ": error: Unable to get input '" +           << InputFilename << "': " << ErrorStr << '\n'; +    return 1; +  } + +  // Get the output data. +  MemoryBuffer *Out = MemoryBuffer::getFile(OutputFilename.c_str(), &ErrorStr); + +  // If the output exists and the contents match, we are done. +  if (Out && In->getBufferSize() == Out->getBufferSize() && +      memcmp(In->getBufferStart(), Out->getBufferStart(), +             Out->getBufferSize()) == 0) { +    if (!Quiet) +      outs() << argv[0] << ": Not updating '" << OutputFilename +             << "', contents match input.\n"; +    return 0; +  } + +  delete Out; + +  // Otherwise, overwrite the output. +  if (!Quiet) +    outs() << argv[0] << ": Updating '" << OutputFilename +           << "', contents changed.\n"; +  raw_fd_ostream OutStream(OutputFilename.c_str(), /*Binary=*/true, +                           /*Force=*/true, ErrorStr); +  if (!ErrorStr.empty()) { +    errs() << argv[0] << ": Unable to write output '" +           << OutputFilename << "': " << ErrorStr << '\n'; +    return 1; +  } + +  OutStream.write(In->getBufferStart(), In->getBufferSize()); +  OutStream.close(); + +  if (OutStream.has_error()) { +    errs() << argv[0] << ": Could not open output file '" +           << OutputFilename << "': " << ErrorStr << '\n'; +    return 1; +  } + +  return 0; +} diff --git a/utils/FileUpdate/Makefile b/utils/FileUpdate/Makefile new file mode 100644 index 0000000..90fa6f0 --- /dev/null +++ b/utils/FileUpdate/Makefile @@ -0,0 +1,18 @@ +##===- utils/FileUpdate/Makefile ---------------------------*- Makefile -*-===## +#  +#                     The LLVM Compiler Infrastructure +# +# This file is distributed under the University of Illinois Open Source +# License. See LICENSE.TXT for details. +#  +##===----------------------------------------------------------------------===## + +LEVEL = ../.. +TOOLNAME = FileUpdate +USEDLIBS = LLVMSupport.a LLVMSystem.a + +# This tool has no plugins, optimize startup time. +TOOL_NO_EXPORTS = 1 + +include $(LEVEL)/Makefile.common + | 
