Skip to content

Commit 35e74ad

Browse files
committed
make: refactor make system (parallelism, deduplication)
Almost everything was build sequentially in RIOT, because we employed explicit for-loops to build directories (DIRS). This PR makes our make system use normal dependencies to build directories. All our compiling rules were duplicated, once for the application, once for modules. This PR makes the application a normal module, removing this duplication.
1 parent c9c1f0d commit 35e74ad

File tree

4 files changed

+41
-52
lines changed

4 files changed

+41
-52
lines changed

Makefile

+5-25
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,10 @@
1-
ifeq (, $(__RIOTBUILD_FLAG))
2-
all: welcome
3-
@echo ""
4-
@exit 1
5-
else
6-
all:
7-
mkdir -p $(BINDIR)
8-
@for i in $(DIRS) ; do "$(MAKE)" -C $$i || exit 1; done ;
9-
endif
10-
11-
DIRS = $(RIOTCPU)/$(CPU) core drivers sys
12-
13-
ifneq (,$(filter embunit,$(USEMODULE)))
14-
DIRS += tests/unittests/embunit/embUnit
15-
endif
1+
.all:
162

17-
ifneq (,$(filter embunit_textui,$(USEMODULE)))
18-
DIRS += tests/unittests/embunit/textui
19-
endif
3+
.PHONY: all doc docclean welcome
204

21-
.PHONY: all clean doc docclean welcome
22-
23-
clean:
24-
@for i in $(DIRS) ; do "$(MAKE)" -C $$i clean || exit 1; done ;
25-
-@if [ -d $(BINDIR) ] ; \
26-
then rm -rf $(BINDIR) ; \
27-
fi
5+
all: welcome
6+
@echo ""
7+
@exit 1
288

299
doc:
3010
"$(MAKE)" -BC doc/doxygen

Makefile.application

+13
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
MODULE = $(APPLICATION)
2+
3+
DIRS += $(RIOTCPU)/$(CPU) $(RIOTBOARD)/$(BOARD)
4+
DIRS += $(RIOTBASE)/core $(RIOTBASE)/drivers $(RIOTBASE)/sys
5+
6+
ifneq (,$(filter embunit,$(USEMODULE)))
7+
DIRS += $(RIOTBASE)/tests/unittests/embunit/embUnit
8+
endif
9+
ifneq (,$(filter embunit_textui,$(USEMODULE)))
10+
DIRS += $(RIOTBASE)/tests/unittests/embunit/textui
11+
endif
12+
13+
include $(RIOTBASE)/Makefile.base

Makefile.base

+15-5
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,20 @@ endif
44

55
MODULE ?= $(shell basename $(CURDIR))
66

7-
all: $(BINDIR)$(MODULE).a
8-
@for i in $(DIRS); do $(MAKE) -C $$i || exit 1; done;
7+
.PHONY: all ${DIRS:%=ALL--%} ${DIRS:%=CLEAN--%}
98

10-
clean::
11-
@for i in $(DIRS); do $(MAKE) -C $$i clean; done;
9+
all: $(BINDIR)$(MODULE).a ..nothing
10+
11+
..nothing:
12+
@:
13+
14+
clean:: ${DIRS:%=CLEAN--%}
15+
16+
${DIRS:%=ALL--%}:
17+
"$(MAKE)" -C ${@:ALL--%=%}
18+
19+
${DIRS:%=CLEAN--%}:
20+
"$(MAKE)" -C ${@:CLEAN--%=%} clean
1221

1322
ASMSRC = $(wildcard *.s)
1423
ASSMSRC = $(wildcard *.S)
@@ -21,7 +30,8 @@ endif
2130
OBJ = $(SRC:%.c=$(BINDIR)$(MODULE)/%.o)
2231
DEP = $(SRC:%.c=$(BINDIR)$(MODULE)/%.d)
2332

24-
$(BINDIR)$(MODULE).a: $(OBJ) $(ASMOBJ)
33+
$(BINDIR)$(MODULE).a: $(OBJ) $(ASMOBJ) ${DIRS:%=ALL--%}
34+
@mkdir -p $(BINDIR)$(MODULE)
2535
$(AD)$(AR) -rc $(BINDIR)$(MODULE).a $(OBJ) $(ASMOBJ)
2636

2737
# pull in dependency info for *existing* .o files

Makefile.include

+8-22
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# Provide a shallow sanity check. You cannot call `make` in the root directory.
1+
# Provide a shallow sanity check. You cannot call `make` in a module directory.
22
export __RIOTBUILD_FLAG := RIOT
33

44
# set undefined variables
@@ -33,12 +33,14 @@ CPUDEF = $(shell echo $(CPU)|tr 'a-z' 'A-Z'|tr '-' '_')
3333
CFLAGS += -DBOARD_$(BB) -DCPU_$(CPUDEF)
3434

3535
export CFLAGS
36+
export APPLICATION
3637

3738
export BINDIRBASE ?= $(CURDIR)/bin
3839
export BINDIR ?= $(abspath $(BINDIRBASE)/$(BOARD))/
3940

4041
ifeq ($(QUIET),1)
4142
AD=@
43+
MAKEFLAGS += --no-print-directory
4244
else
4345
AD=
4446
endif
@@ -84,10 +86,8 @@ export ELFFILE ?= $(BINDIR)$(APPLICATION).elf
8486
export HEXFILE ?= $(ELFFILE:.elf=.hex)
8587

8688
## make script for your application. Build RIOT-base here!
87-
all: $(BINDIR)$(APPLICATION).a
88-
@echo "Building application $(APPLICATION) for $(BOARD) w/ MCU $(MCU)."
89-
"$(MAKE)" -C $(RIOTBOARD)/$(BOARD)
90-
"$(MAKE)" -C $(RIOTBASE)
89+
all: ..build-message $(USEPKG:%=${BINDIR}%.a) $(APPDEPS)
90+
"$(MAKE)" -C $(CURDIR) -f $(RIOTBASE)/Makefile.application
9191
ifeq (,$(RIOTNOLINK))
9292
ifeq ($(BUILDOSXNATIVE),1)
9393
$(AD)$(LINK) $(UNDEF) -o $(ELFFILE) $(BASELIBS) $(LINKFLAGS) -Wl,-no_pie
@@ -98,14 +98,8 @@ endif
9898
$(AD)$(OBJCOPY) $(OFLAGS) $(ELFFILE) $(HEXFILE)
9999
endif
100100

101-
# string array of all names of c files in dir
102-
SRC = $(wildcard *.c)
103-
104-
# string array of all names replaced .c with .o
105-
OBJ = $(SRC:%.c=${BINDIR}${APPLICATION}/%.o)
106-
107-
$(BINDIR)$(APPLICATION).a: $(OBJ)
108-
$(AD)$(AR) -rc $(BINDIR)$(APPLICATION).a $(OBJ)
101+
..build-message:
102+
@echo "Building application $(APPLICATION) for $(BOARD) w/ MCU $(MCU)."
109103

110104
# add extra include paths for packages in $(USEMODULE)
111105
export USEMODULE_INCLUDES =
@@ -119,7 +113,7 @@ INCLUDES += $(USEMODULE_INCLUDES_:%=-I%)
119113

120114
# The `clean` needs to be serialized before everything else.
121115
ifneq (, $(filter clean, $(MAKECMDGOALS)))
122-
$(OBJ) $(BASELIBS) $(USEPKG:%=$(RIOTBASE)/pkg/%/Makefile.include): clean
116+
all $(BASELIBS) $(USEPKG:%=$(RIOTBASE)/pkg/%/Makefile.include): clean
123117
endif
124118

125119
# include Makefile.includes for packages in $(USEPKG)
@@ -130,14 +124,6 @@ $(RIOTBASE)/pkg/%/Makefile.include::
130124

131125
-include $(USEPKG:%=$(RIOTBASE)/pkg/%/Makefile.include)
132126

133-
# pull in dependency info for *existing* .o files
134-
-include $(OBJ:.o=.d)
135-
136-
$(BINDIR)$(APPLICATION)/%.o: %.c $(APPDEPS) $(USEPKG:%=${BINDIR}%.a)
137-
@echo; echo "Compiling.... $*.c"; echo
138-
$(AD)mkdir -p "$(dir $@)"
139-
$(AD)$(CC) $(CFLAGS) $(INCLUDES) -c "$<" -o "$@"
140-
141127
$(USEPKG:%=${BINDIR}%.a):
142128
@mkdir -p ${BINDIR}
143129
"$(MAKE)" -C $(RIOTBASE)/pkg/$(patsubst ${BINDIR}%.a,%,$@)

0 commit comments

Comments
 (0)