[CMake] Putting the git commit hash in a cmake variable

Isaiah Norton isaiah.norton at gmail.com
Wed Oct 10 21:43:58 EDT 2018


Similar question with some suggestions in response:

https://cmake.org/pipermail/cmake/2018-July/067887.html

Best,
Isaiah

On Wed, Oct 10, 2018 at 5:05 PM Matt Schulte <schultetwin1 at gmail.com> wrote:

> Hi all,
>
> I'd like to set a CMake variable to the current git commit short hash.
> This variable will be used as part of the version string for my
> project (ex: "1.0.1+git.${SHORT_HASH}"). I can get at this short hash
> by using execute_process and setting the resulting output to a
> variable.
>
> ```cmake
> execute_process(
>     COMMAND
>         git rev-parse --short HEAD
>     RESULT_VARIABLE
>         SHORT_HASH_RESULT
>     OUTPUT_VARIABLE
>         SHORT_HASH)
> ```
>
> My issue is that cmake will only run execute_process once, during the
> configure step. I need cmake to run this execute_process on every
> build and, if the output has changed, reconfigure to make sure
> SHORT_HASH is up to date.
>
> I came up with one solution to this issue: During the configure step,
> I can write the current short hash to a file named short_hash.txt. On
> every build, I'll re-compute the short hash and verify that the
> computed short hash is the same as what is in short_hash.txt. If its
> not, I'll write the new short hash to short_hash.txt. I then make
> short_hash.txt an input to configure_file. This will cause cmake to
> validate SHORT_HASH is properly set, and re-configure if its not.
>
> ```cmake
> execute_process(
>     COMMAND
>         git rev-parse --short HEAD
>     RESULT_VARIABLE
>         SHORT_HASH_RESULT
>     OUTPUT_VARIABLE
>         SHORT_HASH)
>
> # If running in script mode (this runs on every build)
> if (CMAKE_SCRIPT_MODE_FILE)
>     if (EXISTS "${SHORT_HASH_FILE}")
>         file(READ ${SHORT_HASH_FILE} READ_IN_SHORT_HASH)
>     else()
>         set(READ_IN_SHORT_HASH "")
>     endif()
>
>     if (NOT ("${READ_IN_SHORT_HASH}" STREQUAL "${SHORT_HASH}"))
>         message(STATUS "Short hash is out of date")
>         # This will update short_hash.txt, causing cmake to reconfigure
>         file(WRITE ${SHORT_HASH_FILE} ${SHORT_HASH})
>     endif()
>
> # Else running as part of cmake configure
> else()
>     set(SHORT_HASH_FILE ${CMAKE_CURRENT_BINARY_DIR}/short_hash.txt)
>     file(WRITE ${SHORT_HASH_FILE} ${SHORT_HASH})
>
>     # The trick here is to make sure short_hash.txt is listed as a
> byproduct
>     add_custom_target(
>         git_short_hash
>         BYPRODUCTS
>             ${SHORT_HASH_FILE}
>         COMMAND
>             ${CMAKE_COMMAND}
>             "-DSHORT_HASH_FILE=${SHORT_HASH_FILE}"
>             "-P" "${CMAKE_CURRENT_LIST_FILE}"
>         COMMENT
>             "Re-checking short hash..."
>         VERBATIM
>         USES_TERMINAL)
>
>     # This configure_file makes cmake reconfigure dependent on
> short_hash.txt
>     configure_file(${SHORT_HASH_FILE} ${SHORT_HASH_FILE}.junk COPYONLY)
>
>     message(STATUS "Short Hash: ${SHORT_HASH}")
> endif()
> ```
>
> This works great with cmake 3.12 and ninja 1.8.2! (I was really happy
> with how well it worked. I tip my hat to the cmake developers for
> this). However, it doesn't work with Makefiles, and causes ninja 1.7.2
> to get stuck in an infinite loop. On CMake 3.10 this will cause ninja
> 1.8.2 to generate a warning about a loop.
>
> Has anyone run into this issue before and have a better solution? Or
> is trying to execute a command before cmake checks if it should
> reconfigure a hack that should never be done?
>
> Thanks for the help!
> Matt
> --
>
> Powered by www.kitware.com
>
> Please keep messages on-topic and check the CMake FAQ at:
> http://www.cmake.org/Wiki/CMake_FAQ
>
> Kitware offers various services to support the CMake community. For more
> information on each offering, please visit:
>
> CMake Support: http://cmake.org/cmake/help/support.html
> CMake Consulting: http://cmake.org/cmake/help/consulting.html
> CMake Training Courses: http://cmake.org/cmake/help/training.html
>
> Visit other Kitware open-source projects at
> http://www.kitware.com/opensource/opensource.html
>
> Follow this link to subscribe/unsubscribe:
> https://cmake.org/mailman/listinfo/cmake
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://cmake.org/pipermail/cmake/attachments/20181010/74a7d61d/attachment-0001.html>


More information about the CMake mailing list