I have a project that I am using cmake to help build. The suppose the project is in /home/proj and the build directory is in /home/proj-build
The /home/proj directory is a git repository with some tags, and I would like to incorporate the most recent tag into the code when it gets built so that the binary knows what version it is.
In my CMakeLists.txt file I have the following stanza in the setup portion:
set(CMAKE_BUILD_TYPE None)
message(${CMAKE_CURRENT_SOURCE_DIR})
execute_process(COMMAND cd ${CMAKE_CURRENT_SOURCE_DIR} && exec git describe --abbrev=0 --always OUTPUT_VARIABLE GIT_VERSION)
message("${GIT_VERSION}")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D__GIT_VERSION=\\\"${GIT_VERSION}\\\"")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D__GIT_VERSION=\\\"${GIT_VERSION}\\\"")
The problem is that the compound command in the execute_process apparently returns an empty string for the version. I have to somehow run the git describe command from inside the repository directory, but it is distinct from the build directory where the code is getting made.
How can I get the make process to execute the appropriate git command in the appropriate directory, even when envoked from the build directory? Also, how can I get cmake to get the output from a compound command as I would normally expect in the shell?
Things I've tried
I've tried to surround the compound command with parentheses as suggested here in order to run the command in a sub-shell, but the output does not seem to be returned to the parent shell.
This link suggests that execute_process can be run with several COMMAND invocations, but it seems the stdout from the first is piped to stdin of the next, so that won't produce the desired result.
I also tried explicitly envoking the shell using sh -c inside the execute_process structure. I'm not sure I fully understood the results of this attempt but I could not get the ' I would need in this situation to escape properly inside the execute_process.