blob: 8211ebd009a77cdddbcac4596fac71bc59279937 [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}
14 )
15if (DEFINED LIBCXX_CXX_ABI_LIBRARY_PATH)
16 list(APPEND BENCHMARK_LIBCXX_COMPILE_FLAGS
17 -L${LIBCXX_CXX_ABI_LIBRARY_PATH}
18 -Wl,-rpath,${LIBCXX_CXX_ABI_LIBRARY_PATH})
19endif()
Eric Fiselierd9b9ef72016-07-19 23:07:03 +000020split_list(BENCHMARK_LIBCXX_COMPILE_FLAGS)
Eric Fiselierd9b9ef72016-07-19 23:07:03 +000021
22ExternalProject_Add(google-benchmark-libcxx
23 EXCLUDE_FROM_ALL ON
24 DEPENDS cxx
25 PREFIX benchmark-libcxx
26 SOURCE_DIR ${LIBCXX_SOURCE_DIR}/utils/google-benchmark
27 INSTALL_DIR ${CMAKE_CURRENT_BINARY_DIR}/benchmark-libcxx
Eric Fiselier4e1f9a02016-08-02 20:21:07 +000028 CMAKE_CACHE_ARGS
29 -DCMAKE_C_COMPILER:STRING=${CMAKE_C_COMPILER}
30 -DCMAKE_CXX_COMPILER:STRING=${CMAKE_CXX_COMPILER}
Eric Fiselierd9b9ef72016-07-19 23:07:03 +000031 -DCMAKE_BUILD_TYPE:STRING=RELEASE
32 -DCMAKE_INSTALL_PREFIX:PATH=<INSTALL_DIR>
33 -DCMAKE_CXX_FLAGS:STRING=${BENCHMARK_LIBCXX_COMPILE_FLAGS}
Eric Fiselier0a799bd2016-08-29 19:50:49 +000034 -DBENCHMARK_USE_LIBCXX:BOOL=ON
Eric Fiselierd9b9ef72016-07-19 23:07:03 +000035 -DBENCHMARK_ENABLE_TESTING:BOOL=OFF)
36
37#==============================================================================
38# Build Google Benchmark for the native stdlib
39#==============================================================================
Eric Fiselier2d2f0c02016-10-30 22:53:00 +000040set(BENCHMARK_NATIVE_TARGET_FLAGS)
41if (LIBCXX_BENCHMARK_NATIVE_GCC_TOOLCHAIN)
42 set(BENCHMARK_NATIVE_TARGET_FLAGS
43 -gcc-toolchain ${LIBCXX_BENCHMARK_NATIVE_GCC_TOOLCHAIN})
44endif()
45split_list(BENCHMARK_NATIVE_TARGET_FLAGS)
46
47if (LIBCXX_BENCHMARK_NATIVE_STDLIB)
Eric Fiselierd9b9ef72016-07-19 23:07:03 +000048 ExternalProject_Add(google-benchmark-native
49 EXCLUDE_FROM_ALL ON
50 PREFIX benchmark-native
51 SOURCE_DIR ${LIBCXX_SOURCE_DIR}/utils/google-benchmark
52 INSTALL_DIR ${CMAKE_CURRENT_BINARY_DIR}/benchmark-native
53 CMAKE_CACHE_ARGS
Eric Fiselier4e1f9a02016-08-02 20:21:07 +000054 -DCMAKE_C_COMPILER:STRING=${CMAKE_C_COMPILER}
55 -DCMAKE_CXX_COMPILER:STRING=${CMAKE_CXX_COMPILER}
Eric Fiselier2d2f0c02016-10-30 22:53:00 +000056 -DCMAKE_CXX_FLAGS:STRING=${BENCHMARK_NATIVE_TARGET_FLAGS}
Eric Fiselierd9b9ef72016-07-19 23:07:03 +000057 -DCMAKE_BUILD_TYPE:STRING=RELEASE
Eric Fiselier0a799bd2016-08-29 19:50:49 +000058 -DCMAKE_INSTALL_PREFIX:PATH=<INSTALL_DIR>
59 -DBENCHMARK_ENABLE_TESTING:BOOL=OFF)
Eric Fiselierd9b9ef72016-07-19 23:07:03 +000060endif()
61
62#==============================================================================
63# Benchmark tests configuration
64#==============================================================================
Eric Fiselier0a799bd2016-08-29 19:50:49 +000065add_custom_target(cxx-benchmarks)
Eric Fiselier30ea4d02017-04-18 07:40:22 +000066set(BENCHMARK_OUTPUT_DIR ${CMAKE_CURRENT_BINARY_DIR})
Eric Fiselierd9b9ef72016-07-19 23:07:03 +000067set(BENCHMARK_LIBCXX_INSTALL ${CMAKE_CURRENT_BINARY_DIR}/benchmark-libcxx)
68set(BENCHMARK_NATIVE_INSTALL ${CMAKE_CURRENT_BINARY_DIR}/benchmark-native)
69set(BENCHMARK_TEST_COMPILE_FLAGS
70 -std=c++14 -O2
71 -I${BENCHMARK_LIBCXX_INSTALL}/include
Eric Fiselier026d38e2016-10-31 02:46:25 +000072 -I${LIBCXX_SOURCE_DIR}/test/support
Eric Fiselierd9b9ef72016-07-19 23:07:03 +000073)
74set(BENCHMARK_TEST_LIBCXX_COMPILE_FLAGS
75 -nostdinc++
Eric Fiselier0a799bd2016-08-29 19:50:49 +000076 -isystem ${LIBCXX_SOURCE_DIR}/include
Eric Fiselierd9b9ef72016-07-19 23:07:03 +000077 ${BENCHMARK_TEST_COMPILE_FLAGS}
78 -Wno-user-defined-literals
79)
80set(BENCHMARK_TEST_LIBCXX_LINK_FLAGS
81 -nodefaultlibs
82 -L${BENCHMARK_LIBCXX_INSTALL}/lib/
83)
Eric Fiselier2d2f0c02016-10-30 22:53:00 +000084set(BENCHMARK_TEST_NATIVE_COMPILE_FLAGS
85 ${BENCHMARK_NATIVE_TARGET_FLAGS}
86 ${BENCHMARK_TEST_COMPILE_FLAGS}
87)
Eric Fiselierd9b9ef72016-07-19 23:07:03 +000088set(BENCHMARK_TEST_NATIVE_LINK_FLAGS
Eric Fiselier2d2f0c02016-10-30 22:53:00 +000089 ${BENCHMARK_NATIVE_TARGET_FLAGS}
90 -L${BENCHMARK_NATIVE_INSTALL}/lib
Eric Fiselierd9b9ef72016-07-19 23:07:03 +000091)
92split_list(BENCHMARK_TEST_COMPILE_FLAGS)
93split_list(BENCHMARK_TEST_LIBCXX_COMPILE_FLAGS)
94split_list(BENCHMARK_TEST_LIBCXX_LINK_FLAGS)
Eric Fiselier2d2f0c02016-10-30 22:53:00 +000095split_list(BENCHMARK_TEST_NATIVE_COMPILE_FLAGS)
Eric Fiselierd9b9ef72016-07-19 23:07:03 +000096split_list(BENCHMARK_TEST_NATIVE_LINK_FLAGS)
97macro(add_benchmark_test name source_file)
98 set(libcxx_target ${name}_libcxx)
99 add_executable(${libcxx_target} EXCLUDE_FROM_ALL ${source_file})
100 add_dependencies(${libcxx_target} cxx google-benchmark-libcxx)
Eric Fiselier0a799bd2016-08-29 19:50:49 +0000101 add_dependencies(cxx-benchmarks ${libcxx_target})
Eric Fiselier30b48cb2016-08-09 18:56:48 +0000102 if (LIBCXX_ENABLE_SHARED)
103 target_link_libraries(${libcxx_target} cxx_shared)
104 else()
105 target_link_libraries(${libcxx_target} cxx_static)
106 endif()
Eric Fiselier2d2f0c02016-10-30 22:53:00 +0000107 if (TARGET cxx_experimental)
108 target_link_libraries(${libcxx_target} cxx_experimental)
109 endif()
Eric Fiselier30b48cb2016-08-09 18:56:48 +0000110 target_link_libraries(${libcxx_target} -lbenchmark)
Eric Fiselierd9b9ef72016-07-19 23:07:03 +0000111 set_target_properties(${libcxx_target}
112 PROPERTIES
113 OUTPUT_NAME "${name}.libcxx.out"
Eric Fiselier30ea4d02017-04-18 07:40:22 +0000114 RUNTIME_OUTPUT_DIRECTORY "${BENCHMARK_OUTPUT_DIR}"
Eric Fiselierd9b9ef72016-07-19 23:07:03 +0000115 COMPILE_FLAGS "${BENCHMARK_TEST_LIBCXX_COMPILE_FLAGS}"
116 LINK_FLAGS "${BENCHMARK_TEST_LIBCXX_LINK_FLAGS}")
Eric Fiselier2d2f0c02016-10-30 22:53:00 +0000117 if (LIBCXX_BENCHMARK_NATIVE_STDLIB)
Eric Fiselierd9b9ef72016-07-19 23:07:03 +0000118 set(native_target ${name}_native)
119 add_executable(${native_target} EXCLUDE_FROM_ALL ${source_file})
Eric Fiselier271a19e2016-10-30 23:30:38 +0000120 add_dependencies(${native_target} google-benchmark-native
121 google-benchmark-libcxx)
Eric Fiselierd9b9ef72016-07-19 23:07:03 +0000122 target_link_libraries(${native_target} -lbenchmark)
Eric Fiselier2d2f0c02016-10-30 22:53:00 +0000123 if (LIBCXX_BENCHMARK_NATIVE_STDLIB STREQUAL "libstdc++")
124 target_link_libraries(${native_target} -lstdc++fs)
125 elseif (LIBCXX_BENCHMARK_NATIVE_STDLIB STREQUAL "libc++")
126 target_link_libraries(${native_target} -lc++experimental)
127 endif()
Eric Fiselierd9b9ef72016-07-19 23:07:03 +0000128 if (LIBCXX_HAS_PTHREAD_LIB)
129 target_link_libraries(${native_target} -pthread)
130 endif()
Eric Fiselier0a799bd2016-08-29 19:50:49 +0000131 add_dependencies(cxx-benchmarks ${native_target})
Eric Fiselierd9b9ef72016-07-19 23:07:03 +0000132 set_target_properties(${native_target}
133 PROPERTIES
134 OUTPUT_NAME "${name}.native.out"
Eric Fiselier30ea4d02017-04-18 07:40:22 +0000135 RUNTIME_OUTPUT_DIRECTORY "${BENCHMARK_OUTPUT_DIR}"
Eric Fiselierd9b9ef72016-07-19 23:07:03 +0000136 INCLUDE_DIRECTORIES ""
Eric Fiselier2d2f0c02016-10-30 22:53:00 +0000137 COMPILE_FLAGS "${BENCHMARK_TEST_NATIVE_COMPILE_FLAGS}"
Eric Fiselierd9b9ef72016-07-19 23:07:03 +0000138 LINK_FLAGS "${BENCHMARK_TEST_NATIVE_LINK_FLAGS}")
139 endif()
140endmacro()
141
142
143#==============================================================================
144# Register Benchmark tests
145#==============================================================================
146file(GLOB BENCHMARK_TESTS "*.bench.cpp")
147foreach(test_path ${BENCHMARK_TESTS})
148 get_filename_component(test_file "${test_path}" NAME)
Eric Fiselierd9b9ef72016-07-19 23:07:03 +0000149 string(REPLACE ".bench.cpp" "" test_name "${test_file}")
Eric Fiseliera54229f2016-10-10 06:31:00 +0000150 if (NOT DEFINED ${test_name}_REPORTED)
151 message(STATUS "Adding Benchmark: ${test_file}")
152 # Only report the adding of the benchmark once.
153 set(${test_name}_REPORTED ON CACHE INTERNAL "")
154 endif()
Eric Fiselierd9b9ef72016-07-19 23:07:03 +0000155 add_benchmark_test(${test_name} ${test_file})
156endforeach()