gemini-server/CMakeLists.txt

85 lines
2.7 KiB
CMake

cmake_minimum_required(VERSION 3.17 FATAL_ERROR)
project(GeminiServer CXX)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
set(CMAKE_CXX_COMPILER_LAUNCHER ccache)
find_package(Boost REQUIRED COMPONENTS system program_options)
find_package(OpenSSL REQUIRED)
find_package(OpenMP REQUIRED)
include_directories(${Boost_INCLUDE_DIR} ${OpenSSL_INCLUDE_DIR})
set(COMPILE_DEFINITIONS
$<$<CONFIG:DEBUG>:_LIBCPP_DEBUG>
BOOST_ASIO_NO_DEPRECATED
BOOST_ASIO_NO_TS_EXECUTORS
#[[_FORTIFY_SOURCE=2]]
)
set(COMPILE_FLAGS
-pipe
-march=skylake # change to native or your architecture.
-mtune=skylake # same as above
-mrdseed # be careful about this, this is linked to the x86 architecture.
-mrdrnd # same as above
-stdlib=libc++
-Wpedantic
-Wall
-Wextra
-Wmove
-Wopenmp
-funroll-loops
-flto=thin
-fwhole-program-vtables
-fno-builtin-malloc -fno-builtin-calloc -fno-builtin-realloc -fno-builtin-free
)
set(LINKER_OPTIONS
-Wl,--sort-common,--as-needed
-stdlib=libc++
-flto=thin
-fwhole-program-vtables
-fuse-ld=gold
)
set(LINKER_FLAGS
jemalloc
${Boost_LIBRARIES}
OpenSSL::SSL
OpenMP::OpenMP_CXX
)
file(GLOB HEADERS includes/*.hpp)
set(FILES
main.cpp
src/network.cpp
include/information.hpp
src/cache_files.cpp
include/cache_files.hpp
src/simdjson.cpp
include/simdjson.h
include/configuration.hpp src/configuration.cpp)
# options for spdlog
set(SPDLOG_ENABLE_PCH ON CACHE BOOL "Build static or shared library using precompiled header to speed up compilation time")
set(SPDLOG_BUILD_WARNINGS ON CACHE BOOL "Enable compiler warnings")
set(SPDLOG_FMT_EXTERNAL ON CACHE BOOL "Use external fmt library instead of bundled")
set(SPDLOG_PREVENT_CHILD_FD ON CACHE BOOL "Prevent from child processes to inherit log file descriptors")
set(SPDLOG_NO_THREAD_ID ON CACHE BOOL "prevent spdlog from querying the thread id on each log call if thread id is not needed")
set(SPDLOG_NO_TLS ON CACHE BOOL "prevent spdlog from using thread local storage")
set(SPDLOG_NO_ATOMIC_LEVELS ON CACHE BOOL "prevent spdlog from using of std::atomic log levels (use only if your code never modifies log levels concurrently")
add_subdirectory(external/spdlog EXCLUDE_FROM_ALL)
target_compile_definitions(spdlog PRIVATE ${COMPILE_DEFINITIONS})
target_compile_options(spdlog PRIVATE ${COMPILE_FLAGS})
target_link_options(spdlog PRIVATE ${LINKER_OPTIONS})
# end
add_executable(GeminiServer ${FILES})
target_precompile_headers(GeminiServer PRIVATE ${HEADERS})
target_compile_definitions(GeminiServer PRIVATE ${COMPILE_DEFINITIONS})
target_compile_options(GeminiServer PRIVATE ${COMPILE_FLAGS})
target_link_options(GeminiServer PRIVATE ${LINKER_OPTIONS})
target_link_libraries(GeminiServer ${LINKER_FLAGS} spdlog)