Skip to content

Commit 60af602

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 in CI, to check correctness.
1 parent 4f82a6c commit 60af602

File tree

10 files changed

+238
-90
lines changed

10 files changed

+238
-90
lines changed

.github/workflows/fast.yml

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

CMakeLists.txt

Lines changed: 18 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -3,32 +3,34 @@
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+
# We use semver aligned version, set via git tags. We parse git output to
13+
# establih the version of UMF to be used in CMake, Win dll's, and within the
14+
# code (e.g. in logger). We have 3-component releases (e.g. 1.5.1) plus release
15+
# candidates and git info. Function below sets all variables related to version.
16+
set_version_variables()
17+
18+
project(
19+
umf
20+
VERSION ${UMF_CMAKE_VERSION}
21+
LANGUAGES C)
22+
23+
if(CMAKE_PROJECT_VERSION_PATCH GREATER 0)
24+
# set extra variable for Windows dll metadata
25+
set(UMF_VERSION_BUGFIX TRUE)
26+
endif()
27+
message(STATUS "UMF version: ${UMF_VERSION}")
1628

1729
include(CTest)
1830
include(CMakePackageConfigHelpers)
1931
include(GNUInstallDirs)
2032
find_package(PkgConfig)
2133

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-
3234
# Build Options
3335
option(UMF_BUILD_SHARED_LIBRARY "Build UMF as shared library" OFF)
3436
option(UMF_BUILD_LEVEL_ZERO_PROVIDER "Build Level Zero memory provider" ON)

RELEASE_STEPS.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ Do changes for a release:
4040
- Add an entry to ChangeLog, remember to change the day of the week in the release date
4141
- For major releases mention API and ABI compatibility with the previous release
4242
- Update project's version in a few places:
43-
- Set the new $VERSION in `project` function in the top-level `CMakeLists.txt`
43+
- For major and minor releases: `UMF_VERSION_CURRENT` in `include/umf/base.h` (the API version)
4444
- `release` variable in `scripts/docs_config/conf.py` (for docs)
4545
- `UMF_VERSION` variable in `.github/workflows/basic.yml` (for installation test)
4646
- For major releases update ABI version in `.map` and `.def` files

cmake/helpers.cmake

Lines changed: 140 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -10,68 +10,159 @@
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+
# In this function we establish version vars based on 'git describe' output. If
14+
# there's no git available in the OS, the version will be set to "0.0.0". If git
15+
# reports only a hash, the version will be set to "0.0.0.git.<hash>". Otherwise
16+
# we'll use 3-component version: major.minor.patch, just for CMake's sake. A few
17+
# extra variables will be set for Win dll metadata.
18+
#
19+
# Important note: CMake does not support rc or git information. According to
20+
# semver rules, 1.5.1-rc1 should be less than 1.5.1, but it seems hard to
21+
# achieve such comparison in CMake. So, for CMake's sake we only set 3-component
22+
# version in variable "UMF_CMAKE_VERSION", ignoring the rc and git information.
23+
# It's only used to set SOVERSION and creating "umf-config.cmake" file.
24+
#
25+
# For Windows versioning in dll metadata, we use 4-component version plus a few
26+
# additional variables. REVISION has to be an integer and is calculated as:
27+
# REVISION = rc_no * 1000 + git_commit_no (commits count after the last release)
28+
#
29+
# For all other usages (beside CMake and Win dll), we use semver
30+
# aligned version "UMF_VERSION", which is in line with our tags (e.g.
31+
# "1.5.0-rc2").
32+
#
33+
# Example parsing of git output:
34+
# cmake-format: off
35+
# +-----------------------+-------+-------+-------+----------+--------+---------+------------+
36+
# | \ CMake:| Major | Minor | Patch | | | | |
37+
# +-----------------------+-------+-------+-------+----------+--------+---------+------------+
38+
# | git describe \ Win32:| MAJOR | MINOR | BUILD | REVISION | BUGFIX | PRIVATE | PRERELEASE |
39+
# +-----------------------+-------+-------+-------+----------+--------+---------+------------+
40+
# | 1.5.0-rc2-0-gb8f7a32 | 1 | 5 | 0 | 2000 | | | true |
41+
# | 1.5.0-rc2 | 1 | 5 | 0 | 2000 | | | true |
42+
# | 1.5.0-rc3-6-gb8f7a32 | 1 | 5 | 0 | 3006 | | true | true |
43+
# | 1.5.0-0-gb8f7a32 | 1 | 5 | 0 | 0 | | | |
44+
# | 1.5.0 | 1 | 5 | 0 | 0 | | | |
45+
# | 1.5.0-6-123345678 | 1 | 5 | 0 | 6 | | true | |
46+
# | 1.5.2-rc1-0-gb8f7a32 | 1 | 5 | 2 | 1000 | true | | true |
47+
# | 1.5.2-rc4-6-gb8f7a32 | 1 | 5 | 2 | 4006 | true | true | true |
48+
# | 1.5.2-0-gb8f7a32 | 1 | 5 | 2 | 0 | true | | |
49+
# | 1.5.2-6-gb8f7a32 | 1 | 5 | 2 | 6 | true | true | |
50+
# | gb8f7a32 | 0 | 0 | 0 | 0 | | true | |
51+
# | ? (no git) | 0 | 0 | 0 | 0 | | true | |
52+
# +-----------------------+-------+-------+-------+----------+--------+---------+------------+
53+
# cmake-format: on
54+
function(set_version_variables)
55+
# default values
56+
set(UMF_VERSION_PRERELEASE
57+
FALSE
58+
PARENT_SCOPE)
59+
set(UMF_VERSION_PRIVATE
60+
TRUE
61+
PARENT_SCOPE)
62+
set(UMF_VERSION_BUGFIX
63+
FALSE
64+
PARENT_SCOPE)
65+
set(UMF_VERSION_REVISION
66+
0
67+
PARENT_SCOPE)
68+
set(UMF_CMAKE_VERSION
69+
"0.0.0"
70+
PARENT_SCOPE)
71+
set(UMF_VERSION
72+
"0.0.0"
73+
PARENT_SCOPE)
74+
1675
execute_process(
1776
COMMAND git describe --always
1877
OUTPUT_VARIABLE GIT_VERSION
1978
WORKING_DIRECTORY ${UMF_CMAKE_SOURCE_DIR}
2079
OUTPUT_STRIP_TRAILING_WHITESPACE ERROR_QUIET)
2180

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()
81+
if(NOT GIT_VERSION)
82+
# no git or it reported no version. Use default ver: "0.0.0"
83+
return()
84+
endif()
3285

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()
86+
# v1.5.0 - we're exactly on a tag -> UMF ver: "1.5.0"
87+
string(REGEX MATCHALL "\^v([0-9]+\.[0-9]+\.[0-9]+)\$" MATCHES
88+
${GIT_VERSION})
89+
if(MATCHES)
90+
set(UMF_VERSION
91+
"${CMAKE_MATCH_1}"
92+
PARENT_SCOPE)
93+
set(UMF_CMAKE_VERSION
94+
"${CMAKE_MATCH_1}"
95+
PARENT_SCOPE)
96+
set(UMF_VERSION_PRIVATE
97+
FALSE
98+
PARENT_SCOPE)
99+
return()
100+
endif()
42101

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()
102+
# v1.5.0-rc1 - we're on a RC tag -> UMF ver: "1.5.0-rc1"
103+
string(REGEX MATCHALL "\^v([0-9]+\.[0-9]+\.[0-9]+)-rc([0-9]+)\$" MATCHES
104+
${GIT_VERSION})
105+
if(MATCHES)
106+
set(UMF_VERSION
107+
"${CMAKE_MATCH_1}-rc${CMAKE_MATCH_2}"
108+
PARENT_SCOPE)
109+
set(UMF_CMAKE_VERSION
110+
"${CMAKE_MATCH_1}"
111+
PARENT_SCOPE)
112+
math(EXPR revision "${CMAKE_MATCH_2} * 1000")
113+
set(UMF_VERSION_REVISION
114+
${revision}
115+
PARENT_SCOPE)
116+
set(UMF_VERSION_PRERELEASE
117+
TRUE
118+
PARENT_SCOPE)
119+
set(UMF_VERSION_PRIVATE
120+
FALSE
121+
PARENT_SCOPE)
122+
return()
123+
endif()
52124

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()
125+
# v1.5.0-rc1-19-gb8f7a32 -> UMF ver: "1.5.0-rc1.git19.gb8f7a32"
126+
string(REGEX MATCHALL "v([0-9.]*)-rc([0-9]*)-([0-9]*)-([0-9a-g]*)" MATCHES
127+
${GIT_VERSION})
128+
if(MATCHES)
129+
set(UMF_VERSION
130+
"${CMAKE_MATCH_1}-rc${CMAKE_MATCH_2}.git${CMAKE_MATCH_3}.${CMAKE_MATCH_4}"
131+
PARENT_SCOPE)
132+
set(UMF_CMAKE_VERSION
133+
"${CMAKE_MATCH_1}"
134+
PARENT_SCOPE)
135+
math(EXPR revision "${CMAKE_MATCH_2} * 1000 + ${CMAKE_MATCH_3}")
136+
set(UMF_VERSION_REVISION
137+
${revision}
138+
PARENT_SCOPE)
139+
set(UMF_VERSION_PRERELEASE
140+
TRUE
141+
PARENT_SCOPE)
142+
return()
143+
endif()
62144

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}"
145+
# v1.5.0-19-gb8f7a32 -> UMF ver: "1.5.0-git19.gb8f7a32"
146+
string(REGEX MATCHALL "v([0-9.]*)-([0-9]*)-([0-9a-g]*)" MATCHES
147+
${GIT_VERSION})
148+
if(MATCHES)
149+
set(UMF_VERSION
150+
"${CMAKE_MATCH_1}-git${CMAKE_MATCH_2}.${CMAKE_MATCH_3}"
151+
PARENT_SCOPE)
152+
set(UMF_CMAKE_VERSION
153+
"${CMAKE_MATCH_1}"
67154
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"
155+
set(UMF_VERSION_REVISION
156+
${CMAKE_MATCH_2}
73157
PARENT_SCOPE)
158+
return()
74159
endif()
160+
161+
# no full version is available (e.g. only a hash commit) or a pattern was
162+
# not recognized -> UMF ver: "0.0.0.git.<hash>"
163+
set(UMF_VERSION
164+
"0.0.0.git.${GIT_VERSION}"
165+
PARENT_SCOPE)
75166
endfunction()
76167

77168
# 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: 31 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,22 +4,46 @@
44
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
55
//
66

7+
// extra defines, because CMake returns "TRUE"/"FALSE"
8+
#define FALSE 0
9+
#define TRUE 1
10+
711
#include <winresrc.h>
812

913
#include "umf/base.h"
1014

11-
#define UMF_VERNUMBERS @CMAKE_PROJECT_VERSION_MAJOR@,@CMAKE_PROJECT_VERSION_MINOR@,@CMAKE_PROJECT_VERSION_PATCH@,0
12-
#define UMF_VERSION "@CMAKE_PROJECT_VERSION_MAJOR@.@CMAKE_PROJECT_VERSION_MINOR@"
15+
#define UMF_VERNUMBERS @CMAKE_PROJECT_VERSION_MAJOR@,@CMAKE_PROJECT_VERSION_MINOR@,@CMAKE_PROJECT_VERSION_PATCH@,@UMF_VERSION_REVISION@
16+
#define UMF_VERSION "@UMF_VERSION@"
17+
18+
#ifdef _DEBUG
19+
#define VERSION_DEBUG VS_FF_DEBUG
20+
#else
21+
#define VERSION_DEBUG 0
22+
#endif
23+
24+
#if @UMF_VERSION_PRERELEASE@
25+
#define VERSION_PRERELEASE VS_FF_PRERELEASE
26+
#else
27+
#define VERSION_PRERELEASE 0
28+
#endif
29+
30+
#if @UMF_VERSION_PRIVATE@
31+
#define VERSION_PRIVATE VS_FF_PRIVATEBUILD
32+
#else
33+
#define VERSION_PRIVATE 0
34+
#endif
35+
36+
#if @UMF_VERSION_BUGFIX@
37+
#define VERSION_PATCHED VS_FF_PATCHED
38+
#else
39+
#define VERSION_PATCHED 0
40+
#endif
1341

1442
VS_VERSION_INFO VERSIONINFO
1543
FILEVERSION UMF_VERNUMBERS
1644
PRODUCTVERSION UMF_VERNUMBERS
1745
FILEFLAGSMASK VS_FFI_FILEFLAGSMASK
18-
#ifdef _DEBUG
19-
FILEFLAGS VS_FF_DEBUG
20-
#else
21-
FILEFLAGS 0
22-
#endif
46+
FILEFLAGS (VERSION_DEBUG | VERSION_PRIVATE | VERSION_PRERELEASE | VERSION_PATCHED)
2347
FILEOS VOS__WINDOWS32
2448
FILETYPE VFT_DLL
2549
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)

0 commit comments

Comments
 (0)