blob: 3823b87b39e041cca2b040a8362543f8f5dcc55e [file] [log] [blame]
Eric Fiselierd9b9ef72016-07-19 23:07:03 +00001include(ExternalProject)
2include(CheckCXXCompilerFlag)
3
4#==============================================================================
5# Build Google Benchmark for libc++
6#==============================================================================
Eric Fiselierd9b9ef72016-07-19 23:07:03 +00007
8set(BENCHMARK_LIBCXX_COMPILE_FLAGS
9 -Wno-unused-command-line-argument
10 -nostdinc++
Eric Fiselier0a799bd2016-08-29 19:50:49 +000011 -isystem ${LIBCXX_SOURCE_DIR}/include
Eric Fiselierd9b9ef72016-07-19 23:07:03 +000012 -L${LIBCXX_LIBRARY_DIR}
Eric Fiselier0a799bd2016-08-29 19:50:49 +000013 -Wl,-rpath,${LIBCXX_LIBRARY_DIR}
Eric Fiselier2d7654e2018-11-13 23:08:31 +000014 ${SANITIZER_FLAGS}
Eric Fiselier0a799bd2016-08-29 19:50:49 +000015 )
16if (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})
20endif()
Eric Fiselier3ea08cd2018-11-15 07:29:56 +000021if (LIBCXX_NEEDS_SITE_CONFIG)
22 list(APPEND BENCHMARK_LIBCXX_COMPILE_FLAGS -include "${LIBCXX_BINARY_DIR}/__config_site")
23endif()
Eric Fiselierd9b9ef72016-07-19 23:07:03 +000024split_list(BENCHMARK_LIBCXX_COMPILE_FLAGS)
Eric Fiselierd9b9ef72016-07-19 23:07:03 +000025
26ExternalProject_Add(google-benchmark-libcxx
27 EXCLUDE_FROM_ALL ON
Eric Fiselier3ea08cd2018-11-15 07:29:56 +000028 DEPENDS cxx cxx-headers
Eric Fiselierd9b9ef72016-07-19 23:07:03 +000029 PREFIX benchmark-libcxx
30 SOURCE_DIR ${LIBCXX_SOURCE_DIR}/utils/google-benchmark
31 INSTALL_DIR ${CMAKE_CURRENT_BINARY_DIR}/benchmark-libcxx
Eric Fiselier4e1f9a02016-08-02 20:21:07 +000032 CMAKE_CACHE_ARGS
33 -DCMAKE_C_COMPILER:STRING=${CMAKE_C_COMPILER}
34 -DCMAKE_CXX_COMPILER:STRING=${CMAKE_CXX_COMPILER}
Eric Fiselierd9b9ef72016-07-19 23:07:03 +000035 -DCMAKE_BUILD_TYPE:STRING=RELEASE
36 -DCMAKE_INSTALL_PREFIX:PATH=<INSTALL_DIR>
37 -DCMAKE_CXX_FLAGS:STRING=${BENCHMARK_LIBCXX_COMPILE_FLAGS}
Eric Fiselier0a799bd2016-08-29 19:50:49 +000038 -DBENCHMARK_USE_LIBCXX:BOOL=ON
Eric Fiselierd9b9ef72016-07-19 23:07:03 +000039 -DBENCHMARK_ENABLE_TESTING:BOOL=OFF)
40
41#==============================================================================
42# Build Google Benchmark for the native stdlib
43#==============================================================================
Eric Fiselier2d2f0c02016-10-30 22:53:00 +000044set(BENCHMARK_NATIVE_TARGET_FLAGS)
45if (LIBCXX_BENCHMARK_NATIVE_GCC_TOOLCHAIN)
46 set(BENCHMARK_NATIVE_TARGET_FLAGS
47 -gcc-toolchain ${LIBCXX_BENCHMARK_NATIVE_GCC_TOOLCHAIN})
48endif()
49split_list(BENCHMARK_NATIVE_TARGET_FLAGS)
50
51if (LIBCXX_BENCHMARK_NATIVE_STDLIB)
Eric Fiselierd9b9ef72016-07-19 23:07:03 +000052 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
Eric Fiselier4e1f9a02016-08-02 20:21:07 +000058 -DCMAKE_C_COMPILER:STRING=${CMAKE_C_COMPILER}
59 -DCMAKE_CXX_COMPILER:STRING=${CMAKE_CXX_COMPILER}
Eric Fiselier2d2f0c02016-10-30 22:53:00 +000060 -DCMAKE_CXX_FLAGS:STRING=${BENCHMARK_NATIVE_TARGET_FLAGS}
Eric Fiselierd9b9ef72016-07-19 23:07:03 +000061 -DCMAKE_BUILD_TYPE:STRING=RELEASE
Eric Fiselier0a799bd2016-08-29 19:50:49 +000062 -DCMAKE_INSTALL_PREFIX:PATH=<INSTALL_DIR>
63 -DBENCHMARK_ENABLE_TESTING:BOOL=OFF)
Eric Fiselierd9b9ef72016-07-19 23:07:03 +000064endif()
65
Eric Fiselierfd2e3e92018-01-18 04:23:01 +000066
Eric Fiselierd9b9ef72016-07-19 23:07:03 +000067#==============================================================================
68# Benchmark tests configuration
69#==============================================================================
Eric Fiselier0a799bd2016-08-29 19:50:49 +000070add_custom_target(cxx-benchmarks)
Eric Fiselier30ea4d02017-04-18 07:40:22 +000071set(BENCHMARK_OUTPUT_DIR ${CMAKE_CURRENT_BINARY_DIR})
Eric Fiselierd9b9ef72016-07-19 23:07:03 +000072set(BENCHMARK_LIBCXX_INSTALL ${CMAKE_CURRENT_BINARY_DIR}/benchmark-libcxx)
73set(BENCHMARK_NATIVE_INSTALL ${CMAKE_CURRENT_BINARY_DIR}/benchmark-native)
Eric Fiselier91400612018-11-13 07:03:16 +000074
75check_flag_supported("-std=c++17")
76mangle_name("LIBCXX_SUPPORTS_STD_EQ_c++17_FLAG" BENCHMARK_SUPPORTS_STD_CXX17_FLAG)
77if (${BENCHMARK_SUPPORTS_STD_CXX17_FLAG})
78 set(BENCHMARK_DIALECT_FLAG "-std=c++17")
79else()
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")
83endif()
84
Eric Fiselierd9b9ef72016-07-19 23:07:03 +000085set(BENCHMARK_TEST_COMPILE_FLAGS
Eric Fiselier91400612018-11-13 07:03:16 +000086 ${BENCHMARK_DIALECT_FLAG} -O2
Eric Fiselierd9b9ef72016-07-19 23:07:03 +000087 -I${BENCHMARK_LIBCXX_INSTALL}/include
Eric Fiselier026d38e2016-10-31 02:46:25 +000088 -I${LIBCXX_SOURCE_DIR}/test/support
Eric Fiselierd9b9ef72016-07-19 23:07:03 +000089)
90set(BENCHMARK_TEST_LIBCXX_COMPILE_FLAGS
91 -nostdinc++
Eric Fiselier0a799bd2016-08-29 19:50:49 +000092 -isystem ${LIBCXX_SOURCE_DIR}/include
Eric Fiselierd9b9ef72016-07-19 23:07:03 +000093 ${BENCHMARK_TEST_COMPILE_FLAGS}
Eric Fiselier2d7654e2018-11-13 23:08:31 +000094 ${SANITIZER_FLAGS}
Eric Fiselierd9b9ef72016-07-19 23:07:03 +000095 -Wno-user-defined-literals
96)
Eric Fiselier3ea08cd2018-11-15 07:29:56 +000097if (LIBCXX_NEEDS_SITE_CONFIG)
98 list(APPEND BENCHMARK_TEST_LIBCXX_COMPILE_FLAGS
99 -include "${LIBCXX_BINARY_DIR}/__config_site")
100endif()
101
Eric Fiselierd9b9ef72016-07-19 23:07:03 +0000102set(BENCHMARK_TEST_LIBCXX_LINK_FLAGS
103 -nodefaultlibs
104 -L${BENCHMARK_LIBCXX_INSTALL}/lib/
Eric Fiselier2d7654e2018-11-13 23:08:31 +0000105 ${SANITIZER_FLAGS}
Eric Fiselierd9b9ef72016-07-19 23:07:03 +0000106)
Eric Fiselier2d2f0c02016-10-30 22:53:00 +0000107set(BENCHMARK_TEST_NATIVE_COMPILE_FLAGS
108 ${BENCHMARK_NATIVE_TARGET_FLAGS}
109 ${BENCHMARK_TEST_COMPILE_FLAGS}
110)
Eric Fiselierd9b9ef72016-07-19 23:07:03 +0000111set(BENCHMARK_TEST_NATIVE_LINK_FLAGS
Eric Fiselier2d2f0c02016-10-30 22:53:00 +0000112 ${BENCHMARK_NATIVE_TARGET_FLAGS}
113 -L${BENCHMARK_NATIVE_INSTALL}/lib
Eric Fiselierd9b9ef72016-07-19 23:07:03 +0000114)
115split_list(BENCHMARK_TEST_COMPILE_FLAGS)
116split_list(BENCHMARK_TEST_LIBCXX_COMPILE_FLAGS)
117split_list(BENCHMARK_TEST_LIBCXX_LINK_FLAGS)
Eric Fiselier2d2f0c02016-10-30 22:53:00 +0000118split_list(BENCHMARK_TEST_NATIVE_COMPILE_FLAGS)
Eric Fiselierd9b9ef72016-07-19 23:07:03 +0000119split_list(BENCHMARK_TEST_NATIVE_LINK_FLAGS)
Eric Fiselier2d7654e2018-11-13 23:08:31 +0000120
Eric Fiselierc5a5fa52018-11-15 19:53:43 +0000121if (LIBCXX_BENCHMARK_NATIVE_STDLIB STREQUAL "libstdc++")
122 find_library(LIBSTDCXX_FILESYSTEM_TEST stdc++fs
123 PATHS ${LIBCXX_BENCHMARK_NATIVE_GCC_TOOLCHAIN}
124 PATH_SUFFIXES lib lib64
125 DOC "The libstdc++ filesystem library used by the benchmarks"
126 )
127 if (NOT "${LIBSTDCXX_FILESYSTEM_TEST}" STREQUAL "LIBSTDCXX_FILESYSTEM_TEST-NOTFOUND")
128 set(LIBSTDCXX_FILESYSTEM_LIB "stdc++fs")
129 endif()
130endif()
131
Eric Fiselier2d7654e2018-11-13 23:08:31 +0000132set(libcxx_benchmark_targets)
133
Eric Fiselierc5a5fa52018-11-15 19:53:43 +0000134function(add_benchmark_test name source_file)
Eric Fiselierd9b9ef72016-07-19 23:07:03 +0000135 set(libcxx_target ${name}_libcxx)
Eric Fiselier2d7654e2018-11-13 23:08:31 +0000136 list(APPEND libcxx_benchmark_targets ${libcxx_target})
Eric Fiselierd9b9ef72016-07-19 23:07:03 +0000137 add_executable(${libcxx_target} EXCLUDE_FROM_ALL ${source_file})
Eric Fiselier3ea08cd2018-11-15 07:29:56 +0000138 add_dependencies(${libcxx_target} cxx cxx-headers google-benchmark-libcxx)
Eric Fiselier0a799bd2016-08-29 19:50:49 +0000139 add_dependencies(cxx-benchmarks ${libcxx_target})
Eric Fiselier30b48cb2016-08-09 18:56:48 +0000140 if (LIBCXX_ENABLE_SHARED)
141 target_link_libraries(${libcxx_target} cxx_shared)
142 else()
143 target_link_libraries(${libcxx_target} cxx_static)
144 endif()
Eric Fiselier2d2f0c02016-10-30 22:53:00 +0000145 if (TARGET cxx_experimental)
146 target_link_libraries(${libcxx_target} cxx_experimental)
147 endif()
Eric Fiselier9c34c772018-10-10 17:46:20 +0000148 if (TARGET cxx_filesystem)
149 target_link_libraries(${libcxx_target} cxx_filesystem)
150 endif()
Eric Fiselier30b48cb2016-08-09 18:56:48 +0000151 target_link_libraries(${libcxx_target} -lbenchmark)
Eric Fiselier2d7654e2018-11-13 23:08:31 +0000152 if (LLVM_USE_SANITIZER)
153 target_link_libraries(${libcxx_target} -ldl)
154 endif()
Eric Fiselierd9b9ef72016-07-19 23:07:03 +0000155 set_target_properties(${libcxx_target}
156 PROPERTIES
157 OUTPUT_NAME "${name}.libcxx.out"
Eric Fiselier30ea4d02017-04-18 07:40:22 +0000158 RUNTIME_OUTPUT_DIRECTORY "${BENCHMARK_OUTPUT_DIR}"
Eric Fiselierd9b9ef72016-07-19 23:07:03 +0000159 COMPILE_FLAGS "${BENCHMARK_TEST_LIBCXX_COMPILE_FLAGS}"
160 LINK_FLAGS "${BENCHMARK_TEST_LIBCXX_LINK_FLAGS}")
Eric Fiselier2d2f0c02016-10-30 22:53:00 +0000161 if (LIBCXX_BENCHMARK_NATIVE_STDLIB)
Eric Fiselierc5a5fa52018-11-15 19:53:43 +0000162 if (LIBCXX_BENCHMARK_NATIVE_STDLIB STREQUAL "libstdc++" AND NOT DEFINED LIBSTDCXX_FILESYSTEM_LIB
163 AND "${name}" STREQUAL "filesystem")
164 return()
165 endif()
Eric Fiselierd9b9ef72016-07-19 23:07:03 +0000166 set(native_target ${name}_native)
167 add_executable(${native_target} EXCLUDE_FROM_ALL ${source_file})
Eric Fiselier271a19e2016-10-30 23:30:38 +0000168 add_dependencies(${native_target} google-benchmark-native
169 google-benchmark-libcxx)
Eric Fiselierd9b9ef72016-07-19 23:07:03 +0000170 target_link_libraries(${native_target} -lbenchmark)
Eric Fiselier2d2f0c02016-10-30 22:53:00 +0000171 if (LIBCXX_BENCHMARK_NATIVE_STDLIB STREQUAL "libstdc++")
Eric Fiselierc5a5fa52018-11-15 19:53:43 +0000172 target_link_libraries(${native_target} ${LIBSTDCXX_FILESYSTEM_LIB})
Eric Fiselier2d2f0c02016-10-30 22:53:00 +0000173 elseif (LIBCXX_BENCHMARK_NATIVE_STDLIB STREQUAL "libc++")
Eric Fiselier9c34c772018-10-10 17:46:20 +0000174 target_link_libraries(${native_target} -lc++fs -lc++experimental)
Eric Fiselier2d2f0c02016-10-30 22:53:00 +0000175 endif()
Eric Fiselierd9b9ef72016-07-19 23:07:03 +0000176 if (LIBCXX_HAS_PTHREAD_LIB)
177 target_link_libraries(${native_target} -pthread)
178 endif()
Eric Fiselier0a799bd2016-08-29 19:50:49 +0000179 add_dependencies(cxx-benchmarks ${native_target})
Eric Fiselierd9b9ef72016-07-19 23:07:03 +0000180 set_target_properties(${native_target}
181 PROPERTIES
182 OUTPUT_NAME "${name}.native.out"
Eric Fiselier30ea4d02017-04-18 07:40:22 +0000183 RUNTIME_OUTPUT_DIRECTORY "${BENCHMARK_OUTPUT_DIR}"
Eric Fiselierd9b9ef72016-07-19 23:07:03 +0000184 INCLUDE_DIRECTORIES ""
Eric Fiselier2d2f0c02016-10-30 22:53:00 +0000185 COMPILE_FLAGS "${BENCHMARK_TEST_NATIVE_COMPILE_FLAGS}"
Eric Fiselierd9b9ef72016-07-19 23:07:03 +0000186 LINK_FLAGS "${BENCHMARK_TEST_NATIVE_LINK_FLAGS}")
187 endif()
Eric Fiselierc5a5fa52018-11-15 19:53:43 +0000188endfunction()
Eric Fiselierd9b9ef72016-07-19 23:07:03 +0000189
190
191#==============================================================================
192# Register Benchmark tests
193#==============================================================================
194file(GLOB BENCHMARK_TESTS "*.bench.cpp")
195foreach(test_path ${BENCHMARK_TESTS})
196 get_filename_component(test_file "${test_path}" NAME)
Eric Fiselierd9b9ef72016-07-19 23:07:03 +0000197 string(REPLACE ".bench.cpp" "" test_name "${test_file}")
Eric Fiseliera54229f2016-10-10 06:31:00 +0000198 if (NOT DEFINED ${test_name}_REPORTED)
199 message(STATUS "Adding Benchmark: ${test_file}")
200 # Only report the adding of the benchmark once.
201 set(${test_name}_REPORTED ON CACHE INTERNAL "")
202 endif()
Eric Fiselierd9b9ef72016-07-19 23:07:03 +0000203 add_benchmark_test(${test_name} ${test_file})
204endforeach()
Eric Fiselier2d7654e2018-11-13 23:08:31 +0000205
Eric Fiselierb124ade2018-11-14 20:38:46 +0000206if (LIBCXX_INCLUDE_TESTS)
207 include(AddLLVM)
Eric Fiselier2d7654e2018-11-13 23:08:31 +0000208
Eric Fiselierb124ade2018-11-14 20:38:46 +0000209 if (NOT DEFINED LIBCXX_TEST_DEPS)
210 message(FATAL_ERROR "Expected LIBCXX_TEST_DEPS to be defined")
211 endif()
212
213 configure_lit_site_cfg(
214 ${CMAKE_CURRENT_SOURCE_DIR}/lit.site.cfg.py.in
215 ${CMAKE_CURRENT_BINARY_DIR}/lit.site.cfg.py)
216
Eric Fiselierca91cfc2018-11-14 22:49:42 +0000217 set(BENCHMARK_LIT_ARGS "--show-all --show-xfail --show-unsupported ${LIT_ARGS_DEFAULT}")
Eric Fiselierb124ade2018-11-14 20:38:46 +0000218
Eric Fiselierc53065d2018-11-14 22:48:43 +0000219 add_lit_target(check-cxx-benchmarks
Eric Fiselierb124ade2018-11-14 20:38:46 +0000220 "Running libcxx benchmarks tests"
221 ${CMAKE_CURRENT_BINARY_DIR}
222 DEPENDS cxx-benchmarks ${LIBCXX_TEST_DEPS}
223 ARGS ${BENCHMARK_LIT_ARGS})
224endif()