Skip to content

Commit

Permalink
Merge pull request #16765 from benpicco/RIOT_VERSION_CODE
Browse files Browse the repository at this point in the history
build system: add machine-readable RIOT_VERSION_CODE macro
  • Loading branch information
miri64 authored Sep 22, 2021
2 parents 6cdd54e + eaf5162 commit ea8e632
Show file tree
Hide file tree
Showing 6 changed files with 140 additions and 0 deletions.
9 changes: 9 additions & 0 deletions Makefile.include
Original file line number Diff line number Diff line change
Expand Up @@ -476,6 +476,8 @@ endif
# set some settings useful for continuous integration builds
ifeq ($(RIOT_CI_BUILD),1)
RIOT_VERSION ?= buildtest
# set a dummy version number
RIOT_VERSION_CODE ?= RIOT_VERSION_NUM\(2042,5,23,0\)
ifneq ($(filter $(BOARD_INSUFFICIENT_MEMORY), $(BOARD)),)
$(info CI-build: skipping link step)
RIOTNOLINK:=1
Expand Down Expand Up @@ -504,16 +506,22 @@ include $(RIOTMAKE)/cflags.inc.mk

# Include VERSION for releases
-include $(RIOTBASE)/VERSION
-include $(RIOTBASE)/EXTRAVERSION

include $(RIOTMAKE)/git_version.inc.mk
RIOT_VERSION ?= $(or $(GIT_VERSION),'UNKNOWN (builddir: $(RIOTBASE))')
RIOT_EXTRAVERSION ?= 0

# Deprecate using RIOT_VERSION_OVERRIDE but currently keep the behavior
ifneq (,$(RIOT_VERSION_OVERRIDE))
$(warning 'RIOT_VERSION_OVERRIDE' is deprecated, it can now be set with 'RIOT_VERSION' directly.)
RIOT_VERSION = $(RIOT_VERSION_OVERRIDE)
endif

# Generate machine readable RIOT VERSION macro
RIOT_VERSION_CODE ?= $(shell echo ${RIOT_VERSION} | \
sed -E 's/([0-9]+).([0-9]+).?([0-9]+)?.*/RIOT_VERSION_NUM\\\(\1,\2,0\3,${RIOT_EXTRAVERSION}\\\)/')

# Set module by prepending APPLICATION name with 'application_'.
# It prevents conflict with application and modules with the same name.
APPLICATION_MODULE ?= application_$(APPLICATION)
Expand Down Expand Up @@ -980,6 +988,7 @@ $(RIOTBUILD_CONFIG_HEADER_C).in: FORCE | $(CLEAN)

CFLAGS_WITH_MACROS += $(CFLAGS)
CFLAGS_WITH_MACROS += -DRIOT_VERSION=\"$(RIOT_VERSION)\"
CFLAGS_WITH_MACROS += -DRIOT_VERSION_CODE=$(RIOT_VERSION_CODE)
# MODULE_NAME defines. Declared in 'makefiles/modules.inc.mk'
CFLAGS_WITH_MACROS += $(EXTDEFINES)

Expand Down
28 changes: 28 additions & 0 deletions core/include/kernel_defines.h
Original file line number Diff line number Diff line change
Expand Up @@ -187,6 +187,34 @@ extern "C" {
*/
#define IS_USED(module) IS_ACTIVE(module)

/**
* @def RIOT_VERSION_NUM(major, minor, patch, extra)
* @brief Generates a 64 bit variable of a release version.
* Comparisons to this only apply to released branches
*
* To define @p extra add a file `EXTRAVERSION` to the RIOT root
* with the content
*
* RIOT_EXTRAVERSION = <extra>
*
* with `<extra>` being the number of your local version.
* This can be useful if you are maintaining a downstream
* release to base further work on.
*
* @warning This is only intended to be used with external boards or
* modules.
* In-tree code must not make use of this macro.
*
* @param[in] major Mayor version of the release
* @param[in] minor Minor version of the release
* @param[in] patch Patch level of the release
* @param[in] extra Extra version, user defined
*
* @returns A machine readable version variable
*/
#define RIOT_VERSION_NUM(major, minor, patch, extra) \
(((0ULL + major) << 48) + ((0ULL + minor) << 32) + \
((0ULL + patch) << 16) + (extra))
/**
* @cond INTERNAL
*/
Expand Down
1 change: 1 addition & 0 deletions makefiles/docker.inc.mk
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@ export DOCKER_ENV_VARS += \
PROGRAMMER \
RIOT_CI_BUILD \
RIOT_VERSION \
RIOT_VERSION_CODE \
SCANBUILD_ARGS \
SCANBUILD_OUTPUTDIR \
SIZE \
Expand Down
1 change: 1 addition & 0 deletions tests/unittests/tests-kernel_defines/Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
include $(RIOTBASE)/Makefile.base
64 changes: 64 additions & 0 deletions tests/unittests/tests-kernel_defines/tests-kernel_defines.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
/*
* Copyright (C) 2021 ML!PA Consulting GmbH
*
* This file is subject to the terms and conditions of the GNU Lesser
* General Public License v2.1. See the file LICENSE in the top level
* directory for more details.
*/

/**
* @{
*
* @file
*/
#include "embUnit.h"
#include "kernel_defines.h"

static void kernel_version_parse(uint64_t version, uint16_t *mayor,
uint16_t *minor, uint16_t *patch, uint16_t *extra)
{
*mayor = version >> 48;
*minor = (version >> 32) & 0xFFFF;
*patch = (version >> 16) & 0xFFFF;
*extra = (version >> 0) & 0xFFFF;
}

static void test_kernel_version(void)
{
uint16_t mayor, minor, patch, extra;

TEST_ASSERT(RIOT_VERSION_CODE);
TEST_ASSERT(RIOT_VERSION_CODE > RIOT_VERSION_NUM(2017, 1, 3, 0));
TEST_ASSERT(RIOT_VERSION_CODE < RIOT_VERSION_NUM(2080, 10, 2, 0));

kernel_version_parse(RIOT_VERSION_NUM(2020, 7, 1, 0),
&mayor, &minor, &patch, &extra);

TEST_ASSERT_EQUAL_INT(2020, mayor);
TEST_ASSERT_EQUAL_INT(7, minor);
TEST_ASSERT_EQUAL_INT(1, patch);
TEST_ASSERT_EQUAL_INT(0, extra);
#if RIOT_VERSION_CODE < RIOT_VERSION_NUM(2000, 1, 1, 0)
TEST_ASSERT(0);
#endif
#if RIOT_VERSION_CODE > RIOT_VERSION_NUM(2100, 1, 1, 1)
TEST_ASSERT(0);
#endif
}

Test *tests_kernel_defines_tests(void)
{
EMB_UNIT_TESTFIXTURES(fixtures) {
new_TestFixture(test_kernel_version),
};

EMB_UNIT_TESTCALLER(kernel_defines_tests, NULL, NULL, fixtures);

return (Test *)&kernel_defines_tests;
}

void tests_kernel_defines(void)
{
TESTS_RUN(tests_kernel_defines_tests());
}
/** @} */
37 changes: 37 additions & 0 deletions tests/unittests/tests-kernel_defines/tests-kernel_defines.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
/*
* Copyright (C) 2021 ML!PA Consulting GmbH
*
* This file is subject to the terms and conditions of the GNU Lesser
* General Public License v2.1. See the file LICENSE in the top level
* directory for more details.
*/

/**
* @addtogroup unittests
* @{
*
* @file
* @brief Unittests for the ``kernel_defines`` module
*
* @author Benjamin Valentin <benjamin.valentin@ml-pa.com>
*/
#ifndef TESTS_KERNEL_DEFINES_H
#define TESTS_KERNEL_DEFINES_H

#include "embUnit.h"

#ifdef __cplusplus
extern "C" {
#endif

/**
* @brief The entry point of this test suite.
*/
void tests_kernel_defines(void);

#ifdef __cplusplus
}
#endif

#endif /* TESTS_KERNEL_DEFINES_H */
/** @} */

0 comments on commit ea8e632

Please sign in to comment.