166 lines
7.4 KiB
CMake
166 lines
7.4 KiB
CMake
|
cmake_minimum_required(VERSION 3.8)
|
||
|
project(quill)
|
||
|
|
||
|
#-------------------------------------------------------------------------------------------------------
|
||
|
# Options
|
||
|
#-------------------------------------------------------------------------------------------------------
|
||
|
|
||
|
# Builds Quill without exceptions by adding the -fno-exceptions flag to the compiler.
|
||
|
option(QUILL_NO_EXCEPTIONS "Build without exceptions using -fno-exceptions flag" OFF)
|
||
|
|
||
|
# Disables features that rely on retrieving the thread name, which is not supported in older versions of Windows (e.g., Windows Server 2012/2016).
|
||
|
# Enabling this option ensures compatibility with older Windows versions.
|
||
|
option(QUILL_NO_THREAD_NAME_SUPPORT "Disable features not supported on Windows Server 2012/2016" OFF)
|
||
|
|
||
|
# Enables the use of _mm_prefetch, _mm_clflush, and _mm_clflushopt instructions to enhance cache coherence performance on x86 architectures.
|
||
|
# When enabled, Quill will utilize these instructions on the frontend's queue operations.
|
||
|
# Ensure to specify the target architecture with -march="..." when compiling to maximize compatibility and performance.
|
||
|
option(QUILL_X86ARCH "Enable optimizations for cache coherence on x86 architectures using specific CPU instructions" OFF)
|
||
|
|
||
|
# When enabled, removes the non-prefixed `LOG_*` macros, leaving only `QUILL_LOG_*` macros available.
|
||
|
# This is useful in scenarios where the original macro names conflict with those of an existing logging library.
|
||
|
option(QUILL_DISABLE_NON_PREFIXED_MACROS "Disable non-prefixed macros" OFF)
|
||
|
|
||
|
option(QUILL_DISABLE_POSITION_INDEPENDENT_CODE "Disable position-independent code" OFF)
|
||
|
|
||
|
option(QUILL_BUILD_EXAMPLES "Build the examples" OFF)
|
||
|
|
||
|
option(QUILL_BUILD_TESTS "Build the tests (Requires https://github.com/google/googletest to be installed)" OFF)
|
||
|
|
||
|
option(QUILL_BUILD_BENCHMARKS "Build the benchmarks" OFF)
|
||
|
|
||
|
option(QUILL_SANITIZE_ADDRESS "Enable address sanitizer in tests" OFF)
|
||
|
|
||
|
option(QUILL_SANITIZE_THREAD "Enable thread sanitizer in tests (Using this option with any other compiler except clang may result to false positives)" OFF)
|
||
|
|
||
|
option(QUILL_CODE_COVERAGE "Enable code coverage" OFF)
|
||
|
|
||
|
option(QUILL_USE_VALGRIND "Use valgrind as the default memcheck tool in CTest (Requires Valgrind)" OFF)
|
||
|
|
||
|
option(QUILL_ENABLE_INSTALL "Enable CMake Install when Quill is not a master project" OFF)
|
||
|
|
||
|
option(QUILL_DOCS_GEN "Generate documentation" OFF)
|
||
|
|
||
|
#-------------------------------------------------------------------------------------------------------
|
||
|
# Use newer policies if possible, up to most recent tested version of CMake.
|
||
|
#-------------------------------------------------------------------------------------------------------
|
||
|
cmake_policy(VERSION ${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION})
|
||
|
|
||
|
#-------------------------------------------------------------------------------------------------------
|
||
|
# Include common compiler options
|
||
|
#-------------------------------------------------------------------------------------------------------
|
||
|
include(${PROJECT_SOURCE_DIR}/cmake/SetCommonCompileOptions.cmake)
|
||
|
|
||
|
#-------------------------------------------------------------------------------------------------------
|
||
|
# Determine if quill is built as a subproject (using add_subdirectory) or if it is the master project.
|
||
|
#-------------------------------------------------------------------------------------------------------
|
||
|
set(QUILL_MASTER_PROJECT FALSE CACHE BOOL "Master Project" FORCE)
|
||
|
if (CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_SOURCE_DIR)
|
||
|
set(QUILL_MASTER_PROJECT TRUE CACHE BOOL "Master Project" FORCE)
|
||
|
endif ()
|
||
|
|
||
|
#-------------------------------------------------------------------------------------------------------
|
||
|
# Custom cmake functions
|
||
|
#-------------------------------------------------------------------------------------------------------
|
||
|
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/quill/cmake")
|
||
|
include(Utility)
|
||
|
|
||
|
#-------------------------------------------------------------------------------------------------------
|
||
|
# Resolve version
|
||
|
#-------------------------------------------------------------------------------------------------------
|
||
|
quill_extract_version()
|
||
|
|
||
|
project(quill VERSION ${QUILL_VERSION} LANGUAGES CXX)
|
||
|
|
||
|
#-------------------------------------------------------------------------------------------------------
|
||
|
# Set default build to release
|
||
|
#-------------------------------------------------------------------------------------------------------
|
||
|
if (NOT CMAKE_BUILD_TYPE)
|
||
|
set(CMAKE_BUILD_TYPE "Release" CACHE STRING "Choose the type of build" FORCE)
|
||
|
endif ()
|
||
|
|
||
|
#---------------------------------------------------------------------------------------
|
||
|
# Compiler config
|
||
|
#---------------------------------------------------------------------------------------
|
||
|
if (NOT CMAKE_CXX_STANDARD)
|
||
|
set(CMAKE_CXX_STANDARD 17)
|
||
|
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
||
|
endif ()
|
||
|
|
||
|
#-------------------------------------------------------------------------------------------------------
|
||
|
# Required Packages
|
||
|
#-------------------------------------------------------------------------------------------------------
|
||
|
find_package(Threads REQUIRED)
|
||
|
|
||
|
if (QUILL_BUILD_TESTS)
|
||
|
enable_testing()
|
||
|
|
||
|
if (QUILL_USE_VALGRIND)
|
||
|
# find valgrind
|
||
|
find_program(MEMORYCHECK_COMMAND NAMES valgrind)
|
||
|
if (NOT MEMORYCHECK_COMMAND)
|
||
|
message(WARNING "Valgrind not found")
|
||
|
endif ()
|
||
|
|
||
|
# set valgrind params
|
||
|
set(MEMORYCHECK_COMMAND_OPTIONS "--tool=memcheck --leak-check=full --leak-resolution=med --show-leak-kinds=all --track-origins=yes --vgdb=no --fair-sched=yes")
|
||
|
|
||
|
# add memcheck test action to ctest
|
||
|
include(CTest)
|
||
|
endif ()
|
||
|
endif ()
|
||
|
|
||
|
#-------------------------------------------------------------------------------------------------------
|
||
|
# Log Info
|
||
|
#-------------------------------------------------------------------------------------------------------
|
||
|
if (QUILL_MASTER_PROJECT)
|
||
|
option(QUILL_VERBOSE_MAKEFILE "Verbose make output" OFF)
|
||
|
|
||
|
message(STATUS "CMAKE_BUILD_TYPE: " ${CMAKE_BUILD_TYPE})
|
||
|
message(STATUS "QUILL_VERSION: ${QUILL_VERSION}")
|
||
|
endif ()
|
||
|
|
||
|
message(STATUS "QUILL_NO_EXCEPTIONS: " ${QUILL_NO_EXCEPTIONS})
|
||
|
message(STATUS "QUILL_NO_THREAD_NAME_SUPPORT: " ${QUILL_NO_THREAD_NAME_SUPPORT})
|
||
|
message(STATUS "QUILL_X86ARCH: " ${QUILL_X86ARCH})
|
||
|
message(STATUS "QUILL_DISABLE_NON_PREFIXED_MACROS: " ${QUILL_DISABLE_NON_PREFIXED_MACROS})
|
||
|
|
||
|
#---------------------------------------------------------------------------------------
|
||
|
# Verbose make file option
|
||
|
#---------------------------------------------------------------------------------------
|
||
|
if (QUILL_VERBOSE_MAKEFILE)
|
||
|
set(CMAKE_VERBOSE_MAKEFILE TRUE CACHE BOOL "Verbose output" FORCE)
|
||
|
endif ()
|
||
|
|
||
|
# address sanitizer flags
|
||
|
if (QUILL_SANITIZE_ADDRESS)
|
||
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address,undefined -fno-omit-frame-pointer -g")
|
||
|
endif ()
|
||
|
|
||
|
# thread sanitizer flags
|
||
|
if (QUILL_SANITIZE_THREAD)
|
||
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=thread")
|
||
|
endif ()
|
||
|
|
||
|
# Append extra options for coverage
|
||
|
if (QUILL_CODE_COVERAGE)
|
||
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O0 -g -fprofile-arcs -ftest-coverage")
|
||
|
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fprofile-arcs -ftest-coverage")
|
||
|
endif ()
|
||
|
|
||
|
# Build Examples
|
||
|
if (QUILL_BUILD_EXAMPLES)
|
||
|
add_subdirectory(examples)
|
||
|
endif ()
|
||
|
|
||
|
if (QUILL_BUILD_BENCHMARKS)
|
||
|
add_subdirectory(benchmarks)
|
||
|
endif ()
|
||
|
|
||
|
add_subdirectory(quill)
|
||
|
|
||
|
if (QUILL_DOCS_GEN)
|
||
|
# Add the cmake folder so the FindSphinx module is found
|
||
|
set(CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake" ${CMAKE_MODULE_PATH})
|
||
|
add_subdirectory(docs)
|
||
|
endif ()
|