Skip to main content
FMass.1
Associate III
April 19, 2024
Solved

C-MACRO in Pre-Build script

  • April 19, 2024
  • 4 replies
  • 3577 views

Hi, for my STM32CubeIDE projects it would be convenient to have a macro whose value increases every time I compile the project; As if it were a counter of the times I pressed the build button, to be used as an ID to identify the specific build.
For example, in my code I would like to put a printf at the beginning that prints this number to understand which build the executable being executed belongs to.

On other IDEs there is a way to make a kind of pre-build script that is executed before compiling the project, the question is: is it possible to write a pre-build script also in STM32CubeIDE? If yes, how? In what programming language? Can I read and write C-MACROs from these scripts?

Thanks in advance

Best answer by Pavel A.

Yes I have one example, but not with CubeIDE.

I have "version.h" with all the usual major/minor numbers. Then I made a small c file. "getversion.c" :

//getversion.c

#include "Inc\version.h"
//#define FW_VERSION_SUFFIX -beta
//#define FW_VERSION_MAJOR 5
//..... etc
// #define STRINGIFY(s) #s
//#define VERSIONIZE(x, y, z, w) STRINGIFY(x) "." STRINGIFY(y) "." STRINGIFY(z) STRINGIFY(w)

//#define MY_FW_VERSION VERSIONIZE(FW_VERSION_MAJOR, FW_VERSION_MINOR, FW_VERSION_REVISION, FW_VERSION_SUFFIX)

MY_FW_VERSION

 

Then, in the pre-build script I run the compiler on getversion.c  and get the actual version string like "5.2.0-beta":

iccarm --preprocess=ns $scripts_dir/getver.tmp $scripts_dir/getversion.c" > /dev/null

 

From that I generate various things to handle the build outputs.

But I don't modify the version automatically. Instead I edit version.h manually and assign the version number agreed with the customer.

You can use pre-build script to parse your previous version number and increment it before build.

 

4 replies

bbee
Senior
April 19, 2024

Use the Pre-build or Post-build steps in your project properties under 'C/C++ Build > Settings > Build Steps' to call any script you want. Unfortunately there is no build in feature to support build numbers.

Andrew Neil
Super User
April 19, 2024

I think that would suffer the same issue as my "timestamp":  ie, the "build number" would get updated every time you press the 'Build' button - whether or not there was anything else in the rest of the project that would have been built?

The 'Pre-build' seems to come before the evaluation of whether there is actually anything that needs building?

A complex system that works is invariably found to have evolved from a simple system that worked.A complex system designed from scratch never works and cannot be patched up to make it work.
Brian H
Senior
July 18, 2024

@Andrew Neil wrote:

I think that would suffer the same issue as my "timestamp":  ie, the "build number" would get updated every time you press the 'Build' button - whether or not there was anything else in the rest of the project that would have been built?

The 'Pre-build' seems to come before the evaluation of whether there is actually anything that needs building?


Emphasis added because this is precisely the situation I'm trying to solve.  Starting a debug session, for example, automatically triggers an incremental build (this behavior can be changed, but I want it to do that).  I don't especially want my build numbers incrementing just because I started a new debug session without changing any code.  

I see that it's possible to change the arguments passed to make; is it possible to have user modifications to the makefile that will persist across clean/build cycles?  I suspect make itself is clever enough to "do this only if you did that".

Andrew Neil
Super User
April 19, 2024

I have a timestamp.c file:

 

/* Public variables ---------------------------------------------------------*/
const char build_date[] = __DATE__;
const char build_time[] = __TIME__;

 

So those strings can be printed as required - to show when the code was built.

I use this Pre-build step to ensure that the file is always recompiled:

AndrewNeil_1-1713514435169.png

 

Slight downside with this is that the timestamp file will always be rebuilt - even if no other files have changed.

I haven't found a better way in Eclipse to specify "include in every build" - like other tools have.

 

 

 

A complex system that works is invariably found to have evolved from a simple system that worked.A complex system designed from scratch never works and cannot be patched up to make it work.
Pavel A.
Super User
April 19, 2024

You can do this in a usual "sh" or "dash" shell script. CubeIDE for Windows comes with set of common posix utilities. On Linux, OS/X you have the native bash and more.

Pre-build and post-build commands are set up per project, in the project settings.

Can I read and write C-MACROs from these scripts?

C-MACRO? if you mean, preprocessing C-like expressions with defines and includes - yes, you can run the C compiler and produce preprocessor output.

 

 

FMass.1
FMass.1Author
Associate III
April 19, 2024

@Pavel A. wrote:

C-MACRO? if you mean, preprocessing C-like expressions with defines and includes - yes, you can run the C compiler and produce preprocessor output.

 

Ok, this is exactly what I need to do, but how do I start the compiler before compiling? Do you have any examples of how to do this?

Pavel A.
Pavel A.Best answer
Super User
April 19, 2024

Yes I have one example, but not with CubeIDE.

I have "version.h" with all the usual major/minor numbers. Then I made a small c file. "getversion.c" :

//getversion.c

#include "Inc\version.h"
//#define FW_VERSION_SUFFIX -beta
//#define FW_VERSION_MAJOR 5
//..... etc
// #define STRINGIFY(s) #s
//#define VERSIONIZE(x, y, z, w) STRINGIFY(x) "." STRINGIFY(y) "." STRINGIFY(z) STRINGIFY(w)

//#define MY_FW_VERSION VERSIONIZE(FW_VERSION_MAJOR, FW_VERSION_MINOR, FW_VERSION_REVISION, FW_VERSION_SUFFIX)

MY_FW_VERSION

 

Then, in the pre-build script I run the compiler on getversion.c  and get the actual version string like "5.2.0-beta":

iccarm --preprocess=ns $scripts_dir/getver.tmp $scripts_dir/getversion.c" > /dev/null

 

From that I generate various things to handle the build outputs.

But I don't modify the version automatically. Instead I edit version.h manually and assign the version number agreed with the customer.

You can use pre-build script to parse your previous version number and increment it before build.