diff --git a/CMakeLists.txt b/CMakeLists.txt index 0a9bd352..391a0cf1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -617,11 +617,16 @@ list(APPEND MAIN_TARGETS mkdwarfs_main dwarfsck_main dwarfsbench_main if(FUSE3_FOUND OR WINFSP OR APPLE) add_library(dwarfs_main src/dwarfs_main.cpp) target_compile_definitions(dwarfs_main PRIVATE _FILE_OFFSET_BITS=64) + add_executable(dwarfs-bin src/dwarfs.cpp) + target_link_libraries(dwarfs-bin dwarfs_main) + set_target_properties(dwarfs-bin PROPERTIES OUTPUT_NAME dwarfs) if(WINFSP) target_compile_definitions(dwarfs_main PRIVATE FUSE_USE_VERSION=32 DWARFS_FUSE_LOWLEVEL=0) target_include_directories(dwarfs_main SYSTEM PRIVATE "${WINFSP_PATH}/inc") target_link_libraries(dwarfs_main ${WINFSP}) + target_link_libraries(dwarfs-bin delayimp.lib) + target_link_options(dwarfs-bin PRIVATE /DELAYLOAD:winfsp-x64.dll) if(WITH_UNIVERSAL_BINARY) target_link_libraries(dwarfsuniversal delayimp.lib) target_link_options(dwarfsuniversal PRIVATE /DELAYLOAD:winfsp-x64.dll) @@ -633,9 +638,6 @@ if(FUSE3_FOUND OR WINFSP OR APPLE) target_compile_definitions(dwarfs_main PRIVATE FUSE_USE_VERSION=35) target_link_libraries(dwarfs_main PkgConfig::FUSE3) endif() - add_executable(dwarfs-bin src/dwarfs.cpp) - target_link_libraries(dwarfs-bin dwarfs_main) - set_target_properties(dwarfs-bin PROPERTIES OUTPUT_NAME dwarfs) if(WITH_UNIVERSAL_BINARY) target_link_libraries(dwarfsuniversal dwarfs_main) endif() diff --git a/src/dwarfs_main.cpp b/src/dwarfs_main.cpp index 1e8cc4f0..64ada51e 100644 --- a/src/dwarfs_main.cpp +++ b/src/dwarfs_main.cpp @@ -72,6 +72,7 @@ #endif #ifdef _WIN32 +#include #include #define st_atime st_atim.tv_sec #define st_ctime st_ctim.tv_sec @@ -97,6 +98,7 @@ #include "dwarfs_tool_main.h" namespace { + #ifdef DWARFS_FSP_COMPAT using native_stat = struct ::fuse_stat; using native_statvfs = struct ::fuse_statvfs; @@ -106,8 +108,32 @@ using native_stat = struct ::stat; using native_statvfs = struct ::statvfs; using native_off_t = ::off_t; #endif + +#ifdef _WIN32 +FARPROC WINAPI delay_hook(unsigned dliNotify, PDelayLoadInfo pdli) { + switch (dliNotify) { + case dliFailLoadLib: + std::cerr << "failed to load " << pdli->szDll << "\n"; + break; + + case dliFailGetProc: + std::cerr << "failed to load symbol from " << pdli->szDll << "\n"; + break; + + default: + return NULL; + } + + ::exit(1); +} +#endif + } // namespace +#ifdef _WIN32 +extern "C" const PfnDliHook __pfnDliFailureHook2 = delay_hook; +#endif + namespace dwarfs { namespace { diff --git a/src/universal.cpp b/src/universal.cpp index 4ddc812d..d1e9d74c 100644 --- a/src/universal.cpp +++ b/src/universal.cpp @@ -31,10 +31,6 @@ #include #include -#ifdef _WIN32 -#include -#endif - #include "dwarfs/safe_main.h" #include "dwarfs/tool.h" #include "dwarfs/util.h" @@ -44,25 +40,6 @@ namespace { using namespace dwarfs; -#ifdef _WIN32 -FARPROC WINAPI delay_hook(unsigned dliNotify, PDelayLoadInfo pdli) { - switch (dliNotify) { - case dliFailLoadLib: - std::cerr << "failed to load " << pdli->szDll << "\n"; - break; - - case dliFailGetProc: - std::cerr << "failed to load symbol from " << pdli->szDll << "\n"; - break; - - default: - return NULL; - } - - ::exit(1); -} -#endif - #ifdef _WIN32 #define EXE_EXT ".exe" #else @@ -79,10 +56,6 @@ std::map const functions{ } // namespace -#ifdef _WIN32 -extern "C" const PfnDliHook __pfnDliFailureHook2 = delay_hook; -#endif - int SYS_MAIN(int argc, sys_char** argv) { auto path = std::filesystem::path(argv[0]);