107 lines
3.7 KiB
CMake
107 lines
3.7 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_program(GIT_EXECUTABLE git)
|
|||
|
if(GIT_EXECUTABLE)
|
|||
|
execute_process(COMMAND git 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 diff --quiet --exit-code || echo +\" OUTPUT_VARIABLE GIT_DIFF)
|
|||
|
execute_process(COMMAND git describe --exact-match --tags OUTPUT_VARIABLE GIT_TAG ERROR_QUIET)
|
|||
|
execute_process(COMMAND git 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()
|