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