I once used m4 to create a C ++ header file from a text file containing a simple version string (MAJOR.MINOR.MICRO-STATUS) and information from a disruptive program for a Windows Visual Studio project.
m4 was the smallest macro moderator that I could easily implement and use for this particular purpose.
It looked like this:
#ifndef __VERSION_H__ #define __VERSION_H__ divert(-1) define(`CPP_DEFINE', `#define $1 $2') define(`VERSION', include(`version.txt')) define(`MY_SOFTWARE_MAJOR', regexp(VERSION, `\([0-9]+\)\.[0-9]+\.[0-9]+', `\1')) define(`MY_SOFTWARE_MINOR', regexp(VERSION, `[0-9]+\.\([0-9]\)+\.[0-9]+', `\1')) define(`MY_SOFTWARE_MICRO', regexp(VERSION, `[0-9]+\.[0-9]+\.\([0-9]\)+', `\1')) define(`MY_SOFTWARE_STATUS', regexp(VERSION, `\(-\w+\)', `\1')) define(`SVN_REV', `regexp(esyscmd(svnversion -n), `[0-9]+', `\&')') ifelse(len(SVN_REV), 0, `define(`NO_SVN')') divert CPP_DEFINE(MY_SOFTWARE_VERSION, format(`"%s.%s.%s"', MY_SOFTWARE_MAJOR, MY_SOFTWARE_MINOR, MY_SOFTWARE_MICRO)) CPP_DEFINE(PRODUCT_VERSION, format(`"%s.%s.%s%s"', MY_SOFTWARE_MAJOR, MY_SOFTWARE_MINOR, MY_SOFTWARE_MICRO, MY_SOFTWARE_STATUS)) CPP_DEFINE(COPYRIGHT_NOTICE, `"Copyright (C) 2008 - Me"') ifdef(`NO_SVN', ` CPP_DEFINE(ABOUT_VERSION, format(`"My Software Version %s.%s.%s%s"', MY_SOFTWARE_MAJOR, MY_SOFTWARE_MINOR, MY_SOFTWARE_MICRO, MY_SOFTWARE_STATUS)) CPP_DEFINE(FILE_VERSION, format(`"%s.%s.%s"', MY_SOFTWARE_MAJOR, MY_SOFTWARE_MINOR, MY_SOFTWARE_MICRO)) CPP_DEFINE(INFO_VERSION, format(``%s,%s,%s,0'', MY_SOFTWARE_MAJOR, MY_SOFTWARE_MINOR, MY_SOFTWARE_MICRO)) ', ` CPP_DEFINE(ABOUT_VERSION, format(`"My Software Version %s.%s.%s.%s%s"', MY_SOFTWARE_MAJOR, MY_SOFTWARE_MINOR, MY_SOFTWARE_MICRO, SVN_REV, MY_SOFTWARE_STATUS)) CPP_DEFINE(FILE_VERSION, format(`"%s.%s.%s.%s"', MY_SOFTWARE_MAJOR, MY_SOFTWARE_MINOR, MY_SOFTWARE_MICRO, SVN_REV)) CPP_DEFINE(INFO_VERSION, format(``%s,%s,%s,%s'', MY_SOFTWARE_MAJOR, MY_SOFTWARE_MINOR, MY_SOFTWARE_MICRO, SVN_REV)) ') #endif /* __VERSION_H__ */
Despite the fact that it worked perfectly, it was really an experiment that I did not repeat, mainly because now I prefer to use the built-in CMake features to directly manage this material and create Visual Studio project files.