mirror of
https://github.com/RIOT-OS/RIOT.git
synced 2024-12-29 04:50:03 +01:00
Merge pull request #21013 from maribu/build_system/feature-conflict-is-error
build system: error on conflicting features
This commit is contained in:
commit
d9593c7caa
@ -936,7 +936,6 @@ include $(RIOTMAKE)/usb-codes.inc.mk
|
|||||||
# Warn if the selected board and drivers don't provide all needed features:
|
# Warn if the selected board and drivers don't provide all needed features:
|
||||||
ifneq (, $(filter all flash, $(if $(MAKECMDGOALS), $(MAKECMDGOALS), all)))
|
ifneq (, $(filter all flash, $(if $(MAKECMDGOALS), $(MAKECMDGOALS), all)))
|
||||||
EXPECT_ERRORS :=
|
EXPECT_ERRORS :=
|
||||||
EXPECT_CONFLICT :=
|
|
||||||
|
|
||||||
# Test if there where dependencies against a module in DISABLE_MODULE.
|
# Test if there where dependencies against a module in DISABLE_MODULE.
|
||||||
ifneq (, $(filter $(DISABLE_MODULE), $(USEMODULE)))
|
ifneq (, $(filter $(DISABLE_MODULE), $(USEMODULE)))
|
||||||
@ -962,12 +961,12 @@ ifneq (, $(filter all flash, $(if $(MAKECMDGOALS), $(MAKECMDGOALS), all)))
|
|||||||
|
|
||||||
# Test if any used feature conflict with another one.
|
# Test if any used feature conflict with another one.
|
||||||
ifneq (,$(FEATURES_CONFLICTING))
|
ifneq (,$(FEATURES_CONFLICTING))
|
||||||
$(shell $(COLOR_ECHO) "$(COLOR_YELLOW)The following features may conflict:$(COLOR_RESET)"\
|
$(shell $(COLOR_ECHO) "$(COLOR_RED)The following features conflict:$(COLOR_RESET)"\
|
||||||
"$(FEATURES_CONFLICTING)" 1>&2)
|
"$(FEATURES_CONFLICTING)" 1>&2)
|
||||||
ifneq (, $(FEATURES_CONFLICT_MSG))
|
ifneq (, $(FEATURES_CONFLICT_MSG))
|
||||||
$(shell $(COLOR_ECHO) "$(COLOR_YELLOW)Rationale: $(COLOR_RESET)$(FEATURES_CONFLICT_MSG)" 1>&2)
|
$(shell $(COLOR_ECHO) "$(COLOR_YELLOW)Rationale: $(COLOR_RESET)$(FEATURES_CONFLICT_MSG)" 1>&2)
|
||||||
endif
|
endif
|
||||||
EXPECT_CONFLICT := 1
|
EXPECT_ERRORS := 1
|
||||||
endif
|
endif
|
||||||
|
|
||||||
# If there is a whitelist, then test if the board is whitelisted.
|
# If there is a whitelist, then test if the board is whitelisted.
|
||||||
@ -1000,10 +999,6 @@ ifneq (, $(filter all flash, $(if $(MAKECMDGOALS), $(MAKECMDGOALS), all)))
|
|||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifneq (, $(EXPECT_CONFLICT))
|
|
||||||
$(shell $(COLOR_ECHO) "\n$(COLOR_YELLOW)EXPECT undesired behaviour!$(COLOR_RESET)" 1>&2)
|
|
||||||
endif
|
|
||||||
|
|
||||||
# Fail by default when errors are expected
|
# Fail by default when errors are expected
|
||||||
CONTINUE_ON_EXPECTED_ERRORS ?= 0
|
CONTINUE_ON_EXPECTED_ERRORS ?= 0
|
||||||
ifneq (, $(EXPECT_ERRORS))
|
ifneq (, $(EXPECT_ERRORS))
|
||||||
|
@ -1,13 +0,0 @@
|
|||||||
BOARD ?= stm32f4discovery
|
|
||||||
include ../Makefile.build_system_common
|
|
||||||
|
|
||||||
# The stm32f4discovery is the only board that provides known conflicting features,
|
|
||||||
# so using this compile test on other boards will not provide the expected warning.
|
|
||||||
BOARD_WHITELIST := stm32f4discovery
|
|
||||||
|
|
||||||
# These features have a chance to use/access the shared `SPI_DEV(0)` on
|
|
||||||
# stm32f4discovery, which would probably produce an unexpected behavior in the
|
|
||||||
# user application.
|
|
||||||
FEATURES_REQUIRED = periph_dac periph_spi
|
|
||||||
|
|
||||||
include $(RIOTBASE)/Makefile.include
|
|
@ -1,41 +0,0 @@
|
|||||||
Test warning on conflicting features
|
|
||||||
==================================================
|
|
||||||
Using conflicting features provided by boards was invisible for the user until the used features resulted in a traceable problem or the user was aware of the conflict in advance from documentation etc.
|
|
||||||
Now, existing and known conflicts can be recorded into `FEATURES_CONFLICT` for each board to inform the user on a conflict situation during compile time.
|
|
||||||
|
|
||||||
This test requires conflicting features in its `Makefile`, i.e. `FEATURES_REQUIRED = periph_dac periph_spi`.
|
|
||||||
It is expected to be presented with a warning on the conflicts with a short description message during compile time for the [stm32f4discovery](https://doc.riot-os.org/group__boards__stm32f4discovery.html) by now, i.e. :
|
|
||||||
|
|
||||||
```
|
|
||||||
$ make BOARD=stm32f4discovery
|
|
||||||
The following features may conflict: periph_dac periph_spi
|
|
||||||
Rationale: On stm32f4discovery boards there are the same pins for the DAC and/or SPI_DEV(0).
|
|
||||||
|
|
||||||
EXPECT undesired behaviour!
|
|
||||||
```
|
|
||||||
The warning presents the conflicting features derived from `FEATURES_CONFLICT` and an optional message derived from `FEATURES_CONFLICT_MSG` provided int the `./RIOT/board/stm32f4discovery/Makefile.features`.
|
|
||||||
|
|
||||||
Whenever an application, such as this test, requires board features that match a _conflict group_, e.g. `FEATURES_REQUIRED = periph_dac periph_spi`, a similar warning to the above will be displayed during compile time.
|
|
||||||
|
|
||||||
|
|
||||||
---------
|
|
||||||
###Usage of _conflict groups_:
|
|
||||||
|
|
||||||
* Conflicting features are described in groups separated by a `:` (doublecolon) for each feature, e.g.:
|
|
||||||
`FEATURES_CONFLICT = periph_spi:periph_dac`, which states that `periph_spi` conflicts with `periph_dac`.
|
|
||||||
As seen above, this is the conflict of `SPI_DEV(0)` pinout is shared with `DAC` on the [stm32f4discovery](https://doc.riot-os.org/group__boards__stm32f4discovery.html) board.
|
|
||||||
|
|
||||||
* Distinct groups of conflicts are whitespace separated, e.g.:
|
|
||||||
`featureA:featureB featureC:featureD`, which states that `featureA` conflicts with `featureB`, and `featureC` conflicts with `featureD`.
|
|
||||||
This also means, that e.g. `FEATURES_REQUIRED = featureA featureD` would **not** produce a warning.
|
|
||||||
|
|
||||||
* The groups can have an arbitrary number of conflicting features, e.g.:
|
|
||||||
`featureA:featureB:featureC:featureX:featureY:featureZ`
|
|
||||||
|
|
||||||
* An optional information can be given using the `FEATURES_CONFLICT_MSG`, e.g.:
|
|
||||||
`FEATURES_CONFLICT_MSG = "featureA uses the same pins as featureB"`
|
|
||||||
|
|
||||||
* If the required features match multiple conflict groups, **ALL** conflicting features are provided to the user, e.g.:
|
|
||||||
`FEATURES_CONFLICT = featureA:featureB featureC:featureD` and
|
|
||||||
`FEATURES_REQUIRED = featureA featureB featureC featureD`
|
|
||||||
would result in: `The following features may conflict: featureA featureB featureC featureD`
|
|
@ -1,38 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2014 Martin Landsmann <Martin.Landsmann@HAW-Hamburg.de>
|
|
||||||
*
|
|
||||||
* This library is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU Lesser General Public
|
|
||||||
* License as published by the Free Software Foundation; either
|
|
||||||
* version 2.1 of the License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This library is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
* Lesser General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Lesser General Public
|
|
||||||
* License along with this library; if not, write to the Free Software
|
|
||||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @ingroup tests
|
|
||||||
* @{
|
|
||||||
*
|
|
||||||
* @file
|
|
||||||
* @brief Test whether EXPECT_CONFLICT works.
|
|
||||||
*
|
|
||||||
* @author Martin Landsmann <Martin.Landsmann@HAW-Hamburg.de>
|
|
||||||
*
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
int main(void)
|
|
||||||
{
|
|
||||||
puts("Hello, nothing to do here.\nbye.");
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
@ -1,51 +0,0 @@
|
|||||||
#!/usr/bin/env python3
|
|
||||||
|
|
||||||
import os
|
|
||||||
import sys
|
|
||||||
import subprocess
|
|
||||||
from traceback import print_tb
|
|
||||||
import pexpect
|
|
||||||
|
|
||||||
BOARD = os.getenv('BOARD', 'stm32f4discovery')
|
|
||||||
MAKE = os.environ.get('MAKE', 'make')
|
|
||||||
|
|
||||||
|
|
||||||
def testfunc():
|
|
||||||
cross_gcc = "arm-none-eabi-gcc"
|
|
||||||
|
|
||||||
try:
|
|
||||||
devnull = open(os.devnull)
|
|
||||||
subprocess.Popen([cross_gcc],
|
|
||||||
stdout=devnull, stderr=devnull).communicate()
|
|
||||||
except OSError as exc:
|
|
||||||
if exc.errno == os.errno.ENOENT:
|
|
||||||
print("ABORTING TEST: {} seems to be missing.\n".format(cross_gcc))
|
|
||||||
else:
|
|
||||||
child = pexpect.spawnu([MAKE], env=os.environ)
|
|
||||||
child.logfile = sys.stdout
|
|
||||||
|
|
||||||
try:
|
|
||||||
if BOARD == 'stm32f4discovery':
|
|
||||||
child.expect_exact('\x1b[1;33mThe following features may conflict:'
|
|
||||||
'\x1b[0m periph_dac periph_spi')
|
|
||||||
child.expect_exact('\x1b[1;33mRationale: '
|
|
||||||
'\x1b[0mOn stm32f4discovery boards there are '
|
|
||||||
'the same pins for the DAC and/or SPI_0.')
|
|
||||||
child.expect_exact('\x1b[1;33mEXPECT undesired behaviour!\x1b[0m')
|
|
||||||
else:
|
|
||||||
child.expect_exact('\x1b[1;31mThe selected BOARD={} is not whitelisted:\x1b[0m stm32f4discovery'
|
|
||||||
.format(BOARD))
|
|
||||||
except pexpect.TIMEOUT:
|
|
||||||
print("\x1b[1;31mTimeout in expect script\x1b[0m")
|
|
||||||
print_tb(sys.exc_info()[2])
|
|
||||||
sys.exit(1)
|
|
||||||
except pexpect.EOF:
|
|
||||||
print("\x1b[1;31mUnexpected end of file in expect script\x1b[0m")
|
|
||||||
print_tb(sys.exc_info()[2])
|
|
||||||
sys.exit(1)
|
|
||||||
finally:
|
|
||||||
child.close()
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
testfunc()
|
|
Loading…
Reference in New Issue
Block a user