Skip to content

Commit 2c757f9

Browse files
tejlmandcarlescufi
authored andcommitted
cmake: generalize VERSION infrastructure for better reuse
Generalize the VERSION and version.h generation so that the same infrastructure can be reused for generating other version related header files, such as an application version header. Signed-off-by: Torsten Rasmussen <[email protected]>
1 parent 37c6136 commit 2c757f9

File tree

4 files changed

+97
-67
lines changed

4 files changed

+97
-67
lines changed

CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -544,6 +544,8 @@ add_custom_command(
544544
OUTPUT ${PROJECT_BINARY_DIR}/include/generated/version.h
545545
COMMAND ${CMAKE_COMMAND} -DZEPHYR_BASE=${ZEPHYR_BASE}
546546
-DOUT_FILE=${PROJECT_BINARY_DIR}/include/generated/version.h
547+
-DVERSION_TYPE=KERNEL
548+
-DVERSION_FILE=${ZEPHYR_BASE}/VERSION
547549
${build_version_argument}
548550
-P ${ZEPHYR_BASE}/cmake/gen_version_h.cmake
549551
DEPENDS ${ZEPHYR_BASE}/VERSION ${git_dependency}

cmake/gen_version_h.cmake

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,20 @@
22

33
cmake_minimum_required(VERSION 3.20.0)
44

5-
if(NOT DEFINED BUILD_VERSION)
5+
if(VERSION_TYPE STREQUAL KERNEL)
6+
set(BUILD_VERSION_NAME BUILD_VERSION)
7+
else()
8+
set(BUILD_VERSION_NAME ${VERSION_TYPE}_BUILD_VERSION)
9+
endif()
10+
11+
if(NOT DEFINED ${BUILD_VERSION_NAME})
12+
cmake_path(GET VERSION_FILE PARENT_PATH work_dir)
613
find_package(Git QUIET)
714
if(GIT_FOUND)
815
execute_process(
916
COMMAND ${GIT_EXECUTABLE} describe --abbrev=12 --always
10-
WORKING_DIRECTORY ${ZEPHYR_BASE}
11-
OUTPUT_VARIABLE BUILD_VERSION
17+
WORKING_DIRECTORY ${work_dir}
18+
OUTPUT_VARIABLE ${BUILD_VERSION_NAME}
1219
OUTPUT_STRIP_TRAILING_WHITESPACE
1320
ERROR_STRIP_TRAILING_WHITESPACE
1421
ERROR_VARIABLE stderr
@@ -23,4 +30,7 @@ if(NOT DEFINED BUILD_VERSION)
2330
endif()
2431

2532
include(${ZEPHYR_BASE}/cmake/modules/version.cmake)
26-
configure_file(${ZEPHYR_BASE}/version.h.in ${OUT_FILE})
33+
file(READ ${ZEPHYR_BASE}/version.h.in version_content)
34+
string(CONFIGURE "${version_content}" version_content)
35+
string(CONFIGURE "${version_content}" version_content)
36+
file(WRITE ${OUT_FILE} "${version_content}")

cmake/modules/version.cmake

Lines changed: 67 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -33,72 +33,89 @@
3333
# The final load of `version.cmake` will setup correct build version values.
3434

3535
include(${ZEPHYR_BASE}/cmake/hex.cmake)
36-
file(READ ${ZEPHYR_BASE}/VERSION ver)
37-
set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS ${ZEPHYR_BASE}/VERSION)
3836

39-
string(REGEX MATCH "VERSION_MAJOR = ([0-9]*)" _ ${ver})
40-
set(PROJECT_VERSION_MAJOR ${CMAKE_MATCH_1})
37+
if(NOT DEFINED VERSION_FILE AND NOT DEFINED VERSION_TYPE)
38+
set(VERSION_FILE ${ZEPHYR_BASE}/VERSION ${APPLICATION_SOURCE_DIR}/VERSION)
39+
set(VERSION_TYPE KERNEL APP)
40+
endif()
4141

42-
string(REGEX MATCH "VERSION_MINOR = ([0-9]*)" _ ${ver})
43-
set(PROJECT_VERSION_MINOR ${CMAKE_MATCH_1})
42+
foreach(type file IN ZIP_LISTS VERSION_TYPE VERSION_FILE)
43+
if(NOT EXISTS ${file})
44+
break()
45+
endif()
46+
file(READ ${file} ver)
47+
set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS ${file})
4448

45-
string(REGEX MATCH "PATCHLEVEL = ([0-9]*)" _ ${ver})
46-
set(PROJECT_VERSION_PATCH ${CMAKE_MATCH_1})
49+
string(REGEX MATCH "VERSION_MAJOR = ([0-9]*)" _ ${ver})
50+
set(${type}_VERSION_MAJOR ${CMAKE_MATCH_1})
4751

48-
string(REGEX MATCH "VERSION_TWEAK = ([0-9]*)" _ ${ver})
49-
set(PROJECT_VERSION_TWEAK ${CMAKE_MATCH_1})
52+
string(REGEX MATCH "VERSION_MINOR = ([0-9]*)" _ ${ver})
53+
set(${type}_VERSION_MINOR ${CMAKE_MATCH_1})
5054

51-
string(REGEX MATCH "EXTRAVERSION = ([a-z0-9]*)" _ ${ver})
52-
set(PROJECT_VERSION_EXTRA ${CMAKE_MATCH_1})
55+
string(REGEX MATCH "PATCHLEVEL = ([0-9]*)" _ ${ver})
56+
set(${type}_PATCHLEVEL ${CMAKE_MATCH_1})
5357

54-
# Temporary convenience variable
55-
set(PROJECT_VERSION_WITHOUT_TWEAK ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH})
58+
string(REGEX MATCH "VERSION_TWEAK = ([0-9]*)" _ ${ver})
59+
set(${type}_VERSION_TWEAK ${CMAKE_MATCH_1})
5660

61+
string(REGEX MATCH "EXTRAVERSION = ([a-z0-9]*)" _ ${ver})
62+
set(${type}_VERSION_EXTRA ${CMAKE_MATCH_1})
5763

58-
if(PROJECT_VERSION_EXTRA)
59-
set(PROJECT_VERSION_EXTRA_STR "-${PROJECT_VERSION_EXTRA}")
60-
endif()
64+
# Temporary convenience variable
65+
set(${type}_VERSION_WITHOUT_TWEAK ${${type}_VERSION_MAJOR}.${${type}_VERSION_MINOR}.${${type}_PATCHLEVEL})
6166

62-
if(PROJECT_VERSION_TWEAK)
63-
set(PROJECT_VERSION ${PROJECT_VERSION_WITHOUT_TWEAK}.${PROJECT_VERSION_TWEAK})
64-
else()
65-
set(PROJECT_VERSION ${PROJECT_VERSION_WITHOUT_TWEAK})
66-
endif()
6767

68-
set(PROJECT_VERSION_STR ${PROJECT_VERSION}${PROJECT_VERSION_EXTRA_STR})
68+
set(MAJOR ${${type}_VERSION_MAJOR}) # Temporary convenience variable
69+
set(MINOR ${${type}_VERSION_MINOR}) # Temporary convenience variable
70+
set(PATCH ${${type}_PATCHLEVEL}) # Temporary convenience variable
71+
set(TWEAK ${${type}_VERSION_TWEAK}) # Temporary convenience variable
6972

70-
if(DEFINED BUILD_VERSION)
71-
set(BUILD_VERSION_STR ", build: ${BUILD_VERSION}")
72-
endif()
73+
math(EXPR ${type}_VERSION_NUMBER_INT "(${MAJOR} << 16) + (${MINOR} << 8) + (${PATCH})")
74+
math(EXPR ${type}VERSION_INT "(${MAJOR} << 24) + (${MINOR} << 16) + (${PATCH} << 8) + (${TWEAK})")
7375

74-
if (NOT NO_PRINT_VERSION)
75-
message(STATUS "Zephyr version: ${PROJECT_VERSION_STR} (${ZEPHYR_BASE})${BUILD_VERSION_STR}")
76-
endif()
76+
to_hex(${${type}_VERSION_NUMBER_INT} ${type}_VERSION_NUMBER)
77+
to_hex(${${type}VERSION_INT} ${type}VERSION)
7778

78-
set(MAJOR ${PROJECT_VERSION_MAJOR}) # Temporary convenience variable
79-
set(MINOR ${PROJECT_VERSION_MINOR}) # Temporary convenience variable
80-
set(PATCH ${PROJECT_VERSION_PATCH}) # Temporary convenience variable
79+
if(${type}_VERSION_EXTRA)
80+
set(${type}_VERSION_STRING "${${type}_VERSION_WITHOUT_TWEAK}-${${type}_VERSION_EXTRA}")
81+
else()
82+
set(${type}_VERSION_STRING "${${type}_VERSION_WITHOUT_TWEAK}")
83+
endif()
8184

82-
math(EXPR KERNEL_VERSION_NUMBER_INT "(${MAJOR} << 16) + (${MINOR} << 8) + (${PATCH})")
83-
math(EXPR KERNELVERSION_INT "(${MAJOR} << 24) + (${MINOR} << 16) + (${PATCH} << 8) + (${PROJECT_VERSION_TWEAK})")
85+
if(type STREQUAL KERNEL)
86+
set(PROJECT_VERSION_MAJOR ${${type}_VERSION_MAJOR})
87+
set(PROJECT_VERSION_MINOR ${${type}_VERSION_MINOR})
88+
set(PROJECT_VERSION_PATCH ${${type}_PATCHLEVEL})
89+
set(PROJECT_VERSION_TWEAK ${${type}_VERSION_TWEAK})
90+
set(PROJECT_VERSION_EXTRA ${${type}_VERSION_EXTRA})
8491

85-
to_hex(${KERNEL_VERSION_NUMBER_INT} KERNEL_VERSION_NUMBER)
86-
to_hex(${KERNELVERSION_INT} KERNELVERSION)
92+
if(PROJECT_VERSION_EXTRA)
93+
set(PROJECT_VERSION_EXTRA_STR "-${PROJECT_VERSION_EXTRA}")
94+
endif()
8795

88-
set(KERNEL_VERSION_MAJOR ${PROJECT_VERSION_MAJOR})
89-
set(KERNEL_VERSION_MINOR ${PROJECT_VERSION_MINOR})
90-
set(KERNEL_PATCHLEVEL ${PROJECT_VERSION_PATCH})
96+
if(${type}_VERSION_TWEAK)
97+
set(PROJECT_VERSION ${${type}_VERSION_WITHOUT_TWEAK}.${${type}_VERSION_TWEAK})
98+
else()
99+
set(PROJECT_VERSION ${${type}_VERSION_WITHOUT_TWEAK})
100+
endif()
91101

92-
if(PROJECT_VERSION_EXTRA)
93-
set(KERNEL_VERSION_STRING "\"${PROJECT_VERSION_WITHOUT_TWEAK}-${PROJECT_VERSION_EXTRA}\"")
94-
else()
95-
set(KERNEL_VERSION_STRING "\"${PROJECT_VERSION_WITHOUT_TWEAK}\"")
96-
endif()
102+
set(PROJECT_VERSION_STR ${PROJECT_VERSION}${PROJECT_VERSION_EXTRA_STR})
103+
104+
set(ZEPHYR_VERSION_CODE ${${type}_VERSION_NUMBER_INT})
105+
set(ZEPHYR_VERSION TRUE)
106+
107+
if(DEFINED BUILD_VERSION)
108+
set(BUILD_VERSION_STR ", build: ${BUILD_VERSION}")
109+
endif()
97110

98-
set(ZEPHYR_VERSION_CODE ${KERNEL_VERSION_NUMBER_INT})
111+
if (NOT NO_PRINT_VERSION)
112+
message(STATUS "Zephyr version: ${PROJECT_VERSION_STR} (${ZEPHYR_BASE})${BUILD_VERSION_STR}")
113+
endif()
114+
endif()
99115

100-
# Cleanup convenience variables
101-
unset(MAJOR)
102-
unset(MINOR)
103-
unset(PATCH)
104-
unset(PROJECT_VERSION_WITHOUT_TWEAK)
116+
# Cleanup convenience variables
117+
unset(MAJOR)
118+
unset(MINOR)
119+
unset(PATCH)
120+
unset(${type}_VERSION_WITHOUT_TWEAK)
121+
endforeach()

version.h.in

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,21 @@
1-
#ifndef _KERNEL_VERSION_H_
2-
#define _KERNEL_VERSION_H_
1+
#ifndef _@VERSION_TYPE@_VERSION_H_
2+
#define _@VERSION_TYPE@_VERSION_H_
33

4-
/* KERNEL and ZEPHYR_VERSION @templates@ values come from cmake/version.cmake
5-
* BUILD_VERSION @template@ will be 'git describe', alternatively user defined BUILD_VERSION.
4+
/* @templates@ values come from cmake/version.cmake
5+
* BUILD_VERSION related @template@ values will be 'git describe',
6+
* alternatively user defined BUILD_VERSION.
67
*/
78

89
#cmakedefine ZEPHYR_VERSION_CODE @ZEPHYR_VERSION_CODE@
9-
#define ZEPHYR_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c))
10+
#cmakedefine ZEPHYR_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c))
1011

11-
#define KERNELVERSION @KERNELVERSION@
12-
#define KERNEL_VERSION_NUMBER @KERNEL_VERSION_NUMBER@
13-
#define KERNEL_VERSION_MAJOR @KERNEL_VERSION_MAJOR@
14-
#define KERNEL_VERSION_MINOR @KERNEL_VERSION_MINOR@
15-
#define KERNEL_PATCHLEVEL @KERNEL_PATCHLEVEL@
16-
#define KERNEL_VERSION_STRING @KERNEL_VERSION_STRING@
12+
#define @VERSION_TYPE@VERSION @@VERSION_TYPE@VERSION@
13+
#define @VERSION_TYPE@_VERSION_NUMBER @@VERSION_TYPE@_VERSION_NUMBER@
14+
#define @VERSION_TYPE@_VERSION_MAJOR @@VERSION_TYPE@_VERSION_MAJOR@
15+
#define @VERSION_TYPE@_VERSION_MINOR @@VERSION_TYPE@_VERSION_MINOR@
16+
#define @VERSION_TYPE@_PATCHLEVEL @@VERSION_TYPE@_PATCHLEVEL@
17+
#define @VERSION_TYPE@_VERSION_STRING "@@VERSION_TYPE@_VERSION_STRING@"
1718

18-
#define BUILD_VERSION @BUILD_VERSION@
19+
#define @BUILD_VERSION_NAME@ @@BUILD_VERSION_NAME@@
1920

20-
#endif /* _KERNEL_VERSION_H_ */
21+
#endif /* _@VERSION_TYPE@_VERSION_H_ */

0 commit comments

Comments
 (0)