v2.0.2-rc (#27)
Some checks reported errors
BlockStorage/repertory/pipeline/head Something is wrong with the build of this commit

## v2.0.2-rc

### BREAKING CHANGES

* Refactored `config.json` - will need to verify configuration settings prior to mounting

### Issues

* \#12 \[Unit Test\] Complete all providers unit tests
* \#14 \[Unit Test\] SQLite mini-ORM unit tests and cleanup
* \#16 Add support for bucket name in Sia provider
* \#17 Update to common c++ build system
  * A single 64-bit Linux Jenkins server is used to build all Linux and Windows versions
  * All dependency sources are now included
  * MSVC is no longer supported
  * MSYS2 is required for building Windows binaries on Windows
  * OS X support is temporarily disabled
* \#19 \[bug\] Rename file is broken for files that are existing
* \#23 \[bug\] Incorrect file size displayed while upload is pending
* \#24 RocksDB implementations should be transactional
* \#25 Writes should block when maximum cache size is reached
* \#26 Complete ring buffer and direct download support

### Changes from v2.0.1-rc

* Ability to choose between RocksDB and SQLite databases
* Added direct reads and implemented download fallback
* Corrected file times on S3 and Sia providers
* Corrected handling of `chown()` and `chmod()`
* Fixed erroneous download of chunks after resize

Reviewed-on: #27
This commit is contained in:
2024-12-28 15:56:40 -06:00
parent 1b8de3b097
commit 8dd46b8ad8
790 changed files with 49979 additions and 417734 deletions

139
cmake/libraries/boost.cmake Normal file
View File

@@ -0,0 +1,139 @@
if(PROJECT_ENABLE_BOOST)
if(PROJECT_ENABLE_LIBBITCOIN_SYSTEM)
set(BOOST_MAJOR_VERSION ${BOOST2_MAJOR_VERSION})
set(BOOST_MINOR_VERSION ${BOOST2_MINOR_VERSION})
set(BOOST_PATCH_VERSION ${BOOST2_PATCH_VERSION})
endif()
set(BOOST_ROOT ${PROJECT_EXTERNAL_BUILD_ROOT})
set(BOOST_INCLUDE_DIR ${BOOST_ROOT}/include/boost-${BOOST_MINOR_VERSION}_${BOOST_MINOR_VERSION})
set(PROJECT_EXTERNAL_CMAKE_FLAGS
${PROJECT_EXTERNAL_CMAKE_FLAGS}
-DBUILD_SHARED_LIBS=${PROJECT_BUILD_SHARED_LIBS}
-DBOOST_INCLUDE_DIR=${BOOST_INCLUDE_DIR}
-DBOOST_ROOT=${BOOST_ROOT}
)
if(PROJECT_BUILD)
add_definitions(-DPROJECT_ENABLE_BOOST)
if (PROJECT_ENABLE_LIBBITCOIN_SYSTEM)
find_package(Boost ${BOOST_MAJOR_VERSION}.${BOOST_MINOR_VERSION}.${BOOST_PATCH_VERSION} EXACT
REQUIRED
COMPONENTS
atomic
chrono
date_time
filesystem
iostreams
locale
log
log_setup
program_options
random
regex
serialization
system
thread
wserialization
)
else()
find_package(Boost ${BOOST_MAJOR_VERSION}.${BOOST_MINOR_VERSION}.${BOOST_PATCH_VERSION}
REQUIRED
COMPONENTS
atomic
chrono
date_time
filesystem
iostreams
locale
log
log_setup
program_options
random
regex
serialization
system
thread
wserialization
)
endif()
include_directories(BEFORE SYSTEM
${Boost_INCLUDE_DIRS}
)
link_libraries(
${Boost_LIBRARIES}
)
elseif(NOT PROJECT_IS_MINGW OR CMAKE_HOST_WIN32)
if (PROJECT_ENABLE_LIBBITCOIN_SYSTEM OR NOT CMAKE_HOST_WIN32)
if(PROJECT_CMAKE_BUILD_TYPE STREQUAL "Debug")
set(BOOST_BUILD_TYPE_LOWER debug)
else()
set(BOOST_BUILD_TYPE_LOWER release)
endif()
if(PROJECT_IS_ARM64)
set(BOOST_ARCH arm)
else()
set(BOOST_ARCH x86)
endif()
if(PROJECT_STATIC_LINK)
set(BOOST_LINK static)
else()
set(BOOST_LINK "static,shared")
endif()
set(BOOST_BUILD_ARGS
--openssldir=$ENV{OPENSSL_ROOT_DIR}
--prefix=${PROJECT_EXTERNAL_BUILD_ROOT}
address-model=64
architecture=${BOOST_ARCH}
cxxstd=20
cxxstd-dialect=gnu
cxxflags=-std=gnu++${CMAKE_CXX_STANDARD}
cxxstd=${CMAKE_CXX_STANDARD}
define=BOOST_ASIO_HAS_STD_STRING_VIEW
define=BOOST_SYSTEM_NO_DEPRECATED
link=${BOOST_LINK}
linkflags=-std=gnu++${CMAKE_CXX_STANDARD}
threading=multi
variant=${BOOST_BUILD_TYPE_LOWER}
)
if(PROJECT_ENABLE_LIBBITCOIN_SYSTEM)
set(BOOST_URL_HASH SHA256=${BOOST2_HASH})
else()
set(BOOST_URL_HASH SHA256=${BOOST_HASH})
endif()
ExternalProject_Add(boost_project
PREFIX external
URL ${PROJECT_3RD_PARTY_DIR}/boost_${BOOST_MAJOR_VERSION}_${BOOST_MINOR_VERSION}_${BOOST_PATCH_VERSION}.tar.gz
URL_HASH ${BOOST_URL_HASH}
BUILD_IN_SOURCE 1
LIST_SEPARATOR |
CONFIGURE_COMMAND ./bootstrap.sh
--with-libraries=atomic,chrono,date_time,filesystem,iostreams,locale,log,program_options,random,regex,serialization,system,test,thread
BUILD_COMMAND
./b2
-j1
${BOOST_BUILD_ARGS}
INSTALL_COMMAND
./b2
-j1
${BOOST_BUILD_ARGS}
install
)
list(APPEND PROJECT_DEPENDENCIES boost_project)
if (NOT CMAKE_HOST_WIN32)
add_dependencies(boost_project openssl_project)
endif()
endif()
endif()
endif()

View File

@@ -0,0 +1,32 @@
if(PROJECT_ENABLE_CPP_HTTPLIB)
if(PROJECT_BUILD)
add_definitions(
-DCPPHTTPLIB_OPENSSL_SUPPORT
-DCPPHTTPLIB_TCP_NODELAY=true
-DCPPHTTPLIB_ZLIB_SUPPORT
-DPROJECT_ENABLE_CPP_HTTPLIB
)
elseif(NOT PROJECT_IS_MINGW OR CMAKE_HOST_WIN32)
ExternalProject_Add(cpphttplib_project
PREFIX external
URL ${PROJECT_3RD_PARTY_DIR}/cpp-httplib-${CPP_HTTPLIB_VERSION}.tar.gz
URL_HASH SHA256=${CPP_HTTPLIB_HASH}
LIST_SEPARATOR |
CMAKE_ARGS ${PROJECT_EXTERNAL_CMAKE_FLAGS}
-DBUILD_SHARED_LIBS=${PROJECT_BUILD_SHARED_LIBS}
-DBUILD_STATIC_LIBS=ON
-DHTTPLIB_REQUIRE_OPENSSL=${PROJECT_ENABLE_OPENSSL}
-DHTTPLIB_REQUIRE_ZLIB=ON
-DHTTPLIB_REQUIRE_BROTLI=OFF
-DHTTPLIB_TEST=OFF
-DOPENSSL_USE_STATIC_LIBS=${OPENSSL_USE_STATIC_LIBS}
)
list(APPEND PROJECT_DEPENDENCIES cpphttplib_project)
add_dependencies(cpphttplib_project curl_project)
if (NOT CMAKE_HOST_WIN32)
add_dependencies(cpphttplib_project openssl_project)
endif()
endif()
endif()

View File

@@ -0,0 +1,49 @@
if(PROJECT_ENABLE_CURL)
if(PROJECT_BUILD)
add_definitions(-DPROJECT_ENABLE_CURL)
find_package(CURL ${CURL_VERSION} REQUIRED)
include_directories(BEFORE SYSTEM ${CURL_INCLUDE_DIRS})
link_libraries(CURL::libcurl)
if (EXISTS ${PROJECT_DIST_DIR}/cacert.pem)
file(REMOVE ${PROJECT_DIST_DIR}/cacert.pem)
endif()
file(DOWNLOAD https://curl.haxx.se/ca/cacert.pem ${PROJECT_DIST_DIR}/cacert.pem)
elseif(NOT PROJECT_IS_MINGW OR CMAKE_HOST_WIN32)
ExternalProject_Add(curl_project
PREFIX external
URL ${PROJECT_3RD_PARTY_DIR}/curl-${CURL_VERSION}.tar.gz
URL_HASH SHA256=${CURL_HASH}
LIST_SEPARATOR |
CMAKE_ARGS
${PROJECT_EXTERNAL_CMAKE_FLAGS}
-DBUILD_SHARED_LIBS=${PROJECT_BUILD_SHARED_LIBS}
-DBUILD_STATIC_LIBS=ON
-DBUILD_CURL_EXE=OFF
-DBUILD_STATIC_CURL=ON
-DBUILD_STATIC_LIBS=ON
-DBUILD_TESTING=OFF
-DCURL_CA_BUNDLE=./cacert.pem
-DCURL_CA_FALLBACK=ON
-DCURL_DISABLE_LDAP=ON
-DCURL_USE_LIBPSL=OFF
-DCURL_USE_LIBSSH2=OFF
-DCURL_USE_OPENSSL=${PROJECT_ENABLE_OPENSSL}
-DCURL_ZLIB=ON
-DENABLE_THREADED_RESOLVER=ON
-DOPENSSL_ROOT_DIR=${OPENSSL_ROOT_DIR}
-DOPENSSL_USE_STATIC_LIBS=${OPENSSL_USE_STATIC_LIBS}
-DUSE_LIBIDN2=OFF
-DZLIB_USE_STATIC_LIBS=${ZLIB_USE_STATIC_LIBS}
)
list(APPEND PROJECT_DEPENDENCIES curl_project)
if (NOT CMAKE_HOST_WIN32)
add_dependencies(curl_project openssl_project)
endif()
endif()
endif()

View File

@@ -0,0 +1,37 @@
if(PROJECT_ENABLE_FUSE AND NOT PROJECT_IS_MINGW)
if(PROJECT_BUILD)
add_definitions(-DPROJECT_ENABLE_FUSE)
include_directories(BEFORE SYSTEM ${PROJECT_FUSE_INCLUDE_DIRS})
if(PROJECT_FUSE STREQUAL "fuse3")
add_definitions(-DFUSE_USE_VERSION=30)
if(PROJECT_STATIC_LINK)
link_libraries(libfuse3.a)
else()
link_libraries(fuse3)
endif()
elseif(PROJECT_FUSE STREQUAL "fuse2")
add_definitions(-DFUSE_USE_VERSION=29)
if(PROJECT_STATIC_LINK)
link_libraries(libfuse.a)
else()
link_libraries(fuse)
endif()
endif()
else()
pkg_check_modules(LIBFUSE3 fuse3>=3.0.0)
if(LIBFUSE3_FOUND)
set(PROJECT_FUSE fuse3)
set(PROJECT_FUSE_INCLUDE_DIRS ${LIBFUSE3_INCLUDE_DIRS})
else()
pkg_check_modules(LIBFUSE2 fuse>=2.9.0)
if(LIBFUSE2_FOUND)
set(PROJECT_FUSE fuse2)
set(PROJECT_FUSE_INCLUDE_DIRS ${LIBFUSE2_INCLUDE_DIRS})
else()
message(FATAL_ERROR "fuse library not found")
endif()
endif()
endif()
endif()

View File

@@ -0,0 +1,28 @@
if(PROJECT_ENABLE_JSON)
if(PROJECT_BUILD)
add_definitions(-DPROJECT_ENABLE_JSON)
find_package(nlohmann_json ${JSON_VERSION} REQUIRED)
if(PROJECT_IS_MINGW AND PROJECT_IS_MINGW_UNIX)
include_directories(BEFORE SYSTEM /mingw64/include/nlohmann)
else()
include_directories(BEFORE SYSTEM ${PROJECT_EXTERNAL_BUILD_ROOT}/include/nlohmann)
endif()
elseif(NOT PROJECT_IS_MINGW OR CMAKE_HOST_WIN32)
ExternalProject_Add(json_project
PREFIX external
URL ${PROJECT_3RD_PARTY_DIR}/json-${JSON_VERSION}.tar.gz
URL_HASH SHA256=${JSON_HASH}
LIST_SEPARATOR |
CMAKE_ARGS ${PROJECT_EXTERNAL_CMAKE_FLAGS}
-DBUILD_SHARED_LIBS=${PROJECT_BUILD_SHARED_LIBS}
-DBUILD_STATIC_LIBS=ON
-DJSON_BuildTests=OFF
-DJSON_Install=ON
-DJSON_MultipleHeaders=OFF
)
list(APPEND PROJECT_DEPENDENCIES json_project)
endif()
endif()

View File

@@ -0,0 +1,48 @@
if(PROJECT_ENABLE_LIBSODIUM)
if(PROJECT_BUILD)
pkg_check_modules(SODIUM libsodium>=${LIBSODIUM_VERSION} REQUIRED)
add_definitions(-DPROJECT_ENABLE_LIBSODIUM)
include_directories(BEFORE SYSTEM ${SODIUM_INCLUDE_DIRS})
if(PROJECT_IS_MINGW_UNIX)
if(PROJECT_STATIC_LINK)
link_libraries(/mingw64/lib/libsodium.a)
else()
link_libraries(/mingw64/lib/libsodium.dll.a)
endif()
else()
link_libraries(${SODIUM_LIBRARIES})
endif()
elseif(NOT PROJECT_IS_MINGW)
if(PROJECT_IS_MINGW)
set(LIBSODIUM_TYPE mingw64)
else()
set(LIBSODIUM_TYPE linux)
endif()
if(PROJECT_BUILD_SHARED_LIBS)
set(LIBSODIUM_ENABLE_SHARED yes)
else()
set(LIBSODIUM_ENABLE_SHARED no)
endif()
ExternalProject_Add(libsodium_project
PREFIX external
URL ${PROJECT_3RD_PARTY_DIR}/libsodium-${LIBSODIUM_VERSION}.tar.gz
URL_HASH SHA256=${LIBSODIUM_HASH}
BUILD_IN_SOURCE 1
LIST_SEPARATOR |
CONFIGURE_COMMAND ${PROJECT_3RD_PARTY_DIR}/libsodium_configure.sh
${LIBSODIUM_TYPE}
${PROJECT_MARCH}
${PROJECT_EXTERNAL_BUILD_ROOT}
${LIBSODIUM_ENABLE_SHARED}
BUILD_COMMAND make -j1
INSTALL_COMMAND make install
)
list(APPEND PROJECT_DEPENDENCIES libsodium_project)
endif()
endif()

View File

@@ -0,0 +1,53 @@
set(OPENSSL_ROOT_DIR $ENV{OPENSSL_ROOT_DIR})
if(PROJECT_ENABLE_OPENSSL)
if(PROJECT_BUILD)
add_definitions(-DPROJECT_ENABLE_OPENSSL)
find_package(OpenSSL ${OPENSSL_VERSION} REQUIRED)
include_directories(BEFORE SYSTEM ${OPENSSL_INCLUDE_DIR})
link_libraries(
OpenSSL::Crypto
OpenSSL::SSL
)
elseif(NOT PROJECT_IS_MINGW)
if(PROJECT_IS_MINGW)
set(OPENSSL_COMPILE_TYPE mingw64)
elseif(PROJECT_IS_ARM64)
set(OPENSSL_COMPILE_TYPE linux-aarch64)
else()
set(OPENSSL_COMPILE_TYPE linux-x86_64)
endif()
if(PROJECT_IS_MINGW_UNIX)
set(OPENSSL_CROSS_PREFIX "--cross-compile-prefix=x86_64-w64-mingw32-")
endif()
if(PROJECT_BUILD_SHARED_LIBS)
set(OPENSSL_NO_SHARED shared)
else()
set(OPENSSL_NO_SHARED no-shared)
endif()
ExternalProject_Add(openssl_project
PREFIX external
URL ${PROJECT_3RD_PARTY_DIR}/openssl-${OPENSSL_VERSION}.tar.gz
URL_HASH SHA256=${OPENSSL_HASH}
BUILD_IN_SOURCE 1
LIST_SEPARATOR |
CONFIGURE_COMMAND ./Configure
${OPENSSL_COMPILE_TYPE}
${OPENSSL_CROSS_PREFIX}
--prefix=${PROJECT_EXTERNAL_BUILD_ROOT}
no-apps
no-docs
${OPENSSL_NO_SHARED}
BUILD_COMMAND make -j1
INSTALL_COMMAND make install
)
list(APPEND PROJECT_DEPENDENCIES openssl_project)
endif()
endif()

View File

@@ -0,0 +1,27 @@
if(PROJECT_ENABLE_PUGIXML)
if(PROJECT_BUILD)
add_definitions(-DPROJECT_ENABLE_PUGIXML)
find_package(pugixml ${PUGIXML_VERSION} REQUIRED)
include_directories(BEFORE SYSTEM ${PUGIXML_INCLUDE_DIR})
if(PROJECT_STATIC_LINK)
link_libraries(pugixml::static)
else()
link_libraries(pugixml::pugixml)
endif()
elseif(NOT PROJECT_IS_MINGW)
ExternalProject_Add(pugixml_project
PREFIX external
URL ${PROJECT_3RD_PARTY_DIR}/pugixml-${PUGIXML_VERSION}.tar.gz
URL_HASH SHA256=${PUGIXML_HASH}
LIST_SEPARATOR |
CMAKE_ARGS ${PROJECT_EXTERNAL_CMAKE_FLAGS}
-DBUILD_SHARED_LIBS=${PROJECT_BUILD_SHARED_LIBS}
-DBUILD_STATIC_LIBS=ON
)
list(APPEND PROJECT_DEPENDENCIES pugixml_project)
endif()
endif()

View File

@@ -0,0 +1,34 @@
if(PROJECT_ENABLE_ROCKSDB)
if(PROJECT_BUILD)
add_definitions(-DPROJECT_ENABLE_ROCKSDB)
find_library(ROCKSDB_LIBRARY NAMES librocksdb.a REQUIRED)
link_libraries(${ROCKSDB_LIBRARY})
elseif(NOT PROJECT_IS_MINGW OR CMAKE_HOST_WIN32)
ExternalProject_Add(rocksdb_project
PREFIX external
URL ${PROJECT_3RD_PARTY_DIR}/rocksdb-${ROCKSDB_VERSION}.tar.gz
URL_HASH SHA256=${ROCKSDB_HASH}
LIST_SEPARATOR |
CMAKE_ARGS ${PROJECT_EXTERNAL_CMAKE_FLAGS}
-DBUILD_SHARED_LIBS=OFF
-DBUILD_STATIC_LIBS=ON
-DFAIL_ON_WARNINGS=OFF
-DPORTABLE=1
-DROCKSDB_BUILD_SHARED=OFF
-DROCKSDB_INSTALL_ON_WINDOWS=ON
-DWITH_BENCHMARK=OFF
-DWITH_BENCHMARK_TOOLS=OFF
-DWITH_CORE_TOOLS=OFF
-DWITH_EXAMPLES=OFF
-DWITH_GFLAGS=OFF
-DWITH_IOSTATS_CONTEXT=OFF
-DWITH_PERF_CONTEXT=OFF
-DWITH_TESTS=OFF
-DWITH_TOOLS=OFF
-DWITH_TRACE_TOOLS=OFF
-DWITH_ZLIB=ON
)
list(APPEND PROJECT_DEPENDENCIES rocksdb_project)
endif()
endif()

View File

@@ -0,0 +1,25 @@
if(PROJECT_ENABLE_SPDLOG)
if(PROJECT_BUILD)
add_definitions(-DPROJECT_ENABLE_SPDLOG)
find_package(spdlog ${SPDLOG_VERSION} REQUIRED)
include_directories(BEFORE SYSTEM ${SPDLOG_INCLUDE_DIRS})
link_libraries(spdlog::spdlog)
elseif(NOT PROJECT_IS_MINGW OR CMAKE_HOST_WIN32)
ExternalProject_Add(spdlog_project
PREFIX external
URL ${PROJECT_3RD_PARTY_DIR}/spdlog-${SPDLOG_VERSION}.tar.gz
URL_HASH SHA256=${SPDLOG_HASH}
LIST_SEPARATOR |
CMAKE_ARGS ${PROJECT_EXTERNAL_CMAKE_FLAGS}
-DBUILD_SHARED_LIBS=${PROJECT_BUILD_SHARED_LIBS}
-DSPDLOG_BUILD_EXAMPLE=OFF
-DSPDLOG_FMT_EXTERNAL=OFF
-DSPDLOG_FMT_EXTERNAL_HO=OFF
)
list(APPEND PROJECT_DEPENDENCIES spdlog_project)
endif()
endif()

View File

@@ -0,0 +1,29 @@
if(PROJECT_ENABLE_SQLITE)
if(PROJECT_BUILD)
add_definitions(-DPROJECT_ENABLE_SQLITE)
if (PROJECT_IS_MINGW AND NOT PROJECT_IS_MINGW_UNIX)
pkg_check_modules(SQLITE3 REQUIRED sqlite3>=${SQLITE2_VERSION})
include_directories(SYSTEM BEFORE ${SQLITE3_INCLUDE_DIRS})
link_libraries(${SQLITE3_LIBRARIES})
else()
set(SQLITE_SYSTEM_ROOT ${PROJECT_BUILD_DIR}/external/src/sqlite_project)
include_directories(SYSTEM BEFORE ${SQLITE_SYSTEM_ROOT})
list(APPEND PROJECT_ADDITIONAL_SOURCES
${SQLITE_SYSTEM_ROOT}/sqlite3.c
)
endif()
elseif(NOT PROJECT_IS_MINGW OR PROJECT_IS_MINGW_UNIX)
ExternalProject_Add(sqlite_project
PREFIX external
URL ${PROJECT_3RD_PARTY_DIR}/sqlite-amalgamation-${SQLITE_VERSION}.zip
URL_HASH SHA256=${SQLITE_HASH}
CONFIGURE_COMMAND echo "No configure"
BUILD_COMMAND echo "No build"
INSTALL_COMMAND echo "No install"
)
list(APPEND PROJECT_DEPENDENCIES sqlite_project)
endif()
endif()

View File

@@ -0,0 +1,26 @@
if(PROJECT_ENABLE_STDUUID)
if(PROJECT_BUILD)
add_definitions(-DPROJECT_ENABLE_STDUUID)
find_package(stduuid REQUIRED)
include_directories(BEFORE SYSTEM ${stduuid_INCLUDE_DIRS})
link_libraries(${stduuid_LIBRARIES})
elseif(NOT PROJECT_IS_MINGW OR CMAKE_HOST_WIN32)
ExternalProject_Add(stduuid_project
PREFIX external
URL ${PROJECT_3RD_PARTY_DIR}/stduuid-${STDUUID_VERSION}.tar.gz
URL_HASH SHA256=${STDUUID_HASH}
LIST_SEPARATOR |
CMAKE_ARGS ${PROJECT_EXTERNAL_CMAKE_FLAGS}
-DBUILD_SHARED_LIBS=${PROJECT_BUILD_SHARED_LIBS}
-DBUILD_STATIC_LIBS=ON
-DUUID_BUILD_TESTS=OFF
-DUUID_ENABLE_INSTALL=ON
-DUUID_USING_CXX20_SPAN=ON
)
list(APPEND PROJECT_DEPENDENCIES stduuid_project)
endif()
endif()

View File

@@ -0,0 +1,17 @@
if (PROJECT_ENABLE_TESTING)
if(PROJECT_BUILD)
add_definitions(-DPROJECT_ENABLE_TESTING)
elseif(NOT PROJECT_IS_MINGW)
ExternalProject_Add(gtest_project
PREFIX external
URL ${PROJECT_3RD_PARTY_DIR}/googletest-${GTEST_VERSION}.tar.gz
URL_HASH SHA256=${GTEST_HASH}
LIST_SEPARATOR |
CMAKE_ARGS ${PROJECT_EXTERNAL_CMAKE_FLAGS}
-DBUILD_SHARED_LIBS=${PROJECT_BUILD_SHARED_LIBS}
-DBUILD_STATIC_LIBS=ON
)
list(APPEND PROJECT_DEPENDENCIES gtest_project)
endif()
endif()

View File

@@ -0,0 +1,15 @@
if(PROJECT_ENABLE_WINFSP AND PROJECT_IS_MINGW)
if(PROJECT_BUILD)
add_definitions(-DPROJECT_ENABLE_WINFSP)
include_directories(BEFORE SYSTEM ${PROJECT_3RD_PARTY_DIR}/winfsp-2.0/inc)
link_directories(BEFORE ${PROJECT_3RD_PARTY_DIR}/winfsp-2.0/lib)
if(PROJECT_IS_ARM64)
link_libraries(winfsp-a64)
else()
link_libraries(winfsp-x64)
endif()
endif()
endif()