mirror of
https://github.com/RIOT-OS/RIOT.git
synced 2024-12-29 04:50:03 +01:00
Makefile.include: Add docker target.
export BUILD_IN_DOCKER=1 to use Docker for building inside a Docker container. GDB debug file paths will be wrong after building inside the container, use the script provided in `dist/gdbinit-docker` to set the correct GDB substitution paths (copy and paste the contents into your `~/.gdbinit`) The environment variable DOCKER_FLAGS can be used to pass extra parameters to the Docker process.
This commit is contained in:
parent
4a734d51ca
commit
8db628b17c
@ -10,6 +10,12 @@ RIOTCPU := $(abspath $(RIOTCPU))
|
|||||||
RIOTBOARD ?= $(RIOTBASE)/boards
|
RIOTBOARD ?= $(RIOTBASE)/boards
|
||||||
RIOTBOARD := $(abspath $(RIOTBOARD))
|
RIOTBOARD := $(abspath $(RIOTBOARD))
|
||||||
|
|
||||||
|
RIOTPROJECT ?= $(shell git rev-parse --show-toplevel 2>/dev/null || pwd)
|
||||||
|
RIOTPROJECT := $(abspath $(RIOTPROJECT))
|
||||||
|
|
||||||
|
# Path to the current directory relative to the git root
|
||||||
|
BUILDRELPATH ?= $(shell git rev-parse --show-prefix)
|
||||||
|
|
||||||
BINDIRBASE ?= $(CURDIR)/bin
|
BINDIRBASE ?= $(CURDIR)/bin
|
||||||
BINDIRBASE := $(abspath $(BINDIRBASE))
|
BINDIRBASE := $(abspath $(BINDIRBASE))
|
||||||
|
|
||||||
@ -145,6 +151,7 @@ BASELIBS += $(BINDIR)${APPLICATION}.a
|
|||||||
BASELIBS += $(USEPKG:%=${BINDIR}%.a)
|
BASELIBS += $(USEPKG:%=${BINDIR}%.a)
|
||||||
|
|
||||||
.PHONY: all clean flash term doc debug debug-server reset objdump help
|
.PHONY: all clean flash term doc debug debug-server reset objdump help
|
||||||
|
.PHONY: ..in-docker-container
|
||||||
|
|
||||||
ELFFILE ?= $(BINDIR)$(APPLICATION).elf
|
ELFFILE ?= $(BINDIR)$(APPLICATION).elf
|
||||||
HEXFILE ?= $(ELFFILE:.elf=.hex)
|
HEXFILE ?= $(ELFFILE:.elf=.hex)
|
||||||
@ -157,6 +164,9 @@ LINKFLAGPREFIX ?= -Wl,
|
|||||||
|
|
||||||
DIRS += $(EXTERNAL_MODULE_DIRS)
|
DIRS += $(EXTERNAL_MODULE_DIRS)
|
||||||
|
|
||||||
|
ifeq ($(BUILD_IN_DOCKER),1)
|
||||||
|
all: ..in-docker-container
|
||||||
|
else
|
||||||
## make script for your application. Build RIOT-base here!
|
## make script for your application. Build RIOT-base here!
|
||||||
all: ..compiler-check ..build-message $(USEPKG:%=${BINDIR}%.a) $(APPDEPS)
|
all: ..compiler-check ..build-message $(USEPKG:%=${BINDIR}%.a) $(APPDEPS)
|
||||||
$(AD)DIRS="$(DIRS)" "$(MAKE)" -C $(CURDIR) -f $(RIOTBASE)/Makefile.application
|
$(AD)DIRS="$(DIRS)" "$(MAKE)" -C $(CURDIR) -f $(RIOTBASE)/Makefile.application
|
||||||
@ -169,6 +179,7 @@ endif
|
|||||||
$(AD)$(SIZE) $(ELFFILE)
|
$(AD)$(SIZE) $(ELFFILE)
|
||||||
$(AD)$(OBJCOPY) $(OFLAGS) $(ELFFILE) $(HEXFILE)
|
$(AD)$(OBJCOPY) $(OFLAGS) $(ELFFILE) $(HEXFILE)
|
||||||
endif
|
endif
|
||||||
|
endif # BUILD_IN_DOCKER
|
||||||
|
|
||||||
..compiler-check:
|
..compiler-check:
|
||||||
$(AD)command -v $(CC) >/dev/null 2>&1 || \
|
$(AD)command -v $(CC) >/dev/null 2>&1 || \
|
||||||
@ -260,6 +271,36 @@ objdump:
|
|||||||
exit 1; }
|
exit 1; }
|
||||||
$(PREFIX)objdump -S -D -h $(ELFFILE) | less
|
$(PREFIX)objdump -S -D -h $(ELFFILE) | less
|
||||||
|
|
||||||
|
export DOCKER_IMAGE ?= riot/riotbuild:latest
|
||||||
|
export DOCKER_BUILD_ROOT ?= /data/riotbuild
|
||||||
|
export DOCKER_FLAGS ?= --rm
|
||||||
|
# Default target for building inside a Docker container
|
||||||
|
export DOCKER_MAKECMDGOALS ?= all
|
||||||
|
# This will execute `make $(DOCKER_MAKECMDGOALS)` inside a Docker container.
|
||||||
|
# We do not push the regular $(MAKECMDGOALS) to the container's make command in
|
||||||
|
# order to only perform building inside the container and defer executing any
|
||||||
|
# extra commands such as flashing or debugging until after leaving the
|
||||||
|
# container.
|
||||||
|
# The `flash`, `term`, `debugserver` etc. targets usually require access to
|
||||||
|
# hardware which may not be reachable from inside the container.
|
||||||
|
..in-docker-container:
|
||||||
|
@$(COLOR_ECHO) '${COLOR_GREEN}Launching build container using image "$(DOCKER_IMAGE)".${COLOR_RESET}'
|
||||||
|
docker run $(DOCKER_FLAGS) -i -t -u "$$(id -u)" \
|
||||||
|
-v '$(RIOTBASE):$(DOCKER_BUILD_ROOT)/riotbase' \
|
||||||
|
-v '$(RIOTCPU):$(DOCKER_BUILD_ROOT)/riotcpu' \
|
||||||
|
-v '$(RIOTBOARD):$(DOCKER_BUILD_ROOT)/riotboard' \
|
||||||
|
-v '$(RIOTPROJECT):$(DOCKER_BUILD_ROOT)/riotproject' \
|
||||||
|
-e 'RIOTBASE=$(DOCKER_BUILD_ROOT)/riotbase' \
|
||||||
|
-e 'RIOTCPU=$(DOCKER_BUILD_ROOT)/riotcpu' \
|
||||||
|
-e 'RIOTBOARD=$(DOCKER_BUILD_ROOT)/riotboard' \
|
||||||
|
-e 'RIOTPROJECT=$(DOCKER_BUILD_ROOT)/riotproject' \
|
||||||
|
-e 'BOARD=$(BOARD)' \
|
||||||
|
-e 'RIOT_VERSION=$(RIOT_VERSION)' \
|
||||||
|
-e '__RIOTBUILD_FLAG=$(__RIOTBUILD_FLAG)' \
|
||||||
|
-e 'QUIET=$(QUIET)' \
|
||||||
|
-w '$(DOCKER_BUILD_ROOT)/riotproject/$(BUILDRELPATH)' \
|
||||||
|
'$(DOCKER_IMAGE)' make $(DOCKER_MAKECMDGOALS)
|
||||||
|
|
||||||
# Extra make goals for testing and comparing changes.
|
# Extra make goals for testing and comparing changes.
|
||||||
include $(RIOTBASE)/Makefile.buildtests
|
include $(RIOTBASE)/Makefile.buildtests
|
||||||
|
|
||||||
|
@ -16,6 +16,7 @@ export APPDEPS # Files / Makefile targets that need to be created
|
|||||||
export RIOTBASE # The root folder of RIOT. The folder where this very file lives in.
|
export RIOTBASE # The root folder of RIOT. The folder where this very file lives in.
|
||||||
export RIOTCPU # For third party CPUs this folder is the base of the CPUs.
|
export RIOTCPU # For third party CPUs this folder is the base of the CPUs.
|
||||||
export RIOTBOARD # For third party BOARDs this folder is the base of the BOARDs.
|
export RIOTBOARD # For third party BOARDs this folder is the base of the BOARDs.
|
||||||
|
export RIOTPROJECT # Top level git root of the project being built, or PWD if not a git repository
|
||||||
export BINDIRBASE # This is the folder where the application should be built in. For each BOARD a different subfolder is used.
|
export BINDIRBASE # This is the folder where the application should be built in. For each BOARD a different subfolder is used.
|
||||||
export BINDIR # This is the folder where the application should be built in.
|
export BINDIR # This is the folder where the application should be built in.
|
||||||
|
|
||||||
|
36
dist/gdbinit-docker
vendored
Normal file
36
dist/gdbinit-docker
vendored
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
# Set some path substitution rules to be able to list source code while
|
||||||
|
# debugging after the build was run inside a Docker container
|
||||||
|
# These are harmless as they only apply to filenames beginning with /data/riotbuild/
|
||||||
|
python
|
||||||
|
import os
|
||||||
|
try:
|
||||||
|
path = os.environ['RIOTBASE']
|
||||||
|
except KeyError:
|
||||||
|
# Environment variable wasn't set.
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
gdb.execute('set substitute-path /data/riotbuild/riotbase ' + path)
|
||||||
|
try:
|
||||||
|
path = os.environ['RIOTCPU']
|
||||||
|
except KeyError:
|
||||||
|
# Environment variable wasn't set.
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
gdb.execute('set substitute-path /data/riotbuild/riotcpu ' + path)
|
||||||
|
try:
|
||||||
|
path = os.environ['RIOTBOARD']
|
||||||
|
except KeyError:
|
||||||
|
# Environment variable wasn't set.
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
gdb.execute('set substitute-path /data/riotbuild/riotboard ' + path)
|
||||||
|
try:
|
||||||
|
path = os.environ['RIOTPROJECT']
|
||||||
|
except KeyError:
|
||||||
|
# Environment variable wasn't set.
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
gdb.execute('set substitute-path /data/riotbuild/riotproject ' + path)
|
||||||
|
end
|
||||||
|
|
||||||
|
show substitute-path
|
Loading…
Reference in New Issue
Block a user