Eric Fiselier | d9b9ef7 | 2016-07-19 23:07:03 +0000 | [diff] [blame] | 1 | include(ExternalProject) |
| 2 | include(CheckCXXCompilerFlag) |
| 3 | |
| 4 | #============================================================================== |
| 5 | # Build Google Benchmark for libc++ |
| 6 | #============================================================================== |
| 7 | check_cxx_compiler_flag(-stdlib=libc++ LIBCXX_HAS_NO_STDLIB_LIBCXX_FLAG) |
| 8 | if (NOT LIBCXX_HAS_NO_STDLIB_LIBCXX_FLAG) |
| 9 | message(FATAL "Benchmark requires support for the -stdlib=libc++ flag") |
| 10 | endif() |
| 11 | |
| 12 | set(BENCHMARK_LIBCXX_COMPILE_FLAGS |
| 13 | -Wno-unused-command-line-argument |
| 14 | -nostdinc++ |
| 15 | -cxx-isystem ${LIBCXX_SOURCE_DIR}/include |
| 16 | -stdlib=libc++) |
| 17 | set(BENCHMARK_LIBCXX_LINK_FLAGS |
| 18 | -L${LIBCXX_LIBRARY_DIR} |
| 19 | -Wl,-rpath,${LIBCXX_LIBRARY_DIR}) |
| 20 | split_list(BENCHMARK_LIBCXX_COMPILE_FLAGS) |
| 21 | split_list(BENCHMARK_LIBCXX_LINK_FLAGS) |
| 22 | |
| 23 | ExternalProject_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 Fiselier | 4e1f9a0 | 2016-08-02 20:21:07 +0000 | [diff] [blame^] | 29 | CMAKE_CACHE_ARGS |
| 30 | -DCMAKE_C_COMPILER:STRING=${CMAKE_C_COMPILER} |
| 31 | -DCMAKE_CXX_COMPILER:STRING=${CMAKE_CXX_COMPILER} |
Eric Fiselier | d9b9ef7 | 2016-07-19 23:07:03 +0000 | [diff] [blame] | 32 | -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 | #============================================================================== |
| 42 | if (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 Fiselier | 4e1f9a0 | 2016-08-02 20:21:07 +0000 | [diff] [blame^] | 50 | CMAKE_CACHE_ARGS |
| 51 | -DCMAKE_C_COMPILER:STRING=${CMAKE_C_COMPILER} |
| 52 | -DCMAKE_CXX_COMPILER:STRING=${CMAKE_CXX_COMPILER} |
Eric Fiselier | d9b9ef7 | 2016-07-19 23:07:03 +0000 | [diff] [blame] | 53 | -DCMAKE_BUILD_TYPE:STRING=RELEASE |
| 54 | -DCMAKE_INSTALL_PREFIX:PATH=<INSTALL_DIR>) |
| 55 | endif() |
| 56 | |
| 57 | #============================================================================== |
| 58 | # Benchmark tests configuration |
| 59 | #============================================================================== |
| 60 | add_custom_target(libcxx-benchmarks) |
| 61 | |
| 62 | set(BENCHMARK_LIBCXX_INSTALL ${CMAKE_CURRENT_BINARY_DIR}/benchmark-libcxx) |
| 63 | set(BENCHMARK_NATIVE_INSTALL ${CMAKE_CURRENT_BINARY_DIR}/benchmark-native) |
| 64 | set(BENCHMARK_TEST_COMPILE_FLAGS |
| 65 | -std=c++14 -O2 |
| 66 | -I${BENCHMARK_LIBCXX_INSTALL}/include |
| 67 | ) |
| 68 | set(BENCHMARK_TEST_LIBCXX_COMPILE_FLAGS |
| 69 | -nostdinc++ |
Eric Fiselier | 4e1f9a0 | 2016-08-02 20:21:07 +0000 | [diff] [blame^] | 70 | -cxx-isystem ${LIBCXX_SOURCE_DIR}/include |
Eric Fiselier | d9b9ef7 | 2016-07-19 23:07:03 +0000 | [diff] [blame] | 71 | ${BENCHMARK_TEST_COMPILE_FLAGS} |
| 72 | -Wno-user-defined-literals |
| 73 | ) |
| 74 | set(BENCHMARK_TEST_LIBCXX_LINK_FLAGS |
| 75 | -nodefaultlibs |
| 76 | -L${BENCHMARK_LIBCXX_INSTALL}/lib/ |
| 77 | ) |
| 78 | set(BENCHMARK_TEST_NATIVE_LINK_FLAGS |
| 79 | -L${BENCHMARK_NATIVE_INSTALL}/lib/ |
| 80 | ) |
| 81 | split_list(BENCHMARK_TEST_COMPILE_FLAGS) |
| 82 | split_list(BENCHMARK_TEST_LIBCXX_COMPILE_FLAGS) |
| 83 | split_list(BENCHMARK_TEST_LIBCXX_LINK_FLAGS) |
| 84 | split_list(BENCHMARK_TEST_NATIVE_LINK_FLAGS) |
| 85 | macro(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() |
| 112 | endmacro() |
| 113 | |
| 114 | |
| 115 | #============================================================================== |
| 116 | # Register Benchmark tests |
| 117 | #============================================================================== |
| 118 | file(GLOB BENCHMARK_TESTS "*.bench.cpp") |
| 119 | foreach(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}) |
| 124 | endforeach() |