@@ -50,15 +50,88 @@ endif()
5050# Versioning
5151################################################################################
5252
53- set (VERSION_MAJOR 0)
54- set (VERSION_MINOR 12)
55- set (VERSION_PATCH 0)
56- set (VERSION_TWEAK 0)
57- set (VERSION_SUFFIX "a1" )
53+ # Variables for Versioning
54+ set (VERSION_MAJOR 0) # Major
55+ set (VERSION_MINOR 0) # Minor
56+ set (VERSION_PATCH 0) # Patch
57+ set (VERSION_STAGE "" ) # Prefix for Tweak, if left empty will assume '.'.
58+ set (VERSION_TWEAK 0) # Tweak
5859set (VERSION_COMMIT "00000000" )
60+ # Final format will be [MAJOR].[MINOR].[PATCH]([TYPE][TWEAK])(-[COMMIT])
61+
62+ function (parse_version_string )
63+ # Parses a version in the format A.B.C[.|a|b|rc]D-E
64+ cmake_parse_arguments (
65+ PARSE_ARGV 0
66+ _ARGS
67+ ""
68+ "INPUT;OUTPUT"
69+ ""
70+ )
71+
72+ set (_tmp_MAJOR 0)
73+ set (_tmp_MINOR 0)
74+ set (_tmp_PATCH 0)
75+ set (_tmp_STAGE "" )
76+ set (_tmp_TWEAK "" )
77+ set (_tmp_COMMIT "" )
78+
79+ # Replace separators with list separators
80+ string (REPLACE "-" "." _tmp "${_ARGS_INPUT} " )
81+ string (REPLACE "." ";" _tmp "${_tmp} " )
82+
83+ # Parse version differently depending on total string length.
84+ list (LENGTH _tmp _tmp_len)
85+ if (_tmp_len GREATER_EQUAL 1) # A[...]
86+ list (GET _tmp 0 _tmp_MAJOR)
87+ endif ()
88+ if (_tmp_len GREATER_EQUAL 2) # A.B[...]
89+ list (GET _tmp 1 _tmp_MINOR)
90+ endif ()
91+ if (_tmp_len GREATER_EQUAL 3) # A.B.C[...]
92+ list (GET _tmp 2 _tmp_PATCH)
93+ endif ()
94+ if (_tmp_len EQUAL 4) # A.B.C.D or A.B.C-gEEEEEEEE
95+ list (GET _tmp 3 _tmp2)
96+ # No support for '{N,M}' in CMake-Regex!
97+ if (_tmp2 MATCHES "^g[0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F]" )
98+ # A.B.C-gEEEEEEEE
99+ set (_tmp_COMMIT "${_tmp2} " )
100+ else ()
101+ # It is A.B.C.D
102+ set (_tmp_TWEAK "${_tmp2} " )
103+ set (_tmp_STAGE "a" )
104+ endif ()
105+ elseif (_tmp_len EQUAL 5) # A.B.C.D-gEEEEEEEE
106+ set (_tmp_STAGE "a" )
107+ list (GET _tmp 3 _tmp_TWEAK)
108+ list (GET _tmp 4 _tmp_COMMIT)
109+ endif ()
110+ if (_tmp_TWEAK STREQUAL "" ) # Is A.B.C-gEEEEEEEE actually A.B.CxD-gEEEEEEEE?
111+ string (REGEX MATCHALL "^([0-9]+)([_a-c]+)([0-9]+)" T_MATCHES "${_tmp_PATCH} " )
112+ if (T_MATCHES)
113+ set (_tmp_PATCH ${CMAKE_MATCH_1} )
114+ set (_tmp_STAGE ${CMAKE_MATCH_2} )
115+ set (_tmp_TWEAK ${CMAKE_MATCH_3} )
116+ endif ()
117+ endif ()
118+
119+ set (${_ARGS_OUTPUT} _MAJOR ${_tmp_MAJOR} PARENT_SCOPE )
120+ set (${_ARGS_OUTPUT} _MINOR ${_tmp_MINOR} PARENT_SCOPE )
121+ set (${_ARGS_OUTPUT} _PATCH ${_tmp_PATCH} PARENT_SCOPE )
122+ set (${_ARGS_OUTPUT} _STAGE ${_tmp_STAGE} PARENT_SCOPE )
123+ set (${_ARGS_OUTPUT} _TWEAK ${_tmp_TWEAK} PARENT_SCOPE )
124+ set (${_ARGS_OUTPUT} _COMMIT ${_tmp_COMMIT} PARENT_SCOPE )
125+ endfunction ()
59126
60127# Check if we are in a git repository.
61128if (EXISTS "${CMAKE_CURRENT_LIST_DIR} /.git" )
129+ set (VERSION_BASE "0.11.0" ) # Automatic versioning base
130+ set (VERSION_TARGET "0.12.0" ) # Automatic versioning target
131+
132+ # Parse target version as it is for output.
133+ parse_version_string (OUTPUT "VERSION" INPUT "${VERSION_TARGET} " )
134+
62135 # Try and figure out where git is.
63136 find_program (GIT git
64137 PATHS
@@ -69,12 +142,9 @@ if(EXISTS "${CMAKE_CURRENT_LIST_DIR}/.git")
69142 )
70143
71144 if (GIT)
72- set (GIT_RESULT)
73- set (GIT_OUTPUT)
74- set (GIT_ERROR)
75-
145+ # Tweak
76146 execute_process (
77- COMMAND "${GIT} " describe --tags --long --match "[0-9]*.[0-9]*.[0-9]* " --abbrev=8 HEAD
147+ COMMAND "${GIT} " describe --tags --long --match "${VERSION_BASE} " --abbrev=8 HEAD
78148 WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}
79149 RESULT_VARIABLE GIT_RESULT
80150 OUTPUT_VARIABLE GIT_OUTPUT
@@ -83,72 +153,51 @@ if(EXISTS "${CMAKE_CURRENT_LIST_DIR}/.git")
83153 ERROR_STRIP_TRAILING_WHITESPACE
84154 ERROR_QUIET
85155 )
86-
87- if (GIT_RESULT EQUAL 0)
88- string (REPLACE "-" "." GIT_OUTPUT "${GIT_OUTPUT} " )
89- string (REPLACE "." ";" GIT_OUTPUT "${GIT_OUTPUT} " )
90-
91- # Parse Version
92- list (GET GIT_OUTPUT 0 VERSION_MAJOR)
93- list (GET GIT_OUTPUT 1 VERSION_MINOR)
94- list (GET GIT_OUTPUT 2 VERSION_PATCH)
95- list (GET GIT_OUTPUT 3 VERSION_TWEAK)
96- list (GET GIT_OUTPUT 4 VERSION_COMMIT)
97-
98- # Patch needs additional parsing.
99- # This may be a [0-9]*[a-z]*[0-9]+ string.
100- string (REGEX MATCHALL "^([0-9]+)([a-z]+[0-9]+)?" T_MATCHES "${VERSION_PATCH} " )
101- set (VERSION_PATCH "${CMAKE_MATCH_1} " )
102- if (CMAKE_MATCH_2)
103- set (VERSION_SUFFIX "${CMAKE_MATCH_2} " )
104- else ()
105- set (VERSION_SUFFIX "" )
106- endif ()
107- else ()
156+ if (NOT GIT_RESULT EQUAL 0)
108157 message (WARNING "${LOGPREFIX} Failed to detect version, using default instead." )
158+ else ()
159+ parse_version_string (OUTPUT "GIT_VERSION" INPUT "${GIT_OUTPUT} " )
160+ set (VERSION_STAGE ${GIT_VERSION_STAGE} )
161+ set (VERSION_TWEAK ${GIT_VERSION_TWEAK} )
162+ set (VERSION_COMMIT ${GIT_VERSION_COMMIT} )
163+ endif ()
164+
165+ # Is there a tag on the current commit?
166+ execute_process (
167+ COMMAND "${GIT} " tag "--sort=-v:refname" "--points-at" HEAD
168+ WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}
169+ RESULT_VARIABLE GIT_RESULT
170+ OUTPUT_VARIABLE TAG_OUTPUT
171+ ERROR_VARIABLE GIT_ERROR
172+ OUTPUT_STRIP_TRAILING_WHITESPACE
173+ ERROR_STRIP_TRAILING_WHITESPACE
174+ ERROR_QUIET
175+ )
176+ if ((GIT_RESULT EQUAL 0) AND (NOT "${TAG_OUTPUT} " STREQUAL "" ))
177+ string (REGEX REPLACE "[\r\n ]+.*" "" T_MATCHES "${TAG_OUTPUT} " )
178+ parse_version_string (OUTPUT "TAG_VERSION" INPUT "${T_MATCHES} " )
179+ set (VERSION_MAJOR "${TAG_VERSION_MAJOR} " )
180+ set (VERSION_MINOR "${TAG_VERSION_MINOR} " )
181+ set (VERSION_PATCH "${TAG_VERSION_PATCH} " )
182+ set (VERSION_STAGE "${TAG_VERSION_STAGE} " )
183+ set (VERSION_TWEAK "${TAG_VERSION_TWEAK} " )
109184 endif ()
110185 endif ()
111186else ()
112187 message (STATUS "${LOGPREFIX} Not a git repository, automatic version detection disabled." )
113188endif ()
114189
115190# Allow manual overrides of the detected version.
116- set (${PREFIX} VERSION "" CACHE STRING "Override StreamFX version with this string. Format: Major.Minor.Patch[Suffix][- Tweak[-Commit8c]]" )
191+ set (${PREFIX} VERSION "" CACHE STRING "Override StreamFX version with this string. Format: Major.Minor.Patch[Stage][ Tweak[-Commit8c]]" )
117192if (NOT (${PREFIX} VERSION STREQUAL "" ))
118- string (REPLACE "-" "." T_VERSION "${${PREFIX} VERSION}" )
119- string (REPLACE "." ";" T_VERSION "${${PREFIX} VERSION}" )
120-
121- list (LENGTH T_VERSION T_VERSIONLEN)
122- list (GET T_VERSION 0 VERSION_MAJOR)
123- list (GET T_VERSION 1 VERSION_MINOR)
124- list (GET T_VERSION 2 VERSION_PATCH)
125- if (T_VERSIONLEN GREATER_EQUAL 3)
126- list (GET T_VERSION 3 VERSION_TWEAK)
127- else ()
128- set (VERSION_BUILD 0)
129- endif ()
130- if (T_VERSIONLEN GREATER_EQUAL 4)
131- list (GET T_VERSION 4 VERSION_COMMIT)
132- else ()
133- set (VERSION_COMMIT "" )
134- endif ()
135-
136- # Patch needs additional parsing.
137- # This may be a [0-9]*[a-z]*[0-9]+ string.
138- string (REGEX MATCHALL "^([0-9]+)([a-z]+[0-9]+)?" T_MATCHES "${VERSION_PATCH} " )
139- set (VERSION_PATCH "${CMAKE_MATCH_1} " )
140- if (CMAKE_MATCH_2)
141- set (VERSION_SUFFIX "${CMAKE_MATCH_2} " )
142- else ()
143- set (VERSION_SUFFIX "" )
144- endif ()
193+ parse_version_string (OUTPUT "VERSION" INPUT "${${PREFIX} VERSION}" )
145194endif ()
146195
147196# Generate Version String
148- if (NOT ( VERSION_COMMIT STREQUAL "" ) )
149- set (VERSION_STRING "${VERSION_MAJOR} .${VERSION_MINOR} .${VERSION_PATCH} . ${VERSION_TWEAK }${VERSION_SUFFIX } -${VERSION_COMMIT} " )
197+ if (VERSION_COMMIT)
198+ set (VERSION_STRING "${VERSION_MAJOR} .${VERSION_MINOR} .${VERSION_PATCH}${VERSION_STAGE }${VERSION_TWEAK } -${VERSION_COMMIT} " )
150199else ()
151- set (VERSION_STRING "${VERSION_MAJOR} .${VERSION_MINOR} .${VERSION_PATCH} . ${VERSION_TWEAK }${VERSION_SUFFIX } " )
200+ set (VERSION_STRING "${VERSION_MAJOR} .${VERSION_MINOR} .${VERSION_PATCH}${VERSION_STAGE }${VERSION_TWEAK } " )
152201endif ()
153202
154203# Log the detected version.
@@ -157,13 +206,40 @@ message(STATUS "${LOGPREFIX}Version ${VERSION_STRING}")
157206################################################################################
158207# Project
159208################################################################################
209+ set (_VERSION_TWEAK "0${VERSION_TWEAK} " )
160210project (
161211 StreamFX
162- VERSION ${VERSION_MAJOR} .${VERSION_MINOR} .${VERSION_PATCH} .${VERSION_TWEAK }
212+ VERSION ${VERSION_MAJOR} .${VERSION_MINOR} .${VERSION_PATCH} .${_VERSION_TWEAK }
163213 DESCRIPTION "Additional sources, filters, transitions and encoders for OBS Studio."
164214 HOMEPAGE_URL "https://streamfx.xaymar.com/"
165215)
166216
217+ # Helpers for CI
218+ if (VERSION_STAGE STREQUAL "" )
219+ file (
220+ GENERATE
221+ OUTPUT "$<TARGET_PROPERTY :${PROJECT_NAME} ,BINARY_DIR >/tag_name"
222+ CONTENT "${VERSION_MAJOR} .${VERSION_MINOR} .${VERSION_PATCH} "
223+ TARGET ${PROJECT_NAME}
224+ FILE_PERMISSIONS OWNER_EXECUTE OWNER_WRITE OWNER_READ GROUP_READ GROUP_EXECUTE
225+ )
226+ else ()
227+ file (
228+ GENERATE
229+ OUTPUT "$<TARGET_PROPERTY :${PROJECT_NAME} ,BINARY_DIR >/tag_name"
230+ CONTENT "${VERSION_MAJOR} .${VERSION_MINOR} .${VERSION_PATCH}${VERSION_STAGE}${VERSION_TWEAK} "
231+ TARGET ${PROJECT_NAME}
232+ FILE_PERMISSIONS OWNER_EXECUTE OWNER_WRITE OWNER_READ GROUP_READ GROUP_EXECUTE
233+ )
234+ endif ()
235+ file (
236+ GENERATE
237+ OUTPUT "$<TARGET_PROPERTY :${PROJECT_NAME} ,BINARY_DIR >/version"
238+ CONTENT "${VERSION_STRING} "
239+ TARGET ${PROJECT_NAME}
240+ FILE_PERMISSIONS OWNER_EXECUTE OWNER_WRITE OWNER_READ GROUP_READ GROUP_EXECUTE
241+ )
242+
167243# Full Project Name
168244set (PROJECT_FULL_NAME "StreamFX (for OBS Studio)" )
169245
0 commit comments