Index: llvm/test/CMakeLists.txt =================================================================== --- llvm/test/CMakeLists.txt +++ llvm/test/CMakeLists.txt @@ -58,6 +58,7 @@ llvm-mc llvm-mcmarkup llvm-modextract + llvm-mt llvm-nm llvm-objdump llvm-opt-report Index: llvm/test/tools/llvm-mt/help.test =================================================================== --- /dev/null +++ llvm/test/tools/llvm-mt/help.test @@ -0,0 +1,7 @@ +RUN: llvm-mt /? | FileCheck %s -check-prefix=HELP + +RUN: llvm-mt /inputresource:foo.res /manifest foo.manifest | FileCheck %s -check-prefix=NOT_SUPPORTED + +HELP: OVERVIEW: Manifest Tool + +NOT_SUPPORTED: Ignoring INPUTRESOURCE: option; not supported. Index: llvm/tools/llvm-mt/CMakeLists.txt =================================================================== --- /dev/null +++ llvm/tools/llvm-mt/CMakeLists.txt @@ -0,0 +1,13 @@ +set(LLVM_LINK_COMPONENTS + Option + Support + ) + +set(LLVM_TARGET_DEFINITIONS Opts.td) + +tablegen(LLVM Opts.inc -gen-opt-parser-defs) +add_public_tablegen_target(MtTableGen) + +add_llvm_tool(llvm-mt + llvm-mt.cpp + ) Index: llvm/tools/llvm-mt/LLVMBuild.txt =================================================================== --- /dev/null +++ llvm/tools/llvm-mt/LLVMBuild.txt @@ -0,0 +1,22 @@ +;===- ./tools/llvm-mt/LLVMBuild.txt ---------------------------*- Conf -*--===; +; +; The LLVM Compiler Infrastructure +; +; This file is distributed under the University of Illinois Open Source +; License. See LICENSE.TXT for details. +; +;===------------------------------------------------------------------------===; +; +; This is an LLVMBuild description file for the components in this subdirectory. +; +; For more information on the LLVMBuild system, please see: +; +; http://llvm.org/docs/LLVMBuild.html +; +;===------------------------------------------------------------------------===; + +[component_0] +type = Tool +name = llvm-mt +parent = Tools +required_libraries = Option Support Index: llvm/tools/llvm-mt/Opts.td =================================================================== --- /dev/null +++ llvm/tools/llvm-mt/Opts.td @@ -0,0 +1,29 @@ +include "llvm/Option/OptParser.td" + +def UNSUPPORTED : OptionGroup<"UNSUPPORTED">; +def MANIFEST : Separate<["/", "-"], "MANIFEST">, HelpText<"Used to specify each manifest that need to be processed.">, MetaVarName<"manifest">; +def IDENTITY : Joined<["/", "-"], "IDENTITY:">, HelpText<"Not supported.">, MetaVarName<"identity">, Group; +def RGS : Joined<["/", "-"], "RGS:">, HelpText<"Not supported.">, MetaVarName<"script">, Group; +def TLB : Joined<["/", "-"], "TLB:">, HelpText<"Not supported.">, MetaVarName<"file">, Group; +def DLL : Joined<["/", "-"], "DLL:">, HelpText<"Not supported.">, MetaVarName<"dll">, Group; +def REPLACEMENTS : Joined<["/", "-"], "REPLACEMENTS:">, HelpText<"Not supported.">, MetaVarName<"file">, Group; +def MANAGEDASSEMBLYNAME : Joined<["/", "-"], "MANAGEDASSEMBLYNAME:">, HelpText<"Not supported.">, MetaVarName<"assembly">, Group; +def NODEPENDENCY : Flag<["/", "-"], "NODEPENDENCY">, HelpText<"Not supported.">, Group; +def CATEGORY : Flag<["/", "-"], "CATEGORY">, HelpText<"Not supported.">, Group; +def NOLOGO : Flag<["/", "-"], "NOLOGO">, HelpText<"No effect as this tool never writes copyright data. Included for parity.">; +def OUT : Joined<["/", "-"], "OUT:">, HelpText<"Name of the output manifest. If this is skipped and only one manifest is being operated upon by the tool, that manifest is modified in place.">, MetaVarName<"manifest">; +def INPUTRESOURCE : Joined<["/", "-"], "INPUTRESOURCE:">, HelpText<"Not supported.">, MetaVarName<"file">, Group; +def OUTPUTRESOURCE : Joined<["/", "-"], "OUTPUTRESOURCE:">, HelpText<"Not supported.">, MetaVarName<"file">, Group; +def OUTPUTRESOURCE_FLAG : Flag<["/", "-"], "OUTPUTRESOURCE">, Alias, HelpText<"Not supported.">, Group; +def UPDATERESOURCE : Joined<["/", "-"], "UPDATERESOURCE:">, HelpText<"Not supported.">, MetaVarName<"file">, Group; +def HASHUPDATE : Joined<["/", "-"], "HASHUPDATE:">, HelpText<"Not supported.">, MetaVarName<"file">, Group; +def HASHUPDATE_FLAG : Flag<["/", "-"], "HASHUPDATE">, Alias, HelpText<"Not supported.">, Group; +def VALIDATE_MANIFEST : Flag<["/", "-"], "VALIDATE_MANIFEST">, HelpText<"Not supported.">, Group; +def VALIDATE_FILE_HASHES : Joined<["/", "-"], "VALIDATE_FILE_HASHES:">, HelpText<"Not supported.">, MetaVarName<"">, Group; +def CANONICALIZE : Flag<["/", "-"], "HASHUPDATE:">, HelpText<"Not supported.">, Group; +def CHECK_FOR_DUPLICATES : Flag<["/", "-"], "CHECK_FOR_DUPLICATES:">, HelpText<"Not supported.">, Group; +def MAKECDFS : Flag<["/", "-"], "MAKECDFS:">, HelpText<"Not supported.">, Group; +def VERBOSE : Flag<["/", "-"], "VERBOSE">, HelpText<"Not supported.">, Group; +def HELP : Flag<["/", "-"], "?">; +def HELP_LONG : Flag<["/", "-"], "HELP">, Alias; +def H : Flag<["/", "-"], "H">, Alias; Index: llvm/tools/llvm-mt/llvm-mt.cpp =================================================================== --- /dev/null +++ llvm/tools/llvm-mt/llvm-mt.cpp @@ -0,0 +1,118 @@ +//===- llvm-mt.cpp - Merge .manifest files ---------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===---------------------------------------------------------------------===// +// +// Merge .manifest files. This is intended to be a platform-independent port +// of Microsoft's mt.exe. +// +//===---------------------------------------------------------------------===// + +#include "llvm/Option/Arg.h" +#include "llvm/Option/ArgList.h" +#include "llvm/Option/Option.h" +#include "llvm/Support/Error.h" +#include "llvm/Support/ManagedStatic.h" +#include "llvm/Support/Path.h" +#include "llvm/Support/PrettyStackTrace.h" +#include "llvm/Support/Process.h" +#include "llvm/Support/raw_ostream.h" +#include "llvm/Support/Signals.h" + +#include + +using namespace llvm; + +namespace { + +enum ID { + OPT_INVALID = 0, // This is not an option ID. +#define OPTION(PREFIX, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \ + HELPTEXT, METAVAR, VALUES) \ + OPT_##ID, +#include "Opts.inc" +#undef OPTION +}; + +#define PREFIX(NAME, VALUE) const char *const NAME[] = VALUE; +#include "Opts.inc" +#undef PREFIX + +static const opt::OptTable::Info InfoTable[] = { +#define OPTION(PREFIX, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \ + HELPTEXT, METAVAR, VALUES) \ + { \ + PREFIX, NAME, HELPTEXT, \ + METAVAR, OPT_##ID, opt::Option::KIND##Class, \ + PARAM, FLAGS, OPT_##GROUP, \ + OPT_##ALIAS, ALIASARGS, VALUES}, +#include "Opts.inc" +#undef OPTION +}; + +class CvtResOptTable : public opt::OptTable { +public: + CvtResOptTable() : OptTable(InfoTable, true) {} +}; + +static ExitOnError ExitOnErr; +} + +LLVM_ATTRIBUTE_NORETURN void reportError(Twine Msg) { + errs() << "llvm-mt error: " << Msg; + exit(1); +} + + +int main(int argc_, const char *argv_[]) { + sys::PrintStackTraceOnErrorSignal(argv_[0]); + PrettyStackTraceProgram X(argc_, argv_); + + ExitOnErr.setBanner("llvm-mt: "); + + SmallVector argv; + SpecificBumpPtrAllocator ArgAllocator; + ExitOnErr(errorCodeToError(sys::Process::GetArgumentVector( + argv, makeArrayRef(argv_, argc_), ArgAllocator))); + + llvm_shutdown_obj Y; // Call llvm_shutdown() on exit. + + CvtResOptTable T; + unsigned MAI, MAC; + ArrayRef ArgsArr = makeArrayRef(argv_ + 1, argc_); + opt::InputArgList InputArgs = T.ParseArgs(ArgsArr, MAI, MAC); + + for (auto &Arg : InputArgs) { + if (Arg->getOption().matches(OPT_UNSUPPORTED)) { + outs() << "Ignoring " << Arg->getOption().getName() << " option; not supported.\n"; + } + } + + if (InputArgs.hasArg(OPT_HELP)) { + T.PrintHelp(outs(), "mt", "Manifest Tool", false); + return 0; + } + + std::vector InputFiles = InputArgs.getAllArgValues(OPT_MANIFEST); + + if (InputFiles.size() == 0) { + reportError("No input file specified.\n"); + } + + StringRef OutputFile; + + if (InputArgs.hasArg(OPT_OUT)) { + OutputFile = InputArgs.getLastArgValue(OPT_OUT); + } else if (InputFiles.size() == 1) { + OutputFile = InputFiles[0]; + } else { + reportError("No output file specified.\n"); + } + + return 0; + +}