2025-03-27 3:08 PM - last edited on 2025-03-28 12:37 PM by mƎALLEm
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.
Solved! Go to Solution.
2025-04-05 6:52 AM
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:
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:
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]
Last step is compile your post-build command with : ${workspace_loc:/TestProject/.externalToolBuilders/RenameArtifact} [pay attention to the syntax]
if everything works correctly, when you compile your code you will obtain the following result:
(in my case I used the script on the debug configuration. if you need, change it to release or something else configuration).
2025-03-27 3:24 PM
Sure, you can do this in post-build action: Extract the version numbers from the .h file, then copy or rename the hex file.
Post-build action can be a "unix" shell script (sh is provided in the CubeIDE environment) so we don't have to **** with ******* bat files.
2025-03-28 1:00 AM
HI @Pavel A. ,
thanks for suggestion but I should want a practical example to copy the various instructions.
you told about ready scripts on CubeIDE: can you sueggest to me the folder?
Do I need to search for *.bat files? or on makefiles?
thanks.
2025-03-28 8:19 AM - edited 2025-03-28 8:20 AM
Apologies for been not clear enough. There are no ready examples of such scripts. I only said that we can use the normal "unix" shell tool, even on Windows. Which is easier than dreadful bat files.
The post-build command goes into the project settings:
As you see, CubeIDE variables can be used in the commands, with ${...} syntax.
2025-03-28 9:25 AM
Ok, now I understood that I need to use post-build section on project settings.
My problem is that I don't know the syntax that I must insert on the command string.
For example How can extract values form main.h? and, How can I compose a new filename?
in other words, this is my first time for this problem and I need a reference guide/example to learn the various command to be autonomous.
Do you kwnow same link for the references?
Thanks
2025-03-28 11:34 AM
Hmm. Extracting version numbers from the .h file can be done with "awk" for example. Perhaps ask the AI ? ))
2025-03-28 11:49 AM
You could also just write a native command line application.
One that could take the file name as a command line parameter, use fopen(), fseek(), ftell(), fread() etc, like a C coder, do file manipulation and naming there.
I'm not sure you'd be able to fish out the source files, but the .BIN you could go search the binary for a tag where you embedded this data. Or perhaps parse the .ELF and pull things out of that as symbols, or pre-processor MACROs
2025-03-28 1:09 PM - edited 2025-03-29 11:35 AM
To get the version as string: make a small C file, for example ver.c ver.h [edited - use .h suffix so that Eclipse won't add it to the project as a source file]
#include "main.h"
#define STRINGIFY(w) #w
#define MAKEVERS(x, y, z) STRINGIFY(x) "." STRINGIFY(y) "." STRINGIFY(z)
MAKEVERS(GUI_MAJOR_VER, GUI_MINOR_VER, GUI_RELEASE_VER)
Then preprocess this file and filter junk out:
gcc -E -P ver.h | sed '/^[ \t]*$/d; s/[ \t\"]//g'
Here you get the version suffix string, like "0.1.3"
2025-03-28 2:15 PM - edited 2025-03-28 2:45 PM
hi @Pavel A. ,
I create "version.c"
I inserted these in pre-build:
And I obtain an error:
But I'm in trouble with the compiler in use:
trying to put on post-build command
I get this error:
2025-03-28 3:04 PM
Hi @Pavel A. ,
maybe I have done a little bit of confusion.
After reading for 100 times your original message, maybe I understood the right steps to do :
right click on "version.c" -> proprieties -->settings --> build Steps..
In this way everything is compiling without any error, but Output file has still the project name.