cancel
Showing results for 
Search instead for 
Did you mean: 

Artifact Filename based on a Fw costant

MPast.1
Senior II

Hi All,

I need to obtain an artifact with the name present in some costant in "main.h".

In other words, my project is called "TestProject" and main.h I have these costants:

#define GUI_MAJOR_VER 		0		// Major
#define GUI_MINOR_VER 		1		// Minor
#define GUI_RELEASE_VER 	3		// Release

I would like to ahve a final executable named "TestProject v013.hex"

This means that every time I will change the #defines in main.h, output file will change automatically with a new numeration.

Does someone has some suggestion? or better, an example?

thanks in advance for your help.

 

 

12 REPLIES 12
Pavel A.
Evangelist III

Do not compile version.c with the application. It is not a correct C and cannot not compile to object file. Only preprocess. Better rename it to "version.h".

The "gcc" here should be the arm-none-eabi-gcc , the same compiler used for  STM32. The sed here is hidden in the "sh" so the whole command better should be wrapped in a script file, executed with "sh".  Unless there is other gcc and sed in the path (unlikely on Windows).

On Windows, Powershell can be used as well.

More help with scripting, shell and general software topics can be found here.

 

I don't understand nothing.

The arcifact name doesn't change: Tomorrow morning I will try one more times.

I found a solution.

This is based on git "bash.exe" command. The follow instructions show you how I obtaine my scope in only few steps. For first I create a sh script calles "FW_version.sh", and I placed on the project root:

MPast1_0-1743860222556.png

the content of "FW_version.sh" is the follow:.

#!/bin/bash

export LC_ALL=en_US.UTF-8

# Path to the config.h file
HEADER_FILE="Core/Inc/main.h"

# Path to the build output
BUILD_DIR="Debug"  # or "Release", depending on your build configuration
OUTPUT_FILE="${BUILD_DIR}/TestProject.hex"  # Adjust to match your output artifact

# Extract the GUI_MAJOR_VER, GUI_MINOR_VER, and GUI_LETTER_VER values
echo "Extracting GUI_MAJOR_VER..."
VERSION_MAJOR=$(grep -oP 'GUI_MAJOR_VER \s*\K\d+' "$HEADER_FILE")
echo "Extracted GUI_MAJOR_VER: $VERSION_MAJOR"

echo "Extracting GUI_MINOR_VER..."
VERSION_MINOR=$(grep -oP 'GUI_MINOR_VER \s*\K\d+' "$HEADER_FILE")
echo "Extracted GUI_MINOR_VER: $VERSION_MINOR"

echo "Extracting GUI_LETTER_VER..."
VERSION_LETTER=$(grep -oP 'GUI_LETTER_VER \s*\K\d+' "$HEADER_FILE")
echo "Extracted GUI_LETTER_VER: $VERSION_LETTER"


# Check if all version values were found
if [ -z "$VERSION_MAJOR" ] || [ -z "$VERSION_MINOR" ] || [ -z "$VERSION_LETTER" ]; then
    echo "Error: One or more version constants not found in $HEADER_FILE"
    exit 1
fi

# Construct the full version string (e.g., v_1.23)
VERSION="${VERSION_MAJOR}_${VERSION_MINOR}${VERSION_LETTER}"


# Define the new artifact name based on the extracted version
ARTIFACT_NAME="${BUILD_DIR}/TestProject_v${VERSION}.hex"

# Rename the generated firmware (I.E. firmware.hex -> firmware_0.13.hex)
if [ -f "${BUILD_DIR}/TestProject.hex" ]; then
    mv "$OUTPUT_FILE" "$ARTIFACT_NAME"
    echo "Firmware renamed to: $ARTIFACT_NAME"
else
    echo "Error: Compiled FW not found"
    exit 1
fi

Second step is to create a new builder and inserting it into the project:

MPast1_1-1743860340376.png

So, right click on the project, properties --> Builders --> New.

Compile the step 1,2 ,3 with your preference:

"1" is the "bash.exe" program present on GIT folders

"2" is your project folder

"3" is the script locations (I.E. = ${workspace_loc:/TestProject/FW_version.sh}  )  [pay attention to the syntax]

MPast1_2-1743860470758.png

Last step is compile your post-build command with : ${workspace_loc:/TestProject/.externalToolBuilders/RenameArtifact} [pay attention to the syntax]

MPast1_3-1743860705334.png

if everything works correctly, when you compile your code you will obtain the following result:

MPast1_4-1743860788892.png

(in my case I used the script on the debug configuration. if you need, change it to release or something else configuration).