mirror of
https://github.com/google/benchmark.git
synced 2025-01-13 21:30:14 +08:00
annotate and export public symbols (#1321)
This commit is contained in:
parent
6e51dcbcc3
commit
9e47d070fe
129
.github/workflows/build-and-test.yml
vendored
129
.github/workflows/build-and-test.yml
vendored
@ -10,7 +10,7 @@ jobs:
|
|||||||
# TODO: add coverage build (requires lcov)
|
# TODO: add coverage build (requires lcov)
|
||||||
# TODO: add clang + libc++ builds for ubuntu
|
# TODO: add clang + libc++ builds for ubuntu
|
||||||
job:
|
job:
|
||||||
name: ${{ matrix.os }}.${{ matrix.build_type }}.${{ matrix.compiler }}
|
name: ${{ matrix.os }}.${{ matrix.build_type }}.${{ matrix.lib }}.${{ matrix.compiler }}
|
||||||
runs-on: ${{ matrix.os }}
|
runs-on: ${{ matrix.os }}
|
||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
@ -18,28 +18,39 @@ jobs:
|
|||||||
os: [ubuntu-latest, ubuntu-20.04, macos-latest]
|
os: [ubuntu-latest, ubuntu-20.04, macos-latest]
|
||||||
build_type: ['Release', 'Debug']
|
build_type: ['Release', 'Debug']
|
||||||
compiler: [g++, clang++]
|
compiler: [g++, clang++]
|
||||||
include:
|
lib: ['shared', 'static']
|
||||||
- displayTargetName: windows-latest-release
|
|
||||||
os: windows-latest
|
|
||||||
build_type: 'Release'
|
|
||||||
- displayTargetName: windows-latest-debug
|
|
||||||
os: windows-latest
|
|
||||||
build_type: 'Debug'
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v2
|
||||||
|
|
||||||
- name: create build environment
|
- name: create build environment
|
||||||
run: cmake -E make_directory ${{ runner.workspace }}/_build
|
run: cmake -E make_directory ${{ runner.workspace }}/_build
|
||||||
|
|
||||||
|
- name: setup cmake initial cache
|
||||||
|
run: touch compiler-cache.cmake
|
||||||
|
|
||||||
|
- name: setup lto
|
||||||
|
# Workaround for enabling -flto on old GCC versions
|
||||||
|
if: matrix.build_type == 'Release' && startsWith(matrix.compiler, 'g++') && matrix.os != 'macos-latest'
|
||||||
|
run: >
|
||||||
|
echo 'set (CMAKE_CXX_FLAGS -flto CACHE STRING "")' >> compiler-cache.cmake;
|
||||||
|
echo 'set (CMAKE_RANLIB /usr/bin/gcc-ranlib CACHE FILEPATH "")' >> compiler-cache.cmake;
|
||||||
|
echo 'set (CMAKE_AR /usr/bin/gcc-ar CACHE FILEPATH "")' >> compiler-cache.cmake;
|
||||||
|
echo 'set (CMAKE_NM /usr/bin/gcc-nm CACHE FILEPATH "")' >> compiler-cache.cmake;
|
||||||
|
|
||||||
- name: configure cmake
|
- name: configure cmake
|
||||||
env:
|
env:
|
||||||
CXX: ${{ matrix.compiler }}
|
CXX: ${{ matrix.compiler }}
|
||||||
shell: bash
|
shell: bash
|
||||||
working-directory: ${{ runner.workspace }}/_build
|
working-directory: ${{ runner.workspace }}/_build
|
||||||
run: >
|
run: >
|
||||||
cmake $GITHUB_WORKSPACE
|
cmake -C ${{ github.workspace }}/compiler-cache.cmake
|
||||||
|
$GITHUB_WORKSPACE
|
||||||
-DBENCHMARK_DOWNLOAD_DEPENDENCIES=ON
|
-DBENCHMARK_DOWNLOAD_DEPENDENCIES=ON
|
||||||
|
-DBUILD_SHARED_LIBS=${{ matrix.lib == 'shared' }}
|
||||||
-DCMAKE_BUILD_TYPE=${{ matrix.build_type }}
|
-DCMAKE_BUILD_TYPE=${{ matrix.build_type }}
|
||||||
|
-DCMAKE_CXX_VISIBILITY_PRESET=hidden
|
||||||
|
-DCMAKE_VISIBILITY_INLINES_HIDDEN=ON
|
||||||
|
|
||||||
- name: build
|
- name: build
|
||||||
shell: bash
|
shell: bash
|
||||||
@ -51,6 +62,57 @@ jobs:
|
|||||||
working-directory: ${{ runner.workspace }}/_build
|
working-directory: ${{ runner.workspace }}/_build
|
||||||
run: ctest -C ${{ matrix.build_type }} -VV
|
run: ctest -C ${{ matrix.build_type }} -VV
|
||||||
|
|
||||||
|
msvc:
|
||||||
|
name: ${{ matrix.os }}.${{ matrix.build_type }}.${{ matrix.lib }}.${{ matrix.msvc }}
|
||||||
|
runs-on: ${{ matrix.os }}
|
||||||
|
defaults:
|
||||||
|
run:
|
||||||
|
shell: powershell
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
msvc:
|
||||||
|
- VS-16-2019
|
||||||
|
- VS-17-2022
|
||||||
|
arch:
|
||||||
|
- x64
|
||||||
|
build_type:
|
||||||
|
- Debug
|
||||||
|
- Release
|
||||||
|
lib:
|
||||||
|
- shared
|
||||||
|
- static
|
||||||
|
include:
|
||||||
|
- msvc: VS-16-2019
|
||||||
|
os: windows-2019
|
||||||
|
generator: 'Visual Studio 16 2019'
|
||||||
|
- msvc: VS-17-2022
|
||||||
|
os: windows-2022
|
||||||
|
generator: 'Visual Studio 17 2022'
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v2
|
||||||
|
|
||||||
|
- name: configure cmake
|
||||||
|
run: >
|
||||||
|
cmake -S . -B _build/
|
||||||
|
-A ${{ matrix.arch }}
|
||||||
|
-G "${{ matrix.generator }}"
|
||||||
|
-DBENCHMARK_DOWNLOAD_DEPENDENCIES=ON
|
||||||
|
-DBUILD_SHARED_LIBS=${{ matrix.lib == 'shared' }}
|
||||||
|
|
||||||
|
- name: build
|
||||||
|
run: cmake --build _build/ --config ${{ matrix.build_type }}
|
||||||
|
|
||||||
|
- name: setup test environment
|
||||||
|
# Make sure gmock and benchmark DLLs can be found
|
||||||
|
run: >
|
||||||
|
echo "$((Get-Item .).FullName)/_build/bin/${{ matrix.build_type }}" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append;
|
||||||
|
echo "$((Get-Item .).FullName)/_build/src/${{ matrix.build_type }}" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append;
|
||||||
|
|
||||||
|
- name: test
|
||||||
|
run: ctest --test-dir _build/ -C ${{ matrix.build_type }} -VV
|
||||||
|
|
||||||
ubuntu-16_04:
|
ubuntu-16_04:
|
||||||
name: ubuntu-16.04.${{ matrix.build_type }}.${{ matrix.compiler }}
|
name: ubuntu-16.04.${{ matrix.build_type }}.${{ matrix.compiler }}
|
||||||
runs-on: [ubuntu-latest]
|
runs-on: [ubuntu-latest]
|
||||||
@ -71,15 +133,34 @@ jobs:
|
|||||||
- name: create build environment
|
- name: create build environment
|
||||||
run: cmake -E make_directory $GITHUB_WORKSPACE/_build
|
run: cmake -E make_directory $GITHUB_WORKSPACE/_build
|
||||||
|
|
||||||
|
- name: setup cmake initial cache
|
||||||
|
run: touch compiler-cache.cmake
|
||||||
|
|
||||||
|
- name: setup lto
|
||||||
|
# Workaround for enabling -flto on old GCC versions
|
||||||
|
# -Wl,--no-as-needed is needed to avoid the following linker error:
|
||||||
|
#
|
||||||
|
# /usr/lib/gcc/x86_64-linux-gnu/5/libstdc++.so: undefined reference to `pthread_create'
|
||||||
|
#
|
||||||
|
if: matrix.build_type == 'Release' && startsWith(matrix.compiler, 'g++')
|
||||||
|
run: >
|
||||||
|
echo 'set (CMAKE_CXX_FLAGS "-Wl,--no-as-needed -flto" CACHE STRING "")' >> compiler-cache.cmake;
|
||||||
|
echo 'set (CMAKE_RANLIB "/usr/bin/gcc-ranlib" CACHE FILEPATH "")' >> compiler-cache.cmake;
|
||||||
|
echo 'set (CMAKE_AR "/usr/bin/gcc-ar" CACHE FILEPATH "")' >> compiler-cache.cmake;
|
||||||
|
echo 'set (CMAKE_NM "/usr/bin/gcc-nm" CACHE FILEPATH "")' >> compiler-cache.cmake;
|
||||||
|
|
||||||
- name: configure cmake
|
- name: configure cmake
|
||||||
env:
|
env:
|
||||||
CXX: ${{ matrix.compiler }}
|
CXX: ${{ matrix.compiler }}
|
||||||
shell: bash
|
shell: bash
|
||||||
working-directory: ${{ github.workspace }}/_build
|
working-directory: ${{ github.workspace }}/_build
|
||||||
run: >
|
run: >
|
||||||
cmake $GITHUB_WORKSPACE
|
cmake -C ../compiler-cache.cmake ..
|
||||||
-DBENCHMARK_DOWNLOAD_DEPENDENCIES=ON
|
-DBENCHMARK_DOWNLOAD_DEPENDENCIES=ON
|
||||||
|
-DBUILD_SHARED_LIBS=${{ matrix.lib == 'shared' }}
|
||||||
-DCMAKE_BUILD_TYPE=${{ matrix.build_type }}
|
-DCMAKE_BUILD_TYPE=${{ matrix.build_type }}
|
||||||
|
-DCMAKE_CXX_VISIBILITY_PRESET=hidden
|
||||||
|
-DCMAKE_VISIBILITY_INLINES_HIDDEN=ON
|
||||||
|
|
||||||
- name: build
|
- name: build
|
||||||
shell: bash
|
shell: bash
|
||||||
@ -126,16 +207,38 @@ jobs:
|
|||||||
- name: create build environment
|
- name: create build environment
|
||||||
run: cmake -E make_directory $GITHUB_WORKSPACE/_build
|
run: cmake -E make_directory $GITHUB_WORKSPACE/_build
|
||||||
|
|
||||||
|
- name: setup cmake initial cache
|
||||||
|
run: touch compiler-cache.cmake
|
||||||
|
|
||||||
|
- name: setup lto
|
||||||
|
# Workaround for enabling -flto on old GCC versions
|
||||||
|
# -Wl,--no-as-needed is needed to avoid the following linker error:
|
||||||
|
#
|
||||||
|
# /usr/lib/gcc/x86_64-linux-gnu/6/libstdc++.so: undefined reference to `pthread_create'
|
||||||
|
#
|
||||||
|
if: matrix.build_type == 'Release' && startsWith(matrix.compiler, 'g++')
|
||||||
|
run: >
|
||||||
|
COMPILER=${{ matrix.compiler }};
|
||||||
|
VERSION=${COMPILER#g++-};
|
||||||
|
PREFIX=/usr/bin/gcc;
|
||||||
|
echo "set (CMAKE_CXX_FLAGS \"-Wl,--no-as-needed -flto\" CACHE STRING \"\")" >> compiler-cache.cmake;
|
||||||
|
echo "set (CMAKE_RANLIB \"$PREFIX-ranlib-$VERSION\" CACHE FILEPATH \"\")" >> compiler-cache.cmake;
|
||||||
|
echo "set (CMAKE_AR \"$PREFIX-ar-$VERSION\" CACHE FILEPATH \"\")" >> compiler-cache.cmake;
|
||||||
|
echo "set (CMAKE_NM \"$PREFIX-nm-$VERSION\" CACHE FILEPAT \"\")" >> compiler-cache.cmake;
|
||||||
|
|
||||||
- name: configure cmake
|
- name: configure cmake
|
||||||
env:
|
env:
|
||||||
CXX: ${{ matrix.compiler }}
|
CXX: ${{ matrix.compiler }}
|
||||||
shell: bash
|
shell: bash
|
||||||
working-directory: ${{ github.workspace }}/_build
|
working-directory: ${{ github.workspace }}/_build
|
||||||
run: >
|
run: >
|
||||||
cmake $GITHUB_WORKSPACE
|
cmake -C ../compiler-cache.cmake ..
|
||||||
-DBENCHMARK_ENABLE_TESTING=${{ matrix.run_tests }}
|
|
||||||
-DCMAKE_BUILD_TYPE=${{ matrix.build_type }}
|
|
||||||
-DBENCHMARK_DOWNLOAD_DEPENDENCIES=${{ matrix.run_tests }}
|
-DBENCHMARK_DOWNLOAD_DEPENDENCIES=${{ matrix.run_tests }}
|
||||||
|
-DBENCHMARK_ENABLE_TESTING=${{ matrix.run_tests }}
|
||||||
|
-DBUILD_SHARED_LIBS=${{ matrix.lib == 'shared' }}
|
||||||
|
-DCMAKE_BUILD_TYPE=${{ matrix.build_type }}
|
||||||
|
-DCMAKE_CXX_VISIBILITY_PRESET=hidden
|
||||||
|
-DCMAKE_VISIBILITY_INLINES_HIDDEN=ON
|
||||||
|
|
||||||
- name: build
|
- name: build
|
||||||
shell: bash
|
shell: bash
|
||||||
|
30
BUILD.bazel
30
BUILD.bazel
@ -1,5 +1,22 @@
|
|||||||
licenses(["notice"])
|
licenses(["notice"])
|
||||||
|
|
||||||
|
load(
|
||||||
|
"@com_github_google_benchmark//tools:workspace/generate_export_header.bzl",
|
||||||
|
"generate_export_header",
|
||||||
|
)
|
||||||
|
|
||||||
|
posix_copts = [
|
||||||
|
"-fvisibility=hidden",
|
||||||
|
"-fvisibility-inlines-hidden",
|
||||||
|
]
|
||||||
|
|
||||||
|
# Generate header to provide ABI export symbols
|
||||||
|
generate_export_header(
|
||||||
|
out = "include/benchmark/export.h",
|
||||||
|
lib = "benchmark",
|
||||||
|
static_define = "BENCHMARK_STATIC_DEFINE",
|
||||||
|
)
|
||||||
|
|
||||||
config_setting(
|
config_setting(
|
||||||
name = "qnx",
|
name = "qnx",
|
||||||
constraint_values = ["@platforms//os:qnx"],
|
constraint_values = ["@platforms//os:qnx"],
|
||||||
@ -27,13 +44,20 @@ cc_library(
|
|||||||
],
|
],
|
||||||
exclude = ["src/benchmark_main.cc"],
|
exclude = ["src/benchmark_main.cc"],
|
||||||
),
|
),
|
||||||
hdrs = ["include/benchmark/benchmark.h"],
|
hdrs = [
|
||||||
|
"include/benchmark/benchmark.h",
|
||||||
|
"include/benchmark/export.h", # From generate_export_header
|
||||||
|
],
|
||||||
linkopts = select({
|
linkopts = select({
|
||||||
":windows": ["-DEFAULTLIB:shlwapi.lib"],
|
":windows": ["-DEFAULTLIB:shlwapi.lib"],
|
||||||
"//conditions:default": ["-pthread"],
|
"//conditions:default": ["-pthread"],
|
||||||
}),
|
}),
|
||||||
strip_include_prefix = "include",
|
strip_include_prefix = "include",
|
||||||
visibility = ["//visibility:public"],
|
visibility = ["//visibility:public"],
|
||||||
|
copts = select({
|
||||||
|
":windows": [],
|
||||||
|
"//conditions:default": posix_copts,
|
||||||
|
}),
|
||||||
)
|
)
|
||||||
|
|
||||||
cc_library(
|
cc_library(
|
||||||
@ -43,6 +67,10 @@ cc_library(
|
|||||||
strip_include_prefix = "include",
|
strip_include_prefix = "include",
|
||||||
visibility = ["//visibility:public"],
|
visibility = ["//visibility:public"],
|
||||||
deps = [":benchmark"],
|
deps = [":benchmark"],
|
||||||
|
copts = select({
|
||||||
|
":windows": [],
|
||||||
|
"//conditions:default": posix_copts,
|
||||||
|
}),
|
||||||
)
|
)
|
||||||
|
|
||||||
cc_library(
|
cc_library(
|
||||||
|
@ -50,7 +50,10 @@ option(BENCHMARK_USE_BUNDLED_GTEST "Use bundled GoogleTest. If disabled, the fin
|
|||||||
|
|
||||||
option(BENCHMARK_ENABLE_LIBPFM "Enable performance counters provided by libpfm" OFF)
|
option(BENCHMARK_ENABLE_LIBPFM "Enable performance counters provided by libpfm" OFF)
|
||||||
|
|
||||||
set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON)
|
# Export only public symbols
|
||||||
|
set(CMAKE_CXX_VISIBILITY_PRESET hidden)
|
||||||
|
set(CMAKE_VISIBILITY_INLINES_HIDDEN ON)
|
||||||
|
|
||||||
if(MSVC)
|
if(MSVC)
|
||||||
# As of CMake 3.18, CMAKE_SYSTEM_PROCESSOR is not set properly for MSVC and
|
# As of CMake 3.18, CMAKE_SYSTEM_PROCESSOR is not set properly for MSVC and
|
||||||
# cross-compilation (e.g. Host=x86_64, target=aarch64) requires using the
|
# cross-compilation (e.g. Host=x86_64, target=aarch64) requires using the
|
||||||
@ -123,10 +126,11 @@ set(GENERIC_LIB_VERSION ${VERSION})
|
|||||||
string(SUBSTRING ${VERSION} 0 1 GENERIC_LIB_SOVERSION)
|
string(SUBSTRING ${VERSION} 0 1 GENERIC_LIB_SOVERSION)
|
||||||
|
|
||||||
# Import our CMake modules
|
# Import our CMake modules
|
||||||
include(CheckCXXCompilerFlag)
|
|
||||||
include(AddCXXCompilerFlag)
|
include(AddCXXCompilerFlag)
|
||||||
include(CXXFeatureCheck)
|
include(CheckCXXCompilerFlag)
|
||||||
include(CheckLibraryExists)
|
include(CheckLibraryExists)
|
||||||
|
include(CXXFeatureCheck)
|
||||||
|
include(GenerateExportHeader)
|
||||||
|
|
||||||
check_library_exists(rt shm_open "" HAVE_LIB_RT)
|
check_library_exists(rt shm_open "" HAVE_LIB_RT)
|
||||||
|
|
||||||
|
@ -1,5 +1,7 @@
|
|||||||
// Benchmark for Python.
|
// Benchmark for Python.
|
||||||
|
|
||||||
|
#include "benchmark/benchmark.h"
|
||||||
|
|
||||||
#include <map>
|
#include <map>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
@ -9,8 +11,6 @@
|
|||||||
#include "pybind11/stl.h"
|
#include "pybind11/stl.h"
|
||||||
#include "pybind11/stl_bind.h"
|
#include "pybind11/stl_bind.h"
|
||||||
|
|
||||||
#include "benchmark/benchmark.h"
|
|
||||||
|
|
||||||
PYBIND11_MAKE_OPAQUE(benchmark::UserCounters);
|
PYBIND11_MAKE_OPAQUE(benchmark::UserCounters);
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
@ -187,6 +187,8 @@ BENCHMARK(BM_test)->Unit(benchmark::kMillisecond);
|
|||||||
#include <utility>
|
#include <utility>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
|
#include "benchmark/export.h"
|
||||||
|
|
||||||
#if defined(BENCHMARK_HAS_CXX11)
|
#if defined(BENCHMARK_HAS_CXX11)
|
||||||
#include <atomic>
|
#include <atomic>
|
||||||
#include <initializer_list>
|
#include <initializer_list>
|
||||||
@ -280,23 +282,29 @@ BENCHMARK(BM_test)->Unit(benchmark::kMillisecond);
|
|||||||
#define BENCHMARK_OVERRIDE
|
#define BENCHMARK_OVERRIDE
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined(_MSC_VER)
|
||||||
|
#pragma warning(push)
|
||||||
|
// C4251: <symbol> needs to have dll-interface to be used by clients of class
|
||||||
|
#pragma warning(disable : 4251)
|
||||||
|
#endif
|
||||||
|
|
||||||
namespace benchmark {
|
namespace benchmark {
|
||||||
class BenchmarkReporter;
|
class BenchmarkReporter;
|
||||||
|
|
||||||
void Initialize(int* argc, char** argv);
|
BENCHMARK_EXPORT void Initialize(int* argc, char** argv);
|
||||||
void Shutdown();
|
BENCHMARK_EXPORT void Shutdown();
|
||||||
|
|
||||||
// Report to stdout all arguments in 'argv' as unrecognized except the first.
|
// Report to stdout all arguments in 'argv' as unrecognized except the first.
|
||||||
// Returns true there is at least on unrecognized argument (i.e. 'argc' > 1).
|
// Returns true there is at least on unrecognized argument (i.e. 'argc' > 1).
|
||||||
bool ReportUnrecognizedArguments(int argc, char** argv);
|
BENCHMARK_EXPORT bool ReportUnrecognizedArguments(int argc, char** argv);
|
||||||
|
|
||||||
// Returns the current value of --benchmark_filter.
|
// Returns the current value of --benchmark_filter.
|
||||||
std::string GetBenchmarkFilter();
|
BENCHMARK_EXPORT std::string GetBenchmarkFilter();
|
||||||
|
|
||||||
// Creates a default display reporter. Used by the library when no display
|
// Creates a default display reporter. Used by the library when no display
|
||||||
// reporter is provided, but also made available for external use in case a
|
// reporter is provided, but also made available for external use in case a
|
||||||
// custom reporter should respect the `--benchmark_format` flag as a fallback
|
// custom reporter should respect the `--benchmark_format` flag as a fallback
|
||||||
BenchmarkReporter* CreateDefaultDisplayReporter();
|
BENCHMARK_EXPORT BenchmarkReporter* CreateDefaultDisplayReporter();
|
||||||
|
|
||||||
// Generate a list of benchmarks matching the specified --benchmark_filter flag
|
// Generate a list of benchmarks matching the specified --benchmark_filter flag
|
||||||
// and if --benchmark_list_tests is specified return after printing the name
|
// and if --benchmark_list_tests is specified return after printing the name
|
||||||
@ -314,18 +322,19 @@ BenchmarkReporter* CreateDefaultDisplayReporter();
|
|||||||
// 'file_reporter' is ignored.
|
// 'file_reporter' is ignored.
|
||||||
//
|
//
|
||||||
// RETURNS: The number of matching benchmarks.
|
// RETURNS: The number of matching benchmarks.
|
||||||
size_t RunSpecifiedBenchmarks();
|
BENCHMARK_EXPORT size_t RunSpecifiedBenchmarks();
|
||||||
size_t RunSpecifiedBenchmarks(std::string spec);
|
BENCHMARK_EXPORT size_t RunSpecifiedBenchmarks(std::string spec);
|
||||||
|
|
||||||
size_t RunSpecifiedBenchmarks(BenchmarkReporter* display_reporter);
|
BENCHMARK_EXPORT size_t
|
||||||
size_t RunSpecifiedBenchmarks(BenchmarkReporter* display_reporter,
|
RunSpecifiedBenchmarks(BenchmarkReporter* display_reporter);
|
||||||
std::string spec);
|
BENCHMARK_EXPORT size_t
|
||||||
|
RunSpecifiedBenchmarks(BenchmarkReporter* display_reporter, std::string spec);
|
||||||
|
|
||||||
size_t RunSpecifiedBenchmarks(BenchmarkReporter* display_reporter,
|
BENCHMARK_EXPORT size_t RunSpecifiedBenchmarks(
|
||||||
BenchmarkReporter* file_reporter);
|
BenchmarkReporter* display_reporter, BenchmarkReporter* file_reporter);
|
||||||
size_t RunSpecifiedBenchmarks(BenchmarkReporter* display_reporter,
|
BENCHMARK_EXPORT size_t
|
||||||
BenchmarkReporter* file_reporter,
|
RunSpecifiedBenchmarks(BenchmarkReporter* display_reporter,
|
||||||
std::string spec);
|
BenchmarkReporter* file_reporter, std::string spec);
|
||||||
|
|
||||||
// If a MemoryManager is registered (via RegisterMemoryManager()),
|
// If a MemoryManager is registered (via RegisterMemoryManager()),
|
||||||
// it can be used to collect and report allocation metrics for a run of the
|
// it can be used to collect and report allocation metrics for a run of the
|
||||||
@ -374,9 +383,11 @@ class MemoryManager {
|
|||||||
|
|
||||||
// Register a MemoryManager instance that will be used to collect and report
|
// Register a MemoryManager instance that will be used to collect and report
|
||||||
// allocation measurements for benchmark runs.
|
// allocation measurements for benchmark runs.
|
||||||
|
BENCHMARK_EXPORT
|
||||||
void RegisterMemoryManager(MemoryManager* memory_manager);
|
void RegisterMemoryManager(MemoryManager* memory_manager);
|
||||||
|
|
||||||
// Add a key-value pair to output as part of the context stanza in the report.
|
// Add a key-value pair to output as part of the context stanza in the report.
|
||||||
|
BENCHMARK_EXPORT
|
||||||
void AddCustomContext(const std::string& key, const std::string& value);
|
void AddCustomContext(const std::string& key, const std::string& value);
|
||||||
|
|
||||||
namespace internal {
|
namespace internal {
|
||||||
@ -384,14 +395,15 @@ class Benchmark;
|
|||||||
class BenchmarkImp;
|
class BenchmarkImp;
|
||||||
class BenchmarkFamilies;
|
class BenchmarkFamilies;
|
||||||
|
|
||||||
|
BENCHMARK_EXPORT
|
||||||
void UseCharPointer(char const volatile*);
|
void UseCharPointer(char const volatile*);
|
||||||
|
|
||||||
// Take ownership of the pointer and register the benchmark. Return the
|
// Take ownership of the pointer and register the benchmark. Return the
|
||||||
// registered benchmark.
|
// registered benchmark.
|
||||||
Benchmark* RegisterBenchmarkInternal(Benchmark*);
|
BENCHMARK_EXPORT Benchmark* RegisterBenchmarkInternal(Benchmark*);
|
||||||
|
|
||||||
// Ensure that the standard streams are properly initialized in every TU.
|
// Ensure that the standard streams are properly initialized in every TU.
|
||||||
int InitializeStreams();
|
BENCHMARK_EXPORT int InitializeStreams();
|
||||||
BENCHMARK_UNUSED static int stream_init_anchor = InitializeStreams();
|
BENCHMARK_UNUSED static int stream_init_anchor = InitializeStreams();
|
||||||
|
|
||||||
} // namespace internal
|
} // namespace internal
|
||||||
@ -573,7 +585,7 @@ enum AggregationReportMode
|
|||||||
|
|
||||||
// State is passed to a running Benchmark and contains state for the
|
// State is passed to a running Benchmark and contains state for the
|
||||||
// benchmark to use.
|
// benchmark to use.
|
||||||
class State {
|
class BENCHMARK_EXPORT State {
|
||||||
public:
|
public:
|
||||||
struct StateIterator;
|
struct StateIterator;
|
||||||
friend struct StateIterator;
|
friend struct StateIterator;
|
||||||
@ -904,7 +916,7 @@ typedef void(Function)(State&);
|
|||||||
// be called on this object to change the properties of the benchmark.
|
// be called on this object to change the properties of the benchmark.
|
||||||
// Each method returns "this" so that multiple method calls can
|
// Each method returns "this" so that multiple method calls can
|
||||||
// chained into one expression.
|
// chained into one expression.
|
||||||
class Benchmark {
|
class BENCHMARK_EXPORT Benchmark {
|
||||||
public:
|
public:
|
||||||
virtual ~Benchmark();
|
virtual ~Benchmark();
|
||||||
|
|
||||||
@ -1097,7 +1109,6 @@ class Benchmark {
|
|||||||
|
|
||||||
protected:
|
protected:
|
||||||
explicit Benchmark(const char* name);
|
explicit Benchmark(const char* name);
|
||||||
Benchmark(Benchmark const&);
|
|
||||||
void SetName(const char* name);
|
void SetName(const char* name);
|
||||||
|
|
||||||
int ArgsCnt() const;
|
int ArgsCnt() const;
|
||||||
@ -1127,7 +1138,17 @@ class Benchmark {
|
|||||||
callback_function setup_;
|
callback_function setup_;
|
||||||
callback_function teardown_;
|
callback_function teardown_;
|
||||||
|
|
||||||
Benchmark& operator=(Benchmark const&);
|
Benchmark(Benchmark const&)
|
||||||
|
#if defined(BENCHMARK_HAS_CXX11)
|
||||||
|
= delete
|
||||||
|
#endif
|
||||||
|
;
|
||||||
|
|
||||||
|
Benchmark& operator=(Benchmark const&)
|
||||||
|
#if defined(BENCHMARK_HAS_CXX11)
|
||||||
|
= delete
|
||||||
|
#endif
|
||||||
|
;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace internal
|
} // namespace internal
|
||||||
@ -1146,12 +1167,12 @@ internal::Benchmark* RegisterBenchmark(const char* name, Lambda&& fn);
|
|||||||
|
|
||||||
// Remove all registered benchmarks. All pointers to previously registered
|
// Remove all registered benchmarks. All pointers to previously registered
|
||||||
// benchmarks are invalidated.
|
// benchmarks are invalidated.
|
||||||
void ClearRegisteredBenchmarks();
|
BENCHMARK_EXPORT void ClearRegisteredBenchmarks();
|
||||||
|
|
||||||
namespace internal {
|
namespace internal {
|
||||||
// The class used to hold all Benchmarks created from static function.
|
// The class used to hold all Benchmarks created from static function.
|
||||||
// (ie those created using the BENCHMARK(...) macros.
|
// (ie those created using the BENCHMARK(...) macros.
|
||||||
class FunctionBenchmark : public Benchmark {
|
class BENCHMARK_EXPORT FunctionBenchmark : public Benchmark {
|
||||||
public:
|
public:
|
||||||
FunctionBenchmark(const char* name, Function* func)
|
FunctionBenchmark(const char* name, Function* func)
|
||||||
: Benchmark(name), func_(func) {}
|
: Benchmark(name), func_(func) {}
|
||||||
@ -1444,22 +1465,14 @@ class Fixture : public internal::Benchmark {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Helper macro to create a main routine in a test that runs the benchmarks
|
// Helper macro to create a main routine in a test that runs the benchmarks
|
||||||
#define BENCHMARK_MAIN() \
|
#define BENCHMARK_MAIN() BENCHMARK_EXPORT int main(int argc, char** argv)
|
||||||
int main(int argc, char** argv) { \
|
|
||||||
::benchmark::Initialize(&argc, argv); \
|
|
||||||
if (::benchmark::ReportUnrecognizedArguments(argc, argv)) return 1; \
|
|
||||||
::benchmark::RunSpecifiedBenchmarks(); \
|
|
||||||
::benchmark::Shutdown(); \
|
|
||||||
return 0; \
|
|
||||||
} \
|
|
||||||
int main(int, char**)
|
|
||||||
|
|
||||||
// ------------------------------------------------------
|
// ------------------------------------------------------
|
||||||
// Benchmark Reporters
|
// Benchmark Reporters
|
||||||
|
|
||||||
namespace benchmark {
|
namespace benchmark {
|
||||||
|
|
||||||
struct CPUInfo {
|
struct BENCHMARK_EXPORT CPUInfo {
|
||||||
struct CacheInfo {
|
struct CacheInfo {
|
||||||
std::string type;
|
std::string type;
|
||||||
int level;
|
int level;
|
||||||
@ -1483,7 +1496,7 @@ struct CPUInfo {
|
|||||||
};
|
};
|
||||||
|
|
||||||
// Adding Struct for System Information
|
// Adding Struct for System Information
|
||||||
struct SystemInfo {
|
struct BENCHMARK_EXPORT SystemInfo {
|
||||||
std::string name;
|
std::string name;
|
||||||
static const SystemInfo& Get();
|
static const SystemInfo& Get();
|
||||||
|
|
||||||
@ -1495,7 +1508,7 @@ struct SystemInfo {
|
|||||||
// BenchmarkName contains the components of the Benchmark's name
|
// BenchmarkName contains the components of the Benchmark's name
|
||||||
// which allows individual fields to be modified or cleared before
|
// which allows individual fields to be modified or cleared before
|
||||||
// building the final name using 'str()'.
|
// building the final name using 'str()'.
|
||||||
struct BenchmarkName {
|
struct BENCHMARK_EXPORT BenchmarkName {
|
||||||
std::string function_name;
|
std::string function_name;
|
||||||
std::string args;
|
std::string args;
|
||||||
std::string min_time;
|
std::string min_time;
|
||||||
@ -1514,7 +1527,7 @@ struct BenchmarkName {
|
|||||||
// can control the destination of the reports by calling
|
// can control the destination of the reports by calling
|
||||||
// RunSpecifiedBenchmarks and passing it a custom reporter object.
|
// RunSpecifiedBenchmarks and passing it a custom reporter object.
|
||||||
// The reporter object must implement the following interface.
|
// The reporter object must implement the following interface.
|
||||||
class BenchmarkReporter {
|
class BENCHMARK_EXPORT BenchmarkReporter {
|
||||||
public:
|
public:
|
||||||
struct Context {
|
struct Context {
|
||||||
CPUInfo const& cpu_info;
|
CPUInfo const& cpu_info;
|
||||||
@ -1525,7 +1538,7 @@ class BenchmarkReporter {
|
|||||||
Context();
|
Context();
|
||||||
};
|
};
|
||||||
|
|
||||||
struct Run {
|
struct BENCHMARK_EXPORT Run {
|
||||||
static const int64_t no_repetition_index = -1;
|
static const int64_t no_repetition_index = -1;
|
||||||
enum RunType { RT_Iteration, RT_Aggregate };
|
enum RunType { RT_Iteration, RT_Aggregate };
|
||||||
|
|
||||||
@ -1670,7 +1683,7 @@ class BenchmarkReporter {
|
|||||||
|
|
||||||
// Simple reporter that outputs benchmark data to the console. This is the
|
// Simple reporter that outputs benchmark data to the console. This is the
|
||||||
// default reporter used by RunSpecifiedBenchmarks().
|
// default reporter used by RunSpecifiedBenchmarks().
|
||||||
class ConsoleReporter : public BenchmarkReporter {
|
class BENCHMARK_EXPORT ConsoleReporter : public BenchmarkReporter {
|
||||||
public:
|
public:
|
||||||
enum OutputOptions {
|
enum OutputOptions {
|
||||||
OO_None = 0,
|
OO_None = 0,
|
||||||
@ -1695,7 +1708,7 @@ class ConsoleReporter : public BenchmarkReporter {
|
|||||||
bool printed_header_;
|
bool printed_header_;
|
||||||
};
|
};
|
||||||
|
|
||||||
class JSONReporter : public BenchmarkReporter {
|
class BENCHMARK_EXPORT JSONReporter : public BenchmarkReporter {
|
||||||
public:
|
public:
|
||||||
JSONReporter() : first_report_(true) {}
|
JSONReporter() : first_report_(true) {}
|
||||||
virtual bool ReportContext(const Context& context) BENCHMARK_OVERRIDE;
|
virtual bool ReportContext(const Context& context) BENCHMARK_OVERRIDE;
|
||||||
@ -1708,7 +1721,7 @@ class JSONReporter : public BenchmarkReporter {
|
|||||||
bool first_report_;
|
bool first_report_;
|
||||||
};
|
};
|
||||||
|
|
||||||
class BENCHMARK_DEPRECATED_MSG(
|
class BENCHMARK_EXPORT BENCHMARK_DEPRECATED_MSG(
|
||||||
"The CSV Reporter will be removed in a future release") CSVReporter
|
"The CSV Reporter will be removed in a future release") CSVReporter
|
||||||
: public BenchmarkReporter {
|
: public BenchmarkReporter {
|
||||||
public:
|
public:
|
||||||
@ -1760,11 +1773,17 @@ inline double GetTimeUnitMultiplier(TimeUnit unit) {
|
|||||||
// CreateRange(0, 100, /*multi=*/4),
|
// CreateRange(0, 100, /*multi=*/4),
|
||||||
// CreateDenseRange(0, 4, /*step=*/1),
|
// CreateDenseRange(0, 4, /*step=*/1),
|
||||||
// });
|
// });
|
||||||
|
BENCHMARK_EXPORT
|
||||||
std::vector<int64_t> CreateRange(int64_t lo, int64_t hi, int multi);
|
std::vector<int64_t> CreateRange(int64_t lo, int64_t hi, int multi);
|
||||||
|
|
||||||
// Creates a list of integer values for the given range and step.
|
// Creates a list of integer values for the given range and step.
|
||||||
|
BENCHMARK_EXPORT
|
||||||
std::vector<int64_t> CreateDenseRange(int64_t start, int64_t limit, int step);
|
std::vector<int64_t> CreateDenseRange(int64_t start, int64_t limit, int step);
|
||||||
|
|
||||||
} // namespace benchmark
|
} // namespace benchmark
|
||||||
|
|
||||||
|
#if defined(_MSC_VER)
|
||||||
|
#pragma warning(pop)
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif // BENCHMARK_BENCHMARK_H_
|
#endif // BENCHMARK_BENCHMARK_H_
|
||||||
|
@ -22,10 +22,15 @@ add_library(benchmark::benchmark ALIAS benchmark)
|
|||||||
set_target_properties(benchmark PROPERTIES
|
set_target_properties(benchmark PROPERTIES
|
||||||
OUTPUT_NAME "benchmark"
|
OUTPUT_NAME "benchmark"
|
||||||
VERSION ${GENERIC_LIB_VERSION}
|
VERSION ${GENERIC_LIB_VERSION}
|
||||||
SOVERSION ${GENERIC_LIB_SOVERSION}
|
SOVERSION 2
|
||||||
)
|
)
|
||||||
target_include_directories(benchmark PUBLIC
|
target_include_directories(benchmark PUBLIC
|
||||||
$<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include>)
|
$<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include>
|
||||||
|
$<BUILD_INTERFACE:${PROJECT_BINARY_DIR}/include>
|
||||||
|
)
|
||||||
|
|
||||||
|
generate_export_header(benchmark
|
||||||
|
EXPORT_FILE_NAME ${PROJECT_BINARY_DIR}/include/benchmark/export.h)
|
||||||
|
|
||||||
# libpfm, if available
|
# libpfm, if available
|
||||||
if (HAVE_LIBPFM)
|
if (HAVE_LIBPFM)
|
||||||
@ -59,7 +64,8 @@ add_library(benchmark::benchmark_main ALIAS benchmark_main)
|
|||||||
set_target_properties(benchmark_main PROPERTIES
|
set_target_properties(benchmark_main PROPERTIES
|
||||||
OUTPUT_NAME "benchmark_main"
|
OUTPUT_NAME "benchmark_main"
|
||||||
VERSION ${GENERIC_LIB_VERSION}
|
VERSION ${GENERIC_LIB_VERSION}
|
||||||
SOVERSION ${GENERIC_LIB_SOVERSION}
|
SOVERSION 2
|
||||||
|
DEFINE_SYMBOL benchmark_EXPORTS
|
||||||
)
|
)
|
||||||
target_link_libraries(benchmark_main PUBLIC benchmark::benchmark)
|
target_link_libraries(benchmark_main PUBLIC benchmark::benchmark)
|
||||||
|
|
||||||
@ -107,6 +113,7 @@ if (BENCHMARK_ENABLE_INSTALL)
|
|||||||
|
|
||||||
install(
|
install(
|
||||||
DIRECTORY "${PROJECT_SOURCE_DIR}/include/benchmark"
|
DIRECTORY "${PROJECT_SOURCE_DIR}/include/benchmark"
|
||||||
|
"${PROJECT_BINARY_DIR}/include/benchmark"
|
||||||
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
|
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
|
||||||
FILES_MATCHING PATTERN "*.*h")
|
FILES_MATCHING PATTERN "*.*h")
|
||||||
|
|
||||||
|
@ -126,7 +126,7 @@ BM_DEFINE_int32(v, 0);
|
|||||||
|
|
||||||
namespace internal {
|
namespace internal {
|
||||||
|
|
||||||
std::map<std::string, std::string>* global_context = nullptr;
|
BENCHMARK_EXPORT std::map<std::string, std::string>* global_context = nullptr;
|
||||||
|
|
||||||
// FIXME: wouldn't LTO mess this up?
|
// FIXME: wouldn't LTO mess this up?
|
||||||
void UseCharPointer(char const volatile*) {}
|
void UseCharPointer(char const volatile*) {}
|
||||||
|
@ -76,6 +76,7 @@ bool FindBenchmarksInternal(const std::string& re,
|
|||||||
|
|
||||||
bool IsZero(double n);
|
bool IsZero(double n);
|
||||||
|
|
||||||
|
BENCHMARK_EXPORT
|
||||||
ConsoleReporter::OutputOptions GetOutputOptions(bool force_no_color = false);
|
ConsoleReporter::OutputOptions GetOutputOptions(bool force_no_color = false);
|
||||||
|
|
||||||
} // end namespace internal
|
} // end namespace internal
|
||||||
|
@ -15,3 +15,13 @@
|
|||||||
#include "benchmark/benchmark.h"
|
#include "benchmark/benchmark.h"
|
||||||
|
|
||||||
BENCHMARK_MAIN();
|
BENCHMARK_MAIN();
|
||||||
|
|
||||||
|
// MSVC does not allow the definition of dllimport. Thus, define it here instead
|
||||||
|
// inline in a macro.
|
||||||
|
int main(int argc, char** argv) {
|
||||||
|
::benchmark::Initialize(&argc, argv);
|
||||||
|
if (::benchmark::ReportUnrecognizedArguments(argc, argv)) return 1;
|
||||||
|
::benchmark::RunSpecifiedBenchmarks();
|
||||||
|
::benchmark::Shutdown();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
11
src/check.cc
Normal file
11
src/check.cc
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
#include "check.h"
|
||||||
|
|
||||||
|
namespace benchmark {
|
||||||
|
namespace internal {
|
||||||
|
|
||||||
|
static AbortHandlerT* handler = &std::abort;
|
||||||
|
|
||||||
|
AbortHandlerT*& GetAbortHandler() { return handler; }
|
||||||
|
|
||||||
|
} // namespace internal
|
||||||
|
} // namespace benchmark
|
@ -5,6 +5,7 @@
|
|||||||
#include <cstdlib>
|
#include <cstdlib>
|
||||||
#include <ostream>
|
#include <ostream>
|
||||||
|
|
||||||
|
#include "benchmark/export.h"
|
||||||
#include "internal_macros.h"
|
#include "internal_macros.h"
|
||||||
#include "log.h"
|
#include "log.h"
|
||||||
|
|
||||||
@ -13,10 +14,8 @@ namespace internal {
|
|||||||
|
|
||||||
typedef void(AbortHandlerT)();
|
typedef void(AbortHandlerT)();
|
||||||
|
|
||||||
inline AbortHandlerT*& GetAbortHandler() {
|
BENCHMARK_EXPORT
|
||||||
static AbortHandlerT* handler = &std::abort;
|
AbortHandlerT*& GetAbortHandler();
|
||||||
return handler;
|
|
||||||
}
|
|
||||||
|
|
||||||
BENCHMARK_NORETURN inline void CallAbortHandler() {
|
BENCHMARK_NORETURN inline void CallAbortHandler() {
|
||||||
GetAbortHandler()();
|
GetAbortHandler()();
|
||||||
|
@ -5,28 +5,33 @@
|
|||||||
#include <map>
|
#include <map>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
|
#include "benchmark/export.h"
|
||||||
|
|
||||||
// Macro for referencing flags.
|
// Macro for referencing flags.
|
||||||
#define FLAG(name) FLAGS_##name
|
#define FLAG(name) FLAGS_##name
|
||||||
|
|
||||||
// Macros for declaring flags.
|
// Macros for declaring flags.
|
||||||
#define BM_DECLARE_bool(name) extern bool FLAG(name)
|
#define BM_DECLARE_bool(name) BENCHMARK_EXPORT extern bool FLAG(name)
|
||||||
#define BM_DECLARE_int32(name) extern int32_t FLAG(name)
|
#define BM_DECLARE_int32(name) BENCHMARK_EXPORT extern int32_t FLAG(name)
|
||||||
#define BM_DECLARE_double(name) extern double FLAG(name)
|
#define BM_DECLARE_double(name) BENCHMARK_EXPORT extern double FLAG(name)
|
||||||
#define BM_DECLARE_string(name) extern std::string FLAG(name)
|
#define BM_DECLARE_string(name) BENCHMARK_EXPORT extern std::string FLAG(name)
|
||||||
#define BM_DECLARE_kvpairs(name) \
|
#define BM_DECLARE_kvpairs(name) \
|
||||||
extern std::map<std::string, std::string> FLAG(name)
|
BENCHMARK_EXPORT extern std::map<std::string, std::string> FLAG(name)
|
||||||
|
|
||||||
// Macros for defining flags.
|
// Macros for defining flags.
|
||||||
#define BM_DEFINE_bool(name, default_val) \
|
#define BM_DEFINE_bool(name, default_val) \
|
||||||
bool FLAG(name) = benchmark::BoolFromEnv(#name, default_val)
|
BENCHMARK_EXPORT bool FLAG(name) = benchmark::BoolFromEnv(#name, default_val)
|
||||||
#define BM_DEFINE_int32(name, default_val) \
|
#define BM_DEFINE_int32(name, default_val) \
|
||||||
int32_t FLAG(name) = benchmark::Int32FromEnv(#name, default_val)
|
BENCHMARK_EXPORT int32_t FLAG(name) = \
|
||||||
|
benchmark::Int32FromEnv(#name, default_val)
|
||||||
#define BM_DEFINE_double(name, default_val) \
|
#define BM_DEFINE_double(name, default_val) \
|
||||||
double FLAG(name) = benchmark::DoubleFromEnv(#name, default_val)
|
BENCHMARK_EXPORT double FLAG(name) = \
|
||||||
|
benchmark::DoubleFromEnv(#name, default_val)
|
||||||
#define BM_DEFINE_string(name, default_val) \
|
#define BM_DEFINE_string(name, default_val) \
|
||||||
std::string FLAG(name) = benchmark::StringFromEnv(#name, default_val)
|
BENCHMARK_EXPORT std::string FLAG(name) = \
|
||||||
#define BM_DEFINE_kvpairs(name, default_val) \
|
benchmark::StringFromEnv(#name, default_val)
|
||||||
std::map<std::string, std::string> FLAG(name) = \
|
#define BM_DEFINE_kvpairs(name, default_val) \
|
||||||
|
BENCHMARK_EXPORT std::map<std::string, std::string> FLAG(name) = \
|
||||||
benchmark::KvPairsFromEnv(#name, default_val)
|
benchmark::KvPairsFromEnv(#name, default_val)
|
||||||
|
|
||||||
namespace benchmark {
|
namespace benchmark {
|
||||||
@ -35,6 +40,7 @@ namespace benchmark {
|
|||||||
//
|
//
|
||||||
// If the variable exists, returns IsTruthyFlagValue() value; if not,
|
// If the variable exists, returns IsTruthyFlagValue() value; if not,
|
||||||
// returns the given default value.
|
// returns the given default value.
|
||||||
|
BENCHMARK_EXPORT
|
||||||
bool BoolFromEnv(const char* flag, bool default_val);
|
bool BoolFromEnv(const char* flag, bool default_val);
|
||||||
|
|
||||||
// Parses an Int32 from the environment variable corresponding to the given
|
// Parses an Int32 from the environment variable corresponding to the given
|
||||||
@ -42,6 +48,7 @@ bool BoolFromEnv(const char* flag, bool default_val);
|
|||||||
//
|
//
|
||||||
// If the variable exists, returns ParseInt32() value; if not, returns
|
// If the variable exists, returns ParseInt32() value; if not, returns
|
||||||
// the given default value.
|
// the given default value.
|
||||||
|
BENCHMARK_EXPORT
|
||||||
int32_t Int32FromEnv(const char* flag, int32_t default_val);
|
int32_t Int32FromEnv(const char* flag, int32_t default_val);
|
||||||
|
|
||||||
// Parses an Double from the environment variable corresponding to the given
|
// Parses an Double from the environment variable corresponding to the given
|
||||||
@ -49,6 +56,7 @@ int32_t Int32FromEnv(const char* flag, int32_t default_val);
|
|||||||
//
|
//
|
||||||
// If the variable exists, returns ParseDouble(); if not, returns
|
// If the variable exists, returns ParseDouble(); if not, returns
|
||||||
// the given default value.
|
// the given default value.
|
||||||
|
BENCHMARK_EXPORT
|
||||||
double DoubleFromEnv(const char* flag, double default_val);
|
double DoubleFromEnv(const char* flag, double default_val);
|
||||||
|
|
||||||
// Parses a string from the environment variable corresponding to the given
|
// Parses a string from the environment variable corresponding to the given
|
||||||
@ -56,6 +64,7 @@ double DoubleFromEnv(const char* flag, double default_val);
|
|||||||
//
|
//
|
||||||
// If variable exists, returns its value; if not, returns
|
// If variable exists, returns its value; if not, returns
|
||||||
// the given default value.
|
// the given default value.
|
||||||
|
BENCHMARK_EXPORT
|
||||||
const char* StringFromEnv(const char* flag, const char* default_val);
|
const char* StringFromEnv(const char* flag, const char* default_val);
|
||||||
|
|
||||||
// Parses a set of kvpairs from the environment variable corresponding to the
|
// Parses a set of kvpairs from the environment variable corresponding to the
|
||||||
@ -63,6 +72,7 @@ const char* StringFromEnv(const char* flag, const char* default_val);
|
|||||||
//
|
//
|
||||||
// If variable exists, returns its value; if not, returns
|
// If variable exists, returns its value; if not, returns
|
||||||
// the given default value.
|
// the given default value.
|
||||||
|
BENCHMARK_EXPORT
|
||||||
std::map<std::string, std::string> KvPairsFromEnv(
|
std::map<std::string, std::string> KvPairsFromEnv(
|
||||||
const char* flag, std::map<std::string, std::string> default_val);
|
const char* flag, std::map<std::string, std::string> default_val);
|
||||||
|
|
||||||
@ -75,40 +85,47 @@ std::map<std::string, std::string> KvPairsFromEnv(
|
|||||||
//
|
//
|
||||||
// On success, stores the value of the flag in *value, and returns
|
// On success, stores the value of the flag in *value, and returns
|
||||||
// true. On failure, returns false without changing *value.
|
// true. On failure, returns false without changing *value.
|
||||||
|
BENCHMARK_EXPORT
|
||||||
bool ParseBoolFlag(const char* str, const char* flag, bool* value);
|
bool ParseBoolFlag(const char* str, const char* flag, bool* value);
|
||||||
|
|
||||||
// Parses a string for an Int32 flag, in the form of "--flag=value".
|
// Parses a string for an Int32 flag, in the form of "--flag=value".
|
||||||
//
|
//
|
||||||
// On success, stores the value of the flag in *value, and returns
|
// On success, stores the value of the flag in *value, and returns
|
||||||
// true. On failure, returns false without changing *value.
|
// true. On failure, returns false without changing *value.
|
||||||
|
BENCHMARK_EXPORT
|
||||||
bool ParseInt32Flag(const char* str, const char* flag, int32_t* value);
|
bool ParseInt32Flag(const char* str, const char* flag, int32_t* value);
|
||||||
|
|
||||||
// Parses a string for a Double flag, in the form of "--flag=value".
|
// Parses a string for a Double flag, in the form of "--flag=value".
|
||||||
//
|
//
|
||||||
// On success, stores the value of the flag in *value, and returns
|
// On success, stores the value of the flag in *value, and returns
|
||||||
// true. On failure, returns false without changing *value.
|
// true. On failure, returns false without changing *value.
|
||||||
|
BENCHMARK_EXPORT
|
||||||
bool ParseDoubleFlag(const char* str, const char* flag, double* value);
|
bool ParseDoubleFlag(const char* str, const char* flag, double* value);
|
||||||
|
|
||||||
// Parses a string for a string flag, in the form of "--flag=value".
|
// Parses a string for a string flag, in the form of "--flag=value".
|
||||||
//
|
//
|
||||||
// On success, stores the value of the flag in *value, and returns
|
// On success, stores the value of the flag in *value, and returns
|
||||||
// true. On failure, returns false without changing *value.
|
// true. On failure, returns false without changing *value.
|
||||||
|
BENCHMARK_EXPORT
|
||||||
bool ParseStringFlag(const char* str, const char* flag, std::string* value);
|
bool ParseStringFlag(const char* str, const char* flag, std::string* value);
|
||||||
|
|
||||||
// Parses a string for a kvpairs flag in the form "--flag=key=value,key=value"
|
// Parses a string for a kvpairs flag in the form "--flag=key=value,key=value"
|
||||||
//
|
//
|
||||||
// On success, stores the value of the flag in *value and returns true. On
|
// On success, stores the value of the flag in *value and returns true. On
|
||||||
// failure returns false, though *value may have been mutated.
|
// failure returns false, though *value may have been mutated.
|
||||||
|
BENCHMARK_EXPORT
|
||||||
bool ParseKeyValueFlag(const char* str, const char* flag,
|
bool ParseKeyValueFlag(const char* str, const char* flag,
|
||||||
std::map<std::string, std::string>* value);
|
std::map<std::string, std::string>* value);
|
||||||
|
|
||||||
// Returns true if the string matches the flag.
|
// Returns true if the string matches the flag.
|
||||||
|
BENCHMARK_EXPORT
|
||||||
bool IsFlag(const char* str, const char* flag);
|
bool IsFlag(const char* str, const char* flag);
|
||||||
|
|
||||||
// Returns true unless value starts with one of: '0', 'f', 'F', 'n' or 'N', or
|
// Returns true unless value starts with one of: '0', 'f', 'F', 'n' or 'N', or
|
||||||
// some non-alphanumeric character. Also returns false if the value matches
|
// some non-alphanumeric character. Also returns false if the value matches
|
||||||
// one of 'no', 'false', 'off' (case-insensitive). As a special case, also
|
// one of 'no', 'false', 'off' (case-insensitive). As a special case, also
|
||||||
// returns true if value is the empty string.
|
// returns true if value is the empty string.
|
||||||
|
BENCHMARK_EXPORT
|
||||||
bool IsTruthyFlagValue(const std::string& value);
|
bool IsTruthyFlagValue(const std::string& value);
|
||||||
|
|
||||||
} // end namespace benchmark
|
} // end namespace benchmark
|
||||||
|
@ -29,6 +29,12 @@
|
|||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined(_MSC_VER)
|
||||||
|
#pragma warning(push)
|
||||||
|
// C4251: <symbol> needs to have dll-interface to be used by clients of class
|
||||||
|
#pragma warning(disable : 4251)
|
||||||
|
#endif
|
||||||
|
|
||||||
namespace benchmark {
|
namespace benchmark {
|
||||||
namespace internal {
|
namespace internal {
|
||||||
|
|
||||||
@ -68,7 +74,7 @@ class PerfCounterValues {
|
|||||||
// Collect PMU counters. The object, once constructed, is ready to be used by
|
// Collect PMU counters. The object, once constructed, is ready to be used by
|
||||||
// calling read(). PMU counter collection is enabled from the time create() is
|
// calling read(). PMU counter collection is enabled from the time create() is
|
||||||
// called, to obtain the object, until the object's destructor is called.
|
// called, to obtain the object, until the object's destructor is called.
|
||||||
class PerfCounters final {
|
class BENCHMARK_EXPORT PerfCounters final {
|
||||||
public:
|
public:
|
||||||
// True iff this platform supports performance counters.
|
// True iff this platform supports performance counters.
|
||||||
static const bool kSupported;
|
static const bool kSupported;
|
||||||
@ -125,7 +131,7 @@ class PerfCounters final {
|
|||||||
};
|
};
|
||||||
|
|
||||||
// Typical usage of the above primitives.
|
// Typical usage of the above primitives.
|
||||||
class PerfCountersMeasurement final {
|
class BENCHMARK_EXPORT PerfCountersMeasurement final {
|
||||||
public:
|
public:
|
||||||
PerfCountersMeasurement(const std::vector<std::string>& counter_names);
|
PerfCountersMeasurement(const std::vector<std::string>& counter_names);
|
||||||
~PerfCountersMeasurement();
|
~PerfCountersMeasurement();
|
||||||
@ -184,4 +190,8 @@ BENCHMARK_UNUSED static bool perf_init_anchor = PerfCounters::Initialize();
|
|||||||
} // namespace internal
|
} // namespace internal
|
||||||
} // namespace benchmark
|
} // namespace benchmark
|
||||||
|
|
||||||
|
#if defined(_MSC_VER)
|
||||||
|
#pragma warning(pop)
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif // BENCHMARK_PERF_COUNTERS_H
|
#endif // BENCHMARK_PERF_COUNTERS_H
|
||||||
|
@ -25,12 +25,17 @@ namespace benchmark {
|
|||||||
// Return a vector containing the mean, median and standard devation information
|
// Return a vector containing the mean, median and standard devation information
|
||||||
// (and any user-specified info) for the specified list of reports. If 'reports'
|
// (and any user-specified info) for the specified list of reports. If 'reports'
|
||||||
// contains less than two non-errored runs an empty vector is returned
|
// contains less than two non-errored runs an empty vector is returned
|
||||||
|
BENCHMARK_EXPORT
|
||||||
std::vector<BenchmarkReporter::Run> ComputeStats(
|
std::vector<BenchmarkReporter::Run> ComputeStats(
|
||||||
const std::vector<BenchmarkReporter::Run>& reports);
|
const std::vector<BenchmarkReporter::Run>& reports);
|
||||||
|
|
||||||
|
BENCHMARK_EXPORT
|
||||||
double StatisticsMean(const std::vector<double>& v);
|
double StatisticsMean(const std::vector<double>& v);
|
||||||
|
BENCHMARK_EXPORT
|
||||||
double StatisticsMedian(const std::vector<double>& v);
|
double StatisticsMedian(const std::vector<double>& v);
|
||||||
|
BENCHMARK_EXPORT
|
||||||
double StatisticsStdDev(const std::vector<double>& v);
|
double StatisticsStdDev(const std::vector<double>& v);
|
||||||
|
BENCHMARK_EXPORT
|
||||||
double StatisticsCV(const std::vector<double>& v);
|
double StatisticsCV(const std::vector<double>& v);
|
||||||
|
|
||||||
} // end namespace benchmark
|
} // end namespace benchmark
|
||||||
|
@ -5,6 +5,7 @@
|
|||||||
#include <string>
|
#include <string>
|
||||||
#include <utility>
|
#include <utility>
|
||||||
|
|
||||||
|
#include "benchmark/export.h"
|
||||||
#include "internal_macros.h"
|
#include "internal_macros.h"
|
||||||
|
|
||||||
namespace benchmark {
|
namespace benchmark {
|
||||||
@ -13,6 +14,7 @@ void AppendHumanReadable(int n, std::string* str);
|
|||||||
|
|
||||||
std::string HumanReadableNumber(double n, double one_k = 1024.0);
|
std::string HumanReadableNumber(double n, double one_k = 1024.0);
|
||||||
|
|
||||||
|
BENCHMARK_EXPORT
|
||||||
#if defined(__MINGW32__)
|
#if defined(__MINGW32__)
|
||||||
__attribute__((format(__MINGW_PRINTF_FORMAT, 1, 2)))
|
__attribute__((format(__MINGW_PRINTF_FORMAT, 1, 2)))
|
||||||
#elif defined(__GNUC__)
|
#elif defined(__GNUC__)
|
||||||
@ -38,6 +40,7 @@ inline std::string StrCat(Args&&... args) {
|
|||||||
return ss.str();
|
return ss.str();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BENCHMARK_EXPORT
|
||||||
std::vector<std::string> StrSplit(const std::string& str, char delim);
|
std::vector<std::string> StrSplit(const std::string& str, char delim);
|
||||||
|
|
||||||
// Disable lint checking for this block since it re-implements C functions.
|
// Disable lint checking for this block since it re-implements C functions.
|
||||||
|
@ -23,6 +23,7 @@ string(TOUPPER "${CMAKE_CXX_COMPILER_ID}" ASM_TEST_COMPILER)
|
|||||||
macro(add_filecheck_test name)
|
macro(add_filecheck_test name)
|
||||||
cmake_parse_arguments(ARG "" "" "CHECK_PREFIXES" ${ARGV})
|
cmake_parse_arguments(ARG "" "" "CHECK_PREFIXES" ${ARGV})
|
||||||
add_library(${name} OBJECT ${name}.cc)
|
add_library(${name} OBJECT ${name}.cc)
|
||||||
|
target_link_libraries(${name} PRIVATE benchmark::benchmark)
|
||||||
set_target_properties(${name} PROPERTIES COMPILE_FLAGS "-S ${ASM_TEST_FLAGS}")
|
set_target_properties(${name} PROPERTIES COMPILE_FLAGS "-S ${ASM_TEST_FLAGS}")
|
||||||
set(ASM_OUTPUT_FILE "${CMAKE_CURRENT_BINARY_DIR}/${name}.s")
|
set(ASM_OUTPUT_FILE "${CMAKE_CURRENT_BINARY_DIR}/${name}.s")
|
||||||
add_custom_target(copy_${name} ALL
|
add_custom_target(copy_${name} ALL
|
||||||
|
@ -50,9 +50,8 @@ cc_library(
|
|||||||
"//:benchmark",
|
"//:benchmark",
|
||||||
"//:benchmark_internal_headers",
|
"//:benchmark_internal_headers",
|
||||||
"@com_google_googletest//:gtest",
|
"@com_google_googletest//:gtest",
|
||||||
] + (
|
"@com_google_googletest//:gtest_main",
|
||||||
["@com_google_googletest//:gtest_main"] if (test_src[-len("gtest.cc"):] == "gtest.cc") else []
|
]
|
||||||
),
|
|
||||||
# FIXME: Add support for assembly tests to bazel.
|
# FIXME: Add support for assembly tests to bazel.
|
||||||
# See Issue #556
|
# See Issue #556
|
||||||
# https://github.com/google/benchmark/issues/556
|
# https://github.com/google/benchmark/issues/556
|
||||||
|
@ -1,5 +1,7 @@
|
|||||||
# Enable the tests
|
# Enable the tests
|
||||||
|
|
||||||
|
set(THREADS_PREFER_PTHREAD_FLAG ON)
|
||||||
|
|
||||||
find_package(Threads REQUIRED)
|
find_package(Threads REQUIRED)
|
||||||
include(CheckCXXCompilerFlag)
|
include(CheckCXXCompilerFlag)
|
||||||
|
|
||||||
@ -35,10 +37,11 @@ if (DEFINED BENCHMARK_CXX_LINKER_FLAGS)
|
|||||||
endif()
|
endif()
|
||||||
|
|
||||||
add_library(output_test_helper STATIC output_test_helper.cc output_test.h)
|
add_library(output_test_helper STATIC output_test_helper.cc output_test.h)
|
||||||
|
target_link_libraries(output_test_helper PRIVATE benchmark::benchmark)
|
||||||
|
|
||||||
macro(compile_benchmark_test name)
|
macro(compile_benchmark_test name)
|
||||||
add_executable(${name} "${name}.cc")
|
add_executable(${name} "${name}.cc")
|
||||||
target_link_libraries(${name} benchmark::benchmark ${CMAKE_THREAD_LIBS_INIT})
|
target_link_libraries(${name} benchmark::benchmark_main ${CMAKE_THREAD_LIBS_INIT})
|
||||||
endmacro(compile_benchmark_test)
|
endmacro(compile_benchmark_test)
|
||||||
|
|
||||||
macro(compile_benchmark_test_with_main name)
|
macro(compile_benchmark_test_with_main name)
|
||||||
@ -48,7 +51,7 @@ endmacro(compile_benchmark_test_with_main)
|
|||||||
|
|
||||||
macro(compile_output_test name)
|
macro(compile_output_test name)
|
||||||
add_executable(${name} "${name}.cc" output_test.h)
|
add_executable(${name} "${name}.cc" output_test.h)
|
||||||
target_link_libraries(${name} output_test_helper benchmark::benchmark
|
target_link_libraries(${name} output_test_helper benchmark::benchmark_main
|
||||||
${BENCHMARK_CXX_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT})
|
${BENCHMARK_CXX_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT})
|
||||||
endmacro(compile_output_test)
|
endmacro(compile_output_test)
|
||||||
|
|
||||||
@ -158,8 +161,8 @@ add_test(NAME user_counters_thousands_test COMMAND user_counters_thousands_test
|
|||||||
compile_output_test(memory_manager_test)
|
compile_output_test(memory_manager_test)
|
||||||
add_test(NAME memory_manager_test COMMAND memory_manager_test --benchmark_min_time=0.01)
|
add_test(NAME memory_manager_test COMMAND memory_manager_test --benchmark_min_time=0.01)
|
||||||
|
|
||||||
check_cxx_compiler_flag(-std=c++03 BENCHMARK_HAS_CXX03_FLAG)
|
# MSVC does not allow to set the language standard to C++98/03.
|
||||||
if (BENCHMARK_HAS_CXX03_FLAG)
|
if(NOT CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")
|
||||||
compile_benchmark_test(cxx03_test)
|
compile_benchmark_test(cxx03_test)
|
||||||
set_target_properties(cxx03_test
|
set_target_properties(cxx03_test
|
||||||
PROPERTIES
|
PROPERTIES
|
||||||
@ -170,11 +173,17 @@ if (BENCHMARK_HAS_CXX03_FLAG)
|
|||||||
# causing the test to fail to compile. To prevent this we explicitly disable
|
# causing the test to fail to compile. To prevent this we explicitly disable
|
||||||
# the warning.
|
# the warning.
|
||||||
check_cxx_compiler_flag(-Wno-odr BENCHMARK_HAS_WNO_ODR)
|
check_cxx_compiler_flag(-Wno-odr BENCHMARK_HAS_WNO_ODR)
|
||||||
if (BENCHMARK_ENABLE_LTO AND BENCHMARK_HAS_WNO_ODR)
|
check_cxx_compiler_flag(-Wno-lto-type-mismatch BENCHMARK_HAS_WNO_LTO_TYPE_MISMATCH)
|
||||||
set_target_properties(cxx03_test
|
# Cannot set_target_properties multiple times here because the warnings will
|
||||||
PROPERTIES
|
# be overwritten on each call
|
||||||
LINK_FLAGS "-Wno-odr")
|
set (DISABLE_LTO_WARNINGS "")
|
||||||
|
if (BENCHMARK_HAS_WNO_ODR)
|
||||||
|
set(DISABLE_LTO_WARNINGS "${DISABLE_LTO_WARNINGS} -Wno-odr")
|
||||||
endif()
|
endif()
|
||||||
|
if (BENCHMARK_HAS_WNO_LTO_TYPE_MISMATCH)
|
||||||
|
set(DISABLE_LTO_WARNINGS "${DISABLE_LTO_WARNINGS} -Wno-lto-type-mismatch")
|
||||||
|
endif()
|
||||||
|
set_target_properties(cxx03_test PROPERTIES LINK_FLAGS "${DISABLE_LTO_WARNINGS}")
|
||||||
add_test(NAME cxx03 COMMAND cxx03_test --benchmark_min_time=0.01)
|
add_test(NAME cxx03 COMMAND cxx03_test --benchmark_min_time=0.01)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
@ -8,7 +8,7 @@
|
|||||||
|
|
||||||
namespace benchmark {
|
namespace benchmark {
|
||||||
namespace internal {
|
namespace internal {
|
||||||
extern std::map<std::string, std::string>* global_context;
|
BENCHMARK_EXPORT extern std::map<std::string, std::string>* global_context;
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
|
148
tools/workspace/generate_export_header.bzl
Normal file
148
tools/workspace/generate_export_header.bzl
Normal file
@ -0,0 +1,148 @@
|
|||||||
|
#
|
||||||
|
# Originl file is located at:
|
||||||
|
# https://github.com/RobotLocomotion/drake/blob/bad032aeb09b13c7f8c87ed64b624c8d1e9adb30/tools/workspace/generate_export_header.bzl
|
||||||
|
#
|
||||||
|
# All components of Drake are licensed under the BSD 3-Clause License
|
||||||
|
# shown below. Where noted in the source code, some portions may
|
||||||
|
# be subject to other permissive, non-viral licenses.
|
||||||
|
#
|
||||||
|
# Copyright 2012-2016 Robot Locomotion Group @ CSAIL
|
||||||
|
# All rights reserved.
|
||||||
|
#
|
||||||
|
# Redistribution and use in source and binary forms, with or without
|
||||||
|
# modification, are permitted provided that the following conditions are
|
||||||
|
# met:
|
||||||
|
#
|
||||||
|
# Redistributions of source code must retain the above copyright notice,
|
||||||
|
# this list of conditions and the following disclaimer. Redistributions
|
||||||
|
# in binary form must reproduce the above copyright notice, this list of
|
||||||
|
# conditions and the following disclaimer in the documentation and/or
|
||||||
|
# other materials provided with the distribution. Neither the name of
|
||||||
|
# the Massachusetts Institute of Technology nor the names of its
|
||||||
|
# contributors may be used to endorse or promote products derived from
|
||||||
|
# this software without specific prior written permission.
|
||||||
|
#
|
||||||
|
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||||
|
# HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
#
|
||||||
|
# -*- python -*-
|
||||||
|
|
||||||
|
def _make_identifier(s):
|
||||||
|
result = ""
|
||||||
|
for i in range(len(s)):
|
||||||
|
result += s[i] if s[i].isalnum() else "_"
|
||||||
|
|
||||||
|
return result
|
||||||
|
|
||||||
|
# Defines the implementation actions to generate_export_header.
|
||||||
|
def _generate_export_header_impl(ctx):
|
||||||
|
output = ctx.outputs.out
|
||||||
|
|
||||||
|
guard = _make_identifier(output.basename.upper())
|
||||||
|
|
||||||
|
content = [
|
||||||
|
"#ifndef %s" % guard,
|
||||||
|
"#define %s" % guard,
|
||||||
|
"",
|
||||||
|
"#ifdef %s" % ctx.attr.static_define,
|
||||||
|
"# define %s" % ctx.attr.export_macro_name,
|
||||||
|
"# define %s" % ctx.attr.no_export_macro_name,
|
||||||
|
"#else",
|
||||||
|
"# define %s __attribute__((visibility(\"default\")))" % ctx.attr.export_macro_name, # noqa
|
||||||
|
"# define %s __attribute__((visibility(\"hidden\")))" % ctx.attr.no_export_macro_name, # noqa
|
||||||
|
"#endif",
|
||||||
|
"",
|
||||||
|
"#ifndef %s" % ctx.attr.deprecated_macro_name,
|
||||||
|
"# define %s __attribute__ ((__deprecated__))" % ctx.attr.deprecated_macro_name, # noqa
|
||||||
|
"#endif",
|
||||||
|
"",
|
||||||
|
"#ifndef %s" % ctx.attr.export_deprecated_macro_name,
|
||||||
|
"# define %s %s %s" % (ctx.attr.export_deprecated_macro_name, ctx.attr.export_macro_name, ctx.attr.deprecated_macro_name), # noqa
|
||||||
|
"#endif",
|
||||||
|
"",
|
||||||
|
"#ifndef %s" % ctx.attr.no_export_deprecated_macro_name,
|
||||||
|
"# define %s %s %s" % (ctx.attr.no_export_deprecated_macro_name, ctx.attr.no_export_macro_name, ctx.attr.deprecated_macro_name), # noqa
|
||||||
|
"#endif",
|
||||||
|
"",
|
||||||
|
"#endif",
|
||||||
|
]
|
||||||
|
|
||||||
|
ctx.actions.write(output = output, content = "\n".join(content) + "\n")
|
||||||
|
|
||||||
|
# Defines the rule to generate_export_header.
|
||||||
|
_generate_export_header_gen = rule(
|
||||||
|
attrs = {
|
||||||
|
"out": attr.output(mandatory = True),
|
||||||
|
"export_macro_name": attr.string(),
|
||||||
|
"deprecated_macro_name": attr.string(),
|
||||||
|
"export_deprecated_macro_name": attr.string(),
|
||||||
|
"no_export_macro_name": attr.string(),
|
||||||
|
"no_export_deprecated_macro_name": attr.string(),
|
||||||
|
"static_define": attr.string(),
|
||||||
|
},
|
||||||
|
output_to_genfiles = True,
|
||||||
|
implementation = _generate_export_header_impl,
|
||||||
|
)
|
||||||
|
|
||||||
|
def generate_export_header(
|
||||||
|
lib = None,
|
||||||
|
name = None,
|
||||||
|
out = None,
|
||||||
|
export_macro_name = None,
|
||||||
|
deprecated_macro_name = None,
|
||||||
|
export_deprecated_macro_name = None,
|
||||||
|
no_export_macro_name = None,
|
||||||
|
no_export_deprecated_macro_name = None,
|
||||||
|
static_define = None,
|
||||||
|
**kwargs):
|
||||||
|
"""Creates a rule to generate an export header for a named library. This
|
||||||
|
is an incomplete implementation of CMake's generate_export_header. (In
|
||||||
|
particular, it assumes a platform that uses
|
||||||
|
__attribute__((visibility("default"))) to decorate exports.)
|
||||||
|
|
||||||
|
By default, the rule will have a mangled name related to the library name,
|
||||||
|
and will produce "<lib>_export.h".
|
||||||
|
|
||||||
|
The CMake documentation of the generate_export_header macro is:
|
||||||
|
https://cmake.org/cmake/help/latest/module/GenerateExportHeader.html
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
if name == None:
|
||||||
|
name = "__%s_export_h" % lib
|
||||||
|
if out == None:
|
||||||
|
out = "%s_export.h" % lib
|
||||||
|
if export_macro_name == None:
|
||||||
|
export_macro_name = "%s_EXPORT" % lib.upper()
|
||||||
|
if deprecated_macro_name == None:
|
||||||
|
deprecated_macro_name = "%s_DEPRECATED" % lib.upper()
|
||||||
|
if export_deprecated_macro_name == None:
|
||||||
|
export_deprecated_macro_name = "%s_DEPRECATED_EXPORT" % lib.upper()
|
||||||
|
if no_export_macro_name == None:
|
||||||
|
no_export_macro_name = "%s_NO_EXPORT" % lib.upper()
|
||||||
|
if no_export_deprecated_macro_name == None:
|
||||||
|
no_export_deprecated_macro_name = \
|
||||||
|
"%s_DEPRECATED_NO_EXPORT" % lib.upper()
|
||||||
|
if static_define == None:
|
||||||
|
static_define = "%s_STATIC_DEFINE" % lib.upper()
|
||||||
|
|
||||||
|
_generate_export_header_gen(
|
||||||
|
name = name,
|
||||||
|
out = out,
|
||||||
|
export_macro_name = export_macro_name,
|
||||||
|
deprecated_macro_name = deprecated_macro_name,
|
||||||
|
export_deprecated_macro_name = export_deprecated_macro_name,
|
||||||
|
no_export_macro_name = no_export_macro_name,
|
||||||
|
no_export_deprecated_macro_name = no_export_deprecated_macro_name,
|
||||||
|
static_define = static_define,
|
||||||
|
**kwargs
|
||||||
|
)
|
Loading…
Reference in New Issue
Block a user