From f64de068b37e0b2c7d4ce04d82de8e72e869f143 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Ga=C3=ABtan=20Harter?= <gaetan.harter@fu-berlin.de>
Date: Mon, 26 Mar 2018 13:54:25 +0200
Subject: [PATCH] Makefile.include: separate link in subtargets

* Add ELFFILE, HEXFILE, print-size targets

$(BINDIR)/$(APPLICATION_MODULE).a target builds libraries in RIOT and in DIRS.

Uses a FORCE phony target dependency to force rebuilding but still let
`make` use the file modification timestamps
---
 Makefile.include | 33 ++++++++++++++++++++++++++-------
 1 file changed, 26 insertions(+), 7 deletions(-)

diff --git a/Makefile.include b/Makefile.include
index f91a494908..b08d6fb7ed 100644
--- a/Makefile.include
+++ b/Makefile.include
@@ -308,7 +308,12 @@ BASELIBS += $(BINDIR)/$(APPLICATION_MODULE).a
 BASELIBS += $(APPDEPS)
 
 .PHONY: all link clean flash flash-only term doc debug debug-server reset objdump help info-modules
+.PHONY: print-size
 .PHONY: ..in-docker-container
+# Target can depend on FORCE to always rebuild but still let make use file
+# modification timestamp (contrary to .PHONY).
+# Use it for goals that may keep outputs unchanged when executed.
+.PHONY: FORCE
 
 ELFFILE ?= $(BINDIR)/$(APPLICATION).elf
 HEXFILE ?= $(ELFFILE:.elf=.hex)
@@ -322,6 +327,7 @@ LINKFLAGPREFIX ?= -Wl,
 DIRS += $(EXTERNAL_MODULE_DIRS)
 
 # Linker rule
+$(ELFFILE): FORCE
 ifeq ($(BUILDOSXNATIVE),1)
   _LINK = $(if $(CPPMIX),$(LINKXX),$(LINK)) $(UNDEF) $$(find $(BASELIBS) -size +8c) $(LINKFLAGS) $(LINKFLAGPREFIX)-no_pie
 else
@@ -331,14 +337,27 @@ endif # BUILDOSXNATIVE
 ifeq ($(BUILD_IN_DOCKER),1)
 link: ..in-docker-container
 else
-## make script for your application. Build RIOT-base here!
-link: ..compiler-check ..build-message $(RIOTBUILD_CONFIG_HEADER_C) $(USEPKG:%=$(BINDIR)/%.a) $(APPDEPS)
-	$(Q)DIRS="$(DIRS)" "$(MAKE)" -C $(APPDIR) -f $(RIOTMAKE)/application.inc.mk
 ifeq (,$(RIOTNOLINK))
-	$(Q)$(_LINK) -o $(ELFFILE)
-	$(Q)$(SIZE) $(ELFFILE)
-	$(Q)$(OBJCOPY) $(OFLAGS) $(ELFFILE) $(HEXFILE)
-endif
+link: ..compiler-check ..build-message $(ELFFILE) $(HEXFILE) print-size
+else
+link: ..compiler-check ..build-message $(BASELIBS)
+endif # RIOTNOLINK
+
+$(ELFFILE): $(BASELIBS)
+	$(Q)$(_LINK) -o $@
+
+# All modules are built by application.inc.mk makefile
+$(BINDIR)/$(APPLICATION_MODULE).a: $(RIOTBUILD_CONFIG_HEADER_C) $(USEPKG:%=$(BINDIR)/%.a) $(APPDEPS)
+	$(Q)DIRS="$(DIRS)" "$(MAKE)" -C $(APPDIR) -f $(RIOTMAKE)/application.inc.mk
+$(BINDIR)/$(APPLICATION_MODULE).a: FORCE
+
+# 'print-size' triggers a rebuild. Use 'info-buildsize' if you do not need to rebuild.
+print-size: $(ELFFILE)
+	$(Q)$(SIZE) $<
+
+$(HEXFILE): $(ELFFILE)
+	$(Q)$(OBJCOPY) $(OFLAGS) $< $@
+
 endif # BUILD_IN_DOCKER
 
 # Check given command is available in the path
-- 
GitLab