From aeb0f0cdd28011a34be3772bb7a77292eaf18f9c Mon Sep 17 00:00:00 2001 From: Rafael Espindola Date: Wed, 28 Aug 2013 16:22:16 +0000 Subject: Add a minimal implementation of ranlib. This is just enough to get "llvm-ranlib foo.a" working and tested. Making llvm-ranlib a symbolic link to llvm-ar doesn't work so well with llvm's option parsing, but ar's option parsing is mostly custom anyway. This patch also removes the -X32_64 option. Looks like it was just added in r10297 as part of implementing the current command line parsing. I can add it back (with a test) if someone really has AIX portability problems without it. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@189489 91177308-0d34-0410-b5e6-96231b3b80d8 --- tools/llvm-ar/CMakeLists.txt | 18 ++++++++++++++++ tools/llvm-ar/Makefile | 1 + tools/llvm-ar/llvm-ar.cpp | 50 ++++++++++++++++++++++++++++++++------------ 3 files changed, 56 insertions(+), 13 deletions(-) (limited to 'tools/llvm-ar') diff --git a/tools/llvm-ar/CMakeLists.txt b/tools/llvm-ar/CMakeLists.txt index 503999c262..f15a1e2a86 100644 --- a/tools/llvm-ar/CMakeLists.txt +++ b/tools/llvm-ar/CMakeLists.txt @@ -4,4 +4,22 @@ add_llvm_tool(llvm-ar llvm-ar.cpp ) +# FIXME: this is duplicated from the clang CMakeLists.txt +# FIXME: bin/llvm-ranlib is not a valid build target with this setup (pr17024) + +if(UNIX) + set(LLVM_LINK_OR_COPY create_symlink) + set(llvm_ar_binary "llvm-ar${CMAKE_EXECUTABLE_SUFFIX}") +else() + set(LLVM_LINK_OR_COPY copy) + set(llvm_ar_binary "${LLVM_BINARY_DIR}/bin/${CMAKE_CFG_INTDIR}/llvm-ar${CMAKE_EXECUTABLE_SUFFIX}") +endif() + +set(llvm_ranlib "${LLVM_BINARY_DIR}/bin/${CMAKE_CFG_INTDIR}/llvm-ranlib${CMAKE_EXECUTABLE_SUFFIX}") +add_custom_command(TARGET llvm-ar POST_BUILD + COMMAND ${CMAKE_COMMAND} -E ${LLVM_LINK_OR_COPY} "${llvm_ar_binary}" "${llvm_ranlib}") + +set_property(DIRECTORY APPEND + PROPERTY ADDITIONAL_MAKE_CLEAN_FILES ${llvm_ranlib}) + # TODO: Support check-local. diff --git a/tools/llvm-ar/Makefile b/tools/llvm-ar/Makefile index 15fb0900c2..16a828396c 100644 --- a/tools/llvm-ar/Makefile +++ b/tools/llvm-ar/Makefile @@ -9,6 +9,7 @@ LEVEL := ../.. TOOLNAME := llvm-ar +TOOLALIAS = llvm-ranlib LINK_COMPONENTS := bitreader support object # This tool has no plugins, optimize startup time. diff --git a/tools/llvm-ar/llvm-ar.cpp b/tools/llvm-ar/llvm-ar.cpp index 6026fa7cfe..f47b0a6242 100644 --- a/tools/llvm-ar/llvm-ar.cpp +++ b/tools/llvm-ar/llvm-ar.cpp @@ -63,20 +63,13 @@ static void failIfError(error_code EC, Twine Context = "") { fail(Context + ": " + EC.message()); } -// Option for compatibility with AIX, not used but must allow it to be present. -static cl::opt -X32Option ("X32_64", cl::Hidden, - cl::desc("Ignored option for compatibility with AIX")); - -// llvm-ar operation code and modifier flags. This must come first. -static cl::opt -Options(cl::Positional, cl::Required, cl::desc("{operation}[modifiers]...")); - -// llvm-ar remaining positional arguments. +// llvm-ar/llvm-ranlib remaining positional arguments. static cl::list RestOfArgs(cl::Positional, cl::OneOrMore, cl::desc("[relpos] [count] [members]...")); +std::string Options; + // MoreHelp - Provide additional help output explaining the operations and // modifiers of llvm-ar. This object instructs the CommandLine library // to print the text of the constructor when the --help option is given. @@ -156,6 +149,13 @@ static void getRelPos() { RestOfArgs.erase(RestOfArgs.begin()); } +static void getOptions() { + if(RestOfArgs.size() == 0) + show_help("Expected options"); + Options = RestOfArgs[0]; + RestOfArgs.erase(RestOfArgs.begin()); +} + // getArchive - Get the archive file name from the command line static void getArchive() { if(RestOfArgs.size() == 0) @@ -175,6 +175,7 @@ static void getMembers() { // operation specified. Process all modifiers and check to make sure that // constraints on modifier/operation pairs have not been violated. static ArchiveOperation parseCommandLine() { + getOptions(); // Keep track of number of operations. We can only specify one // per execution. @@ -857,6 +858,9 @@ static void performOperation(ArchiveOperation Operation, llvm_unreachable("Unknown operation."); } +static int ar_main(char **argv); +static int ranlib_main(); + // main - main program for llvm-ar .. see comments in the code int main(int argc, char **argv) { ToolName = argv[0]; @@ -872,15 +876,35 @@ int main(int argc, char **argv) { " This program archives bitcode files into single libraries\n" ); + if (ToolName.endswith("ar")) + return ar_main(argv); + if (ToolName.endswith("ranlib")) + return ranlib_main(); + fail("Not ranlib or ar!"); +} + +static int performOperation(ArchiveOperation Operation); + +int ranlib_main() { + if (RestOfArgs.size() != 1) + fail(ToolName + "takes just one archive as argument"); + ArchiveName = RestOfArgs[0]; + return performOperation(CreateSymTab); +} + +int ar_main(char **argv) { // Do our own parsing of the command line because the CommandLine utility // can't handle the grouped positional parameters without a dash. ArchiveOperation Operation = parseCommandLine(); + return performOperation(Operation); +} +static int performOperation(ArchiveOperation Operation) { // Create or open the archive object. OwningPtr Buf; error_code EC = MemoryBuffer::getFile(ArchiveName, Buf, -1, false); if (EC && EC != llvm::errc::no_such_file_or_directory) { - errs() << argv[0] << ": error opening '" << ArchiveName + errs() << ToolName << ": error opening '" << ArchiveName << "': " << EC.message() << "!\n"; return 1; } @@ -889,7 +913,7 @@ int main(int argc, char **argv) { object::Archive Archive(Buf.take(), EC); if (EC) { - errs() << argv[0] << ": error loading '" << ArchiveName + errs() << ToolName << ": error loading '" << ArchiveName << "': " << EC.message() << "!\n"; return 1; } @@ -904,7 +928,7 @@ int main(int argc, char **argv) { } else { if (!Create) { // Produce a warning if we should and we're creating the archive - errs() << argv[0] << ": creating " << ArchiveName << "\n"; + errs() << ToolName << ": creating " << ArchiveName << "\n"; } } -- cgit v1.2.3