Skip to content

Commit b2c8855

Browse files
committed
kbuild: update modules.order only when contained modules are updated
Make modules.order depend on $(obj-m), and use if_changed to build it. This will avoid unneeded update of modules.order, which will be useful to optimize the modpost stage. Currently, the second pass of modpost is always invoked. By checking the timestamp of modules.order, we can avoid the unneeded modpost. Signed-off-by: Masahiro Yamada <[email protected]>
1 parent f0d50ca commit b2c8855

File tree

3 files changed

+38
-24
lines changed

3 files changed

+38
-24
lines changed

Makefile

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1066,6 +1066,10 @@ vmlinux-alldirs := $(sort $(vmlinux-dirs) Documentation \
10661066
$(patsubst %/,%,$(filter %/, $(core-) \
10671067
$(drivers-) $(libs-))))
10681068

1069+
subdir-modorder := $(addsuffix modules.order,$(filter %/, \
1070+
$(core-y) $(core-m) $(libs-y) $(libs-m) \
1071+
$(drivers-y) $(drivers-m)))
1072+
10691073
build-dirs := $(vmlinux-dirs)
10701074
clean-dirs := $(vmlinux-alldirs)
10711075

@@ -1124,7 +1128,7 @@ targets := vmlinux
11241128

11251129
# The actual objects are generated when descending,
11261130
# make sure no implicit rule kicks in
1127-
$(sort $(vmlinux-deps)): descend ;
1131+
$(sort $(vmlinux-deps) $(subdir-modorder)): descend ;
11281132

11291133
filechk_kernel.release = \
11301134
echo "$(KERNELVERSION)$$($(CONFIG_SHELL) $(srctree)/scripts/setlocalversion $(srctree))"
@@ -1345,8 +1349,12 @@ PHONY += modules_check
13451349
modules_check: modules.order
13461350
$(Q)$(CONFIG_SHELL) $(srctree)/scripts/modules-check.sh $<
13471351

1348-
modules.order: descend
1349-
$(Q)$(AWK) '!x[$$0]++' $(addsuffix /$@, $(build-dirs)) > $@
1352+
cmd_modules_order = $(AWK) '!x[$$0]++' $(real-prereqs) > $@
1353+
1354+
modules.order: $(subdir-modorder) FORCE
1355+
$(call if_changed,modules_order)
1356+
1357+
targets += modules.order
13501358

13511359
# Target to prepare building external modules
13521360
PHONY += modules_prepare

scripts/Makefile.build

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ endif
7171

7272
# subdir-builtin and subdir-modorder may contain duplications. Use $(sort ...)
7373
subdir-builtin := $(sort $(filter %/built-in.a, $(real-obj-y)))
74-
subdir-modorder := $(sort $(filter %/modules.order, $(modorder)))
74+
subdir-modorder := $(sort $(filter %/modules.order, $(obj-m)))
7575

7676
targets-for-builtin := $(extra-y)
7777

@@ -83,8 +83,7 @@ ifdef need-builtin
8383
targets-for-builtin += $(obj)/built-in.a
8484
endif
8585

86-
targets-for-modules := $(obj-m)
87-
targets-for-modules += $(patsubst %.o, %.mod, $(obj-m))
86+
targets-for-modules := $(patsubst %.o, %.mod, $(filter %.o, $(obj-m)))
8887

8988
ifdef need-modorder
9089
targets-for-modules += $(obj)/modules.order
@@ -361,8 +360,9 @@ endif
361360
$(obj)/%.o: $(src)/%.S $(objtool_dep) FORCE
362361
$(call if_changed_rule,as_o_S)
363362

364-
targets += $(filter-out $(subdir-builtin), $(real-obj-y)) $(real-obj-m) $(lib-y)
365-
targets += $(always-y) $(MAKECMDGOALS)
363+
targets += $(filter-out $(subdir-builtin), $(real-obj-y))
364+
targets += $(filter-out $(subdir-modorder), $(real-obj-m))
365+
targets += $(lib-y) $(always-y) $(MAKECMDGOALS)
366366

367367
# Linker scripts preprocessor (.lds.S -> .lds)
368368
# ---------------------------------------------------------------------------
@@ -404,11 +404,16 @@ $(obj)/built-in.a: $(real-obj-y) FORCE
404404
#
405405
# Create commands to either record .ko file or cat modules.order from
406406
# a subdirectory
407-
$(obj)/modules.order: $(subdir-modorder) FORCE
408-
$(Q){ $(foreach m, $(modorder), \
409-
$(if $(filter $^, $m), cat $m, echo $m);) :; } \
407+
# Add $(obj-m) as the prerequisite to avoid updating the timestamp of
408+
# modules.order unless contained modules are updated.
409+
410+
cmd_modules_order = { $(foreach m, $(real-prereqs), \
411+
$(if $(filter %/modules.order, $m), cat $m, echo $(patsubst %.o,%.ko,$m));) :; } \
410412
| $(AWK) '!x[$$0]++' - > $@
411413

414+
$(obj)/modules.order: $(obj-m) FORCE
415+
$(call if_changed,modules_order)
416+
412417
#
413418
# Rule to compile a set of .o files into one .a file (with symbol table)
414419
#

scripts/Makefile.lib

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -32,27 +32,29 @@ obj-m := $(filter-out $(obj-y),$(obj-m))
3232
# Filter out objects already built-in
3333
lib-y := $(filter-out $(obj-y), $(sort $(lib-y) $(lib-m)))
3434

35-
# Determine modorder.
36-
# Unfortunately, we don't have information about ordering between -y
37-
# and -m subdirs. Just put -y's first.
38-
ifdef need-modorder
39-
modorder := $(patsubst %/,%/modules.order, $(filter %/, $(obj-y)) $(obj-m:.o=.ko))
40-
endif
41-
4235
# Subdirectories we need to descend into
4336
subdir-ym := $(sort $(subdir-y) $(subdir-m) \
4437
$(patsubst %/,%, $(filter %/, $(obj-y) $(obj-m))))
4538

46-
# Handle objects in subdirs
47-
# ---------------------------------------------------------------------------
48-
# o if we encounter foo/ in $(obj-y), replace it by foo/built-in.a
49-
# o if we encounter foo/ in $(obj-m), remove it from $(obj-m)
39+
# Handle objects in subdirs:
40+
# - If we encounter foo/ in $(obj-y), replace it by foo/built-in.a and
41+
# foo/modules.order
42+
# - If we encounter foo/ in $(obj-m), replace it by foo/modules.order
43+
#
44+
# Generate modules.order to determine modorder. Unfortunately, we don't have
45+
# information about ordering between -y and -m subdirs. Just put -y's first.
46+
47+
ifdef need-modorder
48+
obj-m := $(patsubst %/,%/modules.order, $(filter %/, $(obj-y)) $(obj-m))
49+
else
50+
obj-m := $(filter-out %/, $(obj-m))
51+
endif
52+
5053
ifdef need-builtin
5154
obj-y := $(patsubst %/, %/built-in.a, $(obj-y))
5255
else
5356
obj-y := $(filter-out %/, $(obj-y))
5457
endif
55-
obj-m := $(filter-out %/, $(obj-m))
5658

5759
# If $(foo-objs), $(foo-y), $(foo-m), or $(foo-) exists, foo.o is a composite object
5860
multi-used-y := $(sort $(foreach m,$(obj-y), $(if $(strip $($(m:.o=-objs)) $($(m:.o=-y)) $($(m:.o=-))), $(m))))
@@ -81,7 +83,6 @@ endif
8183
extra-y := $(addprefix $(obj)/,$(extra-y))
8284
always-y := $(addprefix $(obj)/,$(always-y))
8385
targets := $(addprefix $(obj)/,$(targets))
84-
modorder := $(addprefix $(obj)/,$(modorder))
8586
obj-m := $(addprefix $(obj)/,$(obj-m))
8687
lib-y := $(addprefix $(obj)/,$(lib-y))
8788
real-obj-y := $(addprefix $(obj)/,$(real-obj-y))

0 commit comments

Comments
 (0)