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