mirror of
https://github.com/MariaDB/server.git
synced 2025-02-23 05:43:08 +01:00
91 lines
3.4 KiB
CMake
91 lines
3.4 KiB
CMake
![]() |
# generate a cmake script containing git submodule version information.
|
||
|
# This is typically done during "make dist", and is needed for SBOM generation
|
||
|
# During the build from source package, git info is no more available.
|
||
|
#
|
||
|
# What is in this script
|
||
|
# - Variable ALL_SUBMODULES, a list of submodule subdirectories
|
||
|
# - for every entry in this list, there are 2 related variables defined
|
||
|
# ${name}_REVISION, set to the git tag of submodule, or git hash, if tags are missing
|
||
|
# ${name}_URL , set to the git URL of the submodule
|
||
|
# For example, following will be generated for wolfssl
|
||
|
# SET(extra/wolfssl/wolfssl_REVISION v5.7.2-stable)
|
||
|
# SET(extra/wolfssl/wolfssl_URL https://github.com/wolfSSL/wolfssl.git)
|
||
|
|
||
|
FUNCTION(generate_submodule_info outfile)
|
||
|
FIND_PACKAGE(Git REQUIRED)
|
||
|
SET(git_cmd "(git describe --tags --exact 2>/dev/null || echo no-tag) && git rev-parse --short HEAD && git remote get-url origin")
|
||
|
SET(ENV_LC_ALL "$ENV{LC_ALL}")
|
||
|
SET($ENV{LC_ALL} C)
|
||
|
EXECUTE_PROCESS(
|
||
|
COMMAND
|
||
|
${GIT_EXECUTABLE} submodule foreach --recursive ${git_cmd}
|
||
|
OUTPUT_VARIABLE outvar
|
||
|
RESULT_VARIABLE res
|
||
|
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
|
||
|
)
|
||
|
IF(NOT(${res} EQUAL 0))
|
||
|
MESSAGE(FATAL_ERROR "'git submodule foreach' failed")
|
||
|
ENDIF()
|
||
|
IF(NOT "${ENV_LC_ALL}" STREQUAL "")
|
||
|
SET($ENV{LC_ALL} ${ENV_LC_ALL})
|
||
|
ENDIF()
|
||
|
|
||
|
STRING(REPLACE "\n" ";" out_list "${outvar}")
|
||
|
SET(out_string)
|
||
|
SET(all_submodules)
|
||
|
SET(counter 0)
|
||
|
FOREACH(s ${out_list})
|
||
|
IF(${counter} EQUAL 0)
|
||
|
IF (NOT("${s}" MATCHES "Entering '"))
|
||
|
MESSAGE(FATAL "Unexpected output ${outvar}")
|
||
|
ENDIF()
|
||
|
STRING(LENGTH "${s}" slen)
|
||
|
MATH(EXPR substr_len "${slen} - 11")
|
||
|
STRING(SUBSTRING "${s}" 10 ${substr_len} submodule)
|
||
|
LIST(APPEND all_submodules ${submodule})
|
||
|
ELSEIF(${counter} EQUAL 1)
|
||
|
# tag
|
||
|
STRING(APPEND out_string "SET(${submodule}_TAG ${s})\n")
|
||
|
ELSEIF(${counter} EQUAL 2)
|
||
|
# get revision
|
||
|
STRING(APPEND out_string "SET(${submodule}_REVISION ${s})\n")
|
||
|
ELSEIF(${counter} EQUAL 3)
|
||
|
# origin url
|
||
|
STRING(APPEND out_string "SET(${submodule}_URL ${s})\n")
|
||
|
ELSE()
|
||
|
MESSAGE(FATAL_ERROR "should never happen")
|
||
|
ENDIF()
|
||
|
MATH(EXPR counter "(${counter}+1)%4")
|
||
|
ENDFOREACH()
|
||
|
STRING(APPEND out_string "SET(ALL_SUBMODULES \"${all_submodules}\")\n")
|
||
|
# Also while not strictly "submodule" info, get the origin url
|
||
|
IF(NOT GIT_REMOTE_ORIGIN_URL)
|
||
|
EXECUTE_PROCESS(
|
||
|
COMMAND
|
||
|
${GIT_EXECUTABLE} remote get-url origin
|
||
|
OUTPUT_VARIABLE GIT_REMOTE_ORIGIN_URL
|
||
|
OUTPUT_STRIP_TRAILING_WHITESPACE
|
||
|
RESULT_VARIABLE res
|
||
|
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
|
||
|
)
|
||
|
IF(("${GIT_REMOTE_ORIGIN_URL}" STREQUAL "") OR NOT(${res} EQUAL 0))
|
||
|
# Meh, origin is not called "origin", and there is no GIT_REMOTE_ORIGIN_URL
|
||
|
# set. Fallback to hardcoded default
|
||
|
SET(GIT_REMOTE_ORIGIN_URL https://github.com/mariadb/server.git)
|
||
|
ENDIF()
|
||
|
ENDIF()
|
||
|
|
||
|
STRING(APPEND out_string "SET(GIT_REMOTE_ORIGIN_URL \"${GIT_REMOTE_ORIGIN_URL}\")\n")
|
||
|
EXECUTE_PROCESS(
|
||
|
COMMAND
|
||
|
${GIT_EXECUTABLE} rev-parse --short HEAD
|
||
|
OUTPUT_VARIABLE outvar
|
||
|
OUTPUT_STRIP_TRAILING_WHITESPACE
|
||
|
RESULT_VARIABLE res
|
||
|
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
|
||
|
)
|
||
|
STRING(APPEND out_string "SET(GIT_REV_SHORT \"${outvar}\")\n")
|
||
|
SET(CMAKE_CONFIGURABLE_FILE_CONTENT ${out_string})
|
||
|
CONFIGURE_FILE(${CMAKE_SOURCE_DIR}/cmake/configurable_file_content.in ${outfile} @ONLY)
|
||
|
ENDFUNCTION()
|