build: add dwarfs-fuse-extract semi-universal binary

This commit is contained in:
Marcus Holland-Moritz 2025-04-02 17:27:34 +02:00
parent c8a426ff38
commit 2f053d89a7
2 changed files with 75 additions and 12 deletions

View File

@ -37,6 +37,7 @@ option(ENABLE_PERFMON "enable performance monitor in all tools" ON)
option(TRY_ENABLE_FLAC "build with FLAC support" ON) option(TRY_ENABLE_FLAC "build with FLAC support" ON)
option(ENABLE_RICEPP "build with RICEPP compression support" ON) option(ENABLE_RICEPP "build with RICEPP compression support" ON)
option(WITH_UNIVERSAL_BINARY "build with universal binary" OFF) option(WITH_UNIVERSAL_BINARY "build with universal binary" OFF)
option(WITH_FUSE_EXTRACT_BINARY "build with fuse-extract binary" OFF)
option(WITH_PXATTR "build with pxattr binary" OFF) option(WITH_PXATTR "build with pxattr binary" OFF)
option(WITH_EXAMPLE "build with example binary" OFF) option(WITH_EXAMPLE "build with example binary" OFF)
option(ENABLE_STACKTRACE "build with stack trace support" OFF) option(ENABLE_STACKTRACE "build with stack trace support" OFF)
@ -282,11 +283,36 @@ if(WITH_TOOLS)
add_executable(dwarfsuniversal tools/src/universal.cpp) add_executable(dwarfsuniversal tools/src/universal.cpp)
list(APPEND BINARY_TARGETS dwarfsuniversal) list(APPEND BINARY_TARGETS dwarfsuniversal)
target_compile_definitions(dwarfsuniversal PRIVATE
DWARFS_UNIVERSAL_NAME=\"dwarfs-universal\"
DWARFS_UNIVERSAL_MKDWARFS
DWARFS_UNIVERSAL_DWARFSCK
DWARFS_UNIVERSAL_DWARFSEXTRACT
)
target_link_libraries(dwarfsuniversal PRIVATE target_link_libraries(dwarfsuniversal PRIVATE
mkdwarfs_main dwarfsck_main dwarfsextract_main) mkdwarfs_main dwarfsck_main dwarfsextract_main
)
set_target_properties(dwarfsuniversal PROPERTIES set_target_properties(dwarfsuniversal PROPERTIES
RUNTIME_OUTPUT_DIRECTORY universal RUNTIME_OUTPUT_DIRECTORY universal
OUTPUT_NAME dwarfs-universal) OUTPUT_NAME dwarfs-universal
)
endif()
if(WITH_FUSE_EXTRACT_BINARY)
add_executable(dwarfsfuseextract tools/src/universal.cpp)
list(APPEND BINARY_TARGETS dwarfsfuseextract)
target_compile_definitions(dwarfsfuseextract PRIVATE
DWARFS_UNIVERSAL_NAME=\"dwarfs-fuse-extract\"
DWARFS_UNIVERSAL_DWARFSEXTRACT
)
target_link_libraries(dwarfsfuseextract PRIVATE
dwarfsextract_main
)
set_target_properties(dwarfsfuseextract PROPERTIES
RUNTIME_OUTPUT_DIRECTORY universal
OUTPUT_NAME dwarfs-fuse-extract
)
endif() endif()
endif() endif()
@ -321,9 +347,15 @@ if(WITH_FUSE_DRIVER)
target_link_libraries(dwarfs_main PRIVATE ${WINFSP}) target_link_libraries(dwarfs_main PRIVATE ${WINFSP})
target_link_libraries(dwarfs-bin PRIVATE delayimp.lib) target_link_libraries(dwarfs-bin PRIVATE delayimp.lib)
target_link_options(dwarfs-bin PRIVATE /DELAYLOAD:winfsp-x64.dll) target_link_options(dwarfs-bin PRIVATE /DELAYLOAD:winfsp-x64.dll)
if(WITH_UNIVERSAL_BINARY) if(TARGET dwarfsuniversal)
target_link_libraries(dwarfsuniversal PRIVATE delayimp.lib) target_link_libraries(dwarfsuniversal PRIVATE delayimp.lib)
target_link_options(dwarfsuniversal PRIVATE /DELAYLOAD:winfsp-x64.dll) target_link_options(dwarfsuniversal PRIVATE /DELAYLOAD:winfsp-x64.dll)
target_compile_definitions(dwarfsuniversal PRIVATE DWARFS_UNIVERSAL_FUSE_DRIVER)
endif()
if(TARGET dwarfsfuseextract)
target_link_libraries(dwarfsfuseextract PRIVATE delayimp.lib)
target_link_options(dwarfsfuseextract PRIVATE /DELAYLOAD:winfsp-x64.dll)
target_compile_definitions(dwarfsfuseextract PRIVATE DWARFS_UNIVERSAL_FUSE_DRIVER)
endif() endif()
elseif(APPLE) elseif(APPLE)
target_compile_definitions(dwarfs_main PRIVATE FUSE_USE_VERSION=29) target_compile_definitions(dwarfs_main PRIVATE FUSE_USE_VERSION=29)
@ -332,8 +364,13 @@ if(WITH_FUSE_DRIVER)
target_compile_definitions(dwarfs_main PRIVATE FUSE_USE_VERSION=35) target_compile_definitions(dwarfs_main PRIVATE FUSE_USE_VERSION=35)
target_link_libraries(dwarfs_main PRIVATE PkgConfig::FUSE3) target_link_libraries(dwarfs_main PRIVATE PkgConfig::FUSE3)
endif() endif()
if(WITH_UNIVERSAL_BINARY) if(TARGET dwarfsuniversal)
target_link_libraries(dwarfsuniversal PRIVATE dwarfs_main) target_link_libraries(dwarfsuniversal PRIVATE dwarfs_main)
target_compile_definitions(dwarfsuniversal PRIVATE DWARFS_UNIVERSAL_FUSE_DRIVER)
endif()
if(TARGET dwarfsfuseextract)
target_link_libraries(dwarfsfuseextract PRIVATE dwarfs_main)
target_compile_definitions(dwarfsfuseextract PRIVATE DWARFS_UNIVERSAL_FUSE_DRIVER)
endif() endif()
if(WINFSP) if(WINFSP)
install(TARGETS dwarfs-bin RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) install(TARGETS dwarfs-bin RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
@ -358,8 +395,13 @@ if(WITH_FUSE_DRIVER)
target_link_libraries(dwarfs2_main PRIVATE PkgConfig::FUSE) target_link_libraries(dwarfs2_main PRIVATE PkgConfig::FUSE)
add_executable(dwarfs2-bin tools/src/dwarfs.cpp) add_executable(dwarfs2-bin tools/src/dwarfs.cpp)
target_link_libraries(dwarfs2-bin PRIVATE dwarfs2_main) target_link_libraries(dwarfs2-bin PRIVATE dwarfs2_main)
if(WITH_UNIVERSAL_BINARY AND (NOT FUSE3_FOUND)) if(TARGET dwarfsuniversal AND (NOT FUSE3_FOUND))
target_link_libraries(dwarfsuniversal PRIVATE dwarfs2_main) target_link_libraries(dwarfsuniversal PRIVATE dwarfs2_main)
target_compile_definitions(dwarfsuniversal PRIVATE DWARFS_UNIVERSAL_FUSE_DRIVER)
endif()
if(TARGET dwarfsfuseextract AND (NOT FUSE3_FOUND))
target_link_libraries(dwarfsfuseextract PRIVATE dwarfs2_main)
target_compile_definitions(dwarfsfuseextract PRIVATE DWARFS_UNIVERSAL_FUSE_DRIVER)
endif() endif()
set_target_properties(dwarfs2-bin PROPERTIES OUTPUT_NAME dwarfs2) set_target_properties(dwarfs2-bin PROPERTIES OUTPUT_NAME dwarfs2)
add_custom_command(OUTPUT mount.dwarfs2 add_custom_command(OUTPUT mount.dwarfs2
@ -959,15 +1001,26 @@ if(DWARFS_ARTIFACT_SUFFIX)
endif() endif()
if(STATIC_BUILD_DO_NOT_USE OR WIN32) if(STATIC_BUILD_DO_NOT_USE OR WIN32)
if(WITH_UNIVERSAL_BINARY) if(TARGET dwarfsuniversal)
set(UNIVERSAL_OUT "dwarfs-universal-${DWARFS_ARTIFACT_ID}${CMAKE_EXECUTABLE_SUFFIX}") list(APPEND UNIVERSAL_TARGETS dwarfsuniversal)
endif()
if(TARGET dwarfsfuseextract)
list(APPEND UNIVERSAL_TARGETS dwarfsfuseextract)
endif()
foreach(tgt ${UNIVERSAL_TARGETS})
get_target_property(TARGET_FILENAME ${tgt} OUTPUT_NAME)
get_filename_component(TARGET_FILENAME ${TARGET_FILENAME} NAME_WLE)
set(UNIVERSAL_OUT ${TARGET_FILENAME}-${DWARFS_ARTIFACT_ID}${CMAKE_EXECUTABLE_SUFFIX})
message(STATUS "Creating universal binary for ${tgt} -> ${UNIVERSAL_OUT}")
if(ENABLE_STACKTRACE) if(ENABLE_STACKTRACE)
message(WARNING "UPX compression is disabled with ENABLE_STACKTRACE") message(WARNING "UPX compression is disabled with ENABLE_STACKTRACE")
add_custom_command( add_custom_command(
OUTPUT ${UNIVERSAL_OUT} OUTPUT ${UNIVERSAL_OUT}
COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:dwarfsuniversal> ${UNIVERSAL_OUT} COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:${tgt}> ${UNIVERSAL_OUT}
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
) )
else() else()
@ -978,13 +1031,15 @@ if(STATIC_BUILD_DO_NOT_USE OR WIN32)
# executable significantly # executable significantly
add_custom_command( add_custom_command(
OUTPUT ${UNIVERSAL_OUT} OUTPUT ${UNIVERSAL_OUT}
COMMAND ${UPX_EXE} -9 --best -o ${UNIVERSAL_OUT} $<TARGET_FILE:dwarfsuniversal> COMMAND ${UPX_EXE} -9 --best -o ${UNIVERSAL_OUT} $<TARGET_FILE:${tgt}>
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
) )
endif() endif()
add_custom_target(universal_upx DEPENDS ${UNIVERSAL_OUT}) list(APPEND UNIVERSAL_UPX_TARGETS ${UNIVERSAL_OUT})
endif() endforeach()
add_custom_target(universal_upx DEPENDS ${UNIVERSAL_UPX_TARGETS})
endif() endif()
if(DEFINED ENV{GITHUB_REF_TYPE}) if(DEFINED ENV{GITHUB_REF_TYPE})

View File

@ -45,10 +45,18 @@ using namespace dwarfs::tool;
using namespace std::string_view_literals; using namespace std::string_view_literals;
constexpr dwarfs::sorted_array_map functions{ constexpr dwarfs::sorted_array_map functions{
#ifdef DWARFS_UNIVERSAL_FUSE_DRIVER
std::pair{"dwarfs"sv, &dwarfs_main}, std::pair{"dwarfs"sv, &dwarfs_main},
#endif
#ifdef DWARFS_UNIVERSAL_MKDWARFS
std::pair{"mkdwarfs"sv, &mkdwarfs_main}, std::pair{"mkdwarfs"sv, &mkdwarfs_main},
#endif
#ifdef DWARFS_UNIVERSAL_DWARFSCK
std::pair{"dwarfsck"sv, &dwarfsck_main}, std::pair{"dwarfsck"sv, &dwarfsck_main},
#endif
#ifdef DWARFS_UNIVERSAL_DWARFSEXTRACT
std::pair{"dwarfsextract"sv, &dwarfsextract_main}, std::pair{"dwarfsextract"sv, &dwarfsextract_main},
#endif
}; };
bool looks_like_executable(std::filesystem::path const& path) { bool looks_like_executable(std::filesystem::path const& path) {
@ -107,7 +115,7 @@ int SYS_MAIN(int argc, sys_char** argv) {
ranges::to<std::string>; ranges::to<std::string>;
// clang-format off // clang-format off
std::cout << tool_header_nodeps("dwarfs-universal") std::cout << tool_header_nodeps(DWARFS_UNIVERSAL_NAME)
<< "Command line options:\n" << "Command line options:\n"
<< " --tool=<name> " << " --tool=<name> "
"which tool to run; available tools are:\n" "which tool to run; available tools are:\n"