Skip to content

Commit

Permalink
Merge pull request #7654 from cladmi/pr/arduino_sketches.cpp
Browse files Browse the repository at this point in the history
 arduino/sketches: build sketches as a module
  • Loading branch information
smlng authored Aug 21, 2019
2 parents d6356bd + be30f07 commit 8e08748
Show file tree
Hide file tree
Showing 4 changed files with 57 additions and 37 deletions.
24 changes: 0 additions & 24 deletions dist/tools/arduino/pre_build.sh

This file was deleted.

16 changes: 11 additions & 5 deletions sys/arduino/Makefile.include
Original file line number Diff line number Diff line change
@@ -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
20 changes: 12 additions & 8 deletions sys/arduino/doc.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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
*
Expand Down
34 changes: 34 additions & 0 deletions sys/arduino/sketches.inc.mk
Original file line number Diff line number Diff line change
@@ -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

0 comments on commit 8e08748

Please sign in to comment.