108 lines
3.8 KiB
CMake
108 lines
3.8 KiB
CMake
#[=======================================================================[.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()
|