You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
95 lines
3.2 KiB
95 lines
3.2 KiB
export DOCKER_IMAGE ?= riot/riotbuild:latest |
|
export DOCKER_BUILD_ROOT ?= /data/riotbuild |
|
export DOCKER_FLAGS ?= --rm |
|
# List of Docker-enabled make goals |
|
export DOCKER_MAKECMDGOALS_POSSIBLE = \ |
|
all \ |
|
buildtest \ |
|
scan-build \ |
|
scan-build-analyze \ |
|
# |
|
export DOCKER_MAKECMDGOALS = $(filter $(MAKECMDGOALS),$(DOCKER_MAKECMDGOALS_POSSIBLE)) |
|
|
|
# Docker creates the files .dockerinit and .dockerenv in the root directory of |
|
# the container, we check for the files to determine if we are inside a container. |
|
ifneq (,$(wildcard /.dockerinit /.dockerenv)) |
|
export INSIDE_DOCKER := 1 |
|
else |
|
export INSIDE_DOCKER := 0 |
|
endif |
|
|
|
# Default target for building inside a Docker container if nothing was given |
|
export DOCKER_MAKECMDGOALS ?= all |
|
# List of all exported environment variables that shall be passed on to the |
|
# Docker container, they will only be passed if they are set from the |
|
# environment, not if they are only default Makefile values. |
|
export DOCKER_ENV_VARS = \ |
|
APPDIR \ |
|
AR \ |
|
ARFLAGS \ |
|
AS \ |
|
ASFLAGS \ |
|
BINDIR \ |
|
BINDIRBASE \ |
|
BOARD \ |
|
BUILDRELPATH \ |
|
BUILDTEST_MCU_GROUP \ |
|
BUILDTEST_VERBOSE \ |
|
CC \ |
|
CFLAGS \ |
|
CPPMIX \ |
|
CXX \ |
|
CXXEXFLAGS \ |
|
CXXUWFLAGS \ |
|
ELFFILE \ |
|
HEXFILE \ |
|
LINK \ |
|
LINKFLAGPREFIX \ |
|
LINKFLAGS \ |
|
OBJCOPY \ |
|
OFLAGS \ |
|
PREFIX \ |
|
QUIET \ |
|
WERROR \ |
|
RIOT_VERSION \ |
|
SCANBUILD_ARGS \ |
|
SCANBUILD_OUTPUTDIR \ |
|
SIZE \ |
|
TOOLCHAIN \ |
|
UNDEF \ |
|
# |
|
|
|
# Find which variables were set using the command line or the environment and |
|
# pass those to Docker. |
|
# DOCKER_ENVIRONMENT_CMDLINE must be immediately assigned (:=) or otherwise some |
|
# of the environment variables will be overwritten by Makefile.include and their |
|
# origin is changed to "file" |
|
DOCKER_ENVIRONMENT_CMDLINE := $(foreach varname,$(DOCKER_ENV_VARS), \ |
|
$(if $(filter environment command,$(origin $(varname))), \ |
|
-e '$(varname)=$(subst ','\'',$($(varname)))', \ |
|
)) |
|
DOCKER_ENVIRONMENT_CMDLINE := $(strip $(DOCKER_ENVIRONMENT_CMDLINE)) |
|
|
|
# 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' \ |
|
-v /etc/localtime:/etc/localtime:ro \ |
|
-e 'RIOTBASE=$(DOCKER_BUILD_ROOT)/riotbase' \ |
|
-e 'CCACHE_BASEDIR=$(DOCKER_BUILD_ROOT)/riotbase' \ |
|
-e 'RIOTCPU=$(DOCKER_BUILD_ROOT)/riotcpu' \ |
|
-e 'RIOTBOARD=$(DOCKER_BUILD_ROOT)/riotboard' \ |
|
-e 'RIOTPROJECT=$(DOCKER_BUILD_ROOT)/riotproject' \ |
|
$(DOCKER_ENVIRONMENT_CMDLINE) \ |
|
-w '$(DOCKER_BUILD_ROOT)/riotproject/$(BUILDRELPATH)' \ |
|
'$(DOCKER_IMAGE)' make $(DOCKER_MAKECMDGOALS)
|
|
|