cmake: Simplify version handling based on git tags

- Use the HEAD commit hash as the default suffix
- Use the output of "describe" as the full version string
- Use the HEAD commit time as SOURCE_DATE_EPOCH
This commit is contained in:
Yuri D'Elia 2022-10-06 12:48:07 +02:00 committed by VintagePC
parent 2e1eb4f84a
commit 80594880cd
3 changed files with 84 additions and 93 deletions

View File

@ -2,60 +2,33 @@ cmake_minimum_required(VERSION 3.19)
include(cmake/Utilities.cmake) include(cmake/Utilities.cmake)
include(cmake/GetGitRevisionDescription.cmake) include(cmake/GetGitRevisionDescription.cmake)
include(cmake/ReproducibleBuild.cmake) include(cmake/ReproducibleBuild.cmake)
include(cmake/ProjectVersion.cmake)
resolve_version_variables()
set(PROJECT_VERSION_SUFFIX set(PROJECT_VERSION_SUFFIX
"<auto>" "<auto>"
CACHE CACHE
STRING STRING
"Full version suffix to be shown on the info screen in settings (e.g. full_version=4.0.3-BETA+1035.PR111.B4, suffix=-BETA+1035.PR111.B4). Defaults to '+<commit sha>.<dirty?>.<debug?>' if set to '<auto>'." "Version suffix to be appended to the final filename (<ver+PROJECT_VERSION_SUFFIX>). Overrides git hash if set."
) )
set(PROJECT_VERSION_SUFFIX_SHORT if(PROJECT_VERSION_SUFFIX STREQUAL "<auto>")
set(PROJECT_VERSION_SUFFIX "${FW_COMMIT_HASH}")
endif()
set(PROJECT_VERSION_FULL
"<auto>" "<auto>"
CACHE CACHE
STRING STRING
"Short version suffix to be shown on splash screen. Defaults to '+<BUILD_NUMBER>' if set to '<auto>'." "Full version string to be shown on the info screen in settings. Overrides git version if set."
) )
set(BUILD_NUMBER if(PROJECT_VERSION_FULL STREQUAL "<auto>")
"" set(PROJECT_VERSION_FULL "${FW_COMMIT_DSC}")
CACHE STRING "Build number of the firmware. Resolved automatically if not specified."
)
set(PROJECT_VERSION_TIMESTAMP
""
CACHE STRING "Timestamp for the build. Resolved automatically if not specified."
)
set(CUSTOM_COMPILE_OPTIONS
""
CACHE STRING "Allows adding custom C/C++ flags"
)
include(cmake/ProjectVersion.cmake)
resolve_version_variables()
set(PROJECT_VERSION_FLAVOUR
""
CACHE STRING "Firmware flavour to build - DEBUG, DEVEL, APLHA, BETA or RC"
)
set(PROJECT_VERSION_FLAVOUR_REVISION
""
CACHE STRING "Firmware flavour version, e.g. 1 for RC1, etc"
)
if(NOT PROJECT_VERSION_FLAVOUR STREQUAL "")
set(PROJECT_VERSION "${PROJECT_VERSION}-${PROJECT_VERSION_FLAVOUR}")
add_compile_definitions(FW_FLAVOR=${PROJECT_VERSION_FLAVOUR})
if(NOT PROJECT_VERSION_FLAVOUR_REVISION STREQUAL "")
set(PROJECT_VERSION "${PROJECT_VERSION}${PROJECT_VERSION_FLAVOUR_REVISION}")
add_compile_definitions(FW_FLAVERSION=${PROJECT_VERSION_FLAVOUR_REVISION})
endif()
endif() endif()
set(FN_PREFIX "FW${PROJECT_VERSION}+${PROJECT_VERSION_SUFFIX}")
# Inform user about the resolved settings # Inform user about the resolved settings
message(STATUS "Project version: ${PROJECT_VERSION}") message(STATUS "Project version ...........: ${PROJECT_VERSION}")
message( message(STATUS "Project version suffix ....: ${PROJECT_VERSION_SUFFIX}")
STATUS "Project version with short suffix: ${PROJECT_VERSION}${PROJECT_VERSION_SUFFIX_SHORT}" message(STATUS "Project version description: ${PROJECT_VERSION_FULL}")
)
set(FN_PREFIX "FW${PROJECT_VERSION}${PROJECT_VERSION_SUFFIX_SHORT}")
# Language configuration # Language configuration
set(MAIN_LANGUAGES set(MAIN_LANGUAGES
@ -237,8 +210,7 @@ list(TRANSFORM AVR_SOURCES PREPEND ${PRUSA_BOARDS_DIR}/cores/prusa_einsy_rambo/)
# Target configuration # Target configuration
# #
if(CMAKE_CROSSCOMPILING) if(CMAKE_CROSSCOMPILING)
# set source epoch set_source_epoch(${FW_COMMIT_DATE})
set_source_epoch(${PROJECT_VERSION_TIMESTAMP})
# default optimization flags # default optimization flags
set(CMAKE_CXX_FLAGS_DEBUG "-Og -g") set(CMAKE_CXX_FLAGS_DEBUG "-Og -g")

View File

@ -334,3 +334,27 @@ function(git_head_commit_timestamp _var)
PARENT_SCOPE PARENT_SCOPE
) )
endfunction() endfunction()
function(git_head_commit_data _var _format)
if(NOT GIT_FOUND)
find_package(Git QUIET)
endif()
if(NOT GIT_FOUND)
set(${_var}
"GIT-NOTFOUND"
PARENT_SCOPE)
return()
endif()
execute_process(
COMMAND "${GIT_EXECUTABLE}" show -s --quiet --format=format:${_format} HEAD
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
RESULT_VARIABLE res
OUTPUT_VARIABLE out
ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE)
if(NOT res EQUAL 0)
set(out "HEAD-FORMAT-NOTFOUND")
endif()
set(${_var}
${out}
PARENT_SCOPE)
endfunction()

View File

@ -1,71 +1,66 @@
# #[[
# This file is responsible for setting the following variables: # This file is responsible for setting the following variables:
# #
# ~~~ # ~~~
# BUILD_NUMBER (1035) # PROJECT_VERSION_MAJOR (4)
# PROJECT_VERSION_MINOR (0)
# PROJECT_VERSION_REV (3)
# PROJECT_VERSION (4.0.3) # PROJECT_VERSION (4.0.3)
# PROJECT_VERSION_FULL (4.0.3-BETA+1035.PR111.B4) # FW_COMMIT_DSC ("v4.0.3-deadbeef")
# PROJECT_VERSION_SUFFIX (-BETA+1035.PR111.B4) # FW_COMMIT_HASH (deadbeef)
# PROJECT_VERSION_SUFFIX_SHORT (+1035) # FW_COMMIT_DATE (1665051856)
# PROJECT_VERSION_TIMESTAMP (unix timestamp)
# #
# The `PROJECT_VERSION` variable is set as soon as the file is included. # The `PROJECT_VERSION` variable is set as soon as the file is included.
# To set the rest, the function `resolve_version_variables` has to be called. # To set the rest, the function `resolve_version_variables` has to be called.
#
# ~~~ # ~~~
#]]
FILE(STRINGS ${CMAKE_CURRENT_SOURCE_DIR}/Firmware/Configuration.h CFG_VER_DATA REGEX "#define FW_[A-Z]+ ([0-9]+)" ) file(STRINGS ${CMAKE_CURRENT_SOURCE_DIR}/Firmware/Configuration.h CFG_VER_DATA
LIST(GET CFG_VER_DATA 0 PROJECT_VERSION_MAJOR) REGEX "#define FW_[A-Z]+ ([0-9]+)"
LIST(GET CFG_VER_DATA 1 PROJECT_VERSION_MINOR) )
LIST(GET CFG_VER_DATA 2 PROJECT_VERSION_REV) list(GET CFG_VER_DATA 0 PROJECT_VERSION_MAJOR)
STRING(REGEX MATCH "FW_MAJOR ([0-9]+)" PROJECT_VERSION_MAJOR "${PROJECT_VERSION_MAJOR}") list(GET CFG_VER_DATA 1 PROJECT_VERSION_MINOR)
SET(PROJECT_VERSION_MAJOR "${CMAKE_MATCH_1}") list(GET CFG_VER_DATA 2 PROJECT_VERSION_REV)
STRING(REGEX MATCH "FW_MINOR ([0-9]+)" PROJECT_VERSION_MINOR "${PROJECT_VERSION_MINOR}") string(REGEX MATCH "FW_MAJOR ([0-9]+)" PROJECT_VERSION_MAJOR "${PROJECT_VERSION_MAJOR}")
SET(PROJECT_VERSION_MINOR ${CMAKE_MATCH_1}) set(PROJECT_VERSION_MAJOR "${CMAKE_MATCH_1}")
STRING(REGEX MATCH "FW_REVISION +([0-9]+)" PROJECT_VERSION_REV "${PROJECT_VERSION_REV}") string(REGEX MATCH "FW_MINOR ([0-9]+)" PROJECT_VERSION_MINOR "${PROJECT_VERSION_MINOR}")
SET(PROJECT_VERSION_REV ${CMAKE_MATCH_1}) set(PROJECT_VERSION_MINOR ${CMAKE_MATCH_1})
SET(PROJECT_VERSION "${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_REV}") string(REGEX MATCH "FW_REVISION +([0-9]+)" PROJECT_VERSION_REV "${PROJECT_VERSION_REV}")
set(PROJECT_VERSION_REV ${CMAKE_MATCH_1})
set(PROJECT_VERSION "${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_REV}")
function(resolve_version_variables) function(resolve_version_variables)
# BUILD_NUMBER if(FW_COMMIT_DSC)
if(NOT BUILD_NUMBER) return()
git_count_parent_commits(BUILD_NUMBER)
set(ERRORS "GIT-NOTFOUND" "HEAD-HASH-NOTFOUND")
if(BUILD_NUMBER IN_LIST ERRORS)
message(WARNING "Failed to resolve build number: ${BUILD_NUMBER}. Setting to zero.")
set(BUILD_NUMBER "0")
endif()
set(BUILD_NUMBER
${BUILD_NUMBER}
PARENT_SCOPE
)
endif() endif()
if(NOT GIT_FOUND)
# PROJECT_VERSION_SUFFIX find_package(Git QUIET)
if(PROJECT_VERSION_SUFFIX STREQUAL "<auto>")
# TODO: set to +<sha>.dirty?.debug?
set(PROJECT_VERSION_SUFFIX "+${BUILD_NUMBER}.LOCAL")
set(PROJECT_VERSION_SUFFIX
"+${BUILD_NUMBER}.LOCAL"
PARENT_SCOPE
)
endif() endif()
git_head_commit_data(FW_COMMIT_HASH "%h")
# PROJECT_VERSION_SUFFIX_SHORT set(ERRORS "GIT-NOTFOUND" "HEAD-FORMAT-NOTFOUND")
if(PROJECT_VERSION_SUFFIX_SHORT STREQUAL "<auto>") if(FW_COMMIT_HASH IN_LIST ERRORS)
set(PROJECT_VERSION_SUFFIX_SHORT # git not available, set fallback values
"+${BUILD_NUMBER}" set(FW_COMMIT_HASH "UNKNOWN")
PARENT_SCOPE set(FW_COMMIT_DSC "v${PROJECT_VERSION}-${FW_COMMIT_HASH}")
) string(TIMESTAMP FW_COMMIT_DATE "%s")
else()
git_describe_working_tree(FW_COMMIT_DSC)
git_head_commit_data(FW_COMMIT_DATE "%ct")
endif() endif()
set(FW_COMMIT_DSC
# PROJECT_VERSION_FULL "${FW_COMMIT_DSC}"
set(PROJECT_VERSION_FULL PARENT_SCOPE
"${PROJECT_VERSION}${PROJECT_VERSION_SUFFIX}" )
set(FW_COMMIT_HASH
"${FW_COMMIT_HASH}"
PARENT_SCOPE
)
set(FW_COMMIT_DATE
"${FW_COMMIT_DATE}"
PARENT_SCOPE PARENT_SCOPE
) )