@@ -37,18 +37,88 @@ include $(srctree)/scripts/Makefile.compiler
37
37
include $(kbuild-file)
38
38
include $(srctree)/scripts/Makefile.lib
39
39
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))
45
72
endif
46
73
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))
52
122
endif
53
123
54
124
ifndef obj
67
137
# subdir-builtin and subdir-modorder may contain duplications. Use $(sort ...)
68
138
subdir-builtin := $(sort $(filter %/built-in.a, $(real-obj-y)))
69
139
subdir-modorder := $(sort $(filter %/modules.order, $(obj-m)))
70
- subdir-dtbslist := $(sort $(filter %/dtbs-list, $(dtb-y)))
71
140
72
141
targets-for-builtin := $(extra-y)
73
142
@@ -360,7 +429,7 @@ $(obj)/%.o: $(obj)/%.S FORCE
360
429
361
430
targets += $(filter-out $(subdir-builtin), $(real-obj-y))
362
431
targets += $(filter-out $(subdir-modorder), $(real-obj-m))
363
- targets += $(real-dtb-y) $( lib-y) $(always-y)
432
+ targets += $(lib-y) $(always-y)
364
433
365
434
# Linker scripts preprocessor (.lds.S -> .lds)
366
435
# ---------------------------------------------------------------------------
@@ -386,7 +455,6 @@ $(obj)/%.asn1.c $(obj)/%.asn1.h: $(src)/%.asn1 $(objtree)/scripts/asn1_compiler
386
455
# To build objects in subdirs, we need to descend into the directories
387
456
$(subdir-builtin): $(obj)/%/built-in.a: $(obj)/% ;
388
457
$(subdir-modorder): $(obj)/%/modules.order: $(obj)/% ;
389
- $(subdir-dtbslist): $(obj)/%/dtbs-list: $(obj)/% ;
390
458
391
459
#
392
460
# 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), \
412
480
$(obj)/modules.order: $(obj-m) FORCE
413
481
$(call if_changed,gen_order)
414
482
415
- $(obj)/dtbs-list: $(dtb-y) $(dtbo-y) FORCE
416
- $(call if_changed,gen_order)
417
-
418
483
#
419
484
# Rule to compile a set of .o files into one .a file (with symbol table)
420
485
#
@@ -443,15 +508,26 @@ intermediate_targets = $(foreach sfx, $(2), \
443
508
$(patsubst %$(strip $(1)),%$(sfx), \
444
509
$(filter %$(strip $(1)), $(targets))))
445
510
# %.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
455
531
456
532
# Build
457
533
# ---------------------------------------------------------------------------
0 commit comments