#[=======================================================================[.rst: myx_generate_git_info_header ---------------------------------- Вспомогательная функция для автоматической генерации заголовочного файла, содержащего информацию о текущем состоянии репозитория git:: myx_generate_git_info_header(TARGET BASE_FILENAME [ PREFIX prefix ] ) Обязательные параметры: `TARGET` - имя цели, с которой связан заголовочный файл, и `BASE_FILENAME` - имя генерируемого заголовочного файла. Дополнительный аргумент `PREFIX` добавляет префикс к генерируемым именам переменных. #]=======================================================================] include_guard(GLOBAL) function(myx_generate_git_info_header target base_filename) set(options) set(oneValueArgs PREFIX) set(multiValueArgs) cmake_parse_arguments(ARG "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) if(ARG_PREFIX) string(APPEND ARG_PREFIX "_") endif() set(filename "${PROJECT_BINARY_DIR}/include/${base_filename}") set(git_info_hpp_in "#pragma once #if defined (@ARG_PREFIX@GIT_REV) #error \"Duplicate definition of macros @ARG_PREFIX@GIT_REV\" #else #define @ARG_PREFIX@GIT_REV \"@GIT_REV@\" #endif #if defined (@ARG_PREFIX@GIT_DIFF) #error \"Duplicate definition of macros @ARG_PREFIX@GIT_DIFF\" #else #define @ARG_PREFIX@GIT_DIFF \"@GIT_DIFF@\" #endif #if defined (@ARG_PREFIX@GIT_BRANCH) #error \"Duplicate definition of macros @ARG_PREFIX@GIT_BRANCH\" #else #define @ARG_PREFIX@GIT_BRANCH \"@GIT_BRANCH@\" #endif #if defined (@ARG_PREFIX@GIT_TAG) #error \"Duplicate definition of macros @ARG_PREFIX@GIT_TAG\" #else #define @ARG_PREFIX@GIT_TAG \"@GIT_TAG@\" #endif ") set(git_info_hpp_in_path ${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/myx_git_info_p.hpp.in) file(WRITE ${git_info_hpp_in_path} ${git_info_hpp_in}) set(git_info_cmake_in "set(ARG_PREFIX ${ARG_PREFIX}) set(GIT_REV \"N/A\") set(GIT_DIFF \"\") set(GIT_TAG \"N/A\") set(GIT_BRANCH \"N/A\") find_package(Git) if(GIT_EXECUTABLE) execute_process(COMMAND ${GIT_EXECUTABLE} log --pretty=format:'%h' -n 1 OUTPUT_VARIABLE GIT_REV ERROR_QUIET) # Check whether we got any revision (which isn't always the case, # e.g. when someone downloaded a zip file from Github instead of a checkout) if(NOT \"\${GIT_REV}\" STREQUAL \"\") execute_process(COMMAND bash -c \"${GIT_EXECUTABLE} diff --quiet --exit-code || echo +\" OUTPUT_VARIABLE GIT_DIFF) execute_process(COMMAND ${GIT_EXECUTABLE} describe --exact-match --tags OUTPUT_VARIABLE GIT_TAG ERROR_QUIET) execute_process(COMMAND ${GIT_EXECUTABLE} rev-parse --abbrev-ref HEAD OUTPUT_VARIABLE GIT_BRANCH) string(STRIP \"\${GIT_REV}\" GIT_REV) string(SUBSTRING \"\${GIT_REV}\" 1 7 GIT_REV) string(STRIP \"\${GIT_DIFF}\" GIT_DIFF) string(STRIP \"\${GIT_TAG}\" GIT_TAG) string(STRIP \"\${GIT_BRANCH}\" GIT_BRANCH) endif() endif() configure_file(${git_info_hpp_in_path} \"\${GIT_INFO_FILE}\") ") set(git_info_cmake_in_path "${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/${target}-git-info.cmake.in") file(WRITE ${git_info_cmake_in_path} ${git_info_cmake_in}) # cmake-format: off if(NOT TARGET ${target}-git-info-header) add_custom_target(${target}-git-info-header ALL ${CMAKE_COMMAND} -DGIT_INFO_FILE=${filename} -P ${git_info_cmake_in_path} WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) endif() # cmake-format: on file(WRITE ${filename} "") set_property(TARGET ${target} APPEND PROPERTY PRIVATE_HEADER_FILES ${filename}) target_sources(${target} PRIVATE ${filename}) endfunction()