Skip to content

Commit 5f2703f

Browse files
authored
Merge pull request #5518 from pawelsalawa/copilot/parse-version-from-qmake
Embed version info in Windows executable via RC file
2 parents a175214 + b8ca0ad commit 5f2703f

5 files changed

Lines changed: 188 additions & 0 deletions

File tree

.gitignore

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,13 @@ qrc_*.cpp
3535
.qmake.stash
3636
.qmake.cache
3737

38+
# Generated version calculation scripts
39+
calc_version.bat
40+
calc_version.sh
41+
42+
# Generated Makefiles
43+
Makefile
44+
3845
# ---- Build outputs ----------------------------------------------------------
3946
# Common out-of-source build dirs
4047
build/

SQLiteStudio3/SQLiteStudio3.pro

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
TEMPLATE = subdirs
22

3+
# Include version parsing
4+
include($$PWD/version.pri)
5+
36
REQ_QT_MAJOR = 6
47
REQ_QT_MINOR = 2
58
REQ_QT_PATCH = 0

SQLiteStudio3/common.pri

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
OUTPUT_DIR_NAME = output
22
export(OUTPUT_DIR_NAME)
33

4+
# Include version parsing to make version variables available to all subprojects
5+
include($$PWD/version.pri)
6+
47
DESTDIR = $$PWD/../$$OUTPUT_DIR_NAME/SQLiteStudio
58
OBJECTS_DIR = $$PWD/../$$OUTPUT_DIR_NAME/build
69
MOC_DIR = $$PWD/../$$OUTPUT_DIR_NAME/build

SQLiteStudio3/sqlitestudio/windows.rc

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,49 @@
22

33
ID_ICON ICON DISCARDABLE "../guiSQLiteStudio/img/sqlitestudio.ico"
44
CREATEPROCESS_MANIFEST_RESOURCE_ID RT_MANIFEST "SQLiteStudio.exe.manifest"
5+
6+
#ifndef SQLITESTUDIO_VERSION_MAJOR
7+
#define SQLITESTUDIO_VERSION_MAJOR 4
8+
#endif
9+
#ifndef SQLITESTUDIO_VERSION_MINOR
10+
#define SQLITESTUDIO_VERSION_MINOR 0
11+
#endif
12+
#ifndef SQLITESTUDIO_VERSION_PATCH
13+
#define SQLITESTUDIO_VERSION_PATCH 0
14+
#endif
15+
#ifndef SQLITESTUDIO_VERSION_STRING
16+
#define SQLITESTUDIO_VERSION_STRING "4.0.0"
17+
#endif
18+
19+
VS_VERSION_INFO VERSIONINFO
20+
FILEVERSION SQLITESTUDIO_VERSION_MAJOR,SQLITESTUDIO_VERSION_MINOR,SQLITESTUDIO_VERSION_PATCH,0
21+
PRODUCTVERSION SQLITESTUDIO_VERSION_MAJOR,SQLITESTUDIO_VERSION_MINOR,SQLITESTUDIO_VERSION_PATCH,0
22+
FILEFLAGSMASK VS_FFI_FILEFLAGSMASK
23+
#ifdef _DEBUG
24+
FILEFLAGS VS_FF_DEBUG
25+
#else
26+
FILEFLAGS 0x0L
27+
#endif
28+
FILEOS VOS_NT_WINDOWS32
29+
FILETYPE VFT_APP
30+
FILESUBTYPE VFT2_UNKNOWN
31+
BEGIN
32+
BLOCK "StringFileInfo"
33+
BEGIN
34+
BLOCK "040904b0"
35+
BEGIN
36+
VALUE "CompanyName", "SalSoft"
37+
VALUE "FileDescription", "SQLiteStudio - SQLite database manager"
38+
VALUE "FileVersion", SQLITESTUDIO_VERSION_STRING
39+
VALUE "InternalName", "SQLiteStudio"
40+
VALUE "LegalCopyright", "Copyright (C) 2024 SalSoft"
41+
VALUE "OriginalFilename", "SQLiteStudio.exe"
42+
VALUE "ProductName", "SQLiteStudio"
43+
VALUE "ProductVersion", SQLITESTUDIO_VERSION_STRING
44+
END
45+
END
46+
BLOCK "VarFileInfo"
47+
BEGIN
48+
VALUE "Translation", 0x409, 1200
49+
END
50+
END

SQLiteStudio3/version.pri

Lines changed: 129 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,129 @@
1+
# SQLiteStudio version extraction from sqlitestudio.cpp
2+
# This file parses the version number from the source code and makes it available
3+
# to all qmake builds, including Windows QtCreator builds.
4+
#
5+
# Version format: XXYYZZ where XX = major, YY = minor, ZZ = patch
6+
# Example: 40000 = 4.0.0, 30515 = 3.5.15
7+
8+
# Path to the sqlitestudio.cpp file containing the version
9+
SQLITESTUDIO_CPP = $$PWD/coreSQLiteStudio/sqlitestudio.cpp
10+
11+
# Read the file content
12+
SQLITESTUDIO_CPP_CONTENT = $$cat($$SQLITESTUDIO_CPP, lines)
13+
14+
# Find the line containing the version and extract the number
15+
for(line, SQLITESTUDIO_CPP_CONTENT) {
16+
contains(line, ".*static const int sqlitestudioVersion.*") {
17+
# Extract the version number from the line
18+
# Line format: "static const int sqlitestudioVersion = 40000;"
19+
VERSION_LINE = $$line
20+
21+
# Remove the variable name and everything before the equals sign
22+
VERSION_LINE = $$replace(VERSION_LINE, "static const int sqlitestudioVersion", "")
23+
VERSION_LINE = $$replace(VERSION_LINE, "=", "")
24+
25+
# Remove the semicolon
26+
VERSION_LINE = $$replace(VERSION_LINE, ";", "")
27+
28+
# Remove all whitespace
29+
VERSION_LINE = $$replace(VERSION_LINE, " ", "")
30+
31+
SQLITESTUDIO_VERSION_INT = $$VERSION_LINE
32+
}
33+
}
34+
35+
# Verify we found the version
36+
isEmpty(SQLITESTUDIO_VERSION_INT) {
37+
error("Could not extract version from $$SQLITESTUDIO_CPP")
38+
}
39+
40+
# Calculate version components
41+
# For Windows, use batch file to avoid Python dependency
42+
# For Unix-like systems, use shell script
43+
win32 {
44+
# Windows: Create batch file for version calculation
45+
VERSION_CALC_SCRIPT = $$OUT_PWD/calc_version.bat
46+
47+
# Batch file content for Windows integer division
48+
VERSION_CALC_CONTENT = "@echo off"
49+
VERSION_CALC_CONTENT += $$escape_expand(\\n)
50+
VERSION_CALC_CONTENT += "set ver=$$SQLITESTUDIO_VERSION_INT"
51+
VERSION_CALC_CONTENT += $$escape_expand(\\n)
52+
# Major = ver / 10000
53+
VERSION_CALC_CONTENT += "set /a major=ver/10000"
54+
VERSION_CALC_CONTENT += $$escape_expand(\\n)
55+
# Minor = (ver / 100) % 100
56+
VERSION_CALC_CONTENT += "set /a minor=(ver/100)%%100"
57+
VERSION_CALC_CONTENT += $$escape_expand(\\n)
58+
# Patch = ver % 100
59+
VERSION_CALC_CONTENT += "set /a patch=ver%%100"
60+
VERSION_CALC_CONTENT += $$escape_expand(\\n)
61+
VERSION_CALC_CONTENT += "echo %major% %minor% %patch%"
62+
63+
write_file($$VERSION_CALC_SCRIPT, VERSION_CALC_CONTENT)
64+
65+
# Run the batch file
66+
VERSION_CALC = $$system($$VERSION_CALC_SCRIPT 2>NUL, lines)
67+
} else {
68+
# Unix-like: Create shell script for version calculation
69+
VERSION_CALC_SCRIPT = $$OUT_PWD/calc_version.sh
70+
71+
# Shell script content for integer division
72+
VERSION_CALC_CONTENT = "#!/bin/sh"
73+
VERSION_CALC_CONTENT += $$escape_expand(\\n)
74+
VERSION_CALC_CONTENT += "ver=$$SQLITESTUDIO_VERSION_INT"
75+
VERSION_CALC_CONTENT += $$escape_expand(\\n)
76+
# Major = ver / 10000
77+
VERSION_CALC_CONTENT += "major=\$$((ver/10000))"
78+
VERSION_CALC_CONTENT += $$escape_expand(\\n)
79+
# Minor = (ver / 100) % 100
80+
VERSION_CALC_CONTENT += "minor=\$$((ver/100%100))"
81+
VERSION_CALC_CONTENT += $$escape_expand(\\n)
82+
# Patch = ver % 100
83+
VERSION_CALC_CONTENT += "patch=\$$((ver%100))"
84+
VERSION_CALC_CONTENT += $$escape_expand(\\n)
85+
VERSION_CALC_CONTENT += "echo \$$major \$$minor \$$patch"
86+
87+
write_file($$VERSION_CALC_SCRIPT, VERSION_CALC_CONTENT)
88+
89+
# Run the shell script
90+
VERSION_CALC = $$system(sh $$VERSION_CALC_SCRIPT 2>/dev/null, lines)
91+
}
92+
93+
# Parse the results if we got them
94+
!isEmpty(VERSION_CALC) {
95+
VERSION_PARTS = $$split(VERSION_CALC, " ")
96+
SQLITESTUDIO_VERSION_MAJOR = $$member(VERSION_PARTS, 0)
97+
SQLITESTUDIO_VERSION_MINOR = $$member(VERSION_PARTS, 1)
98+
SQLITESTUDIO_VERSION_PATCH = $$member(VERSION_PARTS, 2)
99+
}
100+
101+
# If script execution failed, show error with helpful message
102+
isEmpty(SQLITESTUDIO_VERSION_MAJOR) {
103+
error("Could not calculate version components from $$SQLITESTUDIO_VERSION_INT. Please check that the build environment supports batch/shell scripts.")
104+
}
105+
106+
# Create version string
107+
SQLITESTUDIO_VERSION_STRING = "$${SQLITESTUDIO_VERSION_MAJOR}.$${SQLITESTUDIO_VERSION_MINOR}.$${SQLITESTUDIO_VERSION_PATCH}"
108+
109+
message("SQLiteStudio version: $$SQLITESTUDIO_VERSION_STRING ($$SQLITESTUDIO_VERSION_INT)")
110+
111+
# Set qmake VERSION variable for use in .rc files and other contexts
112+
VERSION = $$SQLITESTUDIO_VERSION_STRING
113+
114+
# Make variables available to other .pro files
115+
export(SQLITESTUDIO_VERSION_INT)
116+
export(SQLITESTUDIO_VERSION_MAJOR)
117+
export(SQLITESTUDIO_VERSION_MINOR)
118+
export(SQLITESTUDIO_VERSION_PATCH)
119+
export(SQLITESTUDIO_VERSION_STRING)
120+
121+
# Add as DEFINES so they're available in C++ code if needed
122+
DEFINES += SQLITESTUDIO_VERSION_INT=$$SQLITESTUDIO_VERSION_INT
123+
DEFINES += SQLITESTUDIO_VERSION_MAJOR=$$SQLITESTUDIO_VERSION_MAJOR
124+
DEFINES += SQLITESTUDIO_VERSION_MINOR=$$SQLITESTUDIO_VERSION_MINOR
125+
DEFINES += SQLITESTUDIO_VERSION_PATCH=$$SQLITESTUDIO_VERSION_PATCH
126+
# Triple-backslash escaping produces a quoted string literal in C++:
127+
# e.g., #define SQLITESTUDIO_VERSION_STRING "4.0.0"
128+
DEFINES += SQLITESTUDIO_VERSION_STRING=\\\"$$SQLITESTUDIO_VERSION_STRING\\\"
129+

0 commit comments

Comments
 (0)