1+ cmake_minimum_required (VERSION 3.24 )
2+
3+ project (chron-cpp VERSION 0.1.0 LANGUAGES CXX )
4+
5+ message (STATUS "Build ${PROJECT_NAME } : ${PROJECT_VERSION } " )
6+
7+ include (cmake/utils.cmake )
8+
9+ option (ORYX_CHRON_BUILD_SHARED_LIBS "Build shared library" ${BUILD_SHARED_LIBS } )
10+ option (ORYX_CHRON_BUILD_TESTS "Build tests" OFF )
11+ option (ORYX_CHRON_INSTALL "Install the project" OFF )
12+ option (ORYX_CHRON_SANITIZE_ADDRESS "Enable address sanitizer in tests" OFF )
13+ option (ORYX_CHRON_SANITIZE_THREAD "Enable thread sanitizer in tests" OFF )
14+
15+ if (ORYX_SANITIZE_ADDRESS AND ORYX_SANITIZE_THREAD)
16+ message (FATAL_ERROR "ORYX_SANITIZE_ADDRESS and ORYX_SANITIZE_THREAD are mutually exclusive" )
17+ endif ()
18+
19+ if (PROJECT_IS_TOP_LEVEL)
20+ set (ORYX_CHRON_INSTALL ON )
21+ endif ()
22+
23+ set (CMAKE_CXX_STANDARD_REQUIRED ON )
24+ if (NOT DEFINED CMAKE_CXX_STANDARD )
25+ set (CMAKE_CXX_STANDARD 23)
26+ endif ()
27+
28+ if (ORYX_CHRON_BUILD_SHARED_LIBS)
29+ add_library (${PROJECT_NAME } SHARED )
30+ set_target_properties (${PROJECT_NAME } PROPERTIES SOVERSION ${PROJECT_VERSION } )
31+ else ()
32+ add_library (${PROJECT_NAME } STATIC )
33+ endif ()
34+
35+ add_library ("oryx::${PROJECT_NAME } " ALIAS ${PROJECT_NAME } )
36+
37+ if (CMAKE_CXX_COMPILER_ID STREQUAL "MSVC" )
38+ target_compile_options (${PROJECT_NAME }
39+ PRIVATE
40+ /W4
41+ )
42+ else ()
43+ target_compile_options (${PROJECT_NAME }
44+ PRIVATE
45+ -Wall
46+ -Wextra
47+ -Werror
48+ -Wuninitialized
49+ -Wno-unused-function
50+ -Wunused-variable
51+ )
52+ endif ()
53+
54+ target_include_directories (${PROJECT_NAME }
55+ PUBLIC
56+ $<BUILD_INTERFACE :${CMAKE_CURRENT_SOURCE_DIR } /include >
57+ $<INSTALL_INTERFACE :include >
58+ )
59+
60+ file (GLOB_RECURSE ORYX_CHRON_HEADERS
61+ RELATIVE ${CMAKE_CURRENT_SOURCE_DIR }
62+ "${CMAKE_CURRENT_SOURCE_DIR } /include/*"
63+ )
64+
65+ target_sources (${PROJECT_NAME }
66+ PRIVATE
67+ src/cron_clock.cpp
68+ src/cron_data.cpp
69+ src/cron_randomization.cpp
70+ src/cron_schedule.cpp
71+ src/task.cpp
72+ PUBLIC
73+ FILE_SET HEADERS
74+ BASE_DIRS "${CMAKE_CURRENT_SOURCE_DIR } /include"
75+ FILES ${ORYX_CHRON_HEADERS}
76+ )
77+
78+ if (ORYX_CHRON_SANITIZE_ADDRESS)
79+ oryx_enable_addr_sanitizer (${PROJECT_NAME } )
80+ elseif (ORYX_CHRON_SANITIZE_THREAD)
81+ oryx_enable_thread_sanitizer (${PROJECT_NAME } )
82+ endif ()
83+
84+
85+ if (ORYX_CHRON_BUILD_TESTS)
86+ file (GLOB_RECURSE TEST_SOURCES "${CMAKE_CURRENT_SOURCE_DIR } /tests/*.cpp" )
87+ set (test_exe ${PROJECT_NAME } _tests)
88+ add_executable (${test_exe} ${TEST_SOURCES} )
89+ target_link_libraries (${test_exe} PRIVATE ${PROJECT_NAME } )
90+
91+ if (CMAKE_CXX_COMPILER_ID STREQUAL "MSVC" )
92+ target_compile_definitions (${test_exe} PUBLIC DOCTEST_CONFIG_USE_STD_HEADERS )
93+ endif ()
94+ endif ()
95+
96+ if (ORYX_CHRON_INSTALL)
97+ include (GNUInstallDirs )
98+ include (CMakePackageConfigHelpers )
99+
100+ configure_package_config_file (
101+ "${CMAKE_CURRENT_SOURCE_DIR } /cmake/${PROJECT_NAME } -config.cmake.in"
102+ "${CMAKE_CURRENT_BINARY_DIR } /${PROJECT_NAME } -config.cmake"
103+ INSTALL_DESTINATION "${CMAKE_INSTALL_LIBDIR} /cmake/${PROJECT_NAME } "
104+ )
105+
106+ write_basic_package_version_file (
107+ "${CMAKE_CURRENT_BINARY_DIR } /${PROJECT_NAME } -version.cmake"
108+ COMPATIBILITY ExactVersion
109+ )
110+
111+ install (
112+ TARGETS ${PROJECT_NAME }
113+ EXPORT ${PROJECT_NAME } -targets
114+ FILE_SET HEADERS
115+ )
116+
117+ install (
118+ FILES
119+ "${CMAKE_CURRENT_BINARY_DIR } /${PROJECT_NAME } -config.cmake"
120+ "${CMAKE_CURRENT_BINARY_DIR } /${PROJECT_NAME } -version.cmake"
121+ DESTINATION "${CMAKE_INSTALL_LIBDIR} /cmake/${PROJECT_NAME } "
122+ COMPONENT ${PROJECT_NAME }
123+ )
124+
125+ install (
126+ EXPORT ${PROJECT_NAME } -targets
127+ DESTINATION "${CMAKE_INSTALL_LIBDIR} /cmake/${PROJECT_NAME } "
128+ NAMESPACE oryx::
129+ FILE ${PROJECT_NAME } -targets .cmake
130+ COMPONENT ${PROJECT_NAME }
131+ )
132+ endif ()
0 commit comments