2019-01-17 08:54:03

by Masahiro Yamada

[permalink] [raw]
Subject: [PATCH 1/3] kbuild: simplify rules of data compression with size appending

All the callers of size_append pass $(filter-out FORCE,$^).
Move $(filter-out FORCE,$^) to the definition of size_append.

This makes the callers cleaner because $(call ...) can be omitted
to expand a macro with no argument.

Signed-off-by: Masahiro Yamada <[email protected]>
---

scripts/Makefile.lib | 18 +++++++-----------
1 file changed, 7 insertions(+), 11 deletions(-)

diff --git a/scripts/Makefile.lib b/scripts/Makefile.lib
index ecad15b..ebaa348 100644
--- a/scripts/Makefile.lib
+++ b/scripts/Makefile.lib
@@ -321,7 +321,7 @@ dtc-tmp = $(subst $(comma),_,$(dot-target).dts.tmp)
# append the size as a 32-bit littleendian number as gzip does.
size_append = printf $(shell \
dec_size=0; \
-for F in $1; do \
+for F in $(filter-out FORCE,$^); do \
fsize=$$($(CONFIG_SHELL) $(srctree)/scripts/file-size.sh $$F); \
dec_size=$$(expr $$dec_size + $$fsize); \
done; \
@@ -335,23 +335,20 @@ printf "%08x\n" $$dec_size | \
)

quiet_cmd_bzip2 = BZIP2 $@
-cmd_bzip2 = (cat $(filter-out FORCE,$^) | \
- bzip2 -9 && $(call size_append, $(filter-out FORCE,$^))) > $@
+ cmd_bzip2 = (cat $(filter-out FORCE,$^) | bzip2 -9 && $(size_append)) > $@

# Lzma
# ---------------------------------------------------------------------------

quiet_cmd_lzma = LZMA $@
-cmd_lzma = (cat $(filter-out FORCE,$^) | \
- lzma -9 && $(call size_append, $(filter-out FORCE,$^))) > $@
+ cmd_lzma = (cat $(filter-out FORCE,$^) | lzma -9 && $(size_append)) > $@

quiet_cmd_lzo = LZO $@
-cmd_lzo = (cat $(filter-out FORCE,$^) | \
- lzop -9 && $(call size_append, $(filter-out FORCE,$^))) > $@
+ cmd_lzo = (cat $(filter-out FORCE,$^) | lzop -9 && $(size_append)) > $@

quiet_cmd_lz4 = LZ4 $@
-cmd_lz4 = (cat $(filter-out FORCE,$^) | \
- lz4c -l -c1 stdin stdout && $(call size_append, $(filter-out FORCE,$^))) > $@
+ cmd_lz4 = (cat $(filter-out FORCE,$^) | lz4c -l -c1 stdin stdout && \
+ $(size_append)) > $@

# U-Boot mkimage
# ---------------------------------------------------------------------------
@@ -394,8 +391,7 @@ quiet_cmd_uimage = UIMAGE $@
# decompression mode. A BCJ filter isn't used either.
quiet_cmd_xzkern = XZKERN $@
cmd_xzkern = (cat $(filter-out FORCE,$^) | \
- sh $(srctree)/scripts/xz_wrap.sh && \
- $(call size_append, $(filter-out FORCE,$^))) > $@
+ sh $(srctree)/scripts/xz_wrap.sh && $(size_append)) > $@

quiet_cmd_xzmisc = XZMISC $@
cmd_xzmisc = (cat $(filter-out FORCE,$^) | \
--
2.7.4



2019-01-17 08:54:13

by Masahiro Yamada

[permalink] [raw]
Subject: [PATCH 3/3] kbuild: remove unnecessary in-subshell execution

The commands surrounded by ( ) are executed in a subshell, but in
most cases, we do not need to spawn an extra subshell.

Signed-off-by: Masahiro Yamada <[email protected]>
---

scripts/Makefile.build | 4 ++--
scripts/Makefile.lib | 21 ++++++++++-----------
scripts/mkcompile_h | 4 ++--
3 files changed, 14 insertions(+), 15 deletions(-)

diff --git a/scripts/Makefile.build b/scripts/Makefile.build
index 9800178..f8e2794 100644
--- a/scripts/Makefile.build
+++ b/scripts/Makefile.build
@@ -312,11 +312,11 @@ $(real-obj-m:.o=.s): modkern_aflags := $(KBUILD_AFLAGS_MODULE) $(AFLAGS_MODULE)
#
# These mirror gensymtypes_c and co above, keep them in synch.
cmd_gensymtypes_S = \
- (echo "\#include <linux/kernel.h>" ; \
+ { echo "\#include <linux/kernel.h>" ; \
echo "\#include <asm/asm-prototypes.h>" ; \
$(CPP) $(a_flags) $< | \
grep "\<___EXPORT_SYMBOL\>" | \
- sed 's/.*___EXPORT_SYMBOL[[:space:]]*\([a-zA-Z0-9_]*\)[[:space:]]*,.*/EXPORT_SYMBOL(\1);/' ) | \
+ sed 's/.*___EXPORT_SYMBOL[[:space:]]*\([a-zA-Z0-9_]*\)[[:space:]]*,.*/EXPORT_SYMBOL(\1);/' ; } | \
$(CPP) -D__GENKSYMS__ $(c_flags) -xc - | \
$(GENKSYMS) $(if $(1), -T $(2)) \
$(patsubst y,-R,$(CONFIG_MODULE_REL_CRCS)) \
diff --git a/scripts/Makefile.lib b/scripts/Makefile.lib
index c6fc295..c0abd9a 100644
--- a/scripts/Makefile.lib
+++ b/scripts/Makefile.lib
@@ -271,7 +271,7 @@ DTC_FLAGS += $(DTC_FLAGS_$(basetarget))
# Generate an assembly file to wrap the output of the device tree compiler
quiet_cmd_dt_S_dtb= DTB $@
cmd_dt_S_dtb= \
-( \
+{ \
echo '\#include <asm-generic/vmlinux.lds.h>'; \
echo '.section .dtb.init.rodata,"a"'; \
echo '.balign STRUCT_ALIGNMENT'; \
@@ -281,7 +281,7 @@ cmd_dt_S_dtb= \
echo '__dtb_$(subst -,_,$(*F))_end:'; \
echo '.global __dtb_$(subst -,_,$(*F))_end'; \
echo '.balign STRUCT_ALIGNMENT'; \
-) > $@
+} > $@

$(obj)/%.dtb.S: $(obj)/%.dtb FORCE
$(call if_changed,dt_S_dtb)
@@ -335,20 +335,20 @@ printf "%08x\n" $$dec_size | \
)

quiet_cmd_bzip2 = BZIP2 $@
- cmd_bzip2 = (cat $(real-prereqs) | bzip2 -9 && $(size_append)) > $@
+ cmd_bzip2 = { cat $(real-prereqs) | bzip2 -9 && $(size_append); } > $@

# Lzma
# ---------------------------------------------------------------------------

quiet_cmd_lzma = LZMA $@
- cmd_lzma = (cat $(real-prereqs) | lzma -9 && $(size_append)) > $@
+ cmd_lzma = { cat $(real-prereqs) | lzma -9 && $(size_append); } > $@

quiet_cmd_lzo = LZO $@
- cmd_lzo = (cat $(real-prereqs) | lzop -9 && $(size_append)) > $@
+ cmd_lzo = { cat $(real-prereqs) | lzop -9 && $(size_append); } > $@

quiet_cmd_lz4 = LZ4 $@
- cmd_lz4 = (cat $(real-prereqs) | lz4c -l -c1 stdin stdout && \
- $(size_append)) > $@
+ cmd_lz4 = { cat $(real-prereqs) | lz4c -l -c1 stdin stdout && \
+ $(size_append); } > $@

# U-Boot mkimage
# ---------------------------------------------------------------------------
@@ -390,12 +390,11 @@ quiet_cmd_uimage = UIMAGE $@
# big dictionary would increase the memory usage too much in the multi-call
# decompression mode. A BCJ filter isn't used either.
quiet_cmd_xzkern = XZKERN $@
- cmd_xzkern = (cat $(real-prereqs) | \
- sh $(srctree)/scripts/xz_wrap.sh && $(size_append)) > $@
+ cmd_xzkern = { cat $(real-prereqs) | sh $(srctree)/scripts/xz_wrap.sh && \
+ $(size_append); } > $@

quiet_cmd_xzmisc = XZMISC $@
- cmd_xzmisc = (cat $(real-prereqs) | \
- xz --check=crc32 --lzma2=dict=1MiB) > $@
+ cmd_xzmisc = cat $(real-prereqs) | xz --check=crc32 --lzma2=dict=1MiB > $@

# ASM offsets
# ---------------------------------------------------------------------------
diff --git a/scripts/mkcompile_h b/scripts/mkcompile_h
index 87f1fc9..2339f86 100755
--- a/scripts/mkcompile_h
+++ b/scripts/mkcompile_h
@@ -62,7 +62,7 @@ UTS_TRUNCATE="cut -b -$UTS_LEN"

# Generate a temporary compile.h

-( echo /\* This file is auto generated, version $VERSION \*/
+{ echo /\* This file is auto generated, version $VERSION \*/
if [ -n "$CONFIG_FLAGS" ] ; then echo "/* $CONFIG_FLAGS */"; fi

echo \#define UTS_MACHINE \"$ARCH\"
@@ -73,7 +73,7 @@ UTS_TRUNCATE="cut -b -$UTS_LEN"
echo \#define LINUX_COMPILE_HOST \"`echo $LINUX_COMPILE_HOST | $UTS_TRUNCATE`\"

echo \#define LINUX_COMPILER \"`$CC -v 2>&1 | grep ' version ' | sed 's/[[:space:]]*$//'`\"
-) > .tmpcompile
+} > .tmpcompile

# Only replace the real compile.h if the new one is different,
# in order to preserve the timestamp and avoid unnecessary
--
2.7.4


2019-01-17 08:54:28

by Masahiro Yamada

[permalink] [raw]
Subject: [PATCH 2/3] kbuild: add real-prereqs shorthand for $(filter-out FORCE,$^)

In Kbuild, if_changed and friends must have FORCE as a prerequisite.

Hence, $(filter-out FORCE,$^) or $(filter-out $(PHONY),$^) is a common
pattern to get the names of all the prerequisites except phony targets.

Add real-prereqs as a shorthand.

Note:
We cannot replace $(filter %.o,$^) in cmd_link_multi-m because $^ may
include auto-generated dependencies from the .*.cmd file when a single
object module is changed into a multi object module. For details,
see commit 69ea912fda74 ("kbuild: remove unneeded link_multi_deps").
I added a comment to avoid accidental breakage.

Signed-off-by: Masahiro Yamada <[email protected]>
---

Documentation/devicetree/bindings/Makefile | 2 +-
arch/mips/boot/Makefile | 2 +-
arch/powerpc/boot/Makefile | 2 +-
arch/x86/realmode/rm/Makefile | 3 +--
scripts/Kbuild.include | 4 ++++
scripts/Makefile.build | 9 ++++++---
scripts/Makefile.lib | 18 +++++++++---------
scripts/Makefile.modpost | 2 +-
8 files changed, 24 insertions(+), 18 deletions(-)

diff --git a/Documentation/devicetree/bindings/Makefile b/Documentation/devicetree/bindings/Makefile
index 6e5cef0..e4eb5d1 100644
--- a/Documentation/devicetree/bindings/Makefile
+++ b/Documentation/devicetree/bindings/Makefile
@@ -15,7 +15,7 @@ DT_TMP_SCHEMA := processed-schema.yaml
extra-y += $(DT_TMP_SCHEMA)

quiet_cmd_mk_schema = SCHEMA $@
- cmd_mk_schema = $(DT_MK_SCHEMA) $(DT_MK_SCHEMA_FLAGS) -o $@ $(filter-out FORCE, $^)
+ cmd_mk_schema = $(DT_MK_SCHEMA) $(DT_MK_SCHEMA_FLAGS) -o $@ $(real-prereqs)

DT_DOCS = $(shell cd $(srctree)/$(src) && find * -name '*.yaml')
DT_SCHEMA_FILES ?= $(addprefix $(src)/,$(DT_DOCS))
diff --git a/arch/mips/boot/Makefile b/arch/mips/boot/Makefile
index 35704c2..3ce4dd5 100644
--- a/arch/mips/boot/Makefile
+++ b/arch/mips/boot/Makefile
@@ -115,7 +115,7 @@ endif
targets += vmlinux.its.S

quiet_cmd_its_cat = CAT $@
- cmd_its_cat = cat $(filter-out $(PHONY), $^) >$@
+ cmd_its_cat = cat $(real-prereqs) >$@

$(obj)/vmlinux.its.S: $(addprefix $(srctree)/arch/mips/$(PLATFORM)/,$(ITS_INPUTS)) FORCE
$(call if_changed,its_cat)
diff --git a/arch/powerpc/boot/Makefile b/arch/powerpc/boot/Makefile
index 0e8dadd..73d1f35 100644
--- a/arch/powerpc/boot/Makefile
+++ b/arch/powerpc/boot/Makefile
@@ -218,7 +218,7 @@ quiet_cmd_bootas = BOOTAS $@
cmd_bootas = $(BOOTCC) -Wp,-MD,$(depfile) $(BOOTAFLAGS) -c -o $@ $<

quiet_cmd_bootar = BOOTAR $@
- cmd_bootar = $(BOOTAR) $(BOOTARFLAGS) $@.$$$$ $(filter-out FORCE,$^); mv $@.$$$$ $@
+ cmd_bootar = $(BOOTAR) $(BOOTARFLAGS) $@.$$$$ $(real-prereqs); mv $@.$$$$ $@

$(obj-libfdt): $(obj)/%.o: $(srctree)/scripts/dtc/libfdt/%.c FORCE
$(call if_changed_dep,bootcc)
diff --git a/arch/x86/realmode/rm/Makefile b/arch/x86/realmode/rm/Makefile
index 4463fa7..394377c 100644
--- a/arch/x86/realmode/rm/Makefile
+++ b/arch/x86/realmode/rm/Makefile
@@ -37,8 +37,7 @@ REALMODE_OBJS = $(addprefix $(obj)/,$(realmode-y))
sed-pasyms := -n -r -e 's/^([0-9a-fA-F]+) [ABCDGRSTVW] (.+)$$/pa_\2 = \2;/p'

quiet_cmd_pasyms = PASYMS $@
- cmd_pasyms = $(NM) $(filter-out FORCE,$^) | \
- sed $(sed-pasyms) | sort | uniq > $@
+ cmd_pasyms = $(NM) $(real-prereqs) | sed $(sed-pasyms) | sort | uniq > $@

targets += pasyms.h
$(obj)/pasyms.h: $(REALMODE_OBJS) FORCE
diff --git a/scripts/Kbuild.include b/scripts/Kbuild.include
index 3081603..d93250b 100644
--- a/scripts/Kbuild.include
+++ b/scripts/Kbuild.include
@@ -24,6 +24,10 @@ depfile = $(subst $(comma),_,$(dot-target).d)
basetarget = $(basename $(notdir $@))

###
+# real prerequisites without phony targets
+real-prereqs = $(filter-out $(PHONY), $^)
+
+###
# Escape single quote for use in echo statements
escsq = $(subst $(squote),'\$(squote)',$1)

diff --git a/scripts/Makefile.build b/scripts/Makefile.build
index 681ab58..9800178 100644
--- a/scripts/Makefile.build
+++ b/scripts/Makefile.build
@@ -399,8 +399,7 @@ $(sort $(subdir-obj-y)): $(subdir-ym) ;
ifdef builtin-target

quiet_cmd_ar_builtin = AR $@
- cmd_ar_builtin = rm -f $@; \
- $(AR) rcSTP$(KBUILD_ARFLAGS) $@ $(filter $(real-obj-y), $^)
+ cmd_ar_builtin = rm -f $@; $(AR) rcSTP$(KBUILD_ARFLAGS) $@ $(real-prereqs)

$(builtin-target): $(real-obj-y) FORCE
$(call if_changed,ar_builtin)
@@ -428,7 +427,7 @@ ifdef lib-target
quiet_cmd_link_l_target = AR $@

# lib target archives do get a symbol table and index
-cmd_link_l_target = rm -f $@; $(AR) rcsTP$(KBUILD_ARFLAGS) $@ $(lib-y)
+cmd_link_l_target = rm -f $@; $(AR) rcsTP$(KBUILD_ARFLAGS) $@ $(real-prereqs)

$(lib-target): $(lib-y) FORCE
$(call if_changed,link_l_target)
@@ -453,6 +452,10 @@ targets += $(obj)/lib-ksyms.o

endif

+# NOTE:
+# Do not replace $(filter %.o,^) with $(real-prereqs). When a single object
+# module is turned into a multi object module, $^ will contain header file
+# dependencies recorded in the .*.cmd file.
quiet_cmd_link_multi-m = LD [M] $@
cmd_link_multi-m = $(LD) $(ld_flags) -r -o $@ $(filter %.o,$^) $(cmd_secanalysis)

diff --git a/scripts/Makefile.lib b/scripts/Makefile.lib
index ebaa348..c6fc295 100644
--- a/scripts/Makefile.lib
+++ b/scripts/Makefile.lib
@@ -231,7 +231,7 @@ $(obj)/%: $(src)/%_shipped
# ---------------------------------------------------------------------------

quiet_cmd_ld = LD $@
-cmd_ld = $(LD) $(ld_flags) $(filter-out FORCE,$^) -o $@
+ cmd_ld = $(LD) $(ld_flags) $(real-prereqs) -o $@

# Objcopy
# ---------------------------------------------------------------------------
@@ -243,7 +243,7 @@ cmd_objcopy = $(OBJCOPY) $(OBJCOPYFLAGS) $(OBJCOPYFLAGS_$(@F)) $< $@
# ---------------------------------------------------------------------------

quiet_cmd_gzip = GZIP $@
- cmd_gzip = cat $(filter-out FORCE,$^) | gzip -n -f -9 > $@
+ cmd_gzip = cat $(real-prereqs) | gzip -n -f -9 > $@

# DTC
# ---------------------------------------------------------------------------
@@ -321,7 +321,7 @@ dtc-tmp = $(subst $(comma),_,$(dot-target).dts.tmp)
# append the size as a 32-bit littleendian number as gzip does.
size_append = printf $(shell \
dec_size=0; \
-for F in $(filter-out FORCE,$^); do \
+for F in $(real-prereqs); do \
fsize=$$($(CONFIG_SHELL) $(srctree)/scripts/file-size.sh $$F); \
dec_size=$$(expr $$dec_size + $$fsize); \
done; \
@@ -335,19 +335,19 @@ printf "%08x\n" $$dec_size | \
)

quiet_cmd_bzip2 = BZIP2 $@
- cmd_bzip2 = (cat $(filter-out FORCE,$^) | bzip2 -9 && $(size_append)) > $@
+ cmd_bzip2 = (cat $(real-prereqs) | bzip2 -9 && $(size_append)) > $@

# Lzma
# ---------------------------------------------------------------------------

quiet_cmd_lzma = LZMA $@
- cmd_lzma = (cat $(filter-out FORCE,$^) | lzma -9 && $(size_append)) > $@
+ cmd_lzma = (cat $(real-prereqs) | lzma -9 && $(size_append)) > $@

quiet_cmd_lzo = LZO $@
- cmd_lzo = (cat $(filter-out FORCE,$^) | lzop -9 && $(size_append)) > $@
+ cmd_lzo = (cat $(real-prereqs) | lzop -9 && $(size_append)) > $@

quiet_cmd_lz4 = LZ4 $@
- cmd_lz4 = (cat $(filter-out FORCE,$^) | lz4c -l -c1 stdin stdout && \
+ cmd_lz4 = (cat $(real-prereqs) | lz4c -l -c1 stdin stdout && \
$(size_append)) > $@

# U-Boot mkimage
@@ -390,11 +390,11 @@ quiet_cmd_uimage = UIMAGE $@
# big dictionary would increase the memory usage too much in the multi-call
# decompression mode. A BCJ filter isn't used either.
quiet_cmd_xzkern = XZKERN $@
-cmd_xzkern = (cat $(filter-out FORCE,$^) | \
+ cmd_xzkern = (cat $(real-prereqs) | \
sh $(srctree)/scripts/xz_wrap.sh && $(size_append)) > $@

quiet_cmd_xzmisc = XZMISC $@
-cmd_xzmisc = (cat $(filter-out FORCE,$^) | \
+ cmd_xzmisc = (cat $(real-prereqs) | \
xz --check=crc32 --lzma2=dict=1MiB) > $@

# ASM offsets
diff --git a/scripts/Makefile.modpost b/scripts/Makefile.modpost
index 7d4af0d0..c0b7f52 100644
--- a/scripts/Makefile.modpost
+++ b/scripts/Makefile.modpost
@@ -122,7 +122,7 @@ quiet_cmd_ld_ko_o = LD [M] $@
cmd_ld_ko_o = \
$(LD) -r $(KBUILD_LDFLAGS) \
$(KBUILD_LDFLAGS_MODULE) $(LDFLAGS_MODULE) \
- -o $@ $(filter-out FORCE,$^) ; \
+ -o $@ $(real-prereqs) ; \
$(if $(ARCH_POSTLINK), $(MAKE) -f $(ARCH_POSTLINK) $@, true)

$(modules): %.ko :%.o %.mod.o FORCE
--
2.7.4


2019-01-17 11:29:32

by Masahiro Yamada

[permalink] [raw]
Subject: RE: [PATCH 2/3] kbuild: add real-prereqs shorthand for $(filter-out FORCE, $^)

Hi Alexey,

> What is this series made on top of? This does not apply on top of master
> from
> https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git


If you want to apply this series cleanly, please apply the following first:

https://patchwork.kernel.org/patch/10761625/
https://patchwork.kernel.org/patch/10767193/



The conflicts are not significant.
You can use 'git am -C1' if you want to apply this series
directly to Linus tree.

Masahiro

2019-01-17 12:34:47

by Alexey Kardashevskiy

[permalink] [raw]
Subject: Re: [PATCH 2/3] kbuild: add real-prereqs shorthand for $(filter-out FORCE, $^)



On 17/01/2019 15:10, Masahiro Yamada wrote:
> In Kbuild, if_changed and friends must have FORCE as a prerequisite.
>
> Hence, $(filter-out FORCE,$^) or $(filter-out $(PHONY),$^) is a common
> pattern to get the names of all the prerequisites except phony targets.
>
> Add real-prereqs as a shorthand.
>
> Note:
> We cannot replace $(filter %.o,$^) in cmd_link_multi-m because $^ may
> include auto-generated dependencies from the .*.cmd file when a single
> object module is changed into a multi object module. For details,
> see commit 69ea912fda74 ("kbuild: remove unneeded link_multi_deps").
> I added a comment to avoid accidental breakage.


What is this series made on top of? This does not apply on top of master
from https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git



>
> Signed-off-by: Masahiro Yamada <[email protected]>
> ---
>
> Documentation/devicetree/bindings/Makefile | 2 +-
> arch/mips/boot/Makefile | 2 +-
> arch/powerpc/boot/Makefile | 2 +-
> arch/x86/realmode/rm/Makefile | 3 +--
> scripts/Kbuild.include | 4 ++++
> scripts/Makefile.build | 9 ++++++---
> scripts/Makefile.lib | 18 +++++++++---------
> scripts/Makefile.modpost | 2 +-
> 8 files changed, 24 insertions(+), 18 deletions(-)
>
> diff --git a/Documentation/devicetree/bindings/Makefile b/Documentation/devicetree/bindings/Makefile
> index 6e5cef0..e4eb5d1 100644
> --- a/Documentation/devicetree/bindings/Makefile
> +++ b/Documentation/devicetree/bindings/Makefile
> @@ -15,7 +15,7 @@ DT_TMP_SCHEMA := processed-schema.yaml
> extra-y += $(DT_TMP_SCHEMA)
>
> quiet_cmd_mk_schema = SCHEMA $@
> - cmd_mk_schema = $(DT_MK_SCHEMA) $(DT_MK_SCHEMA_FLAGS) -o $@ $(filter-out FORCE, $^)
> + cmd_mk_schema = $(DT_MK_SCHEMA) $(DT_MK_SCHEMA_FLAGS) -o $@ $(real-prereqs)
>
> DT_DOCS = $(shell cd $(srctree)/$(src) && find * -name '*.yaml')
> DT_SCHEMA_FILES ?= $(addprefix $(src)/,$(DT_DOCS))
> diff --git a/arch/mips/boot/Makefile b/arch/mips/boot/Makefile
> index 35704c2..3ce4dd5 100644
> --- a/arch/mips/boot/Makefile
> +++ b/arch/mips/boot/Makefile
> @@ -115,7 +115,7 @@ endif
> targets += vmlinux.its.S
>
> quiet_cmd_its_cat = CAT $@
> - cmd_its_cat = cat $(filter-out $(PHONY), $^) >$@
> + cmd_its_cat = cat $(real-prereqs) >$@
>
> $(obj)/vmlinux.its.S: $(addprefix $(srctree)/arch/mips/$(PLATFORM)/,$(ITS_INPUTS)) FORCE
> $(call if_changed,its_cat)
> diff --git a/arch/powerpc/boot/Makefile b/arch/powerpc/boot/Makefile
> index 0e8dadd..73d1f35 100644
> --- a/arch/powerpc/boot/Makefile
> +++ b/arch/powerpc/boot/Makefile
> @@ -218,7 +218,7 @@ quiet_cmd_bootas = BOOTAS $@
> cmd_bootas = $(BOOTCC) -Wp,-MD,$(depfile) $(BOOTAFLAGS) -c -o $@ $<
>
> quiet_cmd_bootar = BOOTAR $@
> - cmd_bootar = $(BOOTAR) $(BOOTARFLAGS) $@.$$$$ $(filter-out FORCE,$^); mv $@.$$$$ $@
> + cmd_bootar = $(BOOTAR) $(BOOTARFLAGS) $@.$$$$ $(real-prereqs); mv $@.$$$$ $@
>
> $(obj-libfdt): $(obj)/%.o: $(srctree)/scripts/dtc/libfdt/%.c FORCE
> $(call if_changed_dep,bootcc)
> diff --git a/arch/x86/realmode/rm/Makefile b/arch/x86/realmode/rm/Makefile
> index 4463fa7..394377c 100644
> --- a/arch/x86/realmode/rm/Makefile
> +++ b/arch/x86/realmode/rm/Makefile
> @@ -37,8 +37,7 @@ REALMODE_OBJS = $(addprefix $(obj)/,$(realmode-y))
> sed-pasyms := -n -r -e 's/^([0-9a-fA-F]+) [ABCDGRSTVW] (.+)$$/pa_\2 = \2;/p'
>
> quiet_cmd_pasyms = PASYMS $@
> - cmd_pasyms = $(NM) $(filter-out FORCE,$^) | \
> - sed $(sed-pasyms) | sort | uniq > $@
> + cmd_pasyms = $(NM) $(real-prereqs) | sed $(sed-pasyms) | sort | uniq > $@
>
> targets += pasyms.h
> $(obj)/pasyms.h: $(REALMODE_OBJS) FORCE
> diff --git a/scripts/Kbuild.include b/scripts/Kbuild.include
> index 3081603..d93250b 100644
> --- a/scripts/Kbuild.include
> +++ b/scripts/Kbuild.include
> @@ -24,6 +24,10 @@ depfile = $(subst $(comma),_,$(dot-target).d)
> basetarget = $(basename $(notdir $@))
>
> ###
> +# real prerequisites without phony targets
> +real-prereqs = $(filter-out $(PHONY), $^)
> +
> +###
> # Escape single quote for use in echo statements
> escsq = $(subst $(squote),'\$(squote)',$1)
>
> diff --git a/scripts/Makefile.build b/scripts/Makefile.build
> index 681ab58..9800178 100644
> --- a/scripts/Makefile.build
> +++ b/scripts/Makefile.build
> @@ -399,8 +399,7 @@ $(sort $(subdir-obj-y)): $(subdir-ym) ;
> ifdef builtin-target
>
> quiet_cmd_ar_builtin = AR $@
> - cmd_ar_builtin = rm -f $@; \
> - $(AR) rcSTP$(KBUILD_ARFLAGS) $@ $(filter $(real-obj-y), $^)
> + cmd_ar_builtin = rm -f $@; $(AR) rcSTP$(KBUILD_ARFLAGS) $@ $(real-prereqs)
>
> $(builtin-target): $(real-obj-y) FORCE
> $(call if_changed,ar_builtin)
> @@ -428,7 +427,7 @@ ifdef lib-target
> quiet_cmd_link_l_target = AR $@
>
> # lib target archives do get a symbol table and index
> -cmd_link_l_target = rm -f $@; $(AR) rcsTP$(KBUILD_ARFLAGS) $@ $(lib-y)
> +cmd_link_l_target = rm -f $@; $(AR) rcsTP$(KBUILD_ARFLAGS) $@ $(real-prereqs)
>
> $(lib-target): $(lib-y) FORCE
> $(call if_changed,link_l_target)
> @@ -453,6 +452,10 @@ targets += $(obj)/lib-ksyms.o
>
> endif
>
> +# NOTE:
> +# Do not replace $(filter %.o,^) with $(real-prereqs). When a single object
> +# module is turned into a multi object module, $^ will contain header file
> +# dependencies recorded in the .*.cmd file.
> quiet_cmd_link_multi-m = LD [M] $@
> cmd_link_multi-m = $(LD) $(ld_flags) -r -o $@ $(filter %.o,$^) $(cmd_secanalysis)
>
> diff --git a/scripts/Makefile.lib b/scripts/Makefile.lib
> index ebaa348..c6fc295 100644
> --- a/scripts/Makefile.lib
> +++ b/scripts/Makefile.lib
> @@ -231,7 +231,7 @@ $(obj)/%: $(src)/%_shipped
> # ---------------------------------------------------------------------------
>
> quiet_cmd_ld = LD $@
> -cmd_ld = $(LD) $(ld_flags) $(filter-out FORCE,$^) -o $@
> + cmd_ld = $(LD) $(ld_flags) $(real-prereqs) -o $@
>
> # Objcopy
> # ---------------------------------------------------------------------------
> @@ -243,7 +243,7 @@ cmd_objcopy = $(OBJCOPY) $(OBJCOPYFLAGS) $(OBJCOPYFLAGS_$(@F)) $< $@
> # ---------------------------------------------------------------------------
>
> quiet_cmd_gzip = GZIP $@
> - cmd_gzip = cat $(filter-out FORCE,$^) | gzip -n -f -9 > $@
> + cmd_gzip = cat $(real-prereqs) | gzip -n -f -9 > $@
>
> # DTC
> # ---------------------------------------------------------------------------
> @@ -321,7 +321,7 @@ dtc-tmp = $(subst $(comma),_,$(dot-target).dts.tmp)
> # append the size as a 32-bit littleendian number as gzip does.
> size_append = printf $(shell \
> dec_size=0; \
> -for F in $(filter-out FORCE,$^); do \
> +for F in $(real-prereqs); do \
> fsize=$$($(CONFIG_SHELL) $(srctree)/scripts/file-size.sh $$F); \
> dec_size=$$(expr $$dec_size + $$fsize); \
> done; \
> @@ -335,19 +335,19 @@ printf "%08x\n" $$dec_size | \
> )
>
> quiet_cmd_bzip2 = BZIP2 $@
> - cmd_bzip2 = (cat $(filter-out FORCE,$^) | bzip2 -9 && $(size_append)) > $@
> + cmd_bzip2 = (cat $(real-prereqs) | bzip2 -9 && $(size_append)) > $@
>
> # Lzma
> # ---------------------------------------------------------------------------
>
> quiet_cmd_lzma = LZMA $@
> - cmd_lzma = (cat $(filter-out FORCE,$^) | lzma -9 && $(size_append)) > $@
> + cmd_lzma = (cat $(real-prereqs) | lzma -9 && $(size_append)) > $@
>
> quiet_cmd_lzo = LZO $@
> - cmd_lzo = (cat $(filter-out FORCE,$^) | lzop -9 && $(size_append)) > $@
> + cmd_lzo = (cat $(real-prereqs) | lzop -9 && $(size_append)) > $@
>
> quiet_cmd_lz4 = LZ4 $@
> - cmd_lz4 = (cat $(filter-out FORCE,$^) | lz4c -l -c1 stdin stdout && \
> + cmd_lz4 = (cat $(real-prereqs) | lz4c -l -c1 stdin stdout && \
> $(size_append)) > $@
>
> # U-Boot mkimage
> @@ -390,11 +390,11 @@ quiet_cmd_uimage = UIMAGE $@
> # big dictionary would increase the memory usage too much in the multi-call
> # decompression mode. A BCJ filter isn't used either.
> quiet_cmd_xzkern = XZKERN $@
> -cmd_xzkern = (cat $(filter-out FORCE,$^) | \
> + cmd_xzkern = (cat $(real-prereqs) | \
> sh $(srctree)/scripts/xz_wrap.sh && $(size_append)) > $@
>
> quiet_cmd_xzmisc = XZMISC $@
> -cmd_xzmisc = (cat $(filter-out FORCE,$^) | \
> + cmd_xzmisc = (cat $(real-prereqs) | \
> xz --check=crc32 --lzma2=dict=1MiB) > $@
>
> # ASM offsets
> diff --git a/scripts/Makefile.modpost b/scripts/Makefile.modpost
> index 7d4af0d0..c0b7f52 100644
> --- a/scripts/Makefile.modpost
> +++ b/scripts/Makefile.modpost
> @@ -122,7 +122,7 @@ quiet_cmd_ld_ko_o = LD [M] $@
> cmd_ld_ko_o = \
> $(LD) -r $(KBUILD_LDFLAGS) \
> $(KBUILD_LDFLAGS_MODULE) $(LDFLAGS_MODULE) \
> - -o $@ $(filter-out FORCE,$^) ; \
> + -o $@ $(real-prereqs) ; \
> $(if $(ARCH_POSTLINK), $(MAKE) -f $(ARCH_POSTLINK) $@, true)
>
> $(modules): %.ko :%.o %.mod.o FORCE
>

--
Alexey