From b82dd1d94fcd1a6a9c62564aa5e3e373a6ee7f26 Mon Sep 17 00:00:00 2001 From: Marcus Holland-Moritz Date: Tue, 4 Jul 2023 09:44:32 +0200 Subject: [PATCH] dwarfs-universal fixes for Windows build --- CMakeLists.txt | 4 ++-- src/universal.cpp | 45 +++++++++++++++++++++++++++++++++++++++------ 2 files changed, 41 insertions(+), 8 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 7638721c..b260ece4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -489,7 +489,7 @@ target_link_libraries(dwarfsck dwarfsck_main) target_link_libraries(dwarfsbench dwarfsbench_main) target_link_libraries(dwarfsextract dwarfsextract_main) target_link_libraries(dwarfsuniversal mkdwarfs_main dwarfsck_main - dwarfsbench_main dwarfsextract_main) + dwarfsextract_main) set_target_properties(dwarfsuniversal PROPERTIES RUNTIME_OUTPUT_DIRECTORY universal OUTPUT_NAME dwarfs-universal) @@ -516,8 +516,8 @@ if(FUSE3_FOUND OR WINFSP) add_executable(dwarfs-bin src/dwarfs.cpp) target_link_libraries(dwarfs-bin dwarfs_main) set_target_properties(dwarfs-bin PROPERTIES OUTPUT_NAME dwarfs) + target_link_libraries(dwarfsuniversal dwarfs_main) if(NOT WIN32) - target_link_libraries(dwarfsuniversal dwarfs_main) add_custom_command(OUTPUT mount.dwarfs COMMAND ${CMAKE_COMMAND} -E create_symlink dwarfs mount.dwarfs DEPENDS dwarfs) diff --git a/src/universal.cpp b/src/universal.cpp index 8883f79e..ffe2d1dc 100644 --- a/src/universal.cpp +++ b/src/universal.cpp @@ -19,6 +19,7 @@ * along with dwarfs. If not, see . */ +#include #include #include #include @@ -36,8 +37,40 @@ namespace { using namespace dwarfs; -std::map const functions{ +std::string to_narrow_string(sys_char const* str) { +#ifdef _WIN32 + std::wstring_view view(str); + std::string rv(view.size(), 0); + std::transform(view.begin(), view.end(), rv.begin(), + [](sys_char c) { return static_cast(c); }); + return rv; +#else + return std::string(str); +#endif +} + +#ifdef _WIN32 +int dwarfs_main_helper(int argc, sys_char** argv) { + std::vector argv_strings; + std::vector argv_copy; + argv_strings.reserve(argc); + argv_copy.reserve(argc); + + for (int i = 0; i < argc; ++i) { + argv_strings.push_back(to_narrow_string(argv[i])); + argv_copy.push_back(argv_strings.back().data()); + } + + return dwarfs_main(argc, argv_copy.data()); +} +#endif + +std::map const functions{ +#ifdef _WIN32 + {"dwarfs", &dwarfs_main_helper}, +#else {"dwarfs", &dwarfs_main}, +#endif {"mkdwarfs", &mkdwarfs_main}, {"dwarfsck", &dwarfsck_main}, {"dwarfsextract", &dwarfsextract_main}, @@ -46,16 +79,16 @@ std::map const functions{ } // namespace -int main(int argc, char** argv) { +int SYS_MAIN(int argc, sys_char** argv) { if (argc > 1) { - std::string_view tool_arg(argv[1]); + auto tool_arg = to_narrow_string(argv[1]); if (tool_arg.starts_with("--tool=")) { if (auto it = functions.find(tool_arg.substr(7)); it != functions.end()) { - std::vector argv_copy; + 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 safe_main( [&] { return it->second(argc - 1, argv_copy.data()); }); } } @@ -66,7 +99,7 @@ int main(int argc, char** argv) { if (auto it = functions.find(path.filename().string()); it != functions.end()) { - return dwarfs::safe_main([&] { return it->second(argc, argv); }); + return safe_main([&] { return it->second(argc, argv); }); } #endif