Problem Description
I would like to use metadata, like the result of git describe
, in the *OUTPUT_DIRECTORY_<CONFIG>
variables.
I am already using metadata, which is constant and can therefore be added in the configuration/generation phase, like the compiler name and version, target architecture, which I will not change from build to build.
I could also already include some dynamic metadata using generator expressions, like the configuration in use (DEBUG
, RELEASE
, etc.), which is known only during the build phase for multi-config generators, like Visual Studio.
So I currently have folders which like are named like that:
project_name-msvc142-amd64-@GIT_DESCRIBE_INFORMATION@-relwithdebinfo
project_name-msvc142-amd64-@GIT_DESCRIBE_INFORMATION@-release
project_name-msvc142-amd64-@GIT_DESCRIBE_INFORMATION@-minsizerel
project_name-msvc142-amd64-@GIT_DESCRIBE_INFORMATION@-debug
whereas I want them to look like that:
project_name-msvc142-amd64-v1.0.0.0-228-g183eb9c2-relwithdebinfo
project_name-msvc142-amd64-v1.0.0.0-228-g183eb9c2-release
project_name-msvc142-amd64-v1.0.0.0-228-g183eb9c2-minsizerel
project_name-msvc142-amd64-v1.0.0.0-228-g183eb9c2-debug
and after I e.g. commit my code, I do not want to reconfigure the CMake project, but new folders with names like these should be generated:
project_name-msvc142-amd64-v1.0.0.0-229-gfbb9c704-relwithdebinfo
project_name-msvc142-amd64-v1.0.0.0-229-gfbb9c704-release
project_name-msvc142-amd64-v1.0.0.0-229-gfbb9c704-minsizerel
project_name-msvc142-amd64-v1.0.0.0-229-gfbb9c704-debug
Failed “Solutions”
I thought about adding a post-build-target
, which would run after any of my targets ran and would get the git describe
information and substitute the placeholder accordingly.
One of the problems is about how to define a post-build-target like that. I have a pre-build-target, which generates an INFORMATION.md
file with this git metadata, including the history of the last 20 commits, etc. and it was easy to have it build before ANY other target was build, by simply adding it as a dependency to every other target.
But the opposite for the post-build target would not work, i.e. when adding every other target as a dependency of the post-build-target I would always have to build everything.
A second problem could be that if I do not e.g. commit my code from one to the next build, the git describe
tag stays the same and in that case the target folder already exists (from a previous build) and renaming the temporary folder name to the final one could cause a conflict.
On the other hand maybe the two folders would be merged?!
Workaround
The consequence is that I am getting the git describe
information during the configure/generate phase. Whenever I commit code, I manually reconfigure my CMake project to update the ${GIT_DESCRIBE_INFORMATION} variable.
Ideas
Does anyone have an idea how I could manage this problem?