11cmake_minimum_required (VERSION 3.5)
22
3+ # Phase 0: Profiling and Sanitizer Infrastructure
4+ option (ENABLE_PROFILING "Build with profiling symbols and frame pointers" OFF )
5+ option (CI_MODE "CI environment - enables mandatory sanitizers" OFF )
6+ option (ENABLE_ASAN "Build with AddressSanitizer" OFF )
7+ option (ENABLE_TSAN "Build with ThreadSanitizer" OFF )
8+ option (ENABLE_UBSAN "Build with UndefinedBehaviorSanitizer" OFF )
9+
310if (WIN32 )
411 set (CMAKE_CXX_FLAGS "/O2 /EHsc" )
512elseif (APPLE )
916 set (CMAKE_CXX_FLAGS "-O3 -pthread" )
1017endif ()
1118
19+ # Profiling support
20+ if (ENABLE_PROFILING)
21+ message (STATUS "Building with profiling support" )
22+ add_compile_options (-g -fno-omit-frame-pointer)
23+ if (CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang" )
24+ add_compile_options (-fno-inline-functions)
25+ endif ()
26+ endif ()
27+
28+ # Sanitizer support (mandatory in CI mode)
29+ if (CI_MODE OR ENABLE_TSAN)
30+ message (STATUS "ThreadSanitizer enabled" )
31+ set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=thread -g" )
32+ set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=thread" )
33+ elseif (ENABLE_ASAN)
34+ message (STATUS "AddressSanitizer enabled" )
35+ set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address -fno-omit-frame-pointer -g" )
36+ set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=address" )
37+ elseif (ENABLE_UBSAN)
38+ message (STATUS "UndefinedBehaviorSanitizer enabled" )
39+ set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=undefined -g" )
40+ set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=undefined" )
41+ endif ()
42+
1243project (PRTree)
1344file (GLOB MYCPP ${CMAKE_CURRENT_SOURCE_DIR} /cpp/*)
1445
@@ -20,6 +51,7 @@ option(SKIP_PERFORMANCE_COMPARISON "" ON)
2051option (BUILD_TESTS "" OFF )
2152option (BUILD_SANDBOX "" OFF )
2253option (BUILD_DOC "" OFF )
54+ option (BUILD_BENCHMARKS "Build performance benchmarks" OFF )
2355
2456add_subdirectory (${CMAKE_CURRENT_SOURCE_DIR} /third/pybind11/)
2557add_subdirectory (${CMAKE_CURRENT_SOURCE_DIR} /third/cereal/)
@@ -38,7 +70,7 @@ target_link_libraries(PRTree PRIVATE
3870)
3971
4072set_target_properties (PRTree PROPERTIES
41- CXX_STANDARD 17
73+ CXX_STANDARD 20
4274 CXX_STANDARD_REQUIRED TRUE
4375 CXX_EXTENSIONS FALSE
4476 POSITION_INDEPENDENT_CODE ON
@@ -55,3 +87,48 @@ set_target_properties(PRTree PROPERTIES
5587 ARCHIVE_OUTPUT_DIRECTORY_DEBUG "${CMAKE_ARCHIVE_OUTPUT_DIRECTORY_DEBUG} "
5688 ARCHIVE_OUTPUT_DIRECTORY_RELEASE "${CMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELEASE} "
5789)
90+
91+ # Phase 0: Benchmark targets
92+ if (BUILD_BENCHMARKS)
93+ message (STATUS "Building performance benchmarks" )
94+
95+ # Construction benchmark
96+ add_executable (benchmark_construction benchmarks/benchmark_construction.cpp)
97+ target_include_directories (benchmark_construction PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} /cpp)
98+ target_link_libraries (benchmark_construction PRIVATE cereal snappy)
99+ set_target_properties (benchmark_construction PROPERTIES
100+ CXX_STANDARD 20
101+ CXX_STANDARD_REQUIRED TRUE
102+ CXX_EXTENSIONS FALSE
103+ )
104+
105+ # Query benchmark
106+ add_executable (benchmark_query benchmarks/benchmark_query.cpp)
107+ target_include_directories (benchmark_query PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} /cpp)
108+ target_link_libraries (benchmark_query PRIVATE cereal snappy)
109+ set_target_properties (benchmark_query PROPERTIES
110+ CXX_STANDARD 20
111+ CXX_STANDARD_REQUIRED TRUE
112+ CXX_EXTENSIONS FALSE
113+ )
114+
115+ # Multithreaded benchmark
116+ add_executable (benchmark_parallel benchmarks/benchmark_parallel.cpp)
117+ target_include_directories (benchmark_parallel PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} /cpp)
118+ target_link_libraries (benchmark_parallel PRIVATE cereal snappy)
119+ set_target_properties (benchmark_parallel PROPERTIES
120+ CXX_STANDARD 20
121+ CXX_STANDARD_REQUIRED TRUE
122+ CXX_EXTENSIONS FALSE
123+ )
124+
125+ # Stress test
126+ add_executable (stress_test_concurrent benchmarks/stress_test_concurrent.cpp)
127+ target_include_directories (stress_test_concurrent PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} /cpp)
128+ target_link_libraries (stress_test_concurrent PRIVATE cereal snappy pthread)
129+ set_target_properties (stress_test_concurrent PROPERTIES
130+ CXX_STANDARD 20
131+ CXX_STANDARD_REQUIRED TRUE
132+ CXX_EXTENSIONS FALSE
133+ )
134+ endif ()
0 commit comments