Skip to content

Commit 0aa3f66

Browse files
[CMake] Update versioning
Properly set version based on our git tags. For CMake's sake we use major.minor.patch For Windows dll metadata we use major.minor.build.revision and additional variables. Print the dll's metadata, to check correctness.
1 parent c39f4aa commit 0aa3f66

File tree

7 files changed

+204
-79
lines changed

7 files changed

+204
-79
lines changed

.github/workflows/fast.yml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,3 +133,11 @@ jobs:
133133
if: matrix.os == 'windows-latest'
134134
run: ${{github.workspace}}/.github/scripts/check_dll_flags.ps1 ${{github.workspace}}/build/src/proxy_lib/Release/umf_proxy.dll
135135
shell: pwsh
136+
137+
# TODO: We could add some script to verify metadata of dll's (selected fields, perhaps)
138+
# ref. https://superuser.com/questions/381276/what-are-some-nice-command-line-ways-to-inspect-dll-exe-details
139+
- name: Print metadata of our dll's
140+
if: matrix.os == 'windows-latest'
141+
run: |
142+
get-command ${{github.workspace}}/build/bin/Release/umf.dll | format-list
143+
get-command ${{github.workspace}}/build/src/proxy_lib/Release/umf_proxy.dll | format-list

CMakeLists.txt

Lines changed: 27 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -3,32 +3,43 @@
33
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
44

55
cmake_minimum_required(VERSION 3.14.0 FATAL_ERROR)
6-
project(
7-
umf
8-
VERSION 0.1.0
9-
LANGUAGES C)
10-
116
# needed when UMF is used as an external project
127
set(UMF_CMAKE_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR})
138

149
list(APPEND CMAKE_MODULE_PATH "${UMF_CMAKE_SOURCE_DIR}/cmake")
15-
include(${UMF_CMAKE_SOURCE_DIR}/cmake/helpers.cmake)
10+
include(helpers)
11+
12+
# Establish version vars based on the git tag and what 'git describe' reports.
13+
# If there's no git available in the OS, the version will be set to "0.0.0".
14+
# Otherwise we'll use 3-component version: major.minor.patch, just for CMake's
15+
# sake. A few extra variables will be set for Win dll metadata.
16+
#
17+
# For all other usages (beside CMake and Win dll), we'll be using semver aligned
18+
# version "UMF_VERSION", which is in line with our tags (e.g. "1.5.0-rc2").
19+
set_version_variables()
20+
project(
21+
umf
22+
VERSION ${UMF_CMAKE_VERSION}
23+
LANGUAGES C)
24+
# BUGFIX = "true" if Patch version > 0
25+
if(CMAKE_PROJECT_VERSION_PATCH GREATER 0)
26+
set(UMF_VERSION_BUGFIX TRUE)
27+
endif()
28+
29+
message(
30+
STATUS
31+
"UMF CMake version: ${UMF_CMAKE_VERSION} (via CMake: ${CMAKE_PROJECT_VERSION})\n"
32+
"UMF version: ${UMF_VERSION}\n"
33+
"UMF_VERSION_REVISION: ${UMF_VERSION_REVISION}\n"
34+
"UMF_VERSION_PRERELEASE: ${UMF_VERSION_PRERELEASE}\n"
35+
"UMF_VERSION_PRIVATE: ${UMF_VERSION_PRIVATE}\n"
36+
"UMF_VERSION_BUGFIX: ${UMF_VERSION_BUGFIX}")
1637

1738
include(CTest)
1839
include(CMakePackageConfigHelpers)
1940
include(GNUInstallDirs)
2041
find_package(PkgConfig)
2142

22-
# CMAKE_PROJECT_VERSION[_MAJOR|_MINOR|_PATCH] variables are set via 'project'
23-
# command. They cannot contain any "pre-release" part, though. We use custom
24-
# "UMF_SRC_VERSION" to store more accurate (source) version - this var should be
25-
# used, e.g., for creating packages.
26-
set_source_version()
27-
message(
28-
STATUS
29-
"UMF version: ${CMAKE_PROJECT_VERSION} (source version: ${UMF_SRC_VERSION})"
30-
)
31-
3243
# Build Options
3344
option(UMF_BUILD_SHARED_LIBRARY "Build UMF as shared library" OFF)
3445
option(UMF_BUILD_LEVEL_ZERO_PROVIDER "Build Level Zero memory provider" ON)

cmake/helpers.cmake

Lines changed: 135 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -10,68 +10,154 @@
1010
include(CheckCCompilerFlag)
1111
include(CheckCXXCompilerFlag)
1212

13-
# src version shows the current version, as reported by 'git describe', unless
14-
# 'git' is not available, then fall back to the top-level defined version
15-
function(set_source_version)
13+
# While we use semver aligned version, set via git tags, we parse git output to
14+
# establih the version of UMF. We have 3-component releases (e.g. 1.5.1) plus
15+
# release candidates and git info.
16+
#
17+
# Unfortunately, CMake does not support rc or git information. According to
18+
# semver rules, 1.5.1-rc1 should be less than 1.5.1. It seems hard to achieve
19+
# such comparison in CMake, though. So, for CMake's sake we only set 3-component
20+
# version in variable "UMF_CMAKE_VERSION", ignoring the rc and git information.
21+
#
22+
# For Windows versioning in dll metadata, we use 4-component version plus a few
23+
# additional variables. REVISION has to be a number and is calculated as:
24+
# REVISION = rc_no * 1000 + git_commit_no (commits count after the last release)
25+
#
26+
# Example parsing of git output:
27+
# cmake-format: off
28+
# +-----------------------+-------+-------+-------+----------+--------+---------+------------+
29+
# | \ CMake:| Major | Minor | Patch | | | | |
30+
# +-----------------------+-------+-------+-------+----------+--------+---------+------------+
31+
# | git describe \ Win32:| MAJOR | MINOR | BUILD | REVISION | BUGFIX | PRIVATE | PRERELEASE |
32+
# +-----------------------+-------+-------+-------+----------+--------+---------+------------+
33+
# | 1.5.0-rc2-0-gb8f7a32 | 1 | 5 | 0 | 2000 | | | true |
34+
# | 1.5.0-rc2 | 1 | 5 | 0 | 2000 | | | true |
35+
# | 1.5.0-rc3-6-gb8f7a32 | 1 | 5 | 0 | 3006 | | true | true |
36+
# | 1.5.0-0-gb8f7a32 | 1 | 5 | 0 | 0 | | | |
37+
# | 1.5.0 | 1 | 5 | 0 | 0 | | | |
38+
# | 1.5.0-6-123345678 | 1 | 5 | 0 | 6 | | true | |
39+
# | 1.5.2-rc1-0-gb8f7a32 | 1 | 5 | 2 | 1000 | true | | true |
40+
# | 1.5.2-rc4-6-gb8f7a32 | 1 | 5 | 2 | 4006 | true | true | true |
41+
# | 1.5.2-0-gb8f7a32 | 1 | 5 | 2 | 0 | true | | |
42+
# | 1.5.2-6-gb8f7a32 | 1 | 5 | 2 | 6 | true | true | |
43+
# | gb8f7a32 | 0 | 0 | 0 | 0 | | true | |
44+
# | ? (no git) | 0 | 0 | 0 | 0 | | true | |
45+
# +-----------------------+-------+-------+-------+----------+--------+---------+------------+
46+
# cmake-format: on
47+
function(set_version_variables)
48+
# default values
49+
set(UMF_VERSION_PRERELEASE
50+
FALSE
51+
PARENT_SCOPE)
52+
set(UMF_VERSION_PRIVATE
53+
TRUE
54+
PARENT_SCOPE)
55+
set(UMF_VERSION_BUGFIX
56+
FALSE
57+
PARENT_SCOPE)
58+
set(UMF_VERSION_REVISION
59+
0
60+
PARENT_SCOPE)
61+
set(UMF_CMAKE_VERSION
62+
"0.0.0"
63+
PARENT_SCOPE)
64+
set(UMF_VERSION
65+
"0.0.0"
66+
PARENT_SCOPE)
67+
1668
execute_process(
1769
COMMAND git describe --always
1870
OUTPUT_VARIABLE GIT_VERSION
1971
WORKING_DIRECTORY ${UMF_CMAKE_SOURCE_DIR}
2072
OUTPUT_STRIP_TRAILING_WHITESPACE ERROR_QUIET)
2173

22-
if(GIT_VERSION)
23-
# 1.5.0 - we're on a tag
24-
string(REGEX MATCHALL "\^([0-9]+\.[0-9]+\.[0-9]+)\$" MATCHES
25-
${GIT_VERSION})
26-
if(MATCHES)
27-
set(UMF_SRC_VERSION
28-
"${CMAKE_MATCH_1}"
29-
PARENT_SCOPE)
30-
return()
31-
endif()
74+
if(NOT GIT_VERSION)
75+
# no git or it reported no version. Use default ver: "0.0.0"
76+
return()
77+
endif()
3278

33-
# 1.5.0-rc1 - we're on a RC tag
34-
string(REGEX MATCHALL "\^([0-9]+\.[0-9]+\.[0-9]+\-rc[0-9]+)\$" MATCHES
35-
${GIT_VERSION})
36-
if(MATCHES)
37-
set(UMF_SRC_VERSION
38-
"${CMAKE_MATCH_1}"
39-
PARENT_SCOPE)
40-
return()
41-
endif()
79+
message(STATUS "GIT_VERSION: ${GIT_VERSION}")
4280

43-
# 1.5.0-rc1-19-gb8f78a329 -> 1.5.0-rc1.git19.gb8f78a329
44-
string(REGEX MATCHALL "([0-9.]*)-rc([0-9]*)-([0-9]*)-([0-9a-g]*)"
45-
MATCHES ${GIT_VERSION})
46-
if(MATCHES)
47-
set(UMF_SRC_VERSION
48-
"${CMAKE_MATCH_1}-rc${CMAKE_MATCH_2}.git${CMAKE_MATCH_3}.${CMAKE_MATCH_4}"
49-
PARENT_SCOPE)
50-
return()
51-
endif()
81+
# v1.5.0 - we're exactly on a tag -> UMF ver: "1.5.0"
82+
string(REGEX MATCHALL "\^v([0-9]+\.[0-9]+\.[0-9]+)\$" MATCHES
83+
${GIT_VERSION})
84+
if(MATCHES)
85+
set(UMF_VERSION
86+
"${CMAKE_MATCH_1}"
87+
PARENT_SCOPE)
88+
set(UMF_CMAKE_VERSION
89+
"${CMAKE_MATCH_1}"
90+
PARENT_SCOPE)
91+
set(UMF_VERSION_PRIVATE
92+
FALSE
93+
PARENT_SCOPE)
94+
return()
95+
endif()
5296

53-
# 1.5.0-19-gb8f78a329 -> 1.5.0-git19.gb8f78a329
54-
string(REGEX MATCHALL "([0-9.]*)-([0-9]*)-([0-9a-g]*)" MATCHES
55-
${GIT_VERSION})
56-
if(MATCHES)
57-
set(UMF_SRC_VERSION
58-
"${CMAKE_MATCH_1}-git${CMAKE_MATCH_2}.${CMAKE_MATCH_3}"
59-
PARENT_SCOPE)
60-
return()
61-
endif()
97+
# v1.5.0-rc1 - we're on a RC tag -> UMF ver: "1.5.0-rc1"
98+
string(REGEX MATCHALL "\^v([0-9]+\.[0-9]+\.[0-9]+)-rc([0-9]+)\$" MATCHES
99+
${GIT_VERSION})
100+
if(MATCHES)
101+
set(UMF_VERSION
102+
"${CMAKE_MATCH_1}-rc${CMAKE_MATCH_2}"
103+
PARENT_SCOPE)
104+
set(UMF_CMAKE_VERSION
105+
"${CMAKE_MATCH_1}"
106+
PARENT_SCOPE)
107+
math(EXPR revision "${CMAKE_MATCH_2} * 1000")
108+
set(UMF_VERSION_REVISION
109+
${revision}
110+
PARENT_SCOPE)
111+
set(UMF_VERSION_PRERELEASE
112+
TRUE
113+
PARENT_SCOPE)
114+
set(UMF_VERSION_PRIVATE
115+
FALSE
116+
PARENT_SCOPE)
117+
return()
118+
endif()
62119

63-
# no full version is available (e.g. only a hash commit) or a pattern
64-
# was not recognized
65-
set(UMF_SRC_VERSION
66-
"${CMAKE_PROJECT_VERSION}.git.${GIT_VERSION}"
120+
# v1.5.0-rc1-19-gb8f7a32 -> UMF ver: "1.5.0-rc1.git19.gb8f7a32"
121+
string(REGEX MATCHALL "v([0-9.]*)-rc([0-9]*)-([0-9]*)-([0-9a-g]*)" MATCHES
122+
${GIT_VERSION})
123+
if(MATCHES)
124+
set(UMF_VERSION
125+
"${CMAKE_MATCH_1}-rc${CMAKE_MATCH_2}.git${CMAKE_MATCH_3}.${CMAKE_MATCH_4}"
126+
PARENT_SCOPE)
127+
set(UMF_CMAKE_VERSION
128+
"${CMAKE_MATCH_1}"
67129
PARENT_SCOPE)
68-
else()
69-
# git reported no version. Use version set up in the top-level CMake
70-
# with a "devel" suffix
71-
set(UMF_SRC_VERSION
72-
"${CMAKE_PROJECT_VERSION}-devel"
130+
math(EXPR revision "${CMAKE_MATCH_2} * 1000 + ${CMAKE_MATCH_3}")
131+
set(UMF_VERSION_REVISION
132+
${revision}
73133
PARENT_SCOPE)
134+
set(UMF_VERSION_PRERELEASE
135+
TRUE
136+
PARENT_SCOPE)
137+
return()
138+
endif()
139+
140+
# v1.5.0-19-gb8f7a32 -> UMF ver: "1.5.0-git19.gb8f7a32"
141+
string(REGEX MATCHALL "v([0-9.]*)-([0-9]*)-([0-9a-g]*)" MATCHES
142+
${GIT_VERSION})
143+
if(MATCHES)
144+
set(UMF_VERSION
145+
"${CMAKE_MATCH_1}-git${CMAKE_MATCH_2}.${CMAKE_MATCH_3}"
146+
PARENT_SCOPE)
147+
set(UMF_CMAKE_VERSION
148+
"${CMAKE_MATCH_1}"
149+
PARENT_SCOPE)
150+
set(UMF_VERSION_REVISION
151+
${CMAKE_MATCH_2}
152+
PARENT_SCOPE)
153+
return()
74154
endif()
155+
156+
# no full version is available (e.g. only a hash commit) or a pattern was
157+
# not recognized -> UMF ver: "0.0.0.git.<hash>"
158+
set(UMF_VERSION
159+
"0.0.0.git.${GIT_VERSION}"
160+
PARENT_SCOPE)
75161
endfunction()
76162

77163
# Sets ${ret} to version of program specified by ${name} in major.minor format

src/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ set(UMF_SOURCES_WINDOWS libumf_windows.c)
8181
# Compile definitions for UMF library.
8282
#
8383
# TODO: Cleanup the compile definitions across all the CMake files
84-
set(UMF_PRIVATE_COMPILE_DEFINITIONS UMF_SRC_VERSION=${UMF_SRC_VERSION})
84+
set(UMF_PRIVATE_COMPILE_DEFINITIONS UMF_VERSION=${UMF_VERSION})
8585

8686
set(UMF_SOURCES_COMMON_LINUX_MACOSX
8787
provider/provider_os_memory.c

src/libumf.rc.in

Lines changed: 26 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,18 +8,38 @@
88

99
#include "umf/base.h"
1010

11-
#define UMF_VERNUMBERS @CMAKE_PROJECT_VERSION_MAJOR@,@CMAKE_PROJECT_VERSION_MINOR@,@CMAKE_PROJECT_VERSION_PATCH@,0
11+
#define UMF_VERNUMBERS @CMAKE_PROJECT_VERSION_MAJOR@,@CMAKE_PROJECT_VERSION_MINOR@,@CMAKE_PROJECT_VERSION_PATCH@,@UMF_VERSION_REVISION@
1212
#define UMF_VERSION "@CMAKE_PROJECT_VERSION_MAJOR@.@CMAKE_PROJECT_VERSION_MINOR@"
1313

14+
#ifdef _DEBUG
15+
#define VERSION_DEBUG VS_FF_DEBUG
16+
#else
17+
#define VERSION_DEBUG 0
18+
#endif
19+
20+
#if @UMF_VERSION_PRERELEASE@
21+
#define VERSION_PRERELEASE VS_FF_PRERELEASE
22+
#else
23+
#define VERSION_PRERELEASE 0
24+
#endif
25+
26+
#if @UMF_VERSION_PRIVATE@
27+
#define VERSION_PRIVATE VS_FF_PRIVATEBUILD
28+
#else
29+
#define VERSION_PRIVATE 0
30+
#endif
31+
32+
#if @UMF_VERSION_BUGFIX@
33+
#define VERSION_PATCHED VS_FF_PATCHED
34+
#else
35+
#define VERSION_PATCHED 0
36+
#endif
37+
1438
VS_VERSION_INFO VERSIONINFO
1539
FILEVERSION UMF_VERNUMBERS
1640
PRODUCTVERSION UMF_VERNUMBERS
1741
FILEFLAGSMASK VS_FFI_FILEFLAGSMASK
18-
#ifdef _DEBUG
19-
FILEFLAGS VS_FF_DEBUG
20-
#else
21-
FILEFLAGS 0
22-
#endif
42+
FILEFLAGS (VERSION_DEBUG | VERSION_PRIVATE | VERSION_PRERELEASE | VERSION_PATCHED)
2343
FILEOS VOS__WINDOWS32
2444
FILETYPE VFT_DLL
2545
FILESUBTYPE 0

src/proxy_lib/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ add_library(${PROJECT_NAME}::proxy ALIAS umf_proxy)
3939

4040
target_link_directories(umf_proxy PRIVATE ${LIBHWLOC_LIBRARY_DIRS})
4141

42-
target_compile_definitions(umf_proxy PRIVATE UMF_SRC_VERSION=${UMF_SRC_VERSION})
42+
target_compile_definitions(umf_proxy PRIVATE UMF_VERSION=${UMF_VERSION})
4343

4444
if(PROXY_LIB_USES_SCALABLE_POOL)
4545
target_compile_definitions(umf_proxy PRIVATE PROXY_LIB_USES_SCALABLE_POOL=1)

src/utils/utils_log.c

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -305,18 +305,18 @@ void util_log_init(void) {
305305
loggerConfig.flushLevel = LOG_FATAL;
306306
}
307307

308-
#ifdef UMF_SRC_VERSION
308+
#ifdef UMF_VERSION
309309
// convert a define to a C string
310310
#define STR_(X) #X
311311
#define STR(X) STR_(X)
312-
#define STR_UMF_SRC_VERSION "src version: " STR(UMF_SRC_VERSION) ", "
313-
#else /* !UMF_SRC_VERSION */
314-
#define STR_UMF_SRC_VERSION ""
315-
#endif /* !UMF_SRC_VERSION */
312+
#define STR_UMF_VERSION "UMF version: " STR(UMF_VERSION) ", "
313+
#else /* !UMF_VERSION */
314+
#define STR_UMF_VERSION ""
315+
#endif /* !UMF_VERSION */
316316

317317
int umf_ver = umfGetCurrentVersion();
318318
LOG_INFO(
319-
"Logger enabled (umf version: %i.%i, " STR_UMF_SRC_VERSION
319+
"Logger enabled (umf version: %i.%i, " STR_UMF_VERSION
320320
"level: %s, flush: %s, pid: %s, timestamp: %s)",
321321
UMF_MAJOR_VERSION(umf_ver), UMF_MINOR_VERSION(umf_ver),
322322
level_to_str(loggerConfig.level), level_to_str(loggerConfig.flushLevel),

0 commit comments

Comments
 (0)