From 271855781c9bcb39915ff1dafe3a03be5b5f9e72 Mon Sep 17 00:00:00 2001 From: mlangkabel Date: Sun, 12 Jul 2026 09:16:49 +0200 Subject: [PATCH] add tag based version info to exe --- CMakeLists.txt | 12 ++++++++- cmake/version.cmake | 60 +++++++++++++++++++++++++++++++++++++++++++++ cmake/version.rc.in | 35 ++++++++++++++++++++++++++ src/CMakeLists.txt | 15 +++++++++++- 4 files changed, 120 insertions(+), 2 deletions(-) create mode 100644 cmake/version.cmake create mode 100644 cmake/version.rc.in diff --git a/CMakeLists.txt b/CMakeLists.txt index fddbef8..e51d757 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -4,10 +4,20 @@ message(STATUS "Using CMake ${CMAKE_VERSION}") include(cmake/add_files.cmake) include(cmake/create_source_groups.cmake) +include(cmake/version.cmake) # Project ---------------------------------------------------------------------- -project(DotaFactory) +# Product identity — anything that depends on the product/project name is defined +# here so it lives in a single place and can change in the future. These values +# feed the build targets in src/CMakeLists.txt and the Windows version resource +# (see cmake/version.rc.in). +set(PRODUCT_NAME "DotaFactory") # internal name and executable base name +set(PRODUCT_DISPLAY_NAME "Dota Factory") # human-readable product / file description +set(PRODUCT_COMPANY "TODO: company") # placeholder +set(PRODUCT_COPYRIGHT "TODO: copyright") # placeholder + +project(${PRODUCT_NAME}) set(CMAKE_BUILD_TYPE_INIT "Release") diff --git a/cmake/version.cmake b/cmake/version.cmake new file mode 100644 index 0000000..7e42681 --- /dev/null +++ b/cmake/version.cmake @@ -0,0 +1,60 @@ +# simple check for a git repo +if(EXISTS "${CMAKE_SOURCE_DIR}/.git") + find_package(Git) + + execute_process( + COMMAND ${GIT_EXECUTABLE} rev-parse --abbrev-ref HEAD + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + OUTPUT_VARIABLE GIT_BRANCH + OUTPUT_STRIP_TRAILING_WHITESPACE + ) + + execute_process( + COMMAND ${GIT_EXECUTABLE} log -1 --format=%h + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + OUTPUT_VARIABLE GIT_COMMIT_HASH + OUTPUT_STRIP_TRAILING_WHITESPACE + ) + + execute_process( + COMMAND ${GIT_EXECUTABLE} log -1 --format=%ci + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + OUTPUT_VARIABLE GIT_COMMIT_TIME + OUTPUT_STRIP_TRAILING_WHITESPACE + ) + + execute_process( + COMMAND ${GIT_EXECUTABLE} describe --long --match "[0-9]*" HEAD + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + OUTPUT_VARIABLE GIT_VERSION_NUMBER + OUTPUT_STRIP_TRAILING_WHITESPACE + ) + string(REGEX REPLACE "^([0-9]+)\\..*" "\\1" VERSION_MAJOR "${GIT_VERSION_NUMBER}") + string(REGEX REPLACE "^[0-9]+\\.([0-9]+).*" "\\1" VERSION_MINOR "${GIT_VERSION_NUMBER}") + string(REGEX REPLACE "^[0-9]+\\.[0-9]+\\.([0-9]+).*" "\\1" VERSION_PATCH "${GIT_VERSION_NUMBER}") + string(REGEX REPLACE "^[0-9]+\\.[0-9]+\\.[0-9]+-([0-9]+).*" "\\1" VERSION_COMMIT "${GIT_VERSION_NUMBER}") + +else(EXISTS "${CMAKE_SOURCE_DIR}/.git") + set(GIT_BRANCH "") + set(GIT_COMMIT_HASH "") + set(GIT_VERSION_NUMBER "") + set(VERSION_MAJOR "0") + set(VERSION_MINOR "0") + set(VERSION_PATCH "0") + set(VERSION_COMMIT "0") + set(BUILD_TYPE "") + +endif(EXISTS "${CMAKE_SOURCE_DIR}/.git") + +set(VERSION_STRING "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}.${VERSION_COMMIT}") + +message(STATUS "Version: ${VERSION_STRING}") + +# message(STATUS "Git current branch: ${GIT_BRANCH}") +# message(STATUS "Git version number: " ${GIT_VERSION_NUMBER} ) +# message(STATUS "Git commit hash: ${GIT_COMMIT_HASH}") +# message(STATUS "Git commit time: ${GIT_COMMIT_TIME}") +# message(STATUS "Version major: ${VERSION_MAJOR}") +# message(STATUS "Version minor: ${VERSION_MINOR}") +# message(STATUS "Version patch: ${VERSION_PATCH}") +# message(STATUS "Version commit: ${VERSION_COMMIT}") diff --git a/cmake/version.rc.in b/cmake/version.rc.in new file mode 100644 index 0000000..1744283 --- /dev/null +++ b/cmake/version.rc.in @@ -0,0 +1,35 @@ +// Windows version resource. Generated by CMake via configure_file() from this +// template; @VAR@ placeholders are filled from cmake/version.cmake (version +// numbers) and the product identity variables in the top-level CMakeLists.txt. +// Shows up on the executable's Details tab (right-click -> Properties). + +#include + +VS_VERSION_INFO VERSIONINFO + FILEVERSION @VERSION_MAJOR@,@VERSION_MINOR@,@VERSION_PATCH@,@VERSION_COMMIT@ + PRODUCTVERSION @VERSION_MAJOR@,@VERSION_MINOR@,@VERSION_PATCH@,@VERSION_COMMIT@ + FILEFLAGSMASK VS_FFI_FILEFLAGSMASK + FILEFLAGS 0x0L + FILEOS VOS_NT_WINDOWS32 + FILETYPE VFT_APP + FILESUBTYPE VFT2_UNKNOWN +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904b0" // US English (0x0409), Unicode (0x04b0) + BEGIN + VALUE "CompanyName", "@PRODUCT_COMPANY@" + VALUE "FileDescription", "@PRODUCT_DISPLAY_NAME@" + VALUE "FileVersion", "@VERSION_STRING@" + VALUE "InternalName", "@PRODUCT_NAME@" + VALUE "OriginalFilename", "@PRODUCT_NAME@.exe" + VALUE "ProductName", "@PRODUCT_DISPLAY_NAME@" + VALUE "ProductVersion", "@VERSION_STRING@" + VALUE "LegalCopyright", "@PRODUCT_COPYRIGHT@" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1200 // 0x409 = en-US, 1200 = Unicode code page + END +END diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 5cf0f8a..2f71a4e 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,4 +1,4 @@ -set(TARGET_BASE_NAME "DotaFactory") +set(TARGET_BASE_NAME "${PRODUCT_NAME}") set(TARGET_APP_NAME "${TARGET_BASE_NAME}") set(TARGET_LIB_NAME "${TARGET_BASE_NAME}_lib") @@ -183,6 +183,19 @@ target_compile_definitions(${TARGET_APP_NAME} PRIVATE ) target_link_libraries(${TARGET_APP_NAME} ${TARGET_UI_NAME}) +# Embed the Windows version resource so the version shows on the executable's +# Details tab (right-click -> Properties). Values come from cmake/version.cmake +# (version numbers) and the product identity variables in the top-level +# CMakeLists.txt. MSVC compiles the .rc automatically once it is a target source. +if (WIN32) + configure_file( + "${CMAKE_SOURCE_DIR}/cmake/version.rc.in" + "${CMAKE_CURRENT_BINARY_DIR}/version.rc" + @ONLY + ) + target_sources(${TARGET_APP_NAME} PRIVATE "${CMAKE_CURRENT_BINARY_DIR}/version.rc") +endif () + unset(APP_FILES) unset(RELATIVE_HDRS) unset(RELATIVE_SRCS)