cmake: Improve versioning system

This commit is contained in:
Michael Fabian 'Xaymar' Dirks 2021-01-31 15:57:42 +01:00
parent 675186a737
commit 2d522f3c50
1 changed files with 91 additions and 28 deletions

View File

@ -18,53 +18,116 @@
# CMake Setup # CMake Setup
cmake_minimum_required(VERSION 3.8...3.12) cmake_minimum_required(VERSION 3.8...3.12)
# Automatic Versioning ################################################################################
# Build Type
################################################################################
# Detect if we are building by ourselves or as part of something else.
if("${CMAKE_SOURCE_DIR}" STREQUAL "${CMAKE_CURRENT_LIST_DIR}")
set(STANDALONE ON)
set(GROUPED OFF)
set(PREFIX "")
else()
set(STANDALONE OFF)
set(GROUPED ON)
set(PREFIX "StreamFX_")
endif()
set(LOGPREFIX "StreamFX:")
################################################################################
# Versioning
################################################################################
set(VERSION_MAJOR 0) set(VERSION_MAJOR 0)
set(VERSION_MINOR 10) set(VERSION_MINOR 10)
set(VERSION_PATCH 0) set(VERSION_PATCH 0)
set(VERSION_TWEAK 0) set(VERSION_TWEAK 0)
set(VERSION_SUFFIX "a") set(VERSION_SUFFIX "a")
if(EXISTS "${CMAKE_CURRENT_LIST_DIR}/.git") set(VERSION_COMMIT "00000000")
set(GIT_RESULT "")
set(GIT_OUTPUT "")
# Get commit index # Check if we are in a git repository.
execute_process( if(EXISTS "${CMAKE_CURRENT_LIST_DIR}/.git")
COMMAND git rev-list --count --topo-order ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}${VERSION_SUFFIX}..HEAD # Try and figure out where git is.
WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR} find_program(GIT git
RESULT_VARIABLE GIT_RESULT PATHS
OUTPUT_VARIABLE GIT_OUTPUT /bin
OUTPUT_STRIP_TRAILING_WHITESPACE ERROR_STRIP_TRAILING_WHITESPACE ERROR_QUIET /sbin
/usr/bin
/usr/local/bin
) )
if(GIT_RESULT EQUAL 0)
set(VERSION_TWEAK ${GIT_OUTPUT}) if(GIT)
endif() set(GIT_RESULT)
set(GIT_OUTPUT)
# Get commit hash set(GIT_ERROR)
execute_process(
COMMAND git rev-parse --short=8 HEAD execute_process(
WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR} COMMAND "${GIT}" describe --tags --match "[0-9]*.[0-9]*.[0-9]*" --abbrev=8 HEAD
RESULT_VARIABLE GIT_RESULT WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}
OUTPUT_VARIABLE GIT_OUTPUT RESULT_VARIABLE GIT_RESULT
OUTPUT_STRIP_TRAILING_WHITESPACE ERROR_STRIP_TRAILING_WHITESPACE ERROR_QUIET OUTPUT_VARIABLE GIT_OUTPUT
) ERROR_VARIABLE GIT_ERROR
if(GIT_RESULT EQUAL 0) OUTPUT_STRIP_TRAILING_WHITESPACE
set(VERSION_COMMIT ${GIT_OUTPUT}) ERROR_STRIP_TRAILING_WHITESPACE
else() ERROR_QUIET
set(VERSION_COMMIT "") )
if(GIT_RESULT EQUAL 0)
string(REPLACE "-" "." GIT_OUTPUT "${GIT_OUTPUT}")
string(REPLACE "." ";" GIT_OUTPUT "${GIT_OUTPUT}")
# Parse Version
list(GET GIT_OUTPUT 0 VERSION_MAJOR)
list(GET GIT_OUTPUT 1 VERSION_MINOR)
list(GET GIT_OUTPUT 2 VERSION_PATCH)
list(GET GIT_OUTPUT 3 VERSION_BUILD)
list(GET GIT_OUTPUT 4 VERSION_COMMIT)
# Patch needs additional parsing.
# This may be a [0-9]*[a-z]*[0-9]+ string.
string(REGEX MATCHALL "([0-9]+)([a-z0-9]+)" T_MATCHES "${VERSION_PATCH}")
set(VERSION_PATCH "${CMAKE_MATCH_1}")
if(CMAKE_MATCH_2)
set(VERSION_SUFFIX "${CMAKE_MATCH_2}")
endif()
else()
message(WARNING "${LOGPREFIX} Failed to detect version, using default instead.")
endif()
endif() endif()
endif() endif()
# Allow manual overrides of the detected version.
set(${PREFIX}VERSION "" CACHE STRING "Override StreamFX version with this string. Format: /[0-9]{1,9}.[0-9]{1,9}.[0-9]{1,9}(|[a-z]{1,1}[0-9]{1,9})-[0-9]{1,9}-[0-9a-fA-F]{8,8}")
if(${PREFIX}VERSION)
string(REPLACE "-" "." T_VERSION "${${PREFIX}VERSION}")
string(REPLACE "." ";" T_VERSION "${T_VERSION}")
# Parse Version
list(GET GIT_OUTPUT 0 VERSION_MAJOR)
list(GET GIT_OUTPUT 1 VERSION_MINOR)
list(GET GIT_OUTPUT 2 VERSION_PATCH)
list(GET GIT_OUTPUT 3 VERSION_BUILD)
list(GET GIT_OUTPUT 4 VERSION_COMMIT)
endif()
# Generate Version String
if(VERSION_COMMIT) if(VERSION_COMMIT)
set(VERSION_STRING "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}.${VERSION_TWEAK}${VERSION_SUFFIX}-${VERSION_COMMIT}") set(VERSION_STRING "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}.${VERSION_TWEAK}${VERSION_SUFFIX}-${VERSION_COMMIT}")
else() else()
set(VERSION_STRING "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}.${VERSION_TWEAK}${VERSION_SUFFIX}") set(VERSION_STRING "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}.${VERSION_TWEAK}${VERSION_SUFFIX}")
endif() endif()
# Define Project # Log the detected version.
message(STATUS "${LOGPREFIX} Version ${VERSION_STRING}")
################################################################################
# Project
################################################################################
project( project(
StreamFX StreamFX
VERSION ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}.${VERSION_TWEAK} VERSION ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}.${VERSION_TWEAK}
) )
set(PROJECT_FULL_NAME "StreamFX for OBS Studio") set(PROJECT_FULL_NAME "StreamFX for OBS Studio")
set(PROJECT_DESCRIPTION "Better Production Quality, for free.") set(PROJECT_DESCRIPTION "Better Production Quality, for free.")
set(PROJECT_AUTHORS "Michael Fabian 'Xaymar' Dirks <info@xaymar.com>") set(PROJECT_AUTHORS "Michael Fabian 'Xaymar' Dirks <info@xaymar.com>")