blob: 1adbf6f96e2f65fbc98a427cfa6addfad1200ba3 [file] [log] [blame]
Eric Fiselierd9b9ef72016-07-19 23:07:03 +00001include(ExternalProject)
2include(CheckCXXCompilerFlag)
3
4#==============================================================================
5# Build Google Benchmark for libc++
6#==============================================================================
7check_cxx_compiler_flag(-stdlib=libc++ LIBCXX_HAS_NO_STDLIB_LIBCXX_FLAG)
8if (NOT LIBCXX_HAS_NO_STDLIB_LIBCXX_FLAG)
9 message(FATAL "Benchmark requires support for the -stdlib=libc++ flag")
10endif()
11
12set(BENCHMARK_LIBCXX_COMPILE_FLAGS
13 -Wno-unused-command-line-argument
14 -nostdinc++
15 -cxx-isystem ${LIBCXX_SOURCE_DIR}/include
16 -stdlib=libc++)
17set(BENCHMARK_LIBCXX_LINK_FLAGS
18 -L${LIBCXX_LIBRARY_DIR}
19 -Wl,-rpath,${LIBCXX_LIBRARY_DIR})
20split_list(BENCHMARK_LIBCXX_COMPILE_FLAGS)
21split_list(BENCHMARK_LIBCXX_LINK_FLAGS)
22
23ExternalProject_Add(google-benchmark-libcxx
24 EXCLUDE_FROM_ALL ON
25 DEPENDS cxx
26 PREFIX benchmark-libcxx
27 SOURCE_DIR ${LIBCXX_SOURCE_DIR}/utils/google-benchmark
28 INSTALL_DIR ${CMAKE_CURRENT_BINARY_DIR}/benchmark-libcxx
Eric Fiselier4e1f9a02016-08-02 20:21:07 +000029 CMAKE_CACHE_ARGS
30 -DCMAKE_C_COMPILER:STRING=${CMAKE_C_COMPILER}
31 -DCMAKE_CXX_COMPILER:STRING=${CMAKE_CXX_COMPILER}
Eric Fiselierd9b9ef72016-07-19 23:07:03 +000032 -DCMAKE_BUILD_TYPE:STRING=RELEASE
33 -DCMAKE_INSTALL_PREFIX:PATH=<INSTALL_DIR>
34 -DCMAKE_CXX_FLAGS:STRING=${BENCHMARK_LIBCXX_COMPILE_FLAGS}
35 -DCMAKE_SHARED_LINK_FLAGS:STRING=${BENCHMARK_LIBCXX_LINK_FLAGS}
36 -DCMAKE_EXE_LINK_FLAGS:STRING=${BENCHMARK_LIBCXX_LINK_FLAGS}
37 -DBENCHMARK_ENABLE_TESTING:BOOL=OFF)
38
39#==============================================================================
40# Build Google Benchmark for the native stdlib
41#==============================================================================
42if (LIBCXX_BUILD_BENCHMARK_NATIVE_STDLIB)
43 ExternalProject_Add(google-benchmark-native
44 EXCLUDE_FROM_ALL ON
45 PREFIX benchmark-native
46 SOURCE_DIR ${LIBCXX_SOURCE_DIR}/utils/google-benchmark
47 INSTALL_DIR ${CMAKE_CURRENT_BINARY_DIR}/benchmark-native
48 CMAKE_CACHE_ARGS
49 -DBENCHMARK_ENABLE_TESTING:BOOL=OFF
Eric Fiselier4e1f9a02016-08-02 20:21:07 +000050 CMAKE_CACHE_ARGS
51 -DCMAKE_C_COMPILER:STRING=${CMAKE_C_COMPILER}
52 -DCMAKE_CXX_COMPILER:STRING=${CMAKE_CXX_COMPILER}
Eric Fiselierd9b9ef72016-07-19 23:07:03 +000053 -DCMAKE_BUILD_TYPE:STRING=RELEASE
54 -DCMAKE_INSTALL_PREFIX:PATH=<INSTALL_DIR>)
55endif()
56
57#==============================================================================
58# Benchmark tests configuration
59#==============================================================================
60add_custom_target(libcxx-benchmarks)
61
62set(BENCHMARK_LIBCXX_INSTALL ${CMAKE_CURRENT_BINARY_DIR}/benchmark-libcxx)
63set(BENCHMARK_NATIVE_INSTALL ${CMAKE_CURRENT_BINARY_DIR}/benchmark-native)
64set(BENCHMARK_TEST_COMPILE_FLAGS
65 -std=c++14 -O2
66 -I${BENCHMARK_LIBCXX_INSTALL}/include
67)
68set(BENCHMARK_TEST_LIBCXX_COMPILE_FLAGS
69 -nostdinc++
Eric Fiselier4e1f9a02016-08-02 20:21:07 +000070 -cxx-isystem ${LIBCXX_SOURCE_DIR}/include
Eric Fiselierd9b9ef72016-07-19 23:07:03 +000071 ${BENCHMARK_TEST_COMPILE_FLAGS}
72 -Wno-user-defined-literals
73)
74set(BENCHMARK_TEST_LIBCXX_LINK_FLAGS
75 -nodefaultlibs
76 -L${BENCHMARK_LIBCXX_INSTALL}/lib/
77)
78set(BENCHMARK_TEST_NATIVE_LINK_FLAGS
79 -L${BENCHMARK_NATIVE_INSTALL}/lib/
80)
81split_list(BENCHMARK_TEST_COMPILE_FLAGS)
82split_list(BENCHMARK_TEST_LIBCXX_COMPILE_FLAGS)
83split_list(BENCHMARK_TEST_LIBCXX_LINK_FLAGS)
84split_list(BENCHMARK_TEST_NATIVE_LINK_FLAGS)
85macro(add_benchmark_test name source_file)
86 set(libcxx_target ${name}_libcxx)
87 add_executable(${libcxx_target} EXCLUDE_FROM_ALL ${source_file})
88 add_dependencies(${libcxx_target} cxx google-benchmark-libcxx)
89 add_dependencies(libcxx-benchmarks ${libcxx_target})
90 target_link_libraries(${libcxx_target} cxx -lbenchmark)
91 set_target_properties(${libcxx_target}
92 PROPERTIES
93 OUTPUT_NAME "${name}.libcxx.out"
94 COMPILE_FLAGS "${BENCHMARK_TEST_LIBCXX_COMPILE_FLAGS}"
95 LINK_FLAGS "${BENCHMARK_TEST_LIBCXX_LINK_FLAGS}")
96 if (LIBCXX_BUILD_BENCHMARK_NATIVE_STDLIB)
97 set(native_target ${name}_native)
98 add_executable(${native_target} EXCLUDE_FROM_ALL ${source_file})
99 add_dependencies(${native_target} google-benchmark-native)
100 target_link_libraries(${native_target} -lbenchmark)
101 if (LIBCXX_HAS_PTHREAD_LIB)
102 target_link_libraries(${native_target} -pthread)
103 endif()
104 add_dependencies(libcxx-benchmarks ${native_target})
105 set_target_properties(${native_target}
106 PROPERTIES
107 OUTPUT_NAME "${name}.native.out"
108 INCLUDE_DIRECTORIES ""
109 COMPILE_FLAGS "${BENCHMARK_TEST_COMPILE_FLAGS}"
110 LINK_FLAGS "${BENCHMARK_TEST_NATIVE_LINK_FLAGS}")
111 endif()
112endmacro()
113
114
115#==============================================================================
116# Register Benchmark tests
117#==============================================================================
118file(GLOB BENCHMARK_TESTS "*.bench.cpp")
119foreach(test_path ${BENCHMARK_TESTS})
120 get_filename_component(test_file "${test_path}" NAME)
121 message(STATUS "TEST: ${test_file}")
122 string(REPLACE ".bench.cpp" "" test_name "${test_file}")
123 add_benchmark_test(${test_name} ${test_file})
124endforeach()