Skip to content

Commit a2854a7

Browse files
author
Uwe Kindler
committed
Added cmake modules to integrate version information into Windows DLLs
1 parent c1977c5 commit a2854a7

File tree

3 files changed

+126
-0
lines changed

3 files changed

+126
-0
lines changed
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
#include <windows.h>
2+
3+
VS_VERSION_INFO VERSIONINFO
4+
FILEVERSION @PROJECT_VERSION_MAJOR@,@PROJECT_VERSION_MINOR@,@PROJECT_VERSION_PATCH@,0
5+
PRODUCTVERSION @PROJECT_VERSION_MAJOR@,@PROJECT_VERSION_MINOR@,@PROJECT_VERSION_PATCH@,0
6+
FILEFLAGSMASK VS_FFI_FILEFLAGSMASK
7+
FILEFLAGS 0
8+
FILEOS VOS__WINDOWS32
9+
FILETYPE VFT_APP
10+
FILESUBTYPE 0
11+
BEGIN
12+
BLOCK "StringFileInfo"
13+
BEGIN
14+
BLOCK "040904b0"
15+
BEGIN
16+
VALUE "CompanyName", "My Company\0"
17+
VALUE "FileDescription", "@PROJECT_NAME@\0"
18+
VALUE "FileVersion", "@PROJECT_VERSION_STRING@\0"
19+
VALUE "ProductVersion", "@PROJECT_VERSION_STRING@\0"
20+
VALUE "GitCommitFull", "@PROJECT_GIT_HASH@\0"
21+
VALUE "GitCommitShort", "@PROJECT_GIT_HASH_SHORT@\0"
22+
END
23+
END
24+
25+
BLOCK "VarFileInfo"
26+
BEGIN
27+
VALUE "Translation", 0x0409, 1200
28+
END
29+
END

cmake/modules/Versioning.cmake

Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
# ============================================================
2+
# Versioning.cmake (Reusable Version + Resource Generator)
3+
# ============================================================
4+
5+
# Freeze the directory where this module lives
6+
# This is critical — it prevents paths from breaking when the
7+
# function is invoked from other CMakeLists.txt files.
8+
set(_VERSIONING_MODULE_DIR "${CMAKE_CURRENT_LIST_DIR}" CACHE INTERNAL "Versioning module directory")
9+
10+
# ------------------------------------------------------------
11+
# Extract version information from Git
12+
# ------------------------------------------------------------
13+
14+
# Get tag (expected: v1.2.3 or 1.2.3 or 1.2.3-12-gHASH)
15+
execute_process(
16+
COMMAND git describe --tags --dirty
17+
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
18+
OUTPUT_VARIABLE GIT_DESC_RAW
19+
OUTPUT_STRIP_TRAILING_WHITESPACE
20+
)
21+
22+
# Remove leading "v" if present
23+
string(REGEX REPLACE "^v" "" GIT_DESC "${GIT_DESC_RAW}")
24+
25+
# Extract major.minor.patch
26+
string(REGEX MATCH "^([0-9]+)\\.([0-9]+)\\.([0-9]+)" _ "${GIT_DESC}")
27+
set(PROJECT_VERSION_MAJOR "${CMAKE_MATCH_1}")
28+
set(PROJECT_VERSION_MINOR "${CMAKE_MATCH_2}")
29+
set(PROJECT_VERSION_PATCH "${CMAKE_MATCH_3}")
30+
31+
set(PROJECT_VERSION_STRING
32+
"${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}"
33+
)
34+
35+
# Commit hash (full + short)
36+
execute_process(
37+
COMMAND git rev-parse HEAD
38+
OUTPUT_VARIABLE PROJECT_GIT_HASH
39+
OUTPUT_STRIP_TRAILING_WHITESPACE
40+
)
41+
42+
execute_process(
43+
COMMAND git rev-parse --short HEAD
44+
OUTPUT_VARIABLE PROJECT_GIT_HASH_SHORT
45+
OUTPUT_STRIP_TRAILING_WHITESPACE
46+
)
47+
48+
# Export variables to parent scope
49+
set(PROJECT_VERSION_MAJOR "${PROJECT_VERSION_MAJOR}" PARENT_SCOPE)
50+
set(PROJECT_VERSION_MINOR "${PROJECT_VERSION_MINOR}" PARENT_SCOPE)
51+
set(PROJECT_VERSION_PATCH "${PROJECT_VERSION_PATCH}" PARENT_SCOPE)
52+
set(PROJECT_VERSION_STRING "${PROJECT_VERSION_STRING}" PARENT_SCOPE)
53+
set(PROJECT_GIT_HASH "${PROJECT_GIT_HASH}" PARENT_SCOPE)
54+
set(PROJECT_GIT_HASH_SHORT "${PROJECT_GIT_HASH_SHORT}" PARENT_SCOPE)
55+
56+
# Public variable for users
57+
set(PROJECT_AUTO_VERSION "${PROJECT_VERSION_STRING}" PARENT_SCOPE)
58+
59+
# ------------------------------------------------------------
60+
# Reusable function: Attach Windows version resources to target
61+
# ------------------------------------------------------------
62+
function(add_windows_version_resources target)
63+
if(NOT WIN32)
64+
return()
65+
endif()
66+
67+
if(NOT TARGET "${target}")
68+
message(FATAL_ERROR "add_windows_version_resources: target '${target}' not found.")
69+
endif()
70+
71+
# Absolute path to the template (never changes)
72+
get_filename_component(_rc_in
73+
"${_VERSIONING_MODULE_DIR}/FileVersionInfo.rc.in"
74+
ABSOLUTE
75+
)
76+
77+
if(NOT EXISTS "${_rc_in}")
78+
message(FATAL_ERROR
79+
"FileVersionInfo.rc.in missing at: ${_rc_in}"
80+
)
81+
endif()
82+
83+
# Output in the caller's binary dir
84+
set(_rc_out "${CMAKE_CURRENT_BINARY_DIR}/${target}_version.rc")
85+
get_filename_component(_rc_out "${_rc_out}" ABSOLUTE)
86+
87+
# Ensure directory exists
88+
file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}")
89+
90+
# Configure the template
91+
configure_file("${_rc_in}" "${_rc_out}" @ONLY)
92+
93+
# Add to the target
94+
target_sources(${target} PRIVATE "${_rc_out}")
95+
endfunction()

src/CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
cmake_minimum_required(VERSION 3.16)
22
project(QtAdvancedDockingSystem LANGUAGES CXX VERSION ${VERSION_SHORT})
33
include(GNUInstallDirs)
4+
include(Versioning)
45
if (${QT_VERSION_MAJOR})
56
message(STATUS "Forced to use Qt version ${QT_VERSION_MAJOR}")
67
find_package(QT NAMES Qt${QT_VERSION_MAJOR} COMPONENTS Core REQUIRED)
@@ -83,6 +84,7 @@ if(BUILD_STATIC)
8384
target_compile_definitions( ${library_name} PUBLIC ADS_STATIC)
8485
else()
8586
add_library( ${library_name} SHARED ${ads_SRCS} ${ads_HEADERS})
87+
add_windows_version_resources(${library_name})
8688
target_compile_definitions( ${library_name} PRIVATE ADS_SHARED_EXPORT)
8789
endif()
8890

0 commit comments

Comments
 (0)