Skip to content

Commit 35c16d2

Browse files
committed
feat: Implement Git-based versioning for all platforms
- Updated create-appimage-cli.sh, create-appimage.sh, and create-embedded.sh to retrieve version information from Git tags, enhancing version tracking. - Modified output messages to display both the Git version and numeric version components. - Added logic in CMakeLists.txt to extract version components from Git tags for better compatibility and fallback handling. - Introduced metainfo.xml and resource file generation for Windows packaging, incorporating version information dynamically.
1 parent 60b74e4 commit 35c16d2

File tree

9 files changed

+101
-34
lines changed

9 files changed

+101
-34
lines changed

create-appimage-cli.sh

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -58,16 +58,27 @@ echo "Building CLI-only AppImage for architecture: $ARCH"
5858
SOURCE_DIR="src/"
5959
CMAKE_FILE="${SOURCE_DIR}CMakeLists.txt"
6060

61-
# Extract version components
62-
MAJOR=$(grep -E "set\(IMAGER_VERSION_MAJOR [0-9]+" "$CMAKE_FILE" | sed 's/set(IMAGER_VERSION_MAJOR \([0-9]*\).*/\1/')
63-
MINOR=$(grep -E "set\(IMAGER_VERSION_MINOR [0-9]+" "$CMAKE_FILE" | sed 's/set(IMAGER_VERSION_MINOR \([0-9]*\).*/\1/')
64-
PATCH=$(grep -E "set\(IMAGER_VERSION_PATCH [0-9]+" "$CMAKE_FILE" | sed 's/set(IMAGER_VERSION_PATCH \([0-9]*\).*/\1/')
65-
PROJECT_VERSION="$MAJOR.$MINOR.$PATCH"
61+
# Get version from git tag (same approach as CMake)
62+
GIT_VERSION=$(git describe --tags --always --dirty 2>/dev/null || echo "0.0.0-unknown")
63+
64+
# Extract numeric version components for compatibility
65+
if [[ $GIT_VERSION =~ ^v?([0-9]+)\.([0-9]+)\.([0-9]+) ]]; then
66+
MAJOR="${BASH_REMATCH[1]}"
67+
MINOR="${BASH_REMATCH[2]}"
68+
PATCH="${BASH_REMATCH[3]}"
69+
PROJECT_VERSION="$MAJOR.$MINOR.$PATCH"
70+
else
71+
MAJOR="0"
72+
MINOR="0"
73+
PATCH="0"
74+
PROJECT_VERSION="0.0.0"
75+
echo "Warning: Could not parse version from git tag: $GIT_VERSION"
76+
fi
6677

6778
# Extract project name (lowercase for AppImage naming convention)
6879
PROJECT_NAME=$(grep "project(" "$CMAKE_FILE" | head -1 | sed 's/project(\([^[:space:]]*\).*/\1/' | tr '[:upper:]' '[:lower:]')
6980

70-
echo "Building $PROJECT_NAME version $PROJECT_VERSION for CLI-only operation"
81+
echo "Building $PROJECT_NAME version $GIT_VERSION (numeric: $PROJECT_VERSION) for CLI-only operation"
7182

7283
QT_VERSION=""
7384
QT_DIR=""

create-appimage.sh

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -49,16 +49,27 @@ echo "Building for architecture: $ARCH"
4949
SOURCE_DIR="src/"
5050
CMAKE_FILE="${SOURCE_DIR}CMakeLists.txt"
5151

52-
# Extract version components
53-
MAJOR=$(grep -E "set\(IMAGER_VERSION_MAJOR [0-9]+" "$CMAKE_FILE" | sed 's/set(IMAGER_VERSION_MAJOR \([0-9]*\).*/\1/')
54-
MINOR=$(grep -E "set\(IMAGER_VERSION_MINOR [0-9]+" "$CMAKE_FILE" | sed 's/set(IMAGER_VERSION_MINOR \([0-9]*\).*/\1/')
55-
PATCH=$(grep -E "set\(IMAGER_VERSION_PATCH [0-9]+" "$CMAKE_FILE" | sed 's/set(IMAGER_VERSION_PATCH \([0-9]*\).*/\1/')
56-
PROJECT_VERSION="$MAJOR.$MINOR.$PATCH"
52+
# Get version from git tag (same approach as CMake)
53+
GIT_VERSION=$(git describe --tags --always --dirty 2>/dev/null || echo "0.0.0-unknown")
54+
55+
# Extract numeric version components for compatibility
56+
if [[ $GIT_VERSION =~ ^v?([0-9]+)\.([0-9]+)\.([0-9]+) ]]; then
57+
MAJOR="${BASH_REMATCH[1]}"
58+
MINOR="${BASH_REMATCH[2]}"
59+
PATCH="${BASH_REMATCH[3]}"
60+
PROJECT_VERSION="$MAJOR.$MINOR.$PATCH"
61+
else
62+
MAJOR="0"
63+
MINOR="0"
64+
PATCH="0"
65+
PROJECT_VERSION="0.0.0"
66+
echo "Warning: Could not parse version from git tag: $GIT_VERSION"
67+
fi
5768

5869
# Extract project name (lowercase for AppImage naming convention)
5970
PROJECT_NAME=$(grep "project(" "$CMAKE_FILE" | head -1 | sed 's/project(\([^[:space:]]*\).*/\1/' | tr '[:upper:]' '[:lower:]')
6071

61-
echo "Building $PROJECT_NAME version $PROJECT_VERSION"
72+
echo "Building $PROJECT_NAME version $GIT_VERSION (numeric: $PROJECT_VERSION)"
6273

6374
# Check for Qt installation
6475
# Priority: 1. Command line argument, 2. Environment variable, 3. Auto-detection

create-embedded.sh

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -57,16 +57,27 @@ echo "Building embedded AppImage for architecture: $ARCH"
5757
SOURCE_DIR="src/"
5858
CMAKE_FILE="${SOURCE_DIR}CMakeLists.txt"
5959

60-
# Extract version components
61-
MAJOR=$(grep -E "set\(IMAGER_VERSION_MAJOR [0-9]+" "$CMAKE_FILE" | sed 's/set(IMAGER_VERSION_MAJOR \([0-9]*\).*/\1/')
62-
MINOR=$(grep -E "set\(IMAGER_VERSION_MINOR [0-9]+" "$CMAKE_FILE" | sed 's/set(IMAGER_VERSION_MINOR \([0-9]*\).*/\1/')
63-
PATCH=$(grep -E "set\(IMAGER_VERSION_PATCH [0-9]+" "$CMAKE_FILE" | sed 's/set(IMAGER_VERSION_PATCH \([0-9]*\).*/\1/')
64-
PROJECT_VERSION="$MAJOR.$MINOR.$PATCH"
60+
# Get version from git tag (same approach as CMake)
61+
GIT_VERSION=$(git describe --tags --always --dirty 2>/dev/null || echo "0.0.0-unknown")
62+
63+
# Extract numeric version components for compatibility
64+
if [[ $GIT_VERSION =~ ^v?([0-9]+)\.([0-9]+)\.([0-9]+) ]]; then
65+
MAJOR="${BASH_REMATCH[1]}"
66+
MINOR="${BASH_REMATCH[2]}"
67+
PATCH="${BASH_REMATCH[3]}"
68+
PROJECT_VERSION="$MAJOR.$MINOR.$PATCH"
69+
else
70+
MAJOR="0"
71+
MINOR="0"
72+
PATCH="0"
73+
PROJECT_VERSION="0.0.0"
74+
echo "Warning: Could not parse version from git tag: $GIT_VERSION"
75+
fi
6576

6677
# Extract project name (lowercase for AppImage naming convention)
6778
PROJECT_NAME=$(grep "project(" "$CMAKE_FILE" | head -1 | sed 's/project(\([^[:space:]]*\).*/\1/' | tr '[:upper:]' '[:lower:]')
6879

69-
echo "Building $PROJECT_NAME version $PROJECT_VERSION for embedded systems"
80+
echo "Building $PROJECT_NAME version $GIT_VERSION (numeric: $PROJECT_VERSION) for embedded systems"
7081

7182
QT_VERSION=""
7283
QT_DIR=""

debian/com.raspberrypi.rpi-imager.metainfo.xml renamed to debian/com.raspberrypi.rpi-imager.metainfo.xml.in

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
always installing the most up-to-date version.
1313
</p>
1414
<p>
15-
Once youve selected an operating system from the available options,
15+
Once you've selected an operating system from the available options,
1616
the utility reads the relevant file directly from the Raspberry Pi
1717
website and writes it straight to the SD card. This speeds up the
1818
process quite considerably compared to the standard process of reading
@@ -55,9 +55,10 @@
5555
<binary>rpi-imager</binary>
5656
</provides>
5757
<releases>
58-
<release version="1.9.6" />
58+
<release version="@IMAGER_VERSION_STR@" />
5959
</releases>
6060
<content_rating type="oars-1.1">
6161
<content_attribute id="social-info">moderate</content_attribute>
6262
</content_rating>
6363
</component>
64+

src/CMakeLists.txt

Lines changed: 28 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -27,11 +27,8 @@ endif()
2727
set(CMAKE_OSX_ARCHITECTURES "arm64;x86_64" CACHE STRING "Which macOS architectures to build for")
2828

2929
project(rpi-imager LANGUAGES CXX C)
30-
set(IMAGER_VERSION_MAJOR 2)
31-
set(IMAGER_VERSION_MINOR 0)
32-
set(IMAGER_VERSION_PATCH 0)
3330

34-
# Get git description for version string
31+
# Get version from git tag
3532
find_package(Git QUIET)
3633
if(GIT_FOUND)
3734
execute_process(
@@ -43,16 +40,37 @@ if(GIT_FOUND)
4340
)
4441
endif()
4542

46-
# Build version string with git description if available
47-
set(IMAGER_VERSION_STR "${IMAGER_VERSION_MAJOR}.${IMAGER_VERSION_MINOR}.${IMAGER_VERSION_PATCH}")
43+
# Use git-derived version as the canonical version string
4844
if(GIT_DESCRIBE)
49-
set(IMAGER_VERSION_STR "${IMAGER_VERSION_STR}-${GIT_DESCRIBE}")
50-
message(STATUS "Git description: ${GIT_DESCRIBE}")
45+
set(IMAGER_VERSION_STR "${GIT_DESCRIBE}")
46+
message(STATUS "Version from git: ${IMAGER_VERSION_STR}")
47+
48+
# Extract numeric version components from git tag for Windows metadata
49+
# Expected format: v2.0.0 or v2.0.0-rc4-60-geac7c2f0
50+
string(REGEX MATCH "^v?([0-9]+)\\.([0-9]+)\\.([0-9]+)" VERSION_MATCH "${GIT_DESCRIBE}")
51+
if(VERSION_MATCH)
52+
set(IMAGER_VERSION_MAJOR ${CMAKE_MATCH_1})
53+
set(IMAGER_VERSION_MINOR ${CMAKE_MATCH_2})
54+
set(IMAGER_VERSION_PATCH ${CMAKE_MATCH_3})
55+
else()
56+
# Fallback if tag doesn't match expected format
57+
set(IMAGER_VERSION_MAJOR 0)
58+
set(IMAGER_VERSION_MINOR 0)
59+
set(IMAGER_VERSION_PATCH 0)
60+
message(WARNING "Could not parse version from git tag: ${GIT_DESCRIBE}")
61+
endif()
62+
else()
63+
# Fallback when git is not available or no tags exist
64+
set(IMAGER_VERSION_MAJOR 0)
65+
set(IMAGER_VERSION_MINOR 0)
66+
set(IMAGER_VERSION_PATCH 0)
67+
set(IMAGER_VERSION_STR "0.0.0-unknown")
68+
message(WARNING "Git not found or no tags available, using fallback version: ${IMAGER_VERSION_STR}")
5169
endif()
5270

53-
set(IMAGER_VERSION_CSV "${IMAGER_VERSION_MAJOR},${IMAGER_VERSION_MINOR},${IMAGER_VERSION_PATCH},0")
71+
# Version variables for template substitution (Windows .rc, .manifest, etc.)
72+
# Note: IMAGER_VERSION_STR is used in C++ code, so it needs to be a compile definition
5473
add_definitions(-DIMAGER_VERSION_STR="${IMAGER_VERSION_STR}")
55-
add_definitions(-DIMAGER_VERSION_CSV=${IMAGER_VERSION_CSV})
5674
set(CMAKE_INCLUDE_CURRENT_DIR ON)
5775

5876
set(CMAKE_CXX_STANDARD 20)

src/linux/PlatformPackaging.cmake

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,12 @@ if (NOT CMAKE_CROSSCOMPILING)
1212
endif()
1313
endif()
1414

15+
# Generate metainfo.xml with current version
16+
configure_file(
17+
"${CMAKE_CURRENT_LIST_DIR}/../../debian/com.raspberrypi.rpi-imager.metainfo.xml.in"
18+
"${CMAKE_CURRENT_BINARY_DIR}/com.raspberrypi.rpi-imager.metainfo.xml"
19+
@ONLY)
20+
1521
install(TARGETS ${PROJECT_NAME} DESTINATION bin)
1622

1723
if(BUILD_CLI_ONLY)
@@ -22,7 +28,7 @@ else()
2228
# GUI build: install full desktop integration
2329
install(FILES "${CMAKE_CURRENT_LIST_DIR}/../../debian/rpi-imager.png" DESTINATION share/icons/hicolor/128x128/apps)
2430
install(FILES "${CMAKE_CURRENT_LIST_DIR}/../../debian/com.raspberrypi.rpi-imager.desktop" DESTINATION share/applications)
25-
install(FILES "${CMAKE_CURRENT_LIST_DIR}/../../debian/com.raspberrypi.rpi-imager.metainfo.xml" DESTINATION share/metainfo)
31+
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/com.raspberrypi.rpi-imager.metainfo.xml" DESTINATION share/metainfo)
2632
endif()
2733

2834

src/windows/Platform.cmake

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ else()
5252
endif()
5353

5454
set(DEPENDENCIES
55-
windows/rpi-imager.rc
55+
${CMAKE_BINARY_DIR}/rpi-imager.rc
5656
wlanapi_delayed.lib
5757
)
5858
set(EXTRALIBS setupapi ${CMAKE_BINARY_DIR}/wlanapi_delayed.lib Bcrypt.dll ole32 oleaut32 wbemuuid)

src/windows/PlatformPackaging.cmake

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,12 @@ else()
121121
endif()
122122
endif()
123123

124+
# Resource file generation (contains version info)
125+
configure_file(
126+
"${CMAKE_CURRENT_SOURCE_DIR}/windows/rpi-imager.rc.in"
127+
"${CMAKE_CURRENT_BINARY_DIR}/rpi-imager.rc"
128+
@ONLY)
129+
124130
# Manifest generation and copying
125131
configure_file(
126132
"${CMAKE_CURRENT_SOURCE_DIR}/windows/rpi-imager.manifest.in"

src/windows/rpi-imager.rc renamed to src/windows/rpi-imager.rc.in

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,19 +4,22 @@ IDI_ICON1 ICON DISCARDABLE "../icons/rpi-imager.ico"
44
CREATEPROCESS_MANIFEST_RESOURCE_ID RT_MANIFEST "rpi-imager.manifest"
55

66
1 VERSIONINFO
7-
FILEVERSION IMAGER_VERSION_CSV
8-
PRODUCTVERSION IMAGER_VERSION_CSV
7+
FILEVERSION @IMAGER_VERSION_MAJOR@,@IMAGER_VERSION_MINOR@,@IMAGER_VERSION_PATCH@,0
8+
PRODUCTVERSION @IMAGER_VERSION_MAJOR@,@IMAGER_VERSION_MINOR@,@IMAGER_VERSION_PATCH@,0
99
{
1010
BLOCK "StringFileInfo"
1111
{
1212
BLOCK "040904b0"
1313
{
1414
VALUE "CompanyName", "Raspberry Pi Ltd"
1515
VALUE "FileDescription", "Raspberry Pi Imager"
16+
VALUE "FileVersion", "@IMAGER_VERSION_STR@"
17+
VALUE "ProductVersion", "@IMAGER_VERSION_STR@"
1618
}
1719
}
1820
BLOCK "VarFileInfo"
1921
{
2022
VALUE "Translation", 0x409, 1252
2123
}
2224
}
25+

0 commit comments

Comments
 (0)