From b25d52a40e398078176173effb5172596433216d Mon Sep 17 00:00:00 2001 From: Marcus Holland-Moritz Date: Tue, 4 Jul 2023 08:27:54 +0200 Subject: [PATCH] Make dwarfs-universal usable without symlinks --- CMakeLists.txt | 26 +++++++------------------- src/universal.cpp | 47 +++++++++++++++++++++++++++++++++++++++++------ 2 files changed, 48 insertions(+), 25 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 23f41225..7638721c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -482,34 +482,22 @@ add_executable(mkdwarfs src/mkdwarfs.cpp) add_executable(dwarfsck src/dwarfsck.cpp) add_executable(dwarfsbench src/dwarfsbench.cpp) add_executable(dwarfsextract src/dwarfsextract.cpp) -if(NOT WIN32) - add_executable(dwarfsuniversal src/universal.cpp) -endif() +add_executable(dwarfsuniversal src/universal.cpp) target_link_libraries(mkdwarfs mkdwarfs_main) target_link_libraries(dwarfsck dwarfsck_main) target_link_libraries(dwarfsbench dwarfsbench_main) target_link_libraries(dwarfsextract dwarfsextract_main) -if(NOT WIN32) - target_link_libraries(dwarfsuniversal mkdwarfs_main dwarfsck_main - dwarfsbench_main dwarfsextract_main) - set_target_properties(dwarfsuniversal PROPERTIES - RUNTIME_OUTPUT_DIRECTORY universal - OUTPUT_NAME dwarfs-universal) - foreach(bin mkdwarfs dwarfsck dwarfsextract dwarfsbench) - add_custom_command(OUTPUT universal/${bin} - COMMAND ${CMAKE_COMMAND} -E create_symlink dwarfs universal/${bin} - DEPENDS dwarfsuniversal) - list(APPEND SYMLINKS ${CMAKE_CURRENT_BINARY_DIR}/universal/${bin}) - endforeach() -endif() +target_link_libraries(dwarfsuniversal mkdwarfs_main dwarfsck_main + dwarfsbench_main dwarfsextract_main) +set_target_properties(dwarfsuniversal PROPERTIES + RUNTIME_OUTPUT_DIRECTORY universal + OUTPUT_NAME dwarfs-universal) install(TARGETS mkdwarfs dwarfsck dwarfsbench dwarfsextract RUNTIME DESTINATION bin) list(APPEND BINARY_TARGETS mkdwarfs dwarfsck dwarfsbench dwarfsextract) -if(NOT WIN32) - list(APPEND BINARY_TARGETS dwarfsuniversal) -endif() +list(APPEND BINARY_TARGETS dwarfsuniversal) list(APPEND MAIN_TARGETS mkdwarfs_main dwarfsck_main dwarfsbench_main dwarfsextract_main) diff --git a/src/universal.cpp b/src/universal.cpp index 3d81f667..8883f79e 100644 --- a/src/universal.cpp +++ b/src/universal.cpp @@ -20,33 +20,68 @@ */ #include +#include +#include #include -#include +#include + +#include +#include #include "dwarfs/error.h" +#include "dwarfs/tool.h" #include "dwarfs_tool_main.h" namespace { using namespace dwarfs; -std::unordered_map const functions{ +std::map const functions{ + {"dwarfs", &dwarfs_main}, {"mkdwarfs", &mkdwarfs_main}, {"dwarfsck", &dwarfsck_main}, {"dwarfsextract", &dwarfsextract_main}, - {"dwarfsbench", &dwarfsbench_main}, + // {"dwarfsbench", &dwarfsbench_main}, }; } // namespace int main(int argc, char** argv) { - auto fun = &dwarfs::dwarfs_main; + if (argc > 1) { + std::string_view tool_arg(argv[1]); + if (tool_arg.starts_with("--tool=")) { + if (auto it = functions.find(tool_arg.substr(7)); it != functions.end()) { + std::vector argv_copy; + argv_copy.reserve(argc - 1); + argv_copy.emplace_back(argv[0]); + std::copy(argv + 2, argv + argc, std::back_inserter(argv_copy)); + return dwarfs::safe_main( + [&] { return it->second(argc - 1, argv_copy.data()); }); + } + } + } + +#ifndef _WIN32 auto path = std::filesystem::path(argv[0]); if (auto it = functions.find(path.filename().string()); it != functions.end()) { - fun = it->second; + return dwarfs::safe_main([&] { return it->second(argc, argv); }); } +#endif - return dwarfs::safe_main([&] { return fun(argc, argv); }); + using namespace folly::gen; + + auto tools = from(functions) | get<0>() | unsplit(", "); + + // clang-format off + std::cout << tool_header("dwarfs-universal") + << "Command line options:\n" + << " --tool= " + "which tool to run; available tools are:\n" + << " " + << tools << "\n"; + // clang-format on + + return 0; }