@@ -37,18 +37,88 @@ include $(srctree)/scripts/Makefile.compiler
3737include $(kbuild-file)
3838include $(srctree)/scripts/Makefile.lib
3939
40- # Do not include hostprogs rules unless needed.
41- # $(sort ...) is used here to remove duplicated words and excessive spaces.
42- hostprogs := $(sort $(hostprogs))
43- ifneq ($(hostprogs),)
44- include $(srctree)/scripts/Makefile.host
40+ # flags that take effect in current and sub directories
41+ KBUILD_AFLAGS += $(subdir-asflags-y)
42+ KBUILD_CFLAGS += $(subdir-ccflags-y)
43+ KBUILD_RUSTFLAGS += $(subdir-rustflags-y)
44+
45+ # Figure out what we need to build from the various variables
46+ # ===========================================================================
47+
48+ # When an object is listed to be built compiled-in and modular,
49+ # only build the compiled-in version
50+ obj-m := $(filter-out $(obj-y),$(obj-m))
51+
52+ # Libraries are always collected in one lib file.
53+ # Filter out objects already built-in
54+ lib-y := $(filter-out $(obj-y), $(sort $(lib-y) $(lib-m)))
55+
56+ # Subdirectories we need to descend into
57+ subdir-ym := $(sort $(subdir-y) $(subdir-m) \
58+ $(patsubst %/,%, $(filter %/, $(obj-y) $(obj-m))))
59+
60+ # Handle objects in subdirs:
61+ # - If we encounter foo/ in $(obj-y), replace it by foo/built-in.a and
62+ # foo/modules.order
63+ # - If we encounter foo/ in $(obj-m), replace it by foo/modules.order
64+ #
65+ # Generate modules.order to determine modorder. Unfortunately, we don't have
66+ # information about ordering between -y and -m subdirs. Just put -y's first.
67+
68+ ifdef need-modorder
69+ obj-m := $(patsubst %/,%/modules.order, $(filter %/, $(obj-y)) $(obj-m))
70+ else
71+ obj-m := $(filter-out %/, $(obj-m))
4572endif
4673
47- # Do not include userprogs rules unless needed.
48- # $(sort ...) is used here to remove duplicated words and excessive spaces.
49- userprogs := $(sort $(userprogs))
50- ifneq ($(userprogs),)
51- include $(srctree)/scripts/Makefile.userprogs
74+ ifdef need-builtin
75+ obj-y := $(patsubst %/, %/built-in.a, $(obj-y))
76+ else
77+ obj-y := $(filter-out %/, $(obj-y))
78+ endif
79+
80+ # Expand $(foo-objs) $(foo-y) etc. by replacing their individuals
81+ suffix-search = $(strip $(foreach s, $3, $($(1:%$(strip $2)=%$s))))
82+ # List composite targets that are constructed by combining other targets
83+ multi-search = $(sort $(foreach m, $1, $(if $(call suffix-search, $m, $2, $3 -), $m)))
84+ # List primitive targets that are compiled from source files
85+ real-search = $(foreach m, $1, $(if $(call suffix-search, $m, $2, $3 -), $(call suffix-search, $m, $2, $3), $m))
86+
87+ # If $(foo-objs), $(foo-y), $(foo-m), or $(foo-) exists, foo.o is a composite object
88+ multi-obj-y := $(call multi-search, $(obj-y), .o, -objs -y)
89+ multi-obj-m := $(call multi-search, $(obj-m), .o, -objs -y -m)
90+ multi-obj-ym := $(multi-obj-y) $(multi-obj-m)
91+
92+ # Replace multi-part objects by their individual parts,
93+ # including built-in.a from subdirectories
94+ real-obj-y := $(call real-search, $(obj-y), .o, -objs -y)
95+ real-obj-m := $(call real-search, $(obj-m), .o, -objs -y -m)
96+
97+ always-y += $(always-m)
98+
99+ # hostprogs-always-y += foo
100+ # ... is a shorthand for
101+ # hostprogs += foo
102+ # always-y += foo
103+ hostprogs += $(hostprogs-always-y) $(hostprogs-always-m)
104+ always-y += $(hostprogs-always-y) $(hostprogs-always-m)
105+
106+ # userprogs-always-y is likewise.
107+ userprogs += $(userprogs-always-y) $(userprogs-always-m)
108+ always-y += $(userprogs-always-y) $(userprogs-always-m)
109+
110+ # Add subdir path
111+
112+ ifneq ($(obj),.)
113+ extra-y := $(addprefix $(obj)/, $(extra-y))
114+ always-y := $(addprefix $(obj)/, $(always-y))
115+ targets := $(addprefix $(obj)/, $(targets))
116+ obj-m := $(addprefix $(obj)/, $(obj-m))
117+ lib-y := $(addprefix $(obj)/, $(lib-y))
118+ real-obj-y := $(addprefix $(obj)/, $(real-obj-y))
119+ real-obj-m := $(addprefix $(obj)/, $(real-obj-m))
120+ multi-obj-m := $(addprefix $(obj)/, $(multi-obj-m))
121+ subdir-ym := $(addprefix $(obj)/, $(subdir-ym))
52122endif
53123
54124ifndef obj
67137# subdir-builtin and subdir-modorder may contain duplications. Use $(sort ...)
68138subdir-builtin := $(sort $(filter %/built-in.a, $(real-obj-y)))
69139subdir-modorder := $(sort $(filter %/modules.order, $(obj-m)))
70- subdir-dtbslist := $(sort $(filter %/dtbs-list, $(dtb-y)))
71140
72141targets-for-builtin := $(extra-y)
73142
@@ -360,7 +429,7 @@ $(obj)/%.o: $(obj)/%.S FORCE
360429
361430targets += $(filter-out $(subdir-builtin), $(real-obj-y))
362431targets += $(filter-out $(subdir-modorder), $(real-obj-m))
363- targets += $(real-dtb-y) $( lib-y) $(always-y)
432+ targets += $(lib-y) $(always-y)
364433
365434# Linker scripts preprocessor (.lds.S -> .lds)
366435# ---------------------------------------------------------------------------
@@ -386,7 +455,6 @@ $(obj)/%.asn1.c $(obj)/%.asn1.h: $(src)/%.asn1 $(objtree)/scripts/asn1_compiler
386455# To build objects in subdirs, we need to descend into the directories
387456$(subdir-builtin): $(obj)/%/built-in.a: $(obj)/% ;
388457$(subdir-modorder): $(obj)/%/modules.order: $(obj)/% ;
389- $(subdir-dtbslist): $(obj)/%/dtbs-list: $(obj)/% ;
390458
391459#
392460# Rule to compile a set of .o files into one .a file (without symbol table)
@@ -412,9 +480,6 @@ cmd_gen_order = { $(foreach m, $(real-prereqs), \
412480$(obj)/modules.order: $(obj-m) FORCE
413481 $(call if_changed,gen_order)
414482
415- $(obj)/dtbs-list: $(dtb-y) $(dtbo-y) FORCE
416- $(call if_changed,gen_order)
417-
418483#
419484# Rule to compile a set of .o files into one .a file (with symbol table)
420485#
@@ -443,15 +508,26 @@ intermediate_targets = $(foreach sfx, $(2), \
443508 $(patsubst %$(strip $(1)),%$(sfx), \
444509 $(filter %$(strip $(1)), $(targets))))
445510# %.asn1.o <- %.asn1.[ch] <- %.asn1
446- # %.dtb.o <- %.dtb.S <- %.dtb <- %.dts
447- # %.dtbo.o <- %.dtbo.S <- %.dtbo <- %.dtso
448- # %.lex.o <- %.lex.c <- %.l
449- # %.tab.o <- %.tab.[ch] <- %.y
450- targets += $(call intermediate_targets, .asn1.o, .asn1.c .asn1.h) \
451- $(call intermediate_targets, .dtb.o, .dtb.S .dtb) \
452- $(call intermediate_targets, .dtbo.o, .dtbo.S .dtbo) \
453- $(call intermediate_targets, .lex.o, .lex.c) \
454- $(call intermediate_targets, .tab.o, .tab.c .tab.h)
511+ targets += $(call intermediate_targets, .asn1.o, .asn1.c .asn1.h)
512+
513+ # Include additional build rules when necessary
514+ # ---------------------------------------------------------------------------
515+
516+ # $(sort ...) is used here to remove duplicated words and excessive spaces.
517+ hostprogs := $(sort $(hostprogs))
518+ ifneq ($(hostprogs),)
519+ include $(srctree)/scripts/Makefile.host
520+ endif
521+
522+ # $(sort ...) is used here to remove duplicated words and excessive spaces.
523+ userprogs := $(sort $(userprogs))
524+ ifneq ($(userprogs),)
525+ include $(srctree)/scripts/Makefile.userprogs
526+ endif
527+
528+ ifneq ($(need-dtbslist)$(dtb-y)$(dtb-)$(filter %.dtb %.dtb.o %.dtbo.o,$(targets)),)
529+ include $(srctree)/scripts/Makefile.dtbs
530+ endif
455531
456532# Build
457533# ---------------------------------------------------------------------------
0 commit comments