diff --git a/tests/build_system_cflags_spaces/Makefile b/tests/build_system_cflags_spaces/Makefile new file mode 100644 index 0000000000..c620d2640a --- /dev/null +++ b/tests/build_system_cflags_spaces/Makefile @@ -0,0 +1,14 @@ +APPLICATION = cflags_with_spaces +BOARD ?= native +RIOTBASE ?= $(CURDIR)/../.. + +CFLAGS += -DSUPER_STRING='"I love sentences with spaces"' + +include $(RIOTBASE)/Makefile.include + +# Changing this value should trigger a rebuild even if defined after +# Makefile.include +CONFIGURATION_VALUE ?= 0 +CFLAGS += -DDEFINED_AFTER_MAKEFILE_INCLUDE=$(CONFIGURATION_VALUE) +# Exported to be available in the automated test +test: export CONFIGURATION_VALUE ?= diff --git a/tests/build_system_cflags_spaces/README.md b/tests/build_system_cflags_spaces/README.md new file mode 100644 index 0000000000..efa45e535e --- /dev/null +++ b/tests/build_system_cflags_spaces/README.md @@ -0,0 +1,43 @@ +Build system cflags with space test +=================================== + +This tests that the build system now handles CFLAGS correctly. + +There is an automated test for CFLAGS with spaces when defined in the Makefile. + + +Other manual tests +------------------ + +There are also 2 other manual tests that can be run + + +### Modifying CFLAGS defined after including Makefile.include + +CFLAGS defined after `Makefile.include` trigger a rebuild when changed. + +Running the test once should work and then when changing `CONFIGURATION_VALUE` +it should pass too. + + make flash test + CONFIGURATION_VALUE=1 make flash test + + +### Setting CFLAGS with space for docker + +This one is a trickier as CFLAGS are modified in the Makefile, so cannot be +detected automatically in the docker handling. The solution is to pass it with +`DOCKER_ENVIRONMENT_CMDLINE`. + +When the CFLAGS is defined like this, I did not find another solution than +escaping the space. + +``` +DOCKER_ENVIRONMENT_CMDLINE=$'-e CFLAGS=-DSTRING_FROM_DOCKER=\'\\\"with\ space\\\"\'' \ + BUILD_IN_DOCKER=1 make +grep '#define STRING_FROM_DOCKER "with space"' bin/native/riotbuild/riotbuild.h \ + || { echo 'ERROR CFLAGS not passed correctly' >&2; false; } + +... +#define STRING_FROM_DOCKER "with space" +``` diff --git a/tests/build_system_cflags_spaces/main.c b/tests/build_system_cflags_spaces/main.c new file mode 100644 index 0000000000..62cc2efb49 --- /dev/null +++ b/tests/build_system_cflags_spaces/main.c @@ -0,0 +1,37 @@ +/* + * Copyright (C) 2019 Freie Universität Berlin + * + * 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. + */ + +/** + * @ingroup tests + * @{ + * + * @file + * @brief Test the CFLAGS handling + * + * @author Gaëtan Harter + * + * @} + */ + +#include + +/* Define a CFLAGS string with spaces from outside docker */ +/* DOCKER_ENVIRONMENT_CMDLINE=$'-e CFLAGS=-DSTRING_FROM_DOCKER=\'\\\"with\ space\\\"\''*/ +#ifndef STRING_FROM_DOCKER +#define STRING_FROM_DOCKER "" +#endif + + +int main(void) +{ + puts("The output of the configuration variables:"); + printf("SUPER_STRING: %s\n", SUPER_STRING); + printf("DEFINED_AFTER_MAKEFILE_INCLUDE: %u\n", DEFINED_AFTER_MAKEFILE_INCLUDE); + printf("CFLAGS_STRING_FROM_DOCKER: %s\n", STRING_FROM_DOCKER); + return 0; +} diff --git a/tests/build_system_cflags_spaces/tests/01-run.py b/tests/build_system_cflags_spaces/tests/01-run.py new file mode 100755 index 0000000000..a29ad95403 --- /dev/null +++ b/tests/build_system_cflags_spaces/tests/01-run.py @@ -0,0 +1,38 @@ +#!/usr/bin/env python3 + +# Copyright (C) 2019 Freie Universität Berlin +# +# 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. + +""" +Test for passing `CFLAGS` with spaces to the application. + +It also tests that even if a `CFLAGS` is set after including Makefile.include, +changing its value will trigger a rebuild. + +There is also a way to test passing additional values with spaces to docker +documented in the `README.md`. +""" + +import os +import sys +from testrunner import run + + +# Verify the macro matches the configuration value +CONFIGURATION_VALUE = os.environ['CONFIGURATION_VALUE'] + + +def testfunc(child): + child.expect_exact('The output of the configuration variables:') + child.expect_exact('SUPER_STRING: I love sentences with spaces') + child.expect_exact('DEFINED_AFTER_MAKEFILE_INCLUDE: %s' % + CONFIGURATION_VALUE) + # This one is not tested here, see the output in 'riotbuild.h' + child.expect(r'CFLAGS_STRING_FROM_DOCKER: .*') + + +if __name__ == "__main__": + sys.exit(run(testfunc))