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")
set(VERSION_COMMIT "00000000")
# Check if we are in a git repository.
if(EXISTS "${CMAKE_CURRENT_LIST_DIR}/.git") if(EXISTS "${CMAKE_CURRENT_LIST_DIR}/.git")
set(GIT_RESULT "") # Try and figure out where git is.
set(GIT_OUTPUT "") find_program(GIT git
PATHS
# Get commit index /bin
execute_process( /sbin
COMMAND git rev-list --count --topo-order ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}${VERSION_SUFFIX}..HEAD /usr/bin
WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR} /usr/local/bin
RESULT_VARIABLE GIT_RESULT
OUTPUT_VARIABLE GIT_OUTPUT
OUTPUT_STRIP_TRAILING_WHITESPACE ERROR_STRIP_TRAILING_WHITESPACE ERROR_QUIET
) )
if(GIT_RESULT EQUAL 0)
set(VERSION_TWEAK ${GIT_OUTPUT})
endif()
# Get commit hash if(GIT)
execute_process( set(GIT_RESULT)
COMMAND git rev-parse --short=8 HEAD set(GIT_OUTPUT)
WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR} set(GIT_ERROR)
RESULT_VARIABLE GIT_RESULT
OUTPUT_VARIABLE GIT_OUTPUT execute_process(
OUTPUT_STRIP_TRAILING_WHITESPACE ERROR_STRIP_TRAILING_WHITESPACE ERROR_QUIET COMMAND "${GIT}" describe --tags --match "[0-9]*.[0-9]*.[0-9]*" --abbrev=8 HEAD
) WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}
if(GIT_RESULT EQUAL 0) RESULT_VARIABLE GIT_RESULT
set(VERSION_COMMIT ${GIT_OUTPUT}) OUTPUT_VARIABLE GIT_OUTPUT
else() ERROR_VARIABLE GIT_ERROR
set(VERSION_COMMIT "") OUTPUT_STRIP_TRAILING_WHITESPACE
ERROR_STRIP_TRAILING_WHITESPACE
ERROR_QUIET
)
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>")