From 883279e46ae08cc2fa028b3125b4a36b1b935bd2 Mon Sep 17 00:00:00 2001 From: Roman Lebedev Date: Wed, 24 Jan 2024 02:14:54 +0300 Subject: [PATCH 1/5] CMake: `get_git_version()`: just use `--dirty` flag of `git describe` --- cmake/GetGitVersion.cmake | 15 +-------------- 1 file changed, 1 insertion(+), 14 deletions(-) diff --git a/cmake/GetGitVersion.cmake b/cmake/GetGitVersion.cmake index 04a1f9b70..4bd8146a3 100644 --- a/cmake/GetGitVersion.cmake +++ b/cmake/GetGitVersion.cmake @@ -20,7 +20,7 @@ set(__get_git_version INCLUDED) function(get_git_version var) if(GIT_EXECUTABLE) - execute_process(COMMAND ${GIT_EXECUTABLE} describe --tags --match "v[0-9]*.[0-9]*.[0-9]*" --abbrev=8 + execute_process(COMMAND ${GIT_EXECUTABLE} describe --tags --match "v[0-9]*.[0-9]*.[0-9]*" --abbrev=8 --dirty WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} RESULT_VARIABLE status OUTPUT_VARIABLE GIT_DESCRIBE_VERSION @@ -36,19 +36,6 @@ function(get_git_version var) string(REGEX REPLACE "v(.*)" "\\1" GIT_VERSION ${GIT_DESCRIBE_VERSION}) endif() - # Work out if the repository is dirty - execute_process(COMMAND ${GIT_EXECUTABLE} update-index -q --refresh - WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} - OUTPUT_QUIET - ERROR_QUIET) - execute_process(COMMAND ${GIT_EXECUTABLE} diff-index --name-only HEAD -- - WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} - OUTPUT_VARIABLE GIT_DIFF_INDEX - ERROR_QUIET) - string(COMPARE NOTEQUAL "${GIT_DIFF_INDEX}" "" GIT_DIRTY) - if (${GIT_DIRTY}) - set(GIT_DESCRIBE_VERSION "${GIT_DESCRIBE_VERSION}-dirty") - endif() message(STATUS "git version: ${GIT_DESCRIBE_VERSION} normalized to ${GIT_VERSION}") else() set(GIT_VERSION "0.0.0") From 3894f4962140fd2d09b33fb9667c92f11b1201ef Mon Sep 17 00:00:00 2001 From: Roman Lebedev Date: Wed, 24 Jan 2024 02:32:58 +0300 Subject: [PATCH 2/5] CMake: move version normalization out of `get_git_version()` Mainly, i want `get_git_version()` to return true version, not something sanitized. --- CMakeLists.txt | 18 ++++++++++++++---- cmake/GetGitVersion.cmake | 15 +++------------ 2 files changed, 17 insertions(+), 16 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 9625c2dc1..d9bcc6a49 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -105,16 +105,26 @@ get_git_version(GIT_VERSION) # If no git version can be determined, use the version # from the project() command if ("${GIT_VERSION}" STREQUAL "0.0.0") - set(VERSION "${benchmark_VERSION}") + set(VERSION "v${benchmark_VERSION}") else() set(VERSION "${GIT_VERSION}") endif() + +# Normalize version: drop "v" prefix, replace first "-" with ".", +# drop everything after second "-" (including said "-"). +string(STRIP ${VERSION} VERSION) +if(VERSION MATCHES v[^-]*-) + string(REGEX REPLACE "v([^-]*)-([0-9]+)-.*" "\\1.\\2" NORMALIZED_VERSION ${VERSION}) +else() + string(REGEX REPLACE "v(.*)" "\\1" NORMALIZED_VERSION ${VERSION}) +endif() + # Tell the user what versions we are using -message(STATUS "Google Benchmark version: ${VERSION}") +message(STATUS "Google Benchmark version: ${VERSION}, normalized to ${NORMALIZED_VERSION}") # The version of the libraries -set(GENERIC_LIB_VERSION ${VERSION}) -string(SUBSTRING ${VERSION} 0 1 GENERIC_LIB_SOVERSION) +set(GENERIC_LIB_VERSION ${NORMALIZED_VERSION}) +string(SUBSTRING ${NORMALIZED_VERSION} 0 1 GENERIC_LIB_SOVERSION) # Import our CMake modules include(AddCXXCompilerFlag) diff --git a/cmake/GetGitVersion.cmake b/cmake/GetGitVersion.cmake index 4bd8146a3..b0210103b 100644 --- a/cmake/GetGitVersion.cmake +++ b/cmake/GetGitVersion.cmake @@ -23,22 +23,13 @@ function(get_git_version var) execute_process(COMMAND ${GIT_EXECUTABLE} describe --tags --match "v[0-9]*.[0-9]*.[0-9]*" --abbrev=8 --dirty WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} RESULT_VARIABLE status - OUTPUT_VARIABLE GIT_DESCRIBE_VERSION + OUTPUT_VARIABLE GIT_VERSION ERROR_QUIET) if(status) - set(GIT_DESCRIBE_VERSION "v0.0.0") + set(GIT_VERSION "v0.0.0") endif() - - string(STRIP ${GIT_DESCRIBE_VERSION} GIT_DESCRIBE_VERSION) - if(GIT_DESCRIBE_VERSION MATCHES v[^-]*-) - string(REGEX REPLACE "v([^-]*)-([0-9]+)-.*" "\\1.\\2" GIT_VERSION ${GIT_DESCRIBE_VERSION}) - else() - string(REGEX REPLACE "v(.*)" "\\1" GIT_VERSION ${GIT_DESCRIBE_VERSION}) - endif() - - message(STATUS "git version: ${GIT_DESCRIBE_VERSION} normalized to ${GIT_VERSION}") else() - set(GIT_VERSION "0.0.0") + set(GIT_VERSION "v0.0.0") endif() set(${var} ${GIT_VERSION} PARENT_SCOPE) From 682bac9d1a94a2a22a3b4d1884bc263bdcd646e3 Mon Sep 17 00:00:00 2001 From: Roman Lebedev Date: Wed, 24 Jan 2024 02:33:35 +0300 Subject: [PATCH 3/5] JSON reporter: store library version and schema version in `context` --- src/CMakeLists.txt | 7 +++++++ src/json_reporter.cc | 12 ++++++++++++ test/reporter_output_test.cc | 3 +++ 3 files changed, 22 insertions(+) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index daf82fb13..4e5432d79 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -28,6 +28,13 @@ target_include_directories(benchmark PUBLIC $ ) +set_property( + SOURCE json_reporter.cc + APPEND + PROPERTY COMPILE_DEFINITIONS + BENCHMARK_VERSION="${VERSION}" +) + # libpfm, if available if (PFM_FOUND) target_link_libraries(benchmark PRIVATE PFM::libpfm) diff --git a/src/json_reporter.cc b/src/json_reporter.cc index 6559dfd5e..bb0b9a1bf 100644 --- a/src/json_reporter.cc +++ b/src/json_reporter.cc @@ -167,12 +167,24 @@ bool JSONReporter::ReportContext(const Context& context) { } out << "],\n"; +#if defined(BENCHMARK_VERSION) + const char library_version[] = BENCHMARK_VERSION; +#else + const char library_version[] = "hello, bazel!"; +#endif + out << indent << FormatKV("library_version", library_version); + out << ",\n"; + #if defined(NDEBUG) const char build_type[] = "release"; #else const char build_type[] = "debug"; #endif out << indent << FormatKV("library_build_type", build_type); + out << ",\n"; + + // NOTE: our json schema is not strictly tied to the library version! + out << indent << FormatKV("json_schema_version", int64_t(1)); std::map* global_context = internal::GetGlobalContext(); diff --git a/test/reporter_output_test.cc b/test/reporter_output_test.cc index 657a9a107..ea5381d20 100644 --- a/test/reporter_output_test.cc +++ b/test/reporter_output_test.cc @@ -55,6 +55,9 @@ static int AddContextCases() { {{"Load Average: (%float, ){0,2}%float$", MR_Next}}); } AddCases(TC_JSONOut, {{"\"load_avg\": \\[(%float,?){0,3}],$", MR_Next}}); + AddCases(TC_JSONOut, {{"\"library_version\": \".*\",$", MR_Next}}); + AddCases(TC_JSONOut, {{"\"library_build_type\": \".*\",$", MR_Next}}); + AddCases(TC_JSONOut, {{"\"json_schema_version\": 1$", MR_Next}}); return 0; } int dummy_register = AddContextCases(); From 341783b6e29d04735abeb018a40da8d576267b46 Mon Sep 17 00:00:00 2001 From: Roman Lebedev Date: Wed, 24 Jan 2024 02:54:10 +0300 Subject: [PATCH 4/5] Tools: discard inputs with unexpected `json_schema_version` --- tools/gbench/util.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/tools/gbench/util.py b/tools/gbench/util.py index d49018a59..4d061a3a1 100644 --- a/tools/gbench/util.py +++ b/tools/gbench/util.py @@ -135,6 +135,15 @@ def benchmark_wanted(benchmark): with open(fname, "r") as f: results = json.load(f) + if "context" in results: + if "json_schema_version" in results["context"]: + json_schema_version = results["context"]["json_schema_version"] + if json_schema_version != 1: + print( + "In %s, got unnsupported JSON schema version: %i, expected 1" + % (fname, json_schema_version) + ) + sys.exit(1) if "benchmarks" in results: results["benchmarks"] = list( filter(benchmark_wanted, results["benchmarks"]) From a7a5822d658ccf5e1044af2d045dde51403bfd80 Mon Sep 17 00:00:00 2001 From: Roman Lebedev Date: Wed, 24 Jan 2024 15:32:45 +0300 Subject: [PATCH 5/5] Extract version string into `GetBenchmarkVersiom()` --- include/benchmark/benchmark.h | 3 +++ src/CMakeLists.txt | 2 +- src/benchmark.cc | 8 ++++++++ src/json_reporter.cc | 7 +------ 4 files changed, 13 insertions(+), 7 deletions(-) diff --git a/include/benchmark/benchmark.h b/include/benchmark/benchmark.h index 9849c4287..25c3eef70 100644 --- a/include/benchmark/benchmark.h +++ b/include/benchmark/benchmark.h @@ -302,6 +302,9 @@ class BenchmarkReporter; // Default number of minimum benchmark running time in seconds. const char kDefaultMinTimeStr[] = "0.5s"; +// Returns the version of the library. +BENCHMARK_EXPORT std::string GetBenchmarkVersiom(); + BENCHMARK_EXPORT void PrintDefaultHelp(); BENCHMARK_EXPORT void Initialize(int* argc, char** argv, diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 4e5432d79..943594b70 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -29,7 +29,7 @@ target_include_directories(benchmark PUBLIC ) set_property( - SOURCE json_reporter.cc + SOURCE benchmark.cc APPEND PROPERTY COMPILE_DEFINITIONS BENCHMARK_VERSION="${VERSION}" diff --git a/src/benchmark.cc b/src/benchmark.cc index 7dd6eaf51..489c8a0a4 100644 --- a/src/benchmark.cc +++ b/src/benchmark.cc @@ -748,6 +748,14 @@ int InitializeStreams() { } // end namespace internal +std::string GetBenchmarkVersiom() { +#if defined(BENCHMARK_VERSION) + return {BENCHMARK_VERSION}; +#else + return "hello, bazel!"; +#endif +} + void PrintDefaultHelp() { fprintf(stdout, "benchmark" diff --git a/src/json_reporter.cc b/src/json_reporter.cc index bb0b9a1bf..0202c64a0 100644 --- a/src/json_reporter.cc +++ b/src/json_reporter.cc @@ -167,12 +167,7 @@ bool JSONReporter::ReportContext(const Context& context) { } out << "],\n"; -#if defined(BENCHMARK_VERSION) - const char library_version[] = BENCHMARK_VERSION; -#else - const char library_version[] = "hello, bazel!"; -#endif - out << indent << FormatKV("library_version", library_version); + out << indent << FormatKV("library_version", GetBenchmarkVersiom()); out << ",\n"; #if defined(NDEBUG)