diff --git a/CMakeLists.txt b/CMakeLists.txt index 0646b67d..73f961b1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -140,6 +140,47 @@ message(STATUS "TransferBench version: ${VERSION_STRING}") project(TransferBench VERSION ${VERSION_STRING} LANGUAGES CXX) +# Git metadata: branch + short commit hash +# Priority: git rev-parse > GIT_VERSION file (populated by packaging scripts) > "unknown" +if(GIT_FOUND) + execute_process( + COMMAND ${GIT_EXECUTABLE} rev-parse --abbrev-ref HEAD + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + OUTPUT_VARIABLE TB_GIT_BRANCH + OUTPUT_STRIP_TRAILING_WHITESPACE ERROR_QUIET + RESULT_VARIABLE _tb_git_branch_result + ) + execute_process( + COMMAND ${GIT_EXECUTABLE} rev-parse --short HEAD + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + OUTPUT_VARIABLE TB_GIT_COMMIT + OUTPUT_STRIP_TRAILING_WHITESPACE ERROR_QUIET + RESULT_VARIABLE _tb_git_commit_result + ) +endif() +if(NOT TB_GIT_BRANCH OR TB_GIT_BRANCH STREQUAL "" OR + NOT TB_GIT_COMMIT OR TB_GIT_COMMIT STREQUAL "") + if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/GIT_VERSION") + file(STRINGS "${CMAKE_CURRENT_SOURCE_DIR}/GIT_VERSION" _tb_version_lines LIMIT_COUNT 2) + list(LENGTH _tb_version_lines _tb_version_line_count) + if(_tb_version_line_count GREATER 0) + list(GET _tb_version_lines 0 TB_GIT_BRANCH) + else() + set(TB_GIT_BRANCH "unknown") + endif() + if(_tb_version_line_count GREATER 1) + list(GET _tb_version_lines 1 TB_GIT_COMMIT) + else() + set(TB_GIT_COMMIT "unknown") + endif() + else() + set(TB_GIT_BRANCH "unknown") + set(TB_GIT_COMMIT "unknown") + endif() +endif() +message(STATUS "TransferBench ${VERSION_STRING} (${TB_GIT_BRANCH}:${TB_GIT_COMMIT})") + + if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) message(STATUS "Setting build type to 'Release' as none was specified.") set(CMAKE_BUILD_TYPE "Release" CACHE STRING "Choose the type of build." FORCE) @@ -497,6 +538,11 @@ if(POD_COMM_FOUND) target_compile_definitions(TransferBench PRIVATE POD_COMM_ENABLED) endif() +target_compile_definitions(TransferBench PRIVATE + TB_GIT_BRANCH="${TB_GIT_BRANCH}" + TB_GIT_COMMIT="${TB_GIT_COMMIT}" +) + check_cxx_compiler_flag(-parallel-jobs=12 HAVE_PARALLEL_JOBS) if(HAVE_PARALLEL_JOBS) message(STATUS "Enabling parallel compile jobs: -parallel-jobs=12") @@ -635,6 +681,17 @@ if(BUILD_RELOCATABLE_PACKAGE) set(CPACK_ARCHIVE_FILE_NAME "${_tb_archive_name}") set(CPACK_PACKAGE_FILE_NAME "${_tb_archive_name}") + if(CMAKE_VERSION VERSION_GREATER_EQUAL "3.20") + configure_file( + cmake/WriteGitVersion.cmake.in + ${CMAKE_BINARY_DIR}/WriteGitVersion.cmake + @ONLY + ) + set(CPACK_PRE_BUILD_SCRIPTS "${CMAKE_BINARY_DIR}/WriteGitVersion.cmake") + elseif(NOT TB_GIT_BRANCH STREQUAL "unknown") + file(WRITE "${CMAKE_CURRENT_SOURCE_DIR}/GIT_VERSION" "${TB_GIT_BRANCH}\n${TB_GIT_COMMIT}\n") + endif() + set(CPACK_GENERATOR "DEB;RPM;TGZ") include(CPack) else() @@ -650,6 +707,17 @@ else() set(PACKAGE_NAME TB) set(LIBRARY_NAME TransferBench) + if(CMAKE_VERSION VERSION_GREATER_EQUAL "3.20") + configure_file( + cmake/WriteGitVersion.cmake.in + ${CMAKE_BINARY_DIR}/WriteGitVersion.cmake + @ONLY + ) + set(CPACK_PRE_BUILD_SCRIPTS "${CMAKE_BINARY_DIR}/WriteGitVersion.cmake") + elseif(NOT TB_GIT_BRANCH STREQUAL "unknown") + file(WRITE "${CMAKE_CURRENT_SOURCE_DIR}/GIT_VERSION" "${TB_GIT_BRANCH}\n${TB_GIT_COMMIT}\n") + endif() + rocm_create_package( NAME ${LIBRARY_NAME} DESCRIPTION "TransferBench package" diff --git a/GIT_VERSION b/GIT_VERSION new file mode 100644 index 00000000..6abfba07 --- /dev/null +++ b/GIT_VERSION @@ -0,0 +1,2 @@ +unknown +unknown diff --git a/Makefile b/Makefile index 2f240b15..db40ed20 100644 --- a/Makefile +++ b/Makefile @@ -295,6 +295,13 @@ ifeq ($(filter clean,$(MAKECMDGOALS)),) endif endif endif + +# Git metadata (branch + short commit hash) +# Priority: git rev-parse > GIT_VERSION file (populated by packaging scripts) > "unknown" +_TB_DIR := $(dir $(abspath $(firstword $(MAKEFILE_LIST)))) +TB_GIT_BRANCH := $(shell git -C "$(_TB_DIR)" rev-parse --abbrev-ref HEAD 2>/dev/null || sed -n '1p' "$(_TB_DIR)GIT_VERSION" 2>/dev/null || echo unknown) +TB_GIT_COMMIT := $(shell git -C "$(_TB_DIR)" rev-parse --short HEAD 2>/dev/null || sed -n '2p' "$(_TB_DIR)GIT_VERSION" 2>/dev/null || echo unknown) +COMMON_FLAGS += -DTB_GIT_BRANCH='"$(TB_GIT_BRANCH)"' -DTB_GIT_COMMIT='"$(TB_GIT_COMMIT)"' endif .PHONY : all clean diff --git a/cmake/WriteGitVersion.cmake.in b/cmake/WriteGitVersion.cmake.in new file mode 100644 index 00000000..84acd589 --- /dev/null +++ b/cmake/WriteGitVersion.cmake.in @@ -0,0 +1,4 @@ +# Generated by CMakeLists.txt at configure time — do not edit. +# CPack runs this via CPACK_PRE_BUILD_SCRIPTS before creating the package, +# so source tarballs built without .git still carry the correct version info. +file(WRITE "@CMAKE_CURRENT_SOURCE_DIR@/GIT_VERSION" "@TB_GIT_BRANCH@\n@TB_GIT_COMMIT@\n") diff --git a/src/client/Client.cpp b/src/client/Client.cpp index 8ab53192..3074f3b1 100644 --- a/src/client/Client.cpp +++ b/src/client/Client.cpp @@ -253,7 +253,13 @@ void DisplayVersion() case COMM_MPI: multiNodeMode = " (Multi-node via MPI)"; break; } - Print("TransferBench v%s.%s%s%s\n", VERSION, CLIENT_VERSION, support.c_str(), multiNodeMode.c_str()); +#ifndef TB_GIT_BRANCH +#define TB_GIT_BRANCH "unknown" +#endif +#ifndef TB_GIT_COMMIT +#define TB_GIT_COMMIT "unknown" +#endif + Print("TransferBench v%s.%s (%s:%s)%s%s\n", VERSION, CLIENT_VERSION, TB_GIT_BRANCH, TB_GIT_COMMIT, support.c_str(), multiNodeMode.c_str()); Print("=============================================================================================================\n"); }