From be30f072e24e72923475f8d486a07969a8918bdf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ga=C3=ABtan=20Harter?= Date: Thu, 28 Sep 2017 12:14:10 +0200 Subject: [PATCH] sys/arduino/sketches: build sketches as a module Generate a module for arduino sketches in a subfolder of BINDIR. This prevents issues when doing concurrent builds or out of tree build with readonly sources. Declare all generated files as `BUILDDEPS` to be re-created after `clean` on parrallel `clean all`. --- dist/tools/arduino/pre_build.sh | 24 ----------------------- sys/arduino/Makefile.include | 16 +++++++++++----- sys/arduino/doc.txt | 20 +++++++++++-------- sys/arduino/sketches.inc.mk | 34 +++++++++++++++++++++++++++++++++ 4 files changed, 57 insertions(+), 37 deletions(-) delete mode 100755 dist/tools/arduino/pre_build.sh create mode 100644 sys/arduino/sketches.inc.mk diff --git a/dist/tools/arduino/pre_build.sh b/dist/tools/arduino/pre_build.sh deleted file mode 100755 index baf455fbe4..0000000000 --- a/dist/tools/arduino/pre_build.sh +++ /dev/null @@ -1,24 +0,0 @@ -#!/bin/sh - -# check if at least the application dir and one sketch is given -if [ $# -lt 2 ] -then - echo "[Arduino pre-build] Error: not enough arguments given" - exit 1 -fi - -# 'consume' the application and arduino directories (first argument) -SRCDIR=$1 -shift -APPDIR=$1 -shift - -# create temporary file and put in the file header -cat ${SRCDIR}/pre.snip > ${APPDIR}/_sketches.cpp -# loop through the given sketches and include them into the temp file -for sketch in $@ -do - cat ${sketch} >> ${APPDIR}/_sketches.cpp -done -# and prepend the file with the arduino bootstrapping code -cat ${SRCDIR}/post.snip >> ${APPDIR}/_sketches.cpp diff --git a/sys/arduino/Makefile.include b/sys/arduino/Makefile.include index a9dd2e9a1e..1705d0bcce 100644 --- a/sys/arduino/Makefile.include +++ b/sys/arduino/Makefile.include @@ -1,9 +1,15 @@ -# compile together the Arduino sketches of the application -SKETCHES = $(wildcard $(APPDIR)/*.sketch) -SRCDIR = $(RIOTBASE)/sys/arduino +# Add Arduino sketches to the application as a module -# run the Arduino pre-build script -$(shell $(RIOTTOOLS)/arduino/pre_build.sh $(SRCDIR) $(APPDIR) $(SKETCHES)) +# Define application sketches module, it will be generated into $(BINDIR) +SKETCH_MODULE ?= arduino_sketches +SKETCH_MODULE_DIR ?= $(BINDIR)/$(SKETCH_MODULE) +SKETCHES = $(wildcard $(APPDIR)/*.sketch) +include $(RIOTBASE)/sys/arduino/sketches.inc.mk + +# Depends on module +USEMODULE += $(SKETCH_MODULE) +DIRS += $(SKETCH_MODULE_DIR) +BUILDDEPS += $(SKETCH_GENERATED_FILES) # include the Arduino headers INCLUDES += -I$(RIOTBASE)/sys/arduino/include diff --git a/sys/arduino/doc.txt b/sys/arduino/doc.txt index f6690d81cb..205d561fe8 100644 --- a/sys/arduino/doc.txt +++ b/sys/arduino/doc.txt @@ -56,24 +56,28 @@ * * @subsection sec_concept_build Extension of the build system * - * Building Arduino sketches in RIOT is done in a two step process. + * Building Arduino sketches in RIOT is done in a three step process. * - * First, the make system calls a dedicated - * [Arduino build script](https://github.com/RIOT-OS/RIOT/tree/master/dist/tools/arduino/pre_build.sh), - * which is called from the + * First, the make system defines a generated `arduino_sketches` module placed + * into `$(BINDIR)` + * [Arduino sketches makefile](https://github.com/RIOT-OS/RIOT/tree/master/sys/arduino/sketches.inc.mk), + * which is included from the * [Makefile.include](https://github.com/RIOT-OS/RIOT/tree/master/sys/arduino/Makefile.include) * of the RIOT Arduino module. + * The generated module is added to used modules and build directories. * - * This script creates a temporary file called '_sketches.cpp' inside the - * application folder. Into this file, the script copies some Arduino glue code ( + * Second, as prerequisites for the `link` target, the make system will create + * the module into `$(BINDIR)/arduino_sketches` with an `arduino_sketches.cpp` + * source file. + * Into this file, it copies some Arduino glue code ( * [pre.snip](https://github.com/RIOT-OS/RIOT/blob/master/sys/arduino/pre.snip) * and * [post.snip](https://github.com/RIOT-OS/RIOT/blob/master/sys/arduino/post.snip)) * together with the contents of all `*.sketch` files contained in the * application folder. * - * Second, the RIOT make system is called as usual, processing the temporary - * file containing all the Arduino code. Simple :-) + * Third, the RIOT make system is called as usual, building the generated + * library with the Arduino code and including it in the final firmware. * * @subsection sec_conecpt_api Implementation of the Arduino API * diff --git a/sys/arduino/sketches.inc.mk b/sys/arduino/sketches.inc.mk new file mode 100644 index 0000000000..ae71a78524 --- /dev/null +++ b/sys/arduino/sketches.inc.mk @@ -0,0 +1,34 @@ +# Compile together the Arduino sketches of the application +# They are declared a as new module $(SKETCH_MODULE) in $(SKETCH_MODULE_DIR) + +ifndef SKETCH_MODULE + $(error SKETCH_MODULE undefined. It should be defined to the sketches module name) +endif +ifndef SKETCH_MODULE_DIR + $(error SKETCH_MODULE_DIR undefined. It should be defined to the sketches module directory) +endif +ifndef SKETCHES + $(error SKETCHES undefined. It should be defined to the list of sketches files) +endif + +SNIPDIR = $(RIOTBASE)/sys/arduino +SKETCHES_ALL = $(SNIPDIR)/pre.snip $(SKETCHES) $(SNIPDIR)/post.snip +SKETCH_CPP ?= arduino_sketches.cpp +SKETCH_GENERATED_FILES = $(SKETCH_MODULE_DIR)/Makefile $(SKETCH_MODULE_DIR)/$(SKETCH_CPP) + +# Building the module files +# Do not use $^ in receipes as Makefile is also a prerequisite +$(SKETCH_MODULE_DIR)/Makefile: $(SKETCH_MODULE_DIR)/$(SKETCH_CPP) + $(Q)echo 'SRCXX = $(SKETCH_CPP)' > $@ + $(Q)echo 'include $$(RIOTBASE)/Makefile.base' >> $@ +$(SKETCH_MODULE_DIR)/$(SKETCH_CPP): $(SKETCHES_ALL) + @mkdir -p $(@D) + $(Q)cat $(SKETCHES_ALL) > $@ + +# Make everything rebuild if current makefile changes +_ARDUINO_SKETCHES_MAKEFILE := $(lastword $(MAKEFILE_LIST)) +$(SKETCH_MODULE_DIR)/$(SKETCH_CPP): $(_ARDUINO_SKETCHES_MAKEFILE) +$(SKETCH_MODULE_DIR)/Makefile: $(_ARDUINO_SKETCHES_MAKEFILE) + +# HACK Rebuild cpp files everytime in case one of the `SKETCHES` is deleted +$(SKETCH_MODULE_DIR)/$(SKETCH_CPP): FORCE