Skip to content

Commit 7e817cf

Browse files
arch/*/src/Makefile: Avoid uncessary relinking of the nuttx binary.
The goal is to only execute recipes when there is an actual change in the prerequisites. There are several issues which cause the nuttx binary target to be re-made every time the top level make is run. 1. Previously the target nuttx$(EXEEXT), was used, but make resolved this in the relative directory make -C $(ARCH_SRC), and couldn’t find it (need an absolute path: `$(TOPDIR)/..). 2. The .tmp prerequisite for nuttx was always deleted 3. libboard's recipe had a sub-make which may or may not update that target. This was a phony target, and was therefore always considered out of date. These issues were causing the nuttx recipe to be run every make, which was hiding some missing prerequisites: 1. the .config is a prerequisite for the .tmp target 2. libapps.a (and other linklibs) are pre-requisites for nuttx Changes: The changes are only in the build system, and only for arm. Track nuttx$(EXEEXT) via vpath so Make knows when it's already up to date without an explicit path. Add $(TOPDIR)/.config as a dependency to the linker script preprocessing so config changes trigger re-preprocessing. Keep the .tmp linker script on disk (clean already removes it) so timestamp-based dependency checking works across builds. Use FORCE pattern for board/libboard to ensure it's always checked but use the actual library file as the link dependency so nuttx is only re-linked when library content changes. Add staging libs as dependency to nuttx link rule so changed app libs trigger re-link. Signed-off-by: Liam Hickey <williamhickey@geotab.com>
1 parent 4401b49 commit 7e817cf

File tree

8 files changed

+58
-37
lines changed

8 files changed

+58
-37
lines changed

arch/arm/src/Makefile

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,8 @@ VPATH += chip
161161
VPATH += common
162162
VPATH += $(ARCH_SUBDIR)
163163

164+
vpath nuttx$(EXEEXT) $(TOPDIR)
165+
164166
ifeq ($(CONFIG_ARM_TOOLCHAIN_IAR),y)
165167
VPATH += common$(DELIM)iar
166168
else # ifeq ($(CONFIG_ARCH_TOOLCHAIN_GNU),y)
@@ -170,8 +172,6 @@ endif
170172

171173
all: $(HEAD_OBJ) $(BIN)
172174

173-
.PHONY: board$(DELIM)libboard$(LIBEXT)
174-
175175
$(AOBJS) $(UAOBJS) $(HEAD_OBJ): %$(OBJEXT): %.S
176176
$(call ASSEMBLE, $<, $@)
177177

@@ -192,9 +192,13 @@ endif
192192
$(KBIN): $(OBJS)
193193
$(call ARCHIVE, $@, $(OBJS))
194194

195-
board$(DELIM)libboard$(LIBEXT):
195+
board$(DELIM)libboard$(LIBEXT): FORCE
196196
$(Q) $(MAKE) -C board libboard$(LIBEXT) EXTRAFLAGS="$(EXTRAFLAGS)"
197197

198+
.PHONY: FORCE
199+
200+
FORCE:
201+
198202
# When multiple linking, these two additional linking objects will be included
199203

200204
ifeq ($(CONFIG_MM_KASAN_GLOBAL),y)
@@ -218,10 +222,10 @@ define LINK_ALLSYMS_KASAN
218222
$(LDSTARTGROUP) $(LDLIBS) $(EXTRA_LIBS) $(LDENDGROUP)
219223
endef
220224

221-
$(addsuffix .tmp,$(ARCHSCRIPT)): $(ARCHSCRIPT)
225+
$(addsuffix .tmp,$(ARCHSCRIPT)): $(ARCHSCRIPT) $(TOPDIR)$(DELIM).config
222226
$(call PREPROCESS, $(patsubst %.tmp,%,$@), $@)
223227

224-
nuttx$(EXEEXT): $(HEAD_OBJ) board$(DELIM)libboard$(LIBEXT) $(addsuffix .tmp,$(ARCHSCRIPT))
228+
nuttx$(EXEEXT): $(HEAD_OBJ) board$(DELIM)libboard$(LIBEXT) $(addsuffix .tmp,$(ARCHSCRIPT)) $(addprefix $(TOPDIR)$(DELIM)staging$(DELIM),$(LINKLIBS))
225229
$(Q) echo "LD: nuttx"
226230
ifeq ($(CONFIG_ALLSYMS)$(CONFIG_MM_KASAN_GLOBAL),)
227231
$(Q) $(LD) $(LDFLAGS) $(LIBPATHS) $(EXTRA_LIBPATHS) \
@@ -242,7 +246,6 @@ ifneq ($(CONFIG_WINDOWS_NATIVE),y)
242246
grep -v '\(compiled\)\|\(\$(OBJEXT)$$\)\|\( [aUw] \)\|\(\.\.ng$$\)\|\(LASH[RL]DI\)' | \
243247
sort > $(TOPDIR)$(DELIM)System.map
244248
endif
245-
$(Q) $(call DELFILE, $(addsuffix .tmp,$(ARCHSCRIPT)))
246249

247250
# This is part of the top-level export target
248251
# Note that there may not be a head object if layout is handled

arch/arm64/src/Makefile

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -132,9 +132,9 @@ VPATH += chip
132132
VPATH += common
133133
VPATH += $(ARCH_SUBDIR)
134134

135-
all: $(HEAD_OBJ) $(BIN)
135+
vpath nuttx$(EXEEXT) $(TOPDIR)
136136

137-
.PHONY: board$(DELIM)libboard$(LIBEXT)
137+
all: $(HEAD_OBJ) $(BIN)
138138

139139
$(AOBJS) $(UAOBJS) $(HEAD_OBJ): %$(OBJEXT): %.S
140140
$(call ASSEMBLE, $<, $@)
@@ -156,9 +156,13 @@ endif
156156
$(KBIN): $(OBJS)
157157
$(call ARCHIVE, $@, $(OBJS))
158158

159-
board$(DELIM)libboard$(LIBEXT):
159+
board$(DELIM)libboard$(LIBEXT): FORCE
160160
$(Q) $(MAKE) -C board libboard$(LIBEXT) EXTRAFLAGS="$(EXTRAFLAGS)"
161161

162+
.PHONY: FORCE
163+
164+
FORCE:
165+
162166
# When multiple linking, these two additional linking objects will be included
163167

164168
ifeq ($(CONFIG_MM_KASAN_GLOBAL),y)
@@ -182,10 +186,10 @@ define LINK_ALLSYMS_KASAN
182186
$(LDSTARTGROUP) $(LDLIBS) $(EXTRA_LIBS) $(LDENDGROUP)
183187
endef
184188

185-
$(addsuffix .tmp,$(ARCHSCRIPT)): $(ARCHSCRIPT)
189+
$(addsuffix .tmp,$(ARCHSCRIPT)): $(ARCHSCRIPT) $(TOPDIR)$(DELIM).config
186190
$(call PREPROCESS, $(patsubst %.tmp,%,$@), $@)
187191

188-
nuttx$(EXEEXT): $(HEAD_OBJ) board$(DELIM)libboard$(LIBEXT) $(addsuffix .tmp,$(ARCHSCRIPT))
192+
nuttx$(EXEEXT): $(HEAD_OBJ) board$(DELIM)libboard$(LIBEXT) $(addsuffix .tmp,$(ARCHSCRIPT)) $(addprefix $(TOPDIR)$(DELIM)staging$(DELIM),$(LINKLIBS))
189193
$(Q) echo "LD: nuttx"
190194
ifeq ($(CONFIG_ALLSYMS)$(CONFIG_MM_KASAN_GLOBAL),)
191195
$(Q) $(LD) --entry=__start $(LDFLAGS) $(LIBPATHS) $(EXTRA_LIBPATHS) \
@@ -206,7 +210,6 @@ ifneq ($(CONFIG_WINDOWS_NATIVE),y)
206210
grep -v '\(compiled\)\|\(\$(OBJEXT)$$\)\|\( [aUw] \)\|\(\.\.ng$$\)\|\(LASH[RL]DI\)' | \
207211
sort > $(TOPDIR)$(DELIM)System.map
208212
endif
209-
$(Q) $(call DELFILE, $(addsuffix .tmp,$(ARCHSCRIPT)))
210213

211214
# This is part of the top-level export target
212215
# Note that there may not be a head object if layout is handled

arch/risc-v/src/Makefile

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -133,9 +133,9 @@ VPATH += $(SBI_DIR)
133133
VPATH += $(ARCH_SUBDIR)
134134
VPATH += $(CHIP_DIR)
135135

136-
all: $(HEAD_OBJ) $(BIN)
136+
vpath nuttx$(EXEEXT) $(TOPDIR)
137137

138-
.PHONY: board/libboard$(LIBEXT)
138+
all: $(HEAD_OBJ) $(BIN)
139139

140140
$(AOBJS) $(UAOBJS) $(HEAD_OBJ): %$(OBJEXT): %.S
141141
$(call ASSEMBLE, $<, $@)
@@ -157,9 +157,13 @@ endif
157157
$(KBIN): $(OBJS)
158158
$(call ARCHIVE, $@, $(OBJS))
159159

160-
board/libboard$(LIBEXT):
160+
board/libboard$(LIBEXT): FORCE
161161
$(Q) $(MAKE) -C board libboard$(LIBEXT) EXTRAFLAGS="$(EXTRAFLAGS)"
162162

163+
.PHONY: FORCE
164+
165+
FORCE:
166+
163167
# When multiple linking, these two additional linking objects will be included
164168

165169
ifeq ($(CONFIG_MM_KASAN_GLOBAL),y)
@@ -183,10 +187,10 @@ define LINK_ALLSYMS_KASAN
183187
$(LDSTARTGROUP) $(LDLIBS) $(EXTRA_LIBS) $(LDENDGROUP)
184188
endef
185189

186-
$(addsuffix .tmp,$(ARCHSCRIPT)): $(ARCHSCRIPT)
190+
$(addsuffix .tmp,$(ARCHSCRIPT)): $(ARCHSCRIPT) $(TOPDIR)$(DELIM).config
187191
$(call PREPROCESS, $(patsubst %.tmp,%,$@), $@)
188192

189-
nuttx$(EXEEXT): $(HEAD_OBJ) board/libboard$(LIBEXT) $(addsuffix .tmp,$(ARCHSCRIPT))
193+
nuttx$(EXEEXT): $(HEAD_OBJ) board/libboard$(LIBEXT) $(addsuffix .tmp,$(ARCHSCRIPT)) $(addprefix $(TOPDIR)$(DELIM)staging$(DELIM),$(LINKLIBS))
190194
$(Q) echo "LD: nuttx"
191195
ifeq ($(CONFIG_ALLSYMS)$(CONFIG_MM_KASAN_GLOBAL),)
192196
$(Q) $(LD) $(LDENTRY) $(LDFLAGS) $(LIBPATHS) $(EXTRA_LIBPATHS) \
@@ -207,7 +211,6 @@ ifneq ($(CONFIG_WINDOWS_NATIVE),y)
207211
grep -v '\(compiled\)\|\(\$(OBJEXT)$$\)\|\( [aUw] \)\|\(\.\.ng$$\)\|\(LASH[RL]DI\)' | \
208212
sort > $(TOPDIR)/System.map
209213
endif
210-
$(Q) $(call DELFILE, $(addsuffix .tmp,$(ARCHSCRIPT)))
211214

212215
# This is part of the top-level export target
213216
# Note that there may not be a head object if layout is handled

arch/sim/src/Makefile

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,8 @@ else
106106
endif
107107
DEPPATH = $(patsubst %,--dep-path %,$(subst :, ,$(VPATH)))
108108

109+
vpath nuttx$(EXEEXT) $(TOPDIR)
110+
109111
CFLAGS += -fvisibility=default
110112
HOSTCFLAGS = $(ARCHWARNINGS) $(ARCHOPTIMIZATION) \
111113
$(ARCHCFLAGS) $(HOSTINCLUDES) $(EXTRAFLAGS) -D__SIM__ \
@@ -372,7 +374,7 @@ RELLIBS += -lboard
372374

373375
all: sim_head$(OBJEXT) libarch$(LIBEXT)
374376

375-
.PHONY: export_startup clean distclean cleanrel depend board/libboard$(LIBEXT)
377+
.PHONY: export_startup clean distclean cleanrel depend FORCE
376378

377379
$(AOBJS): %$(OBJEXT): %.S
378380
$(call ASSEMBLE, $<, $@)
@@ -394,9 +396,11 @@ libarch$(LIBEXT): $(NUTTXOBJS)
394396
# the simulation. However, this is a good place to keep parts of the simulation
395397
# that are not hardware-related.
396398

397-
board/libboard$(LIBEXT):
399+
board/libboard$(LIBEXT): FORCE
398400
$(Q) $(MAKE) -C board libboard$(LIBEXT) EXTRAFLAGS="$(EXTRAFLAGS)"
399401

402+
FORCE:
403+
400404
# A partially linked object containing only NuttX code (no interface to host OS)
401405
# Change the names of most symbols that conflict with libc symbols.
402406
# Generate the final NuttX binary by linking the host-specific objects with the NuttX

arch/x86_64/src/Makefile

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -105,9 +105,9 @@ endif
105105

106106
VPATH = chip:common:$(ARCH_SUBDIR)
107107

108-
all: libarch$(LIBEXT)
108+
vpath nuttx$(EXEEXT) $(TOPDIR)
109109

110-
.PHONY: board/libboard$(LIBEXT)
110+
all: libarch$(LIBEXT)
111111

112112
$(AOBJS): %$(OBJEXT): %.S
113113
$(call ASSEMBLE, $<, $@)
@@ -129,9 +129,13 @@ endif
129129
$(KBIN): $(OBJS)
130130
$(call ARCHIVE, $@, $(OBJS))
131131

132-
board/libboard$(LIBEXT):
132+
board/libboard$(LIBEXT): FORCE
133133
$(Q) $(MAKE) -C board libboard$(LIBEXT) EXTRAFLAGS="$(EXTRAFLAGS)"
134134

135+
.PHONY: FORCE
136+
137+
FORCE:
138+
135139
ifeq ($(CONFIG_ALLSYMS),y)
136140
EXTRA_LIBS += allsyms$(OBJEXT)
137141
endif
@@ -154,10 +158,10 @@ define LINK_ALLSYMS_KASAN
154158
$(LDSTARTGROUP) $(EXTRA_LIBS) --no-relax $(LDLIBS) $(LDENDGROUP)
155159
endef
156160

157-
$(addsuffix .tmp,$(ARCHSCRIPT)): $(ARCHSCRIPT)
161+
$(addsuffix .tmp,$(ARCHSCRIPT)): $(ARCHSCRIPT) $(TOPDIR)$(DELIM).config
158162
$(call PREPROCESS, $(patsubst %.tmp,%,$@), $@)
159163

160-
nuttx$(EXEEXT): $(HEAD_OBJ) board/libboard$(LIBEXT) $(addsuffix .tmp,$(ARCHSCRIPT))
164+
nuttx$(EXEEXT): $(HEAD_OBJ) board/libboard$(LIBEXT) $(addsuffix .tmp,$(ARCHSCRIPT)) $(addprefix $(TOPDIR)$(DELIM)staging$(DELIM),$(LINKLIBS))
161165
@echo "LD: nuttx$(EXEEXT)"
162166

163167
ifeq ($(CONFIG_ALLSYMS)$(CONFIG_MM_KASAN_GLOBAL),)
@@ -170,7 +174,6 @@ else
170174
$(Q) $(call LINK_ALLSYMS_KASAN)
171175
$(Q) $(call LINK_ALLSYMS_KASAN)
172176
endif
173-
$(Q) $(call DELFILE, $(addsuffix .tmp,$(ARCHSCRIPT)))
174177

175178
ifneq ($(CONFIG_WINDOWS_NATIVE),y)
176179
$(Q) $(NM) $(NUTTX) | \
@@ -217,6 +220,7 @@ clean:
217220
ifeq ($(BOARDMAKE),y)
218221
$(Q) $(MAKE) -C board clean
219222
endif
223+
$(call DELFILE, $(addsuffix .tmp,$(ARCHSCRIPT)))
220224
$(call DELFILE, libarch$(LIBEXT))
221225
$(call CLEAN)
222226

arch/xtensa/src/Makefile

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -135,9 +135,9 @@ VPATH += common/espressif
135135
VPATH += $(ARCH_SUBDIR)
136136
VPATH += $(CHIP_DIR)
137137

138-
all: $(STARTUP_OBJS) libarch$(LIBEXT)
138+
vpath nuttx$(EXEEXT) $(TOPDIR)
139139

140-
.PHONY: board/libboard$(LIBEXT)
140+
all: $(STARTUP_OBJS) libarch$(LIBEXT)
141141

142142
$(AOBJS) $(UAOBJS) $(HEAD_AOBJ): %$(OBJEXT): %.S
143143
$(call ASSEMBLE, $<, $@)
@@ -159,9 +159,13 @@ endif
159159
$(KBIN): $(OBJS)
160160
$(call ARCHIVE, $@, $(OBJS))
161161

162-
board/libboard$(LIBEXT):
162+
board/libboard$(LIBEXT): FORCE
163163
$(Q) $(MAKE) -C board libboard$(LIBEXT) EXTRAFLAGS="$(EXTRAFLAGS)"
164164

165+
.PHONY: FORCE
166+
167+
FORCE:
168+
165169
define LINK_ALLSYMS
166170
$(Q) $(TOPDIR)/tools/mkallsyms.py $(NUTTX) allsyms.tmp --orderbyname $(CONFIG_SYMTAB_ORDEREDBYNAME)
167171
$(Q) $(call COMPILE, allsyms.tmp, allsyms$(OBJEXT), -x c)
@@ -171,10 +175,10 @@ define LINK_ALLSYMS
171175
$(Q) $(call DELFILE, allsyms.tmp allsyms$(OBJEXT))
172176
endef
173177

174-
$(addsuffix .tmp,$(ARCHSCRIPT)): $(ARCHSCRIPT)
178+
$(addsuffix .tmp,$(ARCHSCRIPT)): $(ARCHSCRIPT) $(TOPDIR)$(DELIM).config
175179
$(call PREPROCESS, $(patsubst %.tmp,%,$@), $@)
176180

177-
nuttx$(EXEEXT): $(STARTUP_OBJS) board/libboard$(LIBEXT) $(addsuffix .tmp,$(ARCHSCRIPT))
181+
nuttx$(EXEEXT): $(STARTUP_OBJS) board/libboard$(LIBEXT) $(addsuffix .tmp,$(ARCHSCRIPT)) $(addprefix $(TOPDIR)$(DELIM)staging$(DELIM),$(LINKLIBS))
178182
$(Q) echo "LD: nuttx"
179183
ifneq ($(CONFIG_ALLSYMS),y)
180184
$(Q) $(LD) --entry=__start $(LDFLAGS) $(LIBPATHS) $(EXTRA_LIBPATHS) \
@@ -193,7 +197,6 @@ ifneq ($(CONFIG_WINDOWS_NATIVE),y)
193197
grep -v '\(compiled\)\|\(\$(OBJEXT)$$\)\|\( [aUw] \)\|\(\.\.ng$$\)\|\(LASH[RL]DI\)' | \
194198
sort > $(TOPDIR)/System.map
195199
endif
196-
$(Q) $(call DELFILE, $(addsuffix .tmp,$(ARCHSCRIPT)))
197200

198201
# This is part of the top-level export target
199202

libs/libc/misc/Make.defs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -91,9 +91,9 @@ endif
9191
# To ensure uname information is newest,
9292
# add lib_utsname.o to phony target for force rebuild
9393

94-
#if !defined(CONFIG_LIBC_UNAME_DISABLE_TIMESTAMP)
94+
ifeq ($(CONFIG_LIBC_UNAME_DISABLE_TIMESTAMP),)
9595
.PHONY: bin$(DELIM)lib_utsname$(OBJEXT) kbin$(DELIM)lib_utsname$(OBJEXT)
96-
#endif
96+
endif
9797

9898
# Add the misc directory to the build
9999

tools/Unix.mk

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -266,11 +266,12 @@ tools/mkconfig$(HOSTEXEEXT): prebuild
266266
include/nuttx/config.h: $(TOPDIR)/.config tools/mkconfig$(HOSTEXEEXT)
267267
$(Q) grep -v "CONFIG_BASE_DEFCONFIG" "$(TOPDIR)/.config" > "$(TOPDIR)/.config.tmp"
268268
$(Q) if ! cmp -s "$(TOPDIR)/.config.tmp" "$(TOPDIR)/.config.orig" ; then \
269-
sed -i.bak -e "/CONFIG_BASE_DEFCONFIG/ { /-dirty/! s/\"$$/-dirty\"/; }" "$(TOPDIR)/.config" ; \
269+
sed -e "/CONFIG_BASE_DEFCONFIG/ { /-dirty/! s/\"$$/-dirty\"/; }" "$(TOPDIR)/.config" > "$(TOPDIR)/.config.dirty" ; \
270270
else \
271-
sed -i.bak "s/-dirty//g" "$(TOPDIR)/.config"; \
271+
sed "s/-dirty//g" "$(TOPDIR)/.config" > "$(TOPDIR)/.config.dirty"; \
272272
fi
273-
$(Q) rm -f "$(TOPDIR)/.config.tmp" "$(TOPDIR)/.config.bak"
273+
$(Q) rm -f "$(TOPDIR)/.config.tmp"
274+
$(Q) $(call TESTANDREPLACEFILE, $(TOPDIR)/.config.dirty, $(TOPDIR)/.config)
274275
$(Q) tools/mkconfig $(TOPDIR) > $@.tmp
275276
$(Q) $(call TESTANDREPLACEFILE, $@.tmp, $@)
276277

0 commit comments

Comments
 (0)