From: Rong Xu <xur@google.com>
From: Masahiro Yamada <masahiroy@kernel.org>
Move the build rule for vmlinux.a to a separate file in preparation
for supporting distributed builds with Clang ThinLTO.
Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
Tested-by: Rong Xu <xur@google.com>
Signed-off-by: Rong Xu <xur@google.com>
Tested-by: Piotr Gorski <piotrgorski@cachyos.org>
Reviewed-by: Nathan Chancellor <nathan@kernel.org>
Tested-by: Nathan Chancellor <nathan@kernel.org>
---
Makefile | 16 +++++--------
scripts/Makefile.vmlinux_a | 46 ++++++++++++++++++++++++++++++++++++++
2 files changed, 52 insertions(+), 10 deletions(-)
create mode 100644 scripts/Makefile.vmlinux_a
diff --git a/Makefile b/Makefile
index c9b7bee102e8..ba5eee68d5d2 100644
--- a/Makefile
+++ b/Makefile
@@ -1255,7 +1255,7 @@ export ARCH_DRIVERS := $(drivers-y) $(drivers-m)
KBUILD_VMLINUX_OBJS := built-in.a $(patsubst %/, %/lib.a, $(filter %/, $(libs-y)))
KBUILD_VMLINUX_LIBS := $(filter-out %/, $(libs-y))
-export KBUILD_VMLINUX_LIBS
+export KBUILD_VMLINUX_OBJS KBUILD_VMLINUX_LIBS
export KBUILD_LDS := arch/$(SRCARCH)/kernel/vmlinux.lds
ifdef CONFIG_TRIM_UNUSED_KSYMS
@@ -1264,16 +1264,12 @@ ifdef CONFIG_TRIM_UNUSED_KSYMS
KBUILD_MODULES := y
endif
-# '$(AR) mPi' needs 'T' to workaround the bug of llvm-ar <= 14
-quiet_cmd_ar_vmlinux.a = AR $@
- cmd_ar_vmlinux.a = \
- rm -f $@; \
- $(AR) cDPrST $@ $(KBUILD_VMLINUX_OBJS); \
- $(AR) mPiT $$($(AR) t $@ | sed -n 1p) $@ $$($(AR) t $@ | grep -F -f $(srctree)/scripts/head-object-list.txt)
+PHONY += vmlinux_a
+vmlinux_a: $(KBUILD_VMLINUX_OBJS) scripts/head-object-list.txt FORCE
+ $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.vmlinux_a
-targets += vmlinux.a
-vmlinux.a: $(KBUILD_VMLINUX_OBJS) scripts/head-object-list.txt FORCE
- $(call if_changed,ar_vmlinux.a)
+vmlinux.a: vmlinux_a
+ @:
PHONY += vmlinux_o
vmlinux_o: vmlinux.a $(KBUILD_VMLINUX_LIBS)
diff --git a/scripts/Makefile.vmlinux_a b/scripts/Makefile.vmlinux_a
new file mode 100644
index 000000000000..650d44330d1f
--- /dev/null
+++ b/scripts/Makefile.vmlinux_a
@@ -0,0 +1,46 @@
+# SPDX-License-Identifier: GPL-2.0-only
+
+PHONY := __default
+__default: vmlinux.a
+
+include include/config/auto.conf
+include $(srctree)/scripts/Kbuild.include
+include $(srctree)/scripts/Makefile.lib
+
+# Link of built-in-fixup.a
+# ---------------------------------------------------------------------------
+
+# '$(AR) mPi' needs 'T' to workaround the bug of llvm-ar <= 14
+quiet_cmd_ar_builtin_fixup = AR $@
+ cmd_ar_builtin_fixup = \
+ rm -f $@; \
+ $(AR) cDPrST $@ $(KBUILD_VMLINUX_OBJS); \
+ $(AR) mPiT $$($(AR) t $@ | sed -n 1p) $@ $$($(AR) t $@ | grep -F -f $(srctree)/scripts/head-object-list.txt)
+
+targets += built-in-fixup.a
+built-in-fixup.a: $(KBUILD_VMLINUX_OBJS) scripts/head-object-list.txt FORCE
+ $(call if_changed,ar_builtin_fixup)
+
+# vmlinux.a
+# ---------------------------------------------------------------------------
+
+targets += vmlinux.a
+vmlinux.a: built-in-fixup.a FORCE
+ $(call if_changed,copy)
+
+# Add FORCE to the prerequisites of a target to force it to be always rebuilt.
+# ---------------------------------------------------------------------------
+
+PHONY += FORCE
+FORCE:
+
+# Read all saved command lines and dependencies for the $(targets) we
+# may be building above, using $(if_changed{,_dep}). As an
+# optimization, we don't need to read them if the target does not
+# exist, we will rebuild anyway in that case.
+
+existing-targets := $(wildcard $(sort $(targets)))
+
+-include $(foreach f,$(existing-targets),$(dir $(f)).$(notdir $(f)).cmd)
+
+.PHONY: $(PHONY)
--
2.53.0.851.ga537e3e6e9-goog
On Mon, 16 Mar 2026 21:29:29 +0000, xur@google.com <xur@google.com> wrote: Hi Rong, > Move the build rule for vmlinux.a to a separate file in preparation > for supporting distributed builds with Clang ThinLTO. > > Signed-off-by: Masahiro Yamada <masahiroy@kernel.org> > Tested-by: Rong Xu <xur@google.com> As Masahiro's original patch is now being modified: I'd like to add something like [rong xu: change '--thin' back to 'T' in Makefile.vmlinux_a] here before your 'Signed-off-by'. Are you ok with that? Kind regards, Nicolas -- Nicolas
Sounds good to me. Could you also include a note stating that the '-T' flag is no longer problematic since the minimum requirement for LLVM has been updated to version 15? As of LLVM 14 and onward, the '-T' flag functions identically to the '--thin' flag. Thanks a lot for the help! -Rong On Wed, Mar 25, 2026 at 12:22 PM Nicolas Schier <nsc@kernel.org> wrote: > > On Mon, 16 Mar 2026 21:29:29 +0000, xur@google.com <xur@google.com> wrote: > > Hi Rong, > > > Move the build rule for vmlinux.a to a separate file in preparation > > for supporting distributed builds with Clang ThinLTO. > > > > Signed-off-by: Masahiro Yamada <masahiroy@kernel.org> > > Tested-by: Rong Xu <xur@google.com> > > As Masahiro's original patch is now being modified: I'd like to add > something like > > [rong xu: change '--thin' back to 'T' in Makefile.vmlinux_a] > > here before your 'Signed-off-by'. Are you ok with that? > > Kind regards, > Nicolas > > -- > Nicolas >
© 2016 - 2026 Red Hat, Inc.