Hi Daniel

I just wanted to let you know that I was planing to bring a git versioning 
script upstream soon.
It is based on the following sequence of commands: 
https://github.com/bufferoverflow/proxyme/blob/master/CMakeLists.txt#L5

It tries to generate a version string of the following form: {git-tag} 
({git-hash}-{dirty}).

It will try to do the best possible to figure out the tag:
-    If on a valid tag: v1.1.0 (f567657)
-    If no tag but clean workdir: undefined (f567657)
-    If not tag and working tree with uncommited changes: undefined 
(f567657-dirty)

This -dirty convention is the same as used by u-boot and the linux kernel.
Maybe you can incorperate these ideas into your solution too.

Regards
Pascal

Am 05.10.2015 um 12:50 schrieb Daniel Wirtz:
> Hey all,
>
> thanks for the feedback, i've included most of it.
>
> Regarding the configure/build issue: that indeed is inconvenient and may 
> cause irritation. on the other side, if there has been git activity fussing 
> with any source files affecting the build, cmake will run again and hence 
> capture the possibly new git info. so the case where you change the revision 
> after configure to an extent where cmake will not automatically re-run is 
> uncommon, at least for my guessing.
> however, i've included an explicit warning in the docs to raise awareness.
>
> i'm happy to provide a suitable procedure that is flexible enough; providing 
> scripts that configure files (like with sprokit) seems too specific as people 
> might want to have a single "config.h" file or so containing more than just 
> the git info.
> i've thought about the possibility to generate an explicit "git_version.h" 
> file to include, but that 1) restricts possible languages and 2) will require 
> an extra build target that is run each build etc. any thoughts?
>
> Daniel
>
> Signed-off-by: Daniel Wirtz <[email protected]>
> ---
>  Modules/FindGit.cmake | 145 
> +++++++++++++++++++++++++++++++++++++++++++++++---
>  1 file changed, 138 insertions(+), 7 deletions(-)
>
> diff --git a/Modules/FindGit.cmake b/Modules/FindGit.cmake
> index b4f7b4b..e8a86f5 100644
> --- a/Modules/FindGit.cmake
> +++ b/Modules/FindGit.cmake
> @@ -2,28 +2,75 @@
>  # FindGit
>  # -------
>  #
> +# This module helps finding a local Git_ installation and provides 
> convenience functions for common Git queries.
>  #
> +# .. _Git: http://git-scm.com/
>  #
> -# The module defines the following variables:
> +# Defined variables
> +# """""""""""""""""
>  #
> -# ::
> +# :variable:`GIT_EXECUTABLE`
> +#    Path to Git_ command line client
> +# :variable:`GIT_FOUND`
> +#    True if the Git_ command line client was found
> +# :variable:`GIT_VERSION_STRING`
> +#    The version of Git_ found (since CMake 2.8.8)
> +#
> +# Defined functions
> +# """""""""""""""""
> +#
> +# For convenience, the module provides the additional functions
> +#
> +# :command:`git_get_revision`
> +#     Get commit revision number information. +#
> +# :command:`git_get_branch` +#     Get current branch information.
>  #
> -#    GIT_EXECUTABLE - path to git command line client
> -#    GIT_FOUND - true if the command line client was found
> -#    GIT_VERSION_STRING - the version of git found (since CMake 2.8.8)
> +# **WARNING**
>  #
> -# Example usage:
> +# If you use those functions at *configure* time and checkout a different 
> Git_ revision after running :manual:`cmake(1)`,
> +# the information from :command:`git_get_revision` or 
> :command:`git_get_branch` will be outdated.
> +# If you need to be sure, we recommend using :command:`add_custom_command` 
> or :command:`add_custom_target` in conjunction with
> +# the :manual:`cmake(1)` script mode (:code:`-P`) to ensure the Git_ 
> information is obtained at *build* time.  +# +#
> +# Example usage
> +# """""""""""""
>  #
>  # ::
>  #
>  #    find_package(Git)
>  #    if(GIT_FOUND)
>  #      message("git found: ${GIT_EXECUTABLE}")
> +#      git_get_branch(GITBRANCH)
> +#      message("current branch at ${CMAKE_CURRENT_SOURCE_DIR}: ${GITBRANCH}")
>  #    endif()
> +#
> +# Details
> +# """""""
> +#
> +# .. variable:: GIT_EXECUTABLE
> +#
> +#    Returns the full path to the Git_ executable to use in e.g. 
> :command:`add_custom_command` like
> +#
> +# ::
> +#
> +#        add_custom_command(COMMAND ${GIT_EXECUTABLE} clone 
> https://github.com/myrepo mydir)
> +#    +# .. variable:: GIT_FOUND
> +#
> +#    Boolean variable set to TRUE if a local Git_ was found, FALSE else.
> +# +# .. variable:: GIT_VERSION_STRING
> +#
> +#    The output of :code:`git --version`
> +
>
> #=============================================================================
>  # Copyright 2010 Kitware, Inc.
>  # Copyright 2012 Rolf Eike Beer <[email protected]>
> +# Copyright 2015 Daniel Wirtz <[email protected]>
>  #
>  # Distributed under the OSI-approved BSD License (the "License");
>  # see accompanying file Copyright.txt for details.
> @@ -73,7 +120,91 @@ endif()
>  # Handle the QUIETLY and REQUIRED arguments and set GIT_FOUND to TRUE if
>  # all listed variables are TRUE
>  -include(${CMAKE_CURRENT_LIST_DIR}/FindPackageHandleStandardArgs.cmake)
> +include(FindPackageHandleStandardArgs)
>  find_package_handle_standard_args(Git
>                                    REQUIRED_VARS GIT_EXECUTABLE
>                                    VERSION_VAR GIT_VERSION_STRING)
> +
> +# Convenience Git repo & branch information functions
> +
> +#.rst:
> +# .. command:: git_get_revision
> +#
> +# ::
> +#
> +#     git_get_revision(VARNAME
> +#        [SHORT]
> +#        [GIT_OPTIONS] <string>
> +#        [WORKING_DIRECTORY] <directory>)
> +#
> +# Obtain Git_ revision information using the rev-parse_ command. Effectively 
> calls :code:`rev-parse [GIT_OPTIONS] --verify -q HEAD`.
> +#
> +# ``VARNAME``
> +#    The workspace variable name to assign the result to.
> +#
> +# ``SHORT``
> +#    Optional. If set to TRUE, the short revision string will be returned. 
> Otherwise, the full revision hash is returned.
> +#
> +# ``GIT_OPTIONS``
> +#    Optional. Specify a string like :code:`"--sq"` to add to the options of 
> the rev-parse_ command.
> +#
> +# .. _rev-parse: 
> https://www.kernel.org/pub/software/scm/git/docs/git-rev-parse.html
> +#
> +# ``WORKING_DIRECTORY``
> +#   The working directory at which to execute the git commands.
> +#   If not specified, :variable:`CMAKE_CURRENT_SOURCE_DIR` is assumed. 
> +function(git_get_revision VARNAME)
> +    if (NOT GIT_FOUND)
> +        message(FATAL_ERROR "Cannot use git_get_revision: Git was not 
> found.")
> +    endif()
> +    +    cmake_parse_arguments(GIT "SHORT" "WORKING_DIRECTORY;GIT_OPTIONS" 
> "" ${ARGN})
> +    +    if(NOT GIT_WORKING_DIRECTORY OR "${GIT_WORKING_DIRECTORY}" STREQUAL 
> "")
> +        set(GIT_WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
> +    endif()
> +    execute_process(COMMAND ${GIT_EXECUTABLE} rev-parse ${GIT_OPTIONS} 
> --verify -q HEAD
> +        OUTPUT_VARIABLE RES
> +        ERROR_VARIABLE ERR
> +        OUTPUT_STRIP_TRAILING_WHITESPACE
> +        WORKING_DIRECTORY ${GIT_WORKING_DIRECTORY})
> +    set(${VARNAME} ${RES} PARENT_SCOPE)
> +    if (ERR)
> +        message(WARNING "Issuing Git command '${GIT_EXECUTABLE} rev-parse 
> --verify -q HEAD' failed: ${ERR}")
> +    endif()
> +endfunction()
> +
> +#.rst:
> +# .. command:: git_get_branch
> +#
> +# ::
> +#
> +#     git_get_branch(VARNAME
> +#        [WORKING_DIRECTORY] <directory>)
> +#
> +# ``VARNAME``
> +#    The workspace variable name to assign the result to.
> +#
> +# ``WORKING_DIRECTORY``
> +#   The working directory at which to execute the git commands.
> +#   If not specified, :variable:`CMAKE_CURRENT_SOURCE_DIR` is assumed.
> +function(git_get_branch VARNAME)
> +    if (NOT GIT_FOUND)
> +        message(FATAL_ERROR "Cannot use git_get_branch: Git was not found.")
> +    endif()
> +    +    cmake_parse_arguments(GIT "" "WORKING_DIRECTORY" "" ${ARGN})
> +
> +    if(NOT GIT_WORKING_DIRECTORY OR "${GIT_WORKING_DIRECTORY}" STREQUAL "")
> +        set(GIT_WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
> +    endif()
> +    execute_process(COMMAND ${GIT_EXECUTABLE} symbolic-ref -q HEAD
> +        OUTPUT_VARIABLE RES
> +        ERROR_VARIABLE ERR
> +        OUTPUT_STRIP_TRAILING_WHITESPACE
> +        WORKING_DIRECTORY ${GIT_WORKING_DIRECTORY})
> +    if (ERR)
> +        message(WARNING "Issuing Git command '${GIT_EXECUTABLE} symbolic-ref 
> -q HEAD' failed: ${ERR}")
> +    endif()
> +    set(${VARNAME} ${RES} PARENT_SCOPE)
> +endfunction()
> \ No newline at end of file

-- 

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:
http://public.kitware.com/mailman/listinfo/cmake-developers

Reply via email to