STL/benchmarks/CMakeLists.txt

127 строки
4.9 KiB
CMake

# Copyright (c) Microsoft Corporation.
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
cmake_minimum_required(VERSION 3.28.0)
project(msvc_standard_libraries_benchmarks LANGUAGES CXX)
if(DEFINED STL_BINARY_DIR)
cmake_path(ABSOLUTE_PATH STL_BINARY_DIR
BASE_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/.."
NORMALIZE
)
if(NOT EXISTS "${STL_BINARY_DIR}/out")
message(FATAL_ERROR "Invalid STL_BINARY_DIR '${STL_BINARY_DIR}'")
endif()
if(NOT DEFINED VCLIBS_TARGET_ARCHITECTURE)
set(VCLIBS_TARGET_ARCHITECTURE "${CMAKE_CXX_COMPILER_ARCHITECTURE_ID}")
endif()
string(TOLOWER "${VCLIBS_TARGET_ARCHITECTURE}" VCLIBS_TARGET_ARCHITECTURE)
if("${VCLIBS_TARGET_ARCHITECTURE}" STREQUAL "x86")
set(VCLIBS_I386_OR_AMD64 "i386")
elseif(VCLIBS_TARGET_ARCHITECTURE STREQUAL "x64")
set(VCLIBS_I386_OR_AMD64 "amd64")
elseif(VCLIBS_TARGET_ARCHITECTURE STREQUAL "armv7")
set(VCLIBS_I386_OR_AMD64 "arm")
elseif(VCLIBS_TARGET_ARCHITECTURE STREQUAL "arm64")
set(VCLIBS_I386_OR_AMD64 "arm64")
else()
message(FATAL_ERROR "Could not determine target architecture: VCLIBS_TARGET_ARCHITECTURE: ${VCLIBS_TARGET_ARCHITECTURE}")
endif()
include_directories(BEFORE "${STL_BINARY_DIR}/out/inc")
link_directories(BEFORE "${STL_BINARY_DIR}/out/lib/${VCLIBS_I386_OR_AMD64}")
else()
message(WARNING "STL_BINARY_DIR not set; benchmarking the globally installed standard library")
endif()
set(STL_BENCHMARK_MSVC_RUNTIME_LIBRARY
MultiThreaded
CACHE STRING "The flavor of the standard library to use; see https://cmake.org/cmake/help/latest/variable/CMAKE_MSVC_RUNTIME_LIBRARY.html for more information.")
set_property(CACHE STL_BENCHMARK_MSVC_RUNTIME_LIBRARY
PROPERTY STRINGS
"MultiThreaded;MultiThreadedDLL;MultiThreadedDebug;MultiThreadedDebugDLL"
)
set(CMAKE_MSVC_RUNTIME_LIBRARY "${STL_BENCHMARK_MSVC_RUNTIME_LIBRARY}")
set(STL_BENCHMARK_ITERATOR_DEBUG_LEVEL
default
CACHE STRING "What level of iterator debugging to use."
)
set_property(CACHE STL_BENCHMARK_ITERATOR_DEBUG_LEVEL
PROPERTY STRINGS
"default;0;1;2"
)
if(NOT STL_BENCHMARK_ITERATOR_DEBUG_LEVEL STREQUAL "default")
add_compile_definitions("_ITERATOR_DEBUG_LEVEL=${STL_BENCHMARK_ITERATOR_DEBUG_LEVEL}")
endif()
set(CMAKE_BUILD_TYPE RelWithDebInfo)
# /utf-8 affects <format>.
add_compile_options("$<$<COMPILE_LANGUAGE:CXX>:/diagnostics:caret;/W4;/WX;/w14265;/w15038;/w15262;/utf-8>")
if(NOT EXISTS "${CMAKE_CURRENT_LIST_DIR}/google-benchmark/.git")
message(FATAL_ERROR "google-benchmark is not checked out; make sure to run\n git submodule update --init benchmarks/google-benchmark")
endif()
set(BENCHMARK_ENABLE_DOXYGEN OFF)
set(BENCHMARK_ENABLE_INSTALL OFF)
set(BENCHMARK_ENABLE_TESTING OFF)
set(HAVE_GNU_POSIX_REGEX OFF)
set(HAVE_POSIX_REGEX OFF)
add_subdirectory(google-benchmark EXCLUDE_FROM_ALL)
set(benchmark_headers
"inc/udt.hpp"
"inc/utility.hpp"
"inc/xoshiro.hpp"
)
function(add_benchmark name)
cmake_parse_arguments(PARSE_ARGV 1 "arg" "" "CXX_STANDARD" "")
if(NOT DEFINED arg_CXX_STANDARD)
set(arg_CXX_STANDARD 23)
elseif(NOT arg_CXX_STANDARD MATCHES "^[0-9][0-9]$")
message(FATAL_ERROR "Unexpected value for CXX_STANDARD: ${arg_CXX_STANDARD}")
endif()
if(NOT DEFINED arg_UNPARSED_ARGUMENTS)
message(FATAL_ERROR "benchmark ${name} does not have any source files")
endif()
add_executable(benchmark-${name}
${benchmark_headers}
${arg_UNPARSED_ARGUMENTS}
)
target_compile_features(benchmark-${name} PRIVATE cxx_std_${arg_CXX_STANDARD})
target_include_directories(benchmark-${name} PRIVATE inc)
target_link_libraries(benchmark-${name} PRIVATE benchmark::benchmark)
# TRANSITION, google/benchmark#1450
target_compile_definitions(benchmark-${name} PRIVATE BENCHMARK_STATIC_DEFINE)
endfunction()
add_benchmark(bitset_to_string src/bitset_to_string.cpp)
add_benchmark(find_and_count src/find_and_count.cpp)
add_benchmark(find_first_of src/find_first_of.cpp)
add_benchmark(locale_classic src/locale_classic.cpp)
add_benchmark(minmax_element src/minmax_element.cpp)
add_benchmark(mismatch src/mismatch.cpp)
add_benchmark(path_lexically_normal src/path_lexically_normal.cpp)
add_benchmark(priority_queue_push_range src/priority_queue_push_range.cpp)
add_benchmark(random_integer_generation src/random_integer_generation.cpp)
add_benchmark(replace src/replace.cpp)
add_benchmark(std_copy src/std_copy.cpp)
add_benchmark(swap_ranges src/swap_ranges.cpp)
add_benchmark(vector_bool_copy src/std/containers/sequences/vector.bool/copy/test.cpp)
add_benchmark(vector_bool_copy_n src/std/containers/sequences/vector.bool/copy_n/test.cpp)
add_benchmark(vector_bool_move src/std/containers/sequences/vector.bool/move/test.cpp)