| |
|
|
| |
|
|
| |
| |
|
|
| |
| |
| |
| |
| |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| |
| |
| |
|
|
| cmake_minimum_required(VERSION 3.15) |
|
|
| |
| |
| |
|
|
|
|
| |
| .. command:: write_version_header |
|
|
| Write a file named revision.hpp containing version info:: |
|
|
| write_version_header(<destdir> |
| [FILE_NAME <file-name>] |
| [LIB_NAME <library-name>] |
| ) |
| |
| This command will generate the code to write a file name |
| revision.hpp in the directory ``<destdir>``. |
| |
| ``FILE_NAME`` |
| Specify the name of the file to create, default is ``revision.hpp``. |
|
|
| ``LIB_NAME`` |
| Specify the library name which will be used as a prefix part for the |
| variables contained in the revision file. |
| |
|
|
| |
| |
| get_filename_component(_current_cmake_module_dir ${CMAKE_CURRENT_LIST_FILE} PATH) |
|
|
| |
| function(_get_git_dir _start_dir _variable) |
|
|
| set(cur_dir "${_start_dir}") |
| set(git_dir "${_start_dir}/.git") |
|
|
| while(NOT EXISTS "${git_dir}") |
| |
| set(prev_dir "${cur_dir}") |
| get_filename_component(cur_dir "${cur_dir}" DIRECTORY) |
| if(cur_dir STREQUAL prev_dir OR cur_dir STREQUAL ${_start_dir}) |
| |
| |
| set(${_variable} "" PARENT_SCOPE) |
| return() |
| endif() |
| set(git_dir "${cur_dir}/.git") |
| endwhile() |
|
|
| set(${_variable} "${git_dir}" PARENT_SCOPE) |
| endfunction() |
|
|
| |
| |
| |
| |
| function(_get_git_hash _data_dir _variable) |
|
|
| |
| set(_variable "" PARENT_SCOPE) |
|
|
| |
| if(NOT GIT_FOUND) |
| find_package(Git QUIET) |
| endif() |
|
|
| |
| if(NOT GIT_FOUND) |
| return() |
| endif() |
|
|
| |
| _get_git_dir(${CMAKE_CURRENT_SOURCE_DIR} GIT_DIR) |
|
|
| |
| if("${GIT_DIR}" STREQUAL "") |
| return() |
| endif() |
|
|
| |
| |
| |
| if(IS_DIRECTORY ${GIT_DIR}) |
| set(HEAD_SOURCE_FILE "${GIT_DIR}/HEAD") |
| else() |
| |
| |
| |
| |
| |
| execute_process( |
| COMMAND "${GIT_EXECUTABLE}" rev-parse |
| --show-superproject-working-tree |
| WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" |
| OUTPUT_VARIABLE out |
| ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE) |
| if(NOT "${out}" STREQUAL "") |
| |
| file(READ ${GIT_DIR} submodule) |
| string(REGEX REPLACE "gitdir: (.*)$" "\\1" GIT_DIR_RELATIVE |
| ${submodule}) |
| string(STRIP ${GIT_DIR_RELATIVE} GIT_DIR_RELATIVE) |
| get_filename_component(SUBMODULE_DIR ${GIT_DIR} PATH) |
| get_filename_component(GIT_DIR ${SUBMODULE_DIR}/${GIT_DIR_RELATIVE} |
| ABSOLUTE) |
| set(HEAD_SOURCE_FILE "${GIT_DIR}/HEAD") |
| else() |
| |
| file(READ ${GIT_DIR} worktree_ref) |
| |
| |
| |
| string(REGEX REPLACE "gitdir: (.*)$" "\\1" git_worktree_dir |
| ${worktree_ref}) |
| string(STRIP ${git_worktree_dir} git_worktree_dir) |
| _get_git_dir("${git_worktree_dir}" GIT_DIR) |
| set(HEAD_SOURCE_FILE "${git_worktree_dir}/HEAD") |
| endif() |
| endif() |
|
|
| |
| if(NOT EXISTS "${HEAD_SOURCE_FILE}") |
| return() |
| endif() |
|
|
| |
| set(HEAD_FILE "${_data_dir}/HEAD") |
| configure_file("${HEAD_SOURCE_FILE}" "${HEAD_FILE}" COPYONLY) |
|
|
| |
| |
| file(WRITE "${_data_dir}/grab-ref.cmake.in" [[ |
| set(HEAD_HASH) |
|
|
| file(READ "@HEAD_FILE@" HEAD_CONTENTS LIMIT 1024) |
|
|
| string(STRIP "${HEAD_CONTENTS}" HEAD_CONTENTS) |
| if(HEAD_CONTENTS MATCHES "ref") |
| |
| string(REPLACE "ref: " "" HEAD_REF "${HEAD_CONTENTS}") |
| if(EXISTS "@GIT_DIR@/${HEAD_REF}") |
| configure_file("@GIT_DIR@/${HEAD_REF}" "@VERSION_STRING_DATA@/head-ref" COPYONLY) |
| else() |
| configure_file("@GIT_DIR@/packed-refs" "@VERSION_STRING_DATA@/packed-refs" COPYONLY) |
| file(READ "@VERSION_STRING_DATA@/packed-refs" PACKED_REFS) |
| if(${PACKED_REFS} MATCHES "([0-9a-z]*) ${HEAD_REF}") |
| set(HEAD_HASH "${CMAKE_MATCH_1}") |
| endif() |
| endif() |
| else() |
| |
| configure_file("@GIT_DIR@/HEAD" "@VERSION_STRING_DATA@/head-ref" COPYONLY) |
| endif() |
|
|
| if(NOT HEAD_HASH) |
| file(READ "@VERSION_STRING_DATA@/head-ref" HEAD_HASH LIMIT 1024) |
| string(STRIP "${HEAD_HASH}" HEAD_HASH) |
| endif() |
| ]]) |
|
|
| configure_file("${VERSION_STRING_DATA}/grab-ref.cmake.in" |
| "${VERSION_STRING_DATA}/grab-ref.cmake" @ONLY) |
| |
| |
| |
| include("${VERSION_STRING_DATA}/grab-ref.cmake") |
|
|
| set(${_variable} "${HEAD_HASH}" PARENT_SCOPE) |
| endfunction() |
|
|
| |
| function(write_version_header dir) |
|
|
| set(flags ) |
| set(options LIB_NAME FILE_NAME) |
| set(sources ) |
| cmake_parse_arguments(VERSION_STRING_OPTION "${flags}" "${options}" "${sources}" ${ARGN}) |
|
|
| |
| if(NOT IS_DIRECTORY ${dir}) |
| message(FATAL_ERROR "First parameter to write_version_header should be a directory where the final revision.hpp file will be placed") |
| endif() |
|
|
| if(VERSION_STRING_OPTION_FILE_NAME) |
| set(file_name "${VERSION_STRING_OPTION_FILE_NAME}") |
| else() |
| set(file_name "revision.hpp") |
| endif() |
|
|
| |
| set(VERSION_STRING_DATA "${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/VersionString") |
| if(NOT EXISTS "${VERSION_STRING_DATA}") |
| file(MAKE_DIRECTORY "${VERSION_STRING_DATA}") |
| endif() |
|
|
| |
| _get_git_hash("${VERSION_STRING_DATA}" GIT_HASH) |
|
|
| |
| if(GIT_HASH) |
| execute_process( |
| COMMAND "${GIT_EXECUTABLE}" describe --dirty --match=build |
| WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" |
| RESULT_VARIABLE res |
| OUTPUT_VARIABLE out |
| ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE) |
|
|
| if(res EQUAL 0) |
| set(REVISION_STRING "${out}") |
| else() |
| message(STATUS "Git hash not found, does this project has a 'build' tag?") |
| endif() |
| else() |
| message(STATUS "Git hash not found") |
| endif() |
|
|
| |
| if(REVISION_STRING MATCHES "build-([0-9]+)-g([0-9a-f]+)(-dirty)?") |
| set(BUILD_NUMBER ${CMAKE_MATCH_1}) |
| if(CMAKE_MATCH_3) |
| set(REVISION_GIT_TAGREF "${CMAKE_MATCH_2}*") |
| else() |
| set(REVISION_GIT_TAGREF "${CMAKE_MATCH_2}") |
| endif() |
|
|
| string(TIMESTAMP REVISION_DATE_TIME "%Y-%m-%dT%H:%M:%SZ" UTC) |
| else() |
| set(REVISION_GIT_TAGREF "") |
| set(BUILD_NUMBER 0) |
| set(REVISION_DATE_TIME "") |
| endif() |
|
|
| if(VERSION_STRING_OPTION_LIB_NAME) |
| set(VAR_PREFIX "${VERSION_STRING_OPTION_LIB_NAME}") |
| set(IDENT_PREFIX "${VERSION_STRING_OPTION_LIB_NAME}_") |
| set(BOOL_IS_MAIN "false") |
| else() |
| set(VAR_PREFIX "") |
| set(IDENT_PREFIX "") |
| set(BOOL_IS_MAIN "true") |
| endif() |
|
|
| configure_file("${_current_cmake_module_dir}/revision.hpp.in" "${dir}/${file_name}" @ONLY) |
| endfunction() |
|
|
|
|