| # SPDX-License-Identifier: Apache-2.0 |
| |
| #.rst: |
| # version.cmake |
| # ------------- |
| # |
| # Inputs: |
| # |
| # ``*VERSION*`` and other constants set by |
| # maintainers in ``${ZEPHYR_BASE}/VERSION`` |
| # |
| # Outputs with examples:: |
| # |
| # PROJECT_VERSION 1.14.99.7 |
| # KERNEL_VERSION_STRING "1.14.99-extraver" |
| # KERNEL_VERSION_EXTENDED_STRING "1.14.99-extraver+7" |
| # KERNEL_VERSION_TWEAK_STRING "1.14.99+7" |
| # |
| # KERNEL_VERSION_MAJOR 1 |
| # KERNEL_VERSION_MINOR 14 |
| # KERNEL_PATCHLEVEL 99 |
| # KERNEL_VERSION_TWEAK 7 |
| # KERNELVERSION 0x10E6307 |
| # KERNEL_VERSION_NUMBER 0x10E63 |
| # ZEPHYR_VERSION_CODE 69219 |
| # |
| # Most outputs are converted to C macros, see ``version.h.in`` |
| # |
| # See also: independent and more dynamic ``BUILD_VERSION`` in |
| # ``git.cmake``. |
| |
| # Note: version.cmake is loaded multiple times by ZephyrConfigVersion.cmake to |
| # determine this Zephyr package version and thus the correct Zephyr CMake |
| # package to load. |
| # Therefore `version.cmake` should not use include_guard(GLOBAL). |
| # The final load of `version.cmake` will setup correct build version values. |
| |
| if(NOT DEFINED VERSION_FILE AND NOT DEFINED VERSION_TYPE) |
| set(VERSION_FILE ${ZEPHYR_BASE}/VERSION) |
| set(VERSION_TYPE KERNEL) |
| if(DEFINED APPLICATION_SOURCE_DIR) |
| list(APPEND VERSION_FILE ${APPLICATION_SOURCE_DIR}/VERSION) |
| list(APPEND VERSION_TYPE APP) |
| endif() |
| endif() |
| |
| foreach(type file IN ZIP_LISTS VERSION_TYPE VERSION_FILE) |
| if(NOT EXISTS ${file}) |
| break() |
| endif() |
| file(READ ${file} ver) |
| set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS ${file}) |
| |
| string(REGEX MATCH "VERSION_MAJOR = ([0-9]*)" _ ${ver}) |
| set(${type}_VERSION_MAJOR ${CMAKE_MATCH_1}) |
| |
| string(REGEX MATCH "VERSION_MINOR = ([0-9]*)" _ ${ver}) |
| set(${type}_VERSION_MINOR ${CMAKE_MATCH_1}) |
| |
| string(REGEX MATCH "PATCHLEVEL = ([0-9]*)" _ ${ver}) |
| set(${type}_PATCHLEVEL ${CMAKE_MATCH_1}) |
| |
| string(REGEX MATCH "VERSION_TWEAK = ([0-9]*)" _ ${ver}) |
| set(${type}_VERSION_TWEAK ${CMAKE_MATCH_1}) |
| |
| string(REGEX MATCH "EXTRAVERSION = ([a-z0-9]*)" _ ${ver}) |
| set(${type}_VERSION_EXTRA ${CMAKE_MATCH_1}) |
| |
| # Validate all version fields fit in a single byte |
| if(${type}_VERSION_MAJOR GREATER 255) |
| message(FATAL_ERROR "VERSION_MAJOR must be in the range 0-255 (Current ${${type}_VERSION_MAJOR})") |
| endif() |
| if(${type}_VERSION_MINOR GREATER 255) |
| message(FATAL_ERROR "VERSION_MINOR must be in the range 0-255 (Current ${${type}_VERSION_MINOR})") |
| endif() |
| if(${type}_PATCHLEVEL GREATER 255) |
| message(FATAL_ERROR "PATCHLEVEL must be in the range 0-255 (Current ${${type}_PATCHLEVEL})") |
| endif() |
| if(${type}_VERSION_TWEAK GREATER 255) |
| message(FATAL_ERROR "VERSION_TWEAK must be in the range 0-255 (Current ${${type}_VERSION_TWEAK})") |
| endif() |
| |
| # Temporary convenience variables |
| set(${type}_VERSION_WITHOUT_TWEAK ${${type}_VERSION_MAJOR}.${${type}_VERSION_MINOR}.${${type}_PATCHLEVEL}) |
| set(${type}_VERSION_WITH_TWEAK ${${type}_VERSION_MAJOR}.${${type}_VERSION_MINOR}.${${type}_PATCHLEVEL}+${${type}_VERSION_TWEAK}) |
| |
| set(MAJOR ${${type}_VERSION_MAJOR}) # Temporary convenience variable |
| set(MINOR ${${type}_VERSION_MINOR}) # Temporary convenience variable |
| set(PATCH ${${type}_PATCHLEVEL}) # Temporary convenience variable |
| set(TWEAK ${${type}_VERSION_TWEAK}) # Temporary convenience variable |
| |
| math(EXPR ${type}_VERSION_NUMBER_INT "(${MAJOR} << 16) + (${MINOR} << 8) + (${PATCH})") |
| math(EXPR ${type}VERSION_INT "(${MAJOR} << 24) + (${MINOR} << 16) + (${PATCH} << 8) + (${TWEAK})") |
| |
| math(EXPR ${type}_VERSION_NUMBER "${${type}_VERSION_NUMBER_INT}" OUTPUT_FORMAT HEXADECIMAL) |
| math(EXPR ${type}VERSION "${${type}VERSION_INT}" OUTPUT_FORMAT HEXADECIMAL) |
| |
| if(${type}_VERSION_EXTRA) |
| set(${type}_VERSION_STRING "${${type}_VERSION_WITHOUT_TWEAK}-${${type}_VERSION_EXTRA}") |
| else() |
| set(${type}_VERSION_STRING "${${type}_VERSION_WITHOUT_TWEAK}") |
| endif() |
| set(${type}_VERSION_TWEAK_STRING "${${type}_VERSION_WITH_TWEAK}") |
| set(${type}_VERSION_EXTENDED_STRING "${${type}_VERSION_STRING}+${${type}_VERSION_TWEAK}") |
| |
| if(type STREQUAL KERNEL) |
| set(PROJECT_VERSION_MAJOR ${${type}_VERSION_MAJOR}) |
| set(PROJECT_VERSION_MINOR ${${type}_VERSION_MINOR}) |
| set(PROJECT_VERSION_PATCH ${${type}_PATCHLEVEL}) |
| set(PROJECT_VERSION_TWEAK ${${type}_VERSION_TWEAK}) |
| set(PROJECT_VERSION_EXTRA ${${type}_VERSION_EXTRA}) |
| |
| if(PROJECT_VERSION_EXTRA) |
| set(PROJECT_VERSION_EXTRA_STR "-${PROJECT_VERSION_EXTRA}") |
| endif() |
| |
| if(${type}_VERSION_TWEAK) |
| set(PROJECT_VERSION ${${type}_VERSION_WITHOUT_TWEAK}.${${type}_VERSION_TWEAK}) |
| else() |
| set(PROJECT_VERSION ${${type}_VERSION_WITHOUT_TWEAK}) |
| endif() |
| |
| set(PROJECT_VERSION_STR ${PROJECT_VERSION}${PROJECT_VERSION_EXTRA_STR}) |
| |
| set(ZEPHYR_VERSION_CODE ${${type}_VERSION_NUMBER_INT}) |
| set(ZEPHYR_VERSION TRUE) |
| |
| if(DEFINED BUILD_VERSION) |
| set(BUILD_VERSION_STR ", build: ${BUILD_VERSION}") |
| endif() |
| |
| if (NOT NO_PRINT_VERSION) |
| message(STATUS "Zephyr version: ${PROJECT_VERSION_STR} (${ZEPHYR_BASE})${BUILD_VERSION_STR}") |
| endif() |
| endif() |
| |
| # Cleanup convenience variables |
| unset(MAJOR) |
| unset(MINOR) |
| unset(PATCH) |
| unset(TWEAK) |
| unset(${type}_VERSION_WITHOUT_TWEAK) |
| unset(${type}_VERSION_WITH_TWEAK) |
| endforeach() |