xref: /netbsd-src/external/apache2/llvm/dist/libcxx/benchmarks/CMakeLists.txt (revision 4d6fc14bc9b0c5bf3e30be318c143ee82cadd108)
1*4d6fc14bSjoerginclude(ExternalProject)
2*4d6fc14bSjoerginclude(CheckCXXCompilerFlag)
3*4d6fc14bSjoerg
4*4d6fc14bSjoerg#==============================================================================
5*4d6fc14bSjoerg# Build Google Benchmark for libc++
6*4d6fc14bSjoerg#==============================================================================
7*4d6fc14bSjoerg
8*4d6fc14bSjoergset(CMAKE_FOLDER "${CMAKE_FOLDER}/Benchmarks")
9*4d6fc14bSjoerg
10*4d6fc14bSjoergset(BENCHMARK_LIBCXX_COMPILE_FLAGS
11*4d6fc14bSjoerg    -Wno-unused-command-line-argument
12*4d6fc14bSjoerg    -nostdinc++
13*4d6fc14bSjoerg    -isystem "${LIBCXX_GENERATED_INCLUDE_DIR}"
14*4d6fc14bSjoerg    -L${LIBCXX_LIBRARY_DIR}
15*4d6fc14bSjoerg    -Wl,-rpath,${LIBCXX_LIBRARY_DIR}
16*4d6fc14bSjoerg    ${SANITIZER_FLAGS}
17*4d6fc14bSjoerg    )
18*4d6fc14bSjoergif(LLVM_ENABLE_PER_TARGET_RUNTIME_DIR AND NOT APPLE)
19*4d6fc14bSjoerg  list(APPEND BENCHMARK_LIBCXX_COMPILE_FLAGS
20*4d6fc14bSjoerg    -isystem "${LIBCXX_GENERATED_INCLUDE_TARGET_DIR}")
21*4d6fc14bSjoergendif()
22*4d6fc14bSjoergif (DEFINED LIBCXX_CXX_ABI_LIBRARY_PATH)
23*4d6fc14bSjoerg  list(APPEND BENCHMARK_LIBCXX_COMPILE_FLAGS
24*4d6fc14bSjoerg          -L${LIBCXX_CXX_ABI_LIBRARY_PATH}
25*4d6fc14bSjoerg          -Wl,-rpath,${LIBCXX_CXX_ABI_LIBRARY_PATH})
26*4d6fc14bSjoergendif()
27*4d6fc14bSjoergsplit_list(BENCHMARK_LIBCXX_COMPILE_FLAGS)
28*4d6fc14bSjoerg
29*4d6fc14bSjoergExternalProject_Add(google-benchmark-libcxx
30*4d6fc14bSjoerg        EXCLUDE_FROM_ALL ON
31*4d6fc14bSjoerg        DEPENDS cxx cxx-headers
32*4d6fc14bSjoerg        PREFIX benchmark-libcxx
33*4d6fc14bSjoerg        SOURCE_DIR ${LIBCXX_SOURCE_DIR}/utils/google-benchmark
34*4d6fc14bSjoerg        INSTALL_DIR ${CMAKE_CURRENT_BINARY_DIR}/benchmark-libcxx
35*4d6fc14bSjoerg        CMAKE_CACHE_ARGS
36*4d6fc14bSjoerg          -DCMAKE_C_COMPILER:STRING=${CMAKE_C_COMPILER}
37*4d6fc14bSjoerg          -DCMAKE_CXX_COMPILER:STRING=${CMAKE_CXX_COMPILER}
38*4d6fc14bSjoerg          -DCMAKE_BUILD_TYPE:STRING=RELEASE
39*4d6fc14bSjoerg          -DCMAKE_INSTALL_PREFIX:PATH=<INSTALL_DIR>
40*4d6fc14bSjoerg          -DCMAKE_CXX_FLAGS:STRING=${BENCHMARK_LIBCXX_COMPILE_FLAGS}
41*4d6fc14bSjoerg          -DBENCHMARK_USE_LIBCXX:BOOL=ON
42*4d6fc14bSjoerg          -DBENCHMARK_ENABLE_TESTING:BOOL=OFF)
43*4d6fc14bSjoerg
44*4d6fc14bSjoerg#==============================================================================
45*4d6fc14bSjoerg# Build Google Benchmark for the native stdlib
46*4d6fc14bSjoerg#==============================================================================
47*4d6fc14bSjoergset(BENCHMARK_NATIVE_TARGET_FLAGS)
48*4d6fc14bSjoergif (LIBCXX_BENCHMARK_NATIVE_GCC_TOOLCHAIN)
49*4d6fc14bSjoerg  set(BENCHMARK_NATIVE_TARGET_FLAGS
50*4d6fc14bSjoerg      -gcc-toolchain ${LIBCXX_BENCHMARK_NATIVE_GCC_TOOLCHAIN})
51*4d6fc14bSjoergendif()
52*4d6fc14bSjoergsplit_list(BENCHMARK_NATIVE_TARGET_FLAGS)
53*4d6fc14bSjoerg
54*4d6fc14bSjoergif (LIBCXX_BENCHMARK_NATIVE_STDLIB)
55*4d6fc14bSjoerg  ExternalProject_Add(google-benchmark-native
56*4d6fc14bSjoerg        EXCLUDE_FROM_ALL ON
57*4d6fc14bSjoerg        PREFIX benchmark-native
58*4d6fc14bSjoerg        SOURCE_DIR ${LIBCXX_SOURCE_DIR}/utils/google-benchmark
59*4d6fc14bSjoerg        INSTALL_DIR ${CMAKE_CURRENT_BINARY_DIR}/benchmark-native
60*4d6fc14bSjoerg        CMAKE_CACHE_ARGS
61*4d6fc14bSjoerg          -DCMAKE_C_COMPILER:STRING=${CMAKE_C_COMPILER}
62*4d6fc14bSjoerg          -DCMAKE_CXX_COMPILER:STRING=${CMAKE_CXX_COMPILER}
63*4d6fc14bSjoerg          -DCMAKE_CXX_FLAGS:STRING=${BENCHMARK_NATIVE_TARGET_FLAGS}
64*4d6fc14bSjoerg          -DCMAKE_BUILD_TYPE:STRING=RELEASE
65*4d6fc14bSjoerg          -DCMAKE_INSTALL_PREFIX:PATH=<INSTALL_DIR>
66*4d6fc14bSjoerg          -DBENCHMARK_ENABLE_TESTING:BOOL=OFF)
67*4d6fc14bSjoergendif()
68*4d6fc14bSjoerg
69*4d6fc14bSjoerg
70*4d6fc14bSjoerg#==============================================================================
71*4d6fc14bSjoerg# Benchmark tests configuration
72*4d6fc14bSjoerg#==============================================================================
73*4d6fc14bSjoergadd_custom_target(cxx-benchmarks)
74*4d6fc14bSjoergset(BENCHMARK_OUTPUT_DIR ${CMAKE_CURRENT_BINARY_DIR})
75*4d6fc14bSjoergset(BENCHMARK_LIBCXX_INSTALL ${CMAKE_CURRENT_BINARY_DIR}/benchmark-libcxx)
76*4d6fc14bSjoergset(BENCHMARK_NATIVE_INSTALL ${CMAKE_CURRENT_BINARY_DIR}/benchmark-native)
77*4d6fc14bSjoerg
78*4d6fc14bSjoerg
79*4d6fc14bSjoergset(BENCHMARK_TEST_COMPILE_FLAGS
80*4d6fc14bSjoerg    -O2
81*4d6fc14bSjoerg    -fsized-deallocation
82*4d6fc14bSjoerg    -I${BENCHMARK_LIBCXX_INSTALL}/include
83*4d6fc14bSjoerg    -I${LIBCXX_SOURCE_DIR}/test/support
84*4d6fc14bSjoerg)
85*4d6fc14bSjoergset(BENCHMARK_TEST_LIBCXX_COMPILE_FLAGS
86*4d6fc14bSjoerg    ${BENCHMARK_TEST_COMPILE_FLAGS}
87*4d6fc14bSjoerg    ${SANITIZER_FLAGS}
88*4d6fc14bSjoerg    -Wno-user-defined-literals
89*4d6fc14bSjoerg    -Wno-suggest-override
90*4d6fc14bSjoerg)
91*4d6fc14bSjoerg
92*4d6fc14bSjoergset(BENCHMARK_TEST_LIBCXX_LINK_FLAGS
93*4d6fc14bSjoerg    -nodefaultlibs
94*4d6fc14bSjoerg    -L${BENCHMARK_LIBCXX_INSTALL}/lib/
95*4d6fc14bSjoerg    ${SANITIZER_FLAGS}
96*4d6fc14bSjoerg)
97*4d6fc14bSjoergset(BENCHMARK_TEST_NATIVE_COMPILE_FLAGS
98*4d6fc14bSjoerg  ${BENCHMARK_NATIVE_TARGET_FLAGS}
99*4d6fc14bSjoerg  ${BENCHMARK_TEST_COMPILE_FLAGS}
100*4d6fc14bSjoerg)
101*4d6fc14bSjoergset(BENCHMARK_TEST_NATIVE_LINK_FLAGS
102*4d6fc14bSjoerg    ${BENCHMARK_NATIVE_TARGET_FLAGS}
103*4d6fc14bSjoerg    -L${BENCHMARK_NATIVE_INSTALL}/lib
104*4d6fc14bSjoerg)
105*4d6fc14bSjoergsplit_list(BENCHMARK_TEST_COMPILE_FLAGS)
106*4d6fc14bSjoergsplit_list(BENCHMARK_TEST_LIBCXX_COMPILE_FLAGS)
107*4d6fc14bSjoergsplit_list(BENCHMARK_TEST_LIBCXX_LINK_FLAGS)
108*4d6fc14bSjoergsplit_list(BENCHMARK_TEST_NATIVE_COMPILE_FLAGS)
109*4d6fc14bSjoergsplit_list(BENCHMARK_TEST_NATIVE_LINK_FLAGS)
110*4d6fc14bSjoerg
111*4d6fc14bSjoergif (LIBCXX_BENCHMARK_NATIVE_STDLIB STREQUAL "libstdc++")
112*4d6fc14bSjoerg  find_library(LIBSTDCXX_FILESYSTEM_TEST stdc++fs
113*4d6fc14bSjoerg        PATHS ${LIBCXX_BENCHMARK_NATIVE_GCC_TOOLCHAIN}
114*4d6fc14bSjoerg        PATH_SUFFIXES lib lib64
115*4d6fc14bSjoerg        DOC "The libstdc++ filesystem library used by the benchmarks"
116*4d6fc14bSjoerg    )
117*4d6fc14bSjoerg    if (NOT "${LIBSTDCXX_FILESYSTEM_TEST}" STREQUAL "LIBSTDCXX_FILESYSTEM_TEST-NOTFOUND")
118*4d6fc14bSjoerg      set(LIBSTDCXX_FILESYSTEM_LIB "stdc++fs")
119*4d6fc14bSjoerg    endif()
120*4d6fc14bSjoergendif()
121*4d6fc14bSjoerg
122*4d6fc14bSjoergset(libcxx_benchmark_targets)
123*4d6fc14bSjoerg
124*4d6fc14bSjoergfunction(add_benchmark_test name source_file)
125*4d6fc14bSjoerg  set(libcxx_target ${name}_libcxx)
126*4d6fc14bSjoerg  list(APPEND libcxx_benchmark_targets ${libcxx_target})
127*4d6fc14bSjoerg  add_executable(${libcxx_target} EXCLUDE_FROM_ALL ${source_file})
128*4d6fc14bSjoerg  add_dependencies(${libcxx_target} cxx google-benchmark-libcxx)
129*4d6fc14bSjoerg  add_dependencies(cxx-benchmarks ${libcxx_target})
130*4d6fc14bSjoerg  if (LIBCXX_ENABLE_SHARED)
131*4d6fc14bSjoerg    target_link_libraries(${libcxx_target} PRIVATE cxx_shared)
132*4d6fc14bSjoerg  else()
133*4d6fc14bSjoerg    target_link_libraries(${libcxx_target} PRIVATE cxx_static)
134*4d6fc14bSjoerg  endif()
135*4d6fc14bSjoerg  if (TARGET cxx_experimental)
136*4d6fc14bSjoerg    target_link_libraries(${libcxx_target} PRIVATE cxx_experimental)
137*4d6fc14bSjoerg  endif()
138*4d6fc14bSjoerg  target_link_libraries(${libcxx_target} PRIVATE -lbenchmark)
139*4d6fc14bSjoerg  if (LLVM_USE_SANITIZER)
140*4d6fc14bSjoerg    target_link_libraries(${libcxx_target} PRIVATE -ldl)
141*4d6fc14bSjoerg  endif()
142*4d6fc14bSjoerg  set_target_properties(${libcxx_target}
143*4d6fc14bSjoerg    PROPERTIES
144*4d6fc14bSjoerg          OUTPUT_NAME "${name}.libcxx.out"
145*4d6fc14bSjoerg          RUNTIME_OUTPUT_DIRECTORY "${BENCHMARK_OUTPUT_DIR}"
146*4d6fc14bSjoerg          COMPILE_FLAGS "${BENCHMARK_TEST_LIBCXX_COMPILE_FLAGS}"
147*4d6fc14bSjoerg          LINK_FLAGS "${BENCHMARK_TEST_LIBCXX_LINK_FLAGS}"
148*4d6fc14bSjoerg          CXX_STANDARD 17
149*4d6fc14bSjoerg          CXX_STANDARD_REQUIRED YES
150*4d6fc14bSjoerg          CXX_EXTENSIONS NO)
151*4d6fc14bSjoerg  cxx_link_system_libraries(${libcxx_target})
152*4d6fc14bSjoerg  if (LIBCXX_BENCHMARK_NATIVE_STDLIB)
153*4d6fc14bSjoerg    if (LIBCXX_BENCHMARK_NATIVE_STDLIB STREQUAL "libstdc++" AND NOT DEFINED LIBSTDCXX_FILESYSTEM_LIB
154*4d6fc14bSjoerg        AND "${name}" STREQUAL "filesystem")
155*4d6fc14bSjoerg      return()
156*4d6fc14bSjoerg    endif()
157*4d6fc14bSjoerg    set(native_target ${name}_native)
158*4d6fc14bSjoerg    add_executable(${native_target} EXCLUDE_FROM_ALL ${source_file})
159*4d6fc14bSjoerg    add_dependencies(${native_target} google-benchmark-native
160*4d6fc14bSjoerg                                      google-benchmark-libcxx)
161*4d6fc14bSjoerg    target_link_libraries(${native_target} PRIVATE -lbenchmark)
162*4d6fc14bSjoerg    if (LIBCXX_BENCHMARK_NATIVE_STDLIB STREQUAL "libstdc++")
163*4d6fc14bSjoerg      target_link_libraries(${native_target} PRIVATE ${LIBSTDCXX_FILESYSTEM_LIB})
164*4d6fc14bSjoerg    elseif (LIBCXX_BENCHMARK_NATIVE_STDLIB STREQUAL "libc++")
165*4d6fc14bSjoerg      target_link_libraries(${native_target} PRIVATE -lc++fs -lc++experimental)
166*4d6fc14bSjoerg    endif()
167*4d6fc14bSjoerg    if (LIBCXX_HAS_PTHREAD_LIB)
168*4d6fc14bSjoerg      target_link_libraries(${native_target} PRIVATE -pthread)
169*4d6fc14bSjoerg    endif()
170*4d6fc14bSjoerg    add_dependencies(cxx-benchmarks ${native_target})
171*4d6fc14bSjoerg    set_target_properties(${native_target}
172*4d6fc14bSjoerg      PROPERTIES
173*4d6fc14bSjoerg          OUTPUT_NAME "${name}.native.out"
174*4d6fc14bSjoerg          RUNTIME_OUTPUT_DIRECTORY "${BENCHMARK_OUTPUT_DIR}"
175*4d6fc14bSjoerg          INCLUDE_DIRECTORIES ""
176*4d6fc14bSjoerg          COMPILE_FLAGS "${BENCHMARK_TEST_NATIVE_COMPILE_FLAGS}"
177*4d6fc14bSjoerg          LINK_FLAGS "${BENCHMARK_TEST_NATIVE_LINK_FLAGS}"
178*4d6fc14bSjoerg          CXX_STANDARD 17
179*4d6fc14bSjoerg          CXX_STANDARD_REQUIRED YES
180*4d6fc14bSjoerg          CXX_EXTENSIONS NO)
181*4d6fc14bSjoerg  endif()
182*4d6fc14bSjoergendfunction()
183*4d6fc14bSjoerg
184*4d6fc14bSjoerg
185*4d6fc14bSjoerg#==============================================================================
186*4d6fc14bSjoerg# Register Benchmark tests
187*4d6fc14bSjoerg#==============================================================================
188*4d6fc14bSjoergfile(GLOB BENCHMARK_TESTS "*.bench.cpp")
189*4d6fc14bSjoergforeach(test_path ${BENCHMARK_TESTS})
190*4d6fc14bSjoerg  get_filename_component(test_file "${test_path}" NAME)
191*4d6fc14bSjoerg  string(REPLACE ".bench.cpp" "" test_name "${test_file}")
192*4d6fc14bSjoerg  if (NOT DEFINED ${test_name}_REPORTED)
193*4d6fc14bSjoerg    message(STATUS "Adding Benchmark: ${test_file}")
194*4d6fc14bSjoerg    # Only report the adding of the benchmark once.
195*4d6fc14bSjoerg    set(${test_name}_REPORTED ON CACHE INTERNAL "")
196*4d6fc14bSjoerg  endif()
197*4d6fc14bSjoerg  add_benchmark_test(${test_name} ${test_file})
198*4d6fc14bSjoergendforeach()
199*4d6fc14bSjoerg
200*4d6fc14bSjoergif (LIBCXX_INCLUDE_TESTS)
201*4d6fc14bSjoerg  include(AddLLVM)
202*4d6fc14bSjoerg
203*4d6fc14bSjoerg  if (NOT DEFINED LIBCXX_TEST_DEPS)
204*4d6fc14bSjoerg    message(FATAL_ERROR "Expected LIBCXX_TEST_DEPS to be defined")
205*4d6fc14bSjoerg  endif()
206*4d6fc14bSjoerg
207*4d6fc14bSjoerg  configure_lit_site_cfg(
208*4d6fc14bSjoerg          ${CMAKE_CURRENT_SOURCE_DIR}/lit.site.cfg.py.in
209*4d6fc14bSjoerg          ${CMAKE_CURRENT_BINARY_DIR}/lit.site.cfg.py)
210*4d6fc14bSjoerg
211*4d6fc14bSjoerg  set(BENCHMARK_LIT_ARGS "--show-all --show-xfail --show-unsupported ${LIT_ARGS_DEFAULT}")
212*4d6fc14bSjoerg
213*4d6fc14bSjoerg  add_lit_target(check-cxx-benchmarks
214*4d6fc14bSjoerg          "Running libcxx benchmarks tests"
215*4d6fc14bSjoerg          ${CMAKE_CURRENT_BINARY_DIR}
216*4d6fc14bSjoerg          DEPENDS cxx-benchmarks ${LIBCXX_TEST_DEPS}
217*4d6fc14bSjoerg          ARGS ${BENCHMARK_LIT_ARGS})
218*4d6fc14bSjoergendif()
219