repertory/CMakeLists.txt
Scott E. Graves 3ff46723b8
Some checks failed
BlockStorage/repertory_osx/pipeline/head There was a failure building this commit
BlockStorage/repertory_windows/pipeline/head This commit looks good
BlockStorage/repertory_linux_builds/pipeline/head This commit looks good
initial commit
2022-03-05 00:30:50 -06:00

509 lines
14 KiB
CMake

cmake_minimum_required(VERSION 3.22)
project(repertory)
include(CheckIncludeFiles)
include(CheckIncludeFileCXX)
include(ExternalProject)
set(AWSCPP_VERSION 1.9.206)
set(BOOST_MAJOR_VERSION 1)
set(BOOST_MINOR_VERSION 78)
set(BOOST_MSVC_TOOLSET msvc-14.2)
set(BOOST_MSVC_TOOLSET_DLL 142)
set(BOOST_REVISION 0)
set(BOOST_VERSION ${BOOST_MAJOR_VERSION}.${BOOST_MINOR_VERSION}.${BOOST_REVISION})
set(BOOST_VERSION_DL ${BOOST_MAJOR_VERSION}_${BOOST_MINOR_VERSION}_${BOOST_REVISION})
set(BOOST_VERSION_DLL ${BOOST_MAJOR_VERSION}_${BOOST_MINOR_VERSION})
set(CRYPTOPP_VERSION 8_2_0)
set(CURL_VERSION 7_81_0)
set(GTEST_VERSION 1.11.0)
set(LIBHTTPSERVER_VERSION 0.18.2)
set(LIBMICROHTTPD_VERSION 0.9.73)
set(LIBUUID_VERSION 1.6.2)
set(OPENSSL_VERSION 1_1_1m)
set(ROCKSDB_VERSION 6.27.3)
set(WINFSP_VERSION 1.10)
set(ZLIB_VERSION v1.2.11)
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
option(REPERTORY_ENABLE_TESTING "Enable testing" ON)
option(REPERTORY_ENABLE_S3 "Enable S3 mount support" OFF)
if (REPERTORY_ENABLE_S3)
add_definitions(-DREPERTORY_ENABLE_S3)
option(REPERTORY_ENABLE_S3_TESTING "Enable S3 unit tests" OFF)
if (REPERTORY_ENABLE_S3_TESTING)
add_definitions(-DREPERTORY_ENABLE_S3_TESTING)
endif ()
endif ()
option(REPERTORY_ENABLE_SKYNET "Enable Skynet mount support" ON)
if (REPERTORY_ENABLE_SKYNET)
add_definitions(-DREPERTORY_ENABLE_SKYNET)
option(REPERTORY_ENABLE_SKYNET_PREMIUM_TESTS "Enable Skynet premium portal unit tests" OFF)
if (REPERTORY_ENABLE_SKYNET_PREMIUM_TESTS)
add_definitions(-DREPERTORY_ENABLE_SKYNET_PREMIUM_TESTS)
endif()
endif ()
set(REPERTORY_MAJOR 2)
set(REPERTORY_MINOR 0)
set(REPERTORY_REV 0)
set(REPERTORY_RELEASE_NUM 2000000)
set(REPERTORY_RELEASE_ITER rc)
set(REPERTORY_VERSION ${REPERTORY_MAJOR}.${REPERTORY_MINOR}.${REPERTORY_REV}-${REPERTORY_RELEASE_ITER})
if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang" OR CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang")
set(IS_CLANG_COMPILER TRUE)
endif()
if(UNIX AND NOT APPLE)
if(${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD")
set(FREEBSD TRUE)
else()
set(LINUX TRUE)
endif()
elseif(UNIX AND APPLE)
set(MACOS TRUE)
set(CMAKE_OSX_ARCHITECTURES x86_64)
endif()
if ("${CMAKE_SIZEOF_VOID_P}" EQUAL "4")
message(FATAL_ERROR "32-bit compilation is not supported")
else()
if (CMAKE_SYSTEM_PROCESSOR MATCHES "^(aarch64.*|AARCH64.*|arm64.*|ARM64.*)")
set(REPERTORY_UNIX_ARCH armv8-a)
set(IS_ARM64 TRUE)
add_definitions("-DIS_ARM64")
else()
set(REPERTORY_UNIX_ARCH x86-64)
endif()
set(WINFSP_LIBRARY_BASENAME winfsp-x64)
set(REPERTORY_LIB_DIR lib64)
endif()
if (EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/3rd_party/cacert.pem")
file(REMOVE ${CMAKE_CURRENT_SOURCE_DIR}/3rd_party/cacert.pem)
endif()
file(DOWNLOAD https://curl.haxx.se/ca/cacert.pem ${CMAKE_CURRENT_SOURCE_DIR}/3rd_party/cacert.pem)
execute_process(
COMMAND git rev-parse --short HEAD
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
OUTPUT_VARIABLE REPERTORY_GIT_REV
ERROR_QUIET
OUTPUT_STRIP_TRAILING_WHITESPACE
)
if (NOT CMAKE_CXX_STANDARD)
set(CMAKE_CXX_STANDARD 17)
endif()
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(THREADS_PREFER_PTHREAD_FLAG ON)
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
if (NOT CMAKE_BUILD_TYPE)
set(CMAKE_BUILD_TYPE Release)
endif ()
if (CMAKE_BUILD_TYPE STREQUAL "Debug")
set(DEBUG_EXTRA d)
set(DEBUG_EXTRA2 -d)
set(DEBUG_EXTRA3 _d)
set(BOOST_DEBUG_EXTRA gd-)
set(CMAKE_BUILD_TYPE_LOWER debug)
else()
set(CMAKE_BUILD_TYPE_LOWER release)
endif()
string(TOLOWER "${CMAKE_GENERATOR}" CMAKE_GENERATOR_LOWER)
set(EXTERNAL_BUILD_ROOT ${CMAKE_BINARY_DIR}/external)
set(EXTERNAL_BUILD_TYPE ${CMAKE_BUILD_TYPE})
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/src/common.cpp.in ${CMAKE_CURRENT_SOURCE_DIR}/src/common.cpp @ONLY)
link_directories(
${EXTERNAL_BUILD_ROOT}/lib
)
if (UNIX)
set(STATIC_LIB_EXT a)
set(REPERTORY_C_FLAGS_LIST
${REPERTORY_C_FLAGS_LIST}
-march=${REPERTORY_UNIX_ARCH}
-mtune=generic
-D_FILE_OFFSET_BITS=64
)
set(REPERTORY_CXX_FLAGS_LIST
${REPERTORY_CXX_FLAGS_LIST}
-march=${REPERTORY_UNIX_ARCH}
-mtune=generic
-D_FILE_OFFSET_BITS=64
-std=c++${CMAKE_CXX_STANDARD}
)
if (CMAKE_BUILD_TYPE STREQUAL "Debug")
set(REPERTORY_C_FLAGS_LIST
${REPERTORY_C_FLAGS_LIST}
-g
-gdwarf-4
-DDEBUG
-O0
-fno-omit-frame-pointer
-D_DEBUG
-Wall
-Wextra
-Wpedantic
)
set(REPERTORY_CXX_FLAGS_LIST
${REPERTORY_CXX_FLAGS_LIST}
-g
-gdwarf-4
-DDEBUG
-O0
-fno-omit-frame-pointer
-D_DEBUG
-Wall
-Wextra
-Wpedantic
)
else ()
set(REPERTORY_C_FLAGS_LIST
${REPERTORY_C_FLAGS_LIST}
-O3
-DNDEBUG
)
set(REPERTORY_CXX_FLAGS_LIST
${REPERTORY_CXX_FLAGS_LIST}
-O3
-DNDEBUG
)
if (NOT IS_CLANG_COMPILER)
set(REPERTORY_C_FLAGS_LIST
${REPERTORY_C_FLAGS_LIST}
-s
)
set(REPERTORY_CXX_FLAGS_LIST
${REPERTORY_CXX_FLAGS_LIST}
-s
)
endif ()
endif()
endif()
if (LINUX)
execute_process(COMMAND /bin/bash ${CMAKE_CURRENT_SOURCE_DIR}/detect_linux_build.sh OUTPUT_VARIABLE LINUX_DISTRO)
string(REGEX REPLACE "\n$" "" LINUX_DISTRO "${LINUX_DISTRO}")
if (LINUX_DISTRO STREQUAL "debian9")
set(IS_DEBIAN9_DISTRO TRUE)
add_definitions("-DIS_DEBIAN9_DISTRO")
endif()
set(ENV{PKG_CONFIG_PATH} "${EXTERNAL_BUILD_ROOT}/lib/pkgconfig:${EXTERNAL_BUILD_ROOT}/${REPERTORY_LIB_DIR}/pkgconfig:$ENV{PKG_CONFIG_PATH}")
find_package(PkgConfig REQUIRED)
pkg_check_modules(LIBFUSE REQUIRED fuse>=2.9.0)
set(Boost_USE_STATIC_LIBS ON)
include_directories(/usr/local/include)
if (CMAKE_COMPILER_IS_GNUCC AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS 5.5)
message(FATAL_ERROR "Require at least gcc-5.5")
endif()
link_directories(
${EXTERNAL_BUILD_ROOT}/${REPERTORY_LIB_DIR}
/usr/local/lib
/usr/local/${REPERTORY_LIB_DIR}
)
set(REPERTORY_LINK_LIBRARIES
dl
pthread
)
elseif (FREEBSD)
message(FATAL_ERROR "FreeBSD is no longer supported")
elseif (MACOS)
add_definitions("-DBOOST_ASIO_HAS_STD_STRING_VIEW")
include_directories(/usr/local/include)
find_library(OSXFUSE NAMES OSXFUSE)
if (OSXFUSE-NOTFOUND)
message(FATAL_ERROR "FUSE for macOS not found (https://osxfuse.github.io/)")
endif ()
set(LIBFUSE_LIBRARIES fuse)
set(REPERTORY_LINK_LIBRARIES
z
pthread
dl
"-L/usr/local/lib"
"-framework Foundation"
"-framework AppKit"
"-framework SystemConfiguration"
)
elseif (MSVC)
set(STATIC_LIB_EXT lib)
set(REPERTORY_C_FLAGS_LIST
${REPERTORY_C_FLAGS_LIST}
/D_SILENCE_TR1_NAMESPACE_DEPRECATION_WARNING
/DNOMINMAX
/bigobj
/Zi
)
set(REPERTORY_CXX_FLAGS_LIST
${REPERTORY_CXX_FLAGS_LIST}
/D_SILENCE_TR1_NAMESPACE_DEPRECATION_WARNING
/DNOMINMAX
/bigobj
/Zi
)
if (CMAKE_BUILD_TYPE STREQUAL "Debug")
set(REPERTORY_C_FLAGS_LIST
${REPERTORY_C_FLAGS_LIST}
/DEBUG
)
set(REPERTORY_CXX_FLAGS_LIST
${REPERTORY_CXX_FLAGS_LIST}
/DEBUG
)
set(REPERTORY_SHARED_LINKER_FLAGS_LIST
${REPERTORY_SHARED_LINKER_FLAGS_LIST}
/DEBUG
/OPT:REF
/OPT:ICF
)
endif()
set(REPERTORY_VER_FILEVERSION ${REPERTORY_MAJOR},${REPERTORY_MINOR},${REPERTORY_REV},${REPERTORY_RELEASE_NUM})
set(REPERTORY_VER_FILEVERSION_STR ${REPERTORY_MAJOR}.${REPERTORY_MINOR}.${REPERTORY_REV}.${REPERTORY_RELEASE_NUM})
set(REPERTORY_VER_PRODUCTVERSION ${REPERTORY_MAJOR},${REPERTORY_MINOR},${REPERTORY_REV},${REPERTORY_RELEASE_NUM})
set(REPERTORY_VER_PRODUCTVERSION_STR ${REPERTORY_MAJOR}.${REPERTORY_MINOR}.${REPERTORY_REV}.${REPERTORY_RELEASE_NUM})
set(REPERTORY_VER_PRERELEASE VS_FF_PRERELEASE)
set(REPERTORY_VER_COMPANYNAME_STR "https://git.fifthgrid.com/blockstorage")
set(REPERTORY_VER_LEGALCOPYRIGHT_STR "Copyright 2018 <MIT License> <https://git.fifthgrid.com/blockstorage/repertory>")
set(REPERTORY_VER_FILEDESCRIPTION_STR "Mount utility for Sia, Skynet and S3")
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/version.rc.in ${CMAKE_CURRENT_SOURCE_DIR}/src/version.rc @ONLY)
set(WINDOWS_VERSION_RC ${CMAKE_CURRENT_SOURCE_DIR}/src/version.rc)
set(OPENSSL_USE_STATIC_LIBS TRUE)
if (NOT OPENSSL_ROOT_DIR)
set (OPENSSL_ROOT_DIR "C:\\Program Files\\OpenSSL-Win64")
endif()
find_package(OpenSSL 1.1.1 REQUIRED)
set(OPENSSL_LIBRARIES OpenSSL::SSL OpenSSL::Crypto)
include_directories(SYSTEM ${CMAKE_SOURCE_DIR}/3rd_party/winfsp-${WINFSP_VERSION}/inc)
add_definitions(-DTTMATH_NOASM -D_SILENCE_CXX17_CODECVT_HEADER_DEPRECATION_WARNING)
link_directories(${CMAKE_SOURCE_DIR}/3rd_party/winfsp-${WINFSP_VERSION}/lib)
set(REPERTORY_LINK_LIBRARIES
Ncrypt.lib
Rpcrt4.lib
Secur32.lib
Shlwapi.lib
Userenv.lib
Version.lib
Winhttp.lib
Wininet.lib
Ws2_32.lib
advapi32.lib
bcrypt.lib
comdlg32.lib
crypt32.lib
gdi32.lib
httpapi.lib
kernel32.lib
ole32.lib
oleaut32.lib
shell32.lib
user32.lib
uuid.lib
winspool.lib
${WINFSP_LIBRARY_BASENAME}.lib
)
if (CMAKE_GENERATOR MATCHES "NMake Makefiles")
set(REPERTORY_DLL_OUTPUT_DIR ${CMAKE_BINARY_DIR})
else()
set(REPERTORY_DLL_OUTPUT_DIR ${CMAKE_BINARY_DIR}/${CMAKE_BUILD_TYPE})
endif()
function(CopySupportFiles target)
add_custom_command(
TARGET ${target}
POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy
${CMAKE_SOURCE_DIR}/3rd_party/winfsp-${WINFSP_VERSION}/bin/${WINFSP_LIBRARY_BASENAME}.dll
${REPERTORY_DLL_OUTPUT_DIR}/${WINFSP_LIBRARY_BASENAME}.dll)
add_custom_command(
TARGET ${target}
POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy
${CMAKE_SOURCE_DIR}/3rd_party/cacert.pem
${REPERTORY_DLL_OUTPUT_DIR}/cacert.pem)
endfunction()
endif()
list(JOIN REPERTORY_CXX_FLAGS_LIST " " REPERTORY_CXX_FLAGS_LIST)
list(JOIN REPERTORY_C_FLAGS_LIST " " REPERTORY_C_FLAGS_LIST)
list(JOIN REPERTORY_SHARED_LINKER_FLAGS_LIST " " REPERTORY_SHARED_LINKER_FLAGS_LIST)
set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${REPERTORY_C_FLAGS_LIST}")
set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${REPERTORY_CXX_FLAGS_LIST}")
set (CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${REPERTORY_SHARED_LINKER_FLAGS_LIST}")
include(cmake/zlib.cmake)
include(cmake/openssl.cmake)
include(cmake/curl.cmake)
include(cmake/boost.cmake)
include(cmake/libuuid.cmake)
include(cmake/rocksdb.cmake)
include(cmake/cryptopp.cmake)
include(cmake/awscpp.cmake)
include(cmake/libmicrohttpd.cmake)
include(cmake/libhttpserver.cmake)
include_directories(include)
include_directories(SYSTEM
${Boost_INCLUDE_DIR}
${CMAKE_CURRENT_SOURCE_DIR}/3rd_party/json
${CMAKE_CURRENT_SOURCE_DIR}/3rd_party/jsonrpcpp-1.1.1/lib
${LIBUUID_INCLUDE_DIR}
${EXTERNAL_BUILD_ROOT}/include
${EXTERNAL_BUILD_ROOT}/include/cryptopp
${OPENSSL_INCLUDE_DIR}
${CURL_INCLUDE_DIRS}
${LIBFUSE_INCLUDE_DIRS}
${CMAKE_SOURCE_DIR}/3rd_party/ttmath-0.9.3/ttmath
${ROCKSDB_INCLUDE_DIRS}
)
if (NOT IS_DEBIAN9_DISTRO)
check_include_file_cxx(optional HAS_STD_OPTIONAL)
if (HAS_STD_OPTIONAL)
add_definitions(-DHAS_STD_OPTIONAL)
endif()
endif()
if (UNIX)
macro(install_symlink filepath sympath)
install(CODE "execute_process(COMMAND ${CMAKE_COMMAND} -E create_symlink ${filepath} ${sympath})")
install(CODE "message(\"-- Created symlink: ${sympath} -> ${filepath}\")")
endmacro(install_symlink)
check_include_files(sys/xattr.h HAS_SETXATTR)
if (HAS_SETXATTR)
add_definitions(-DHAS_SETXATTR)
endif()
endif()
set(REPERTORY_LINK_LIBRARIES
${ROCKSDB_LIBRARIES}
${LIBFUSE_LIBRARIES}
${LIBUUID_LIBRARIES}
${AWSCPP_LIBRARIES}
${LIBHTTPSERVER_LIBRARIES}
${LIBMICROHTTPD_LIBRARIES}
${Boost_LIBRARIES}
${CURL_LIBRARIES}
${OPENSSL_LIBRARIES}
${ZLIB_LIBRARIES}
${REPERTORY_LINK_LIBRARIES}
)
file(GLOB_RECURSE REPERTORY_HEADERS
${REPERTORY_HEADERS}
${CMAKE_CURRENT_SOURCE_DIR}/include/*.h
${CMAKE_CURRENT_SOURCE_DIR}/include/*.hh
${CMAKE_CURRENT_SOURCE_DIR}/include/*.hpp
${CMAKE_CURRENT_SOURCE_DIR}/include/**/*.h
${CMAKE_CURRENT_SOURCE_DIR}/include/**/*.hh
${CMAKE_CURRENT_SOURCE_DIR}/include/**/*.hpp
)
file(GLOB_RECURSE REPERTORY_SOURCES
${REPERTORY_SOURCES}
${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/**/*.cpp
${CMAKE_CURRENT_SOURCE_DIR}/3rd_party/jsonrpcpp-1.1.1/lib/jsonrp.cpp
)
list(REMOVE_ITEM REPERTORY_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/main.cpp)
add_library(librepertory STATIC ${REPERTORY_SOURCES} ${REPERTORY_HEADERS})
set_target_properties(librepertory PROPERTIES PREFIX "")
target_link_libraries(librepertory LINK_INTERFACE_LIBRARIES ${REPERTORY_LINK_LIBRARIES})
add_dependencies(librepertory
rocksdb_project
cryptopp_project
libhttpserver_project
)
if (REPERTORY_ENABLE_S3)
add_dependencies(librepertory awscpp_project)
endif ()
if (LINUX)
add_dependencies(librepertory
libuuid_project
boost_project
curl_project
openssl_project
)
elseif (MACOS)
add_dependencies(librepertory
openssl_project
boost_project
curl_project
)
elseif (MSVC)
add_dependencies(librepertory
curl_project
zlib_project
boost_project
)
endif()
add_executable(repertory
src/main.cpp
${WINDOWS_VERSION_RC}
${REPERTORY_HEADERS}
)
add_custom_command(
TARGET repertory
POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy
${CMAKE_CURRENT_SOURCE_DIR}/3rd_party/cacert.pem
${CMAKE_BINARY_DIR}/cacert.pem
)
add_dependencies(repertory librepertory)
target_link_libraries(repertory PRIVATE librepertory)
if (MACOS)
set_target_properties(repertory PROPERTIES COMPILE_FLAGS -fvisibility=hidden)
elseif (MSVC)
CopySupportFiles(repertory)
endif()
include(cmake/testing.cmake)
if (UNIX)
install(TARGETS repertory RUNTIME DESTINATION bin)
if (LINUX)
install_symlink(${CMAKE_INSTALL_PREFIX}/bin/repertory /sbin/mount.repertory)
endif()
endif()
message(STATUS "Repertory Version: ${REPERTORY_VERSION}")
message(STATUS "Git Revision: ${REPERTORY_GIT_REV}")