Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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