kbuild: various cleanups
Subsystems (26)
cover kbuild: various cleanups
- Avoid updating init/built-in.a twice
- Run modpost just once instead of twice
- Link vmlinux and modules in parallel
- Remove head-y syntax
These are ground works to make the further refactoring possible.
This patch set is applicable after the following series:
https://patchwork.kernel.org/project/linux-kbuild/list/?series=669437
Masahiro Yamada (15):
kbuild: remove duplicated dependency between modules and modules_check
kbuild: refactor single builds of *.ko
kbuild: move 'PHONY += modules_prepare' to the common part init/version.c: remove #include <linux/version.h>
kbuild: build init/built-in.a just once
kbuild: generate include/generated/compile.h in top Makefile scripts/mkcompile_h: move LC_ALL=C to '$LD -v'
Revert "kbuild: Make scripts/compile.h when sh != bash"
kbuild: rename modules.order in sub-directories to .modules.order
kbuild: move core-y in top Makefile to ./Kbuild
kbuild: move .vmlinux.objs rule to Makefile.modpost
kbuild: move vmlinux.o rule to the top Makefile
kbuild: unify two modpost invocations
kbuild: use obj-y instead extra-y for objects placed at the head
kbuild: remove head-y syntax
Documentation/kbuild/makefiles.rst | 27 +---- Kbuild | 16 +++ Makefile | 120 ++++++++++++-------- arch/alpha/Makefile | 2 - arch/alpha/kernel/Makefile | 4 +- arch/arc/Makefile | 2 - arch/arc/kernel/Makefile | 4 +- arch/arm/Makefile | 3 - arch/arm/kernel/Makefile | 4 +- arch/arm64/Makefile | 3 - arch/arm64/kernel/Makefile | 4 +- arch/csky/Makefile | 2 - arch/csky/kernel/Makefile | 4 +- arch/hexagon/Makefile | 2 - arch/hexagon/kernel/Makefile | 3 +- arch/ia64/Makefile | 1 - arch/ia64/kernel/Makefile | 4 +- arch/loongarch/Makefile | 2 - arch/loongarch/kernel/Makefile | 4 +- arch/m68k/68000/Makefile | 2 +- arch/m68k/Makefile | 9 -- arch/m68k/coldfire/Makefile | 2 +- arch/m68k/kernel/Makefile | 21 ++-- arch/microblaze/Makefile | 1 - arch/microblaze/kernel/Makefile | 4 +- arch/mips/Makefile | 2 - arch/mips/kernel/Makefile | 4 +- arch/nios2/Makefile | 1 - arch/nios2/kernel/Makefile | 2 +- arch/openrisc/Makefile | 2 - arch/openrisc/kernel/Makefile | 4 +- arch/parisc/Makefile | 2 - arch/parisc/kernel/Makefile | 4 +- arch/powerpc/Makefile | 12 -- arch/powerpc/kernel/Makefile | 22 ++-- arch/riscv/Makefile | 2 - arch/riscv/kernel/Makefile | 2 +- arch/s390/Makefile | 2 - arch/s390/boot/version.c | 1 + arch/s390/kernel/Makefile | 4 +- arch/sh/Makefile | 2 - arch/sh/kernel/Makefile | 4 +- arch/sparc/Makefile | 2 - arch/sparc/kernel/Makefile | 3 +- arch/x86/Makefile | 5 - arch/x86/boot/compressed/kaslr.c | 1 + arch/x86/boot/version.c | 1 + arch/x86/kernel/Makefile | 10 +- arch/xtensa/Makefile | 2 - arch/xtensa/kernel/Makefile | 4 +- init/Makefile | 55 ++++++--- init/build-version | 10 ++ init/version-timestamp.c | 31 +++++ init/version.c | 37 +++--- scripts/Makefile.build | 20 ++-- scripts/Makefile.lib | 8 +- scripts/Makefile.modfinal | 2 +- scripts/Makefile.modpost | 112 ++++++++---------- scripts/Makefile.vmlinux_o | 6 +- scripts/clang-tools/gen_compile_commands.py | 19 +--- scripts/head-object-list.txt | 53 +++++++++ scripts/link-vmlinux.sh | 51 ++------- scripts/mkcompile_h | 96 ++-------------- 63 files changed, 393 insertions(+), 457 deletions(-) create mode 100755 init/build-version create mode 100644 init/version-timestamp.c create mode 100644 scripts/head-object-list.txt
Signature · 1 line
2.34.1
PATCH 1/15 kbuild: remove duplicated dependency between modules and modules_check
The dependency, "modules: modules_check" is specified twice. Commit 1a998be620a1 ("kbuild: check module name conflict for external modules as well") missed to clean it up.
'PHONY += modules' also appears twice.
---
Makefile | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
Makefile +1 -2
@@ -1436,8 +1436,7 @@ endif # Build modules # -PHONY += modules -modules: $(if $(KBUILD_BUILTIN),vmlinux) modules_check modules_prepare +modules: $(if $(KBUILD_BUILTIN),vmlinux) modules_prepare cmd_modules_order = cat $(real-prereqs) > $@
Signature · 1 line
2.34.1
PATCH 2/15 kbuild: refactor single builds of *.ko
In reply to Masahiro YamadaRemove the potentially invalid modules.order instead of using the temporary file.
Also, KBUILD_MODULES is don't care for single builds. No need to cancel it.
---
Makefile | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-)
Makefile +4 -12
@@ -1787,6 +1787,8 @@ modules modules_install: @echo >&2 '***' @exit 1 +KBUILD_MODULES := + endif # CONFIG_MODULES # Single targets
@@ -1813,18 +1815,12 @@ $(single-ko): single_modpost $(single-no-ko): descend @: -ifeq ($(KBUILD_EXTMOD),) -# For the single build of in-tree modules, use a temporary file to avoid -# the situation of modules_install installing an invalid modules.order. -MODORDER := .modules.tmp -endif - +# Remove MODORDER when done because it is not the real one. PHONY += single_modpost single_modpost: $(single-no-ko) modules_prepare $(Q){ $(foreach m, $(single-ko), echo $(extmod_prefix)$m;) } > $(MODORDER) $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpost - -KBUILD_MODULES := 1 + $(Q)rm -f $(MODORDER) export KBUILD_SINGLE_TARGETS := $(addprefix $(extmod_prefix), $(single-no-ko))
@@ -1834,10 +1830,6 @@ build-dirs := $(foreach d, $(build-dirs), \ endif -ifndef CONFIG_MODULES -KBUILD_MODULES := -endif - # Handle descending into subdirectories listed in $(build-dirs) # Preset locale variables to speed up the build process. Limit locale # tweaks to this spot to avoid wrong language settings when running
Signature · 1 line
2.34.1
PATCH 3/15 kbuild: move 'PHONY += modules_prepare' to the common part
In reply to Masahiro YamadaUnify the code between in-tree builds and external module builds.
---
Makefile | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-)
Makefile +1 -5
@@ -1446,7 +1446,6 @@ modules.order: $(subdir-modorder) FORCE targets += modules.order # Target to prepare building external modules -PHONY += modules_prepare modules_prepare: prepare $(Q)$(MAKE) $(build)=scripts scripts/module.lds
@@ -1747,15 +1746,12 @@ help: @echo ' clean - remove generated files in module directory only' @echo '' -# no-op for external module builds -PHONY += modules_prepare - endif # KBUILD_EXTMOD # --------------------------------------------------------------------------- # Modules -PHONY += modules modules_install +PHONY += modules modules_install modules_prepare ifdef CONFIG_MODULES
Signature · 1 line
2.34.1
PATCH 4/15 init/version.c: remove #include <linux/version.h>
In reply to Masahiro YamadaThis is unneeded since commit 073a9ecb3a73 ("init/version.c: remove Version_<LINUX_VERSION_CODE> symbol").
---
init/version.c | 1 - 1 file changed, 1 deletion(-)
init/version.c +0 -1
@@ -16,7 +16,6 @@#include <linux/uts.h> #include <linux/utsname.h> #include <generated/utsrelease.h> -#include <linux/version.h> #include <linux/proc_ns.h> struct uts_namespace init_uts_ns = {
Signature · 1 line
2.34.1
PATCH 5/15 kbuild: build init/built-in.a just once
In reply to Masahiro YamadaKbuild builds init/built-in.a twice; first during the ordinary directory descending, second from scripts/link-vmlinux.sh.
We do this because UTS_VERSION contains the build version and the timestamp. We cannot update it during the normal directory traversal since we do not yet know if we need to update vmlinux. UTS_VERSION is temporarily calculated, but omitted from the update check. Otherwise, vmlinux would be rebuilt every time.
When Kbuild results in running link-vmlinux.sh, it increments the version number in the .version file and takes the timestamp at that time to really fix UTS_VERSION.
However, updating the same file twice is a footgun. To avoid nasty timestamp issues, all build artifacts that depend on init/built-in.a must be atomically generated in link-vmlinux.sh, where some of them do not need rebuilding.
To fix this issue, this commit changes as follows:
[1] Split UTS_VERSION out to include/generated/utsversion.h from include/generated/compile.h
include/generated/utsversion.h is generated just before the vmlinux link. It is generated under include/generated/ because some decompressors (s390, x86) use UTS_VERSION.
[2] Split init_uts_ns and linux_banner out to init/version-timestamp.c from init/version.c
init_uts_ns and linux_banner contain UTS_VERSION. During the ordinary directory descending, they are compiled with __weak and used to determine if vmlinux needs relinking. Just before the vmlinux link, they are compiled without __weak to embed the real version and timestamp.
---
arch/s390/boot/version.c | 1 + arch/x86/boot/compressed/kaslr.c | 1 + arch/x86/boot/version.c | 1 + init/Makefile | 53 ++++++++++++++----- init/build-version | 10 ++++ init/version-timestamp.c | 31 +++++++++++ init/version.c | 36 +++++-------- scripts/link-vmlinux.sh | 17 ++---- scripts/mkcompile_h | 89 ++++---------------------------- 9 files changed, 112 insertions(+), 127 deletions(-) create mode 100755 init/build-version create mode 100644 init/version-timestamp.c
arch/s390/boot/version.c +1 -0
@@ -1,4 +1,5 @@// SPDX-License-Identifier: GPL-2.0 +#include <generated/utsversion.h> #include <generated/utsrelease.h> #include <generated/compile.h> #include "boot.h"
arch/x86/boot/compressed/kaslr.c +1 -0
@@ -29,6 +29,7 @@#include <linux/uts.h> #include <linux/utsname.h> #include <linux/ctype.h> +#include <generated/utsversion.h> #include <generated/utsrelease.h> #define _SETUP
arch/x86/boot/version.c +1 -0
@@ -11,6 +11,7 @@*/ #include "boot.h" +#include <generated/utsversion.h> #include <generated/utsrelease.h> #include <generated/compile.h>
init/Makefile +40 -13
60 lines not on this page · raw message
init/build-version new file +10 -0
@@ -0,0 +1,10 @@ +#!/bin/sh +# SPDX-License-Identifier: GPL-2.0-only + +VERSION=$(cat .version) 2>/dev/null && +VERSION=$(expr $VERSION + 1) 2>/dev/null || +VERSION=1 + +echo ${VERSION} > .version + +echo ${VERSION}
init/version-timestamp.c new file +31 -0
@@ -0,0 +1,31 @@ +// SPDX-License-Identifier: GPL-2.0-only + +#include <generated/compile.h> +#include <generated/utsrelease.h> +#include <linux/version.h> +#include <linux/proc_ns.h> +#include <linux/refcount.h> +#include <linux/uts.h> +#include <linux/utsname.h> + +struct uts_namespace init_uts_ns = { + .ns.count =REFCOUNT_INIT (2 ), + .name = { + .sysname =UTS_SYSNAME , + .nodename =UTS_NODENAME , + .release =UTS_RELEASE , + .version =UTS_VERSION , + .machine =UTS_MACHINE , + .domainname =UTS_DOMAINNAME , + }, + .user_ns = &init_user_ns, + .ns.inum =PROC_UTS_INIT_INO , +#ifdef CONFIG_UTS_NS + .ns.ops = &utsns_operations, +#endif +}; + +/* FIXED STRINGS! Don't touch! */ +const char linux_banner[] = +"Linux version " UTS_RELEASE " (" LINUX_COMPILE_BY "@" +LINUX_COMPILE_HOST ") (" LINUX_COMPILER ") " UTS_VERSION "\n" ;
init/version.c +13 -23
@@ -18,24 +18,6 @@#include <generated/utsrelease.h> #include <linux/proc_ns.h> -struct uts_namespace init_uts_ns = { - .ns.count =REFCOUNT_INIT (2 ), - .name = { - .sysname =UTS_SYSNAME , - .nodename =UTS_NODENAME , - .release =UTS_RELEASE , - .version =UTS_VERSION , - .machine =UTS_MACHINE , - .domainname =UTS_DOMAINNAME , - }, - .user_ns = &init_user_ns, - .ns.inum =PROC_UTS_INIT_INO , -#ifdef CONFIG_UTS_NS - .ns.ops = &utsns_operations, -#endif -}; -EXPORT_SYMBOL_GPL (init_uts_ns); -static int __init early_hostname (char *arg) {size_t bufsize =sizeof (init_uts_ns.name.nodename);
@@ -51,11 +33,6 @@ static int __init early_hostname(char *arg) }early_param ("hostname" , early_hostname); -/* FIXED STRINGS! Don't touch! */ -const char linux_banner[] = -"Linux version " UTS_RELEASE " (" LINUX_COMPILE_BY "@" -LINUX_COMPILE_HOST ") (" LINUX_COMPILER ") " UTS_VERSION "\n" ; -const char linux_proc_banner[] ="%s version %s" " (" LINUX_COMPILE_BY "@" LINUX_COMPILE_HOST ")"
@@ -63,3 +40,16 @@ const char linux_proc_banner[] =BUILD_SALT ;BUILD_LTO_INFO ; + +/* +* init_uts_ns and linux_banner contain the build version and timestamp, +* which are really fixed at the very last step of build process. +* They are compiled with __weak first, and without __weak later. +*/ + +struct uts_namespace init_uts_ns__weak ; +const char linux_banner[]__weak ; + +#include "version-timestamp.c" + +EXPORT_SYMBOL_GPL (init_uts_ns);
scripts/link-vmlinux.sh +4 -13
@@ -75,6 +75,8 @@ vmlinux_link() objs="${objs} .vmlinux.export.o" fi + objs="${objs} init/version-timestamp.o" + if [ "${SRCARCH}" = "um" ]; then wl=-Wl, ld="${CC}"
@@ -213,19 +215,6 @@ if [ "$1" = "clean" ]; then exit 0 fi -# Update version -info GEN .version -if [ -r .version ]; then - VERSION=$(expr 0$(cat .version) + 1) - echo $VERSION > .version -else - rm -f .version - echo 1 > .version -fi; - -# final build of init/ -${MAKE} -f "${srctree}/scripts/Makefile.build" obj=init need-builtin=1 - #link vmlinux.o ${MAKE} -f "${srctree}/scripts/Makefile.vmlinux_o"
@@ -260,6 +249,8 @@ if is_enabled CONFIG_MODULES; then ${MAKE} -f "${srctree}/scripts/Makefile.vmlinux" .vmlinux.export.o fi +${MAKE} -f "${srctree}/scripts/Makefile.build" obj=init init/version-timestamp.o + btf_vmlinux_bin_o="" if is_enabled CONFIG_DEBUG_INFO_BTF; then btf_vmlinux_bin_o=.btf.vmlinux.bin.o
scripts/mkcompile_h +11 -78
105 lines not on this page · raw message
Signature · 1 line
2.34.1
Re: [PATCH 05/15] kbuild: build init/built-in.a just once
Quoted 21 lines · Masahiro Yamada
init/Makefile +13
-2@@ -19,20 +19,47 @@ mounts-y := do_mounts.o mounts-$(CONFIG_BLK_DEV_RAM) += do_mounts_rd.o mounts-$(CONFIG_BLK_DEV_INITRD) += do_mounts_initrd.o -# dependencies on generated files need to be listed explicitly -$(obj)/version.o: include/generated/compile.h +# +# UTS_VERSION +# + +smp-flag-$(CONFIG_SMP) := SMP +preempt-flag-$(CONFIG_PREEMPT_BUILD) := PREEMPT +preempt-flag-$(CONFIG_PREEMPT_DYNAMIC) := PREEMPT_DYNAMIC +preempt-flag-$(CONFIG_PREEMPT_RT) := PREEMPT_RT + +build-version = $(or $(KBUILD_BUILD_VERSION), $(build-version-auto)) +build-timestamp = $(or $(KBUILD_BUILD_TIMESTAMP), $(build-timestamp-auto)) + +# Maximum length of UTS_VERSION is 64 chars
init/Makefile mounts-y := do_mounts.o · line 44
Quoted 10 lines
init/Makefile +10
-0+filechk_uts_version = \ + utsver=$$(echo '$(pound)'"$(build-version)" $(smp-flag-y) $(preempt-flag-y) "$(build-timestamp)" | cut -b -64); \ + echo '$(pound)'define UTS_VERSION \""$${utsver}"\" + +# +# Build version.c with temporary UTS_VERSION +# + +$(obj)/utsversion-tmp.h: FORCE + $(call filechk,uts_version)
I missed to clean up init/utsversion-tmp.h.
I patched like follows, and also added it to init/.gitignore.
init/Makefile +2 -0
@@ -43,6 +43,8 @@ filechk_uts_version = \ $(obj)/utsversion-tmp.h: FORCE $(call filechk,uts_version) +clean-files += utsversion-tmp.h + $(obj)/version.o: include/generated/compile.h $(obj)/utsversion-tmp.h CFLAGS_version.o := -include $(obj)/utsversion-tmp.h
Signature · 2 lines
Best Regards Masahiro Yamada
Nathan Chancellor
maintainerRe: [PATCH 05/15] kbuild: build init/built-in.a just once
In reply to Masahiro YamadaHi Masahiro,
Quoted 37 lines · Masahiro Yamada
Kbuildbuildsinit/built-in.atwice; first during the ordinary directory descending, second fromscripts/link-vmlinux.sh.We do this because
UTS_VERSIONcontains the build version and the timestamp. We cannot update it during the normal directory traversal since we do not yet know if we need to update vmlinux.UTS_VERSIONis temporarily calculated, but omitted from the update check. Otherwise, vmlinux would be rebuilt every time.When
Kbuildresults in runninglink-vmlinux.sh, it increments the version number in the .version file and takes the timestamp at that time to really fixUTS_VERSION.However, updating the same file twice is a footgun. To avoid nasty timestamp issues, all build artifacts that depend on
init/built-in.amust be atomically generated inlink-vmlinux.sh, where some of them do not need rebuilding.To fix this issue, this commit changes as follows:
[1] Split
UTS_VERSIONout toinclude/generated/utsversion.hfrominclude/generated/compile.h
include/generated/utsversion.his generated just before the vmlinux link. It is generated underinclude/generated/because some decompressors (s390, x86) useUTS_VERSION.[2] Split
init_uts_nsandlinux_bannerout toinit/version-timestamp.cfrominit/version.c
init_uts_nsandlinux_bannercontainUTS_VERSION. During the ordinary directory descending, they are compiled with__weakand used to determine if vmlinux needs relinking. Just before the vmlinux link, they are compiled without__weakto embed the real version and timestamp.Signed-off-by Masahiro Yamada <[email protected]>
<snip>
Quoted 6 lines
init/build-version new file +0
-0
init/build-version line 10
Quoted 10 lines
init/build-version new file +10
-0@@ -0,0 +1,10 @@ +#!/bin/sh +# SPDX-License-Identifier: GPL-2.0-only + +VERSION=$(cat .version) 2>/dev/null && +VERSION=$(expr $VERSION + 1) 2>/dev/null || +VERSION=1 + +echo ${VERSION} > .version + +echo ${VERSION}
I am seeing
cat: .version: No such file or directory
at some point in nearly all of my builds in -next. Does the 2>/dev/null want to be moved into the subshell?
Cheers,
Nathan
Re: [PATCH 05/15] kbuild: build init/built-in.a just once
Quoted 63 lines · Nathan Chancellor
Hi Masahiro,
Quoted 37 lines · Masahiro Yamada
Kbuildbuildsinit/built-in.atwice; first during the ordinary directory descending, second fromscripts/link-vmlinux.sh.We do this because
UTS_VERSIONcontains the build version and the timestamp. We cannot update it during the normal directory traversal since we do not yet know if we need to update vmlinux.UTS_VERSIONis temporarily calculated, but omitted from the update check. Otherwise, vmlinux would be rebuilt every time.When
Kbuildresults in runninglink-vmlinux.sh, it increments the version number in the .version file and takes the timestamp at that time to really fixUTS_VERSION.However, updating the same file twice is a footgun. To avoid nasty timestamp issues, all build artifacts that depend on
init/built-in.amust be atomically generated inlink-vmlinux.sh, where some of them do not need rebuilding.To fix this issue, this commit changes as follows:
[1] Split
UTS_VERSIONout toinclude/generated/utsversion.hfrominclude/generated/compile.h
include/generated/utsversion.his generated just before the vmlinux link. It is generated underinclude/generated/because some decompressors (s390, x86) useUTS_VERSION.[2] Split
init_uts_nsandlinux_bannerout toinit/version-timestamp.cfrominit/version.c
init_uts_nsandlinux_bannercontainUTS_VERSION. During the ordinary directory descending, they are compiled with__weakand used to determine if vmlinux needs relinking. Just before the vmlinux link, they are compiled without__weakto embed the real version and timestamp.Signed-off-by Masahiro Yamada <[email protected]><snip>
Quoted 6 lines
init/build-version new file +0
-0init/build-version line 10
Quoted 10 lines
init/build-version new file +10
-0@@ -0,0 +1,10 @@ +#!/bin/sh +# SPDX-License-Identifier: GPL-2.0-only + +VERSION=$(cat .version) 2>/dev/null && +VERSION=$(expr $VERSION + 1) 2>/dev/null || +VERSION=1 + +echo ${VERSION} > .version + +echo ${VERSION}I am seeing
Quoted 1 line
cat: .version: No such file or directory
Thanks, Nathan.
I did not notice it because /bin/sh is a symlink to dash on my machine.
I see the warning by running it with bash.
$ rm -f .version ; dash init/build-version 1 $ rm -f .version ; bash init/build-version cat: .version: No such file or directory 1
Quoted 3 lines
at some point in nearly all of my builds in -next. Does the 2>/dev/null want to be moved into the subshell?
Agree.
I will fix it up locally.
Thanks.
Quoted 3 lines
Cheers,
Nathan
Signature · 2 lines
Best Regards Masahiro Yamada
RE: [PATCH 05/15] kbuild: build init/built-in.a just once
In reply to Nathan Chancellor...
Quoted 3 lines
init/build-version line 6
Quoted 3 lines
init/build-version new file +3
-0+VERSION=$(cat .version) 2>/dev/null && +VERSION=$(expr $VERSION + 1) 2>/dev/null || +VERSION=1
What's wrong with:
VERSION=$(($(cat .version 2>/dev/null) + 1))
If you are worried about .version not containing a valid number and $((...)) failing then use ${VERSION:-1} later.
David
-
Registered Address Lakeside, Bramley Road, Mount Farm, Milton Keynes, MK1 1PT, UK Registration No: 1397386 (Wales)
Re: [PATCH 05/15] kbuild: build init/built-in.a just once
Quoted 8 lines · David Laight
...
Quoted 3 lines
init/build-version line 6
Quoted 3 lines
init/build-version new file +3
-0+VERSION=$(cat .version) 2>/dev/null && +VERSION=$(expr $VERSION + 1) 2>/dev/null || +VERSION=1What's wrong with:
VERSION=$(($(cat .version 2>/dev/null) + 1))
One reason was, the original code used 'expr'.
Quoted 2 lines
If you are worried about .version not containing a valid number and $((...)) failing then use ${VERSION:-1} later.
Maybe another reason is,
I want to make the behavior deterministic when the .version file contains a non-integer string.
$ unset FOO $ echo FOO > .version $ echo $(($(cat .version 2>/dev/null) + 1)) 1
$ export FOO=100 $ echo FOO > .version $ echo $(($(cat .version 2>/dev/null) + 1)) 101
I want the script to consistently return 1
whether or not 'FOO' is available in the user's environment.
Quoted 6 lines
David
-
Registered Address Lakeside, Bramley Road, Mount Farm, Milton Keynes, MK1 1PT, UK Registration No: 1397386 (Wales)
Signature · 2 lines
Best Regards Masahiro Yamada
Jon Hunter
maintainerRe: [PATCH 05/15] kbuild: build init/built-in.a just once
In reply to Masahiro YamadaHi Masahiro
Quoted 30 lines · Masahiro Yamada
Kbuildbuildsinit/built-in.atwice; first during the ordinary directory descending, second fromscripts/link-vmlinux.sh.We do this because
UTS_VERSIONcontains the build version and the timestamp. We cannot update it during the normal directory traversal since we do not yet know if we need to update vmlinux.UTS_VERSIONis temporarily calculated, but omitted from the update check. Otherwise, vmlinux would be rebuilt every time.When
Kbuildresults in runninglink-vmlinux.sh, it increments the version number in the .version file and takes the timestamp at that time to really fixUTS_VERSION.However, updating the same file twice is a footgun. To avoid nasty timestamp issues, all build artifacts that depend on
init/built-in.amust be atomically generated inlink-vmlinux.sh, where some of them do not need rebuilding.To fix this issue, this commit changes as follows:
[1] Split
UTS_VERSIONout toinclude/generated/utsversion.hfrominclude/generated/compile.h
include/generated/utsversion.his generated just before the vmlinux link. It is generated underinclude/generated/because some decompressors (s390, x86) useUTS_VERSION.[2] Split
init_uts_nsandlinux_bannerout toinit/version-timestamp.cfrominit/version.c
Quoted 7 lines
init_uts_nsandlinux_bannercontainUTS_VERSION. During the ordinary directory descending, they are compiled with__weakand used to determine if vmlinux needs relinking. Just before the vmlinux link, they are compiled without__weakto embed the real version and timestamp.Signed-off-by Masahiro Yamada <[email protected]>
Since this change I have noticed that the kernel image (at least on ARM64) now contains two version strings ...
$ strings arch/arm64/boot/Image | grep "Linux version" Linux version 6.0.0-rc7-00011-g2df8220cc511 (jonathanh@moonraker) (aarch64-linux-gnu-gcc (Linaro GCC 6.4-2017.08) 6.4.1 20170707, GNU ld (Linaro_Binutils-2017.08) 2.27.0.20161019) # SMP PREEMPT Linux version 6.0.0-rc7-00011-g2df8220cc511 (jonathanh@moonraker) (aarch64-linux-gnu-gcc (Linaro GCC 6.4-2017.08) 6.4.1 20170707, GNU ld (Linaro_Binutils-2017.08) 2.27.0.20161019) #20 SMP PREEMPT Thu Nov 17 09:49:18 GMT 2022
Is this expected?
Thanks!
Jon
Signature · 1 line
nvpublic
Re: [PATCH 05/15] kbuild: build init/built-in.a just once
Quoted 43 lines · Jon Hunter
Hi Masahiro
Quoted 30 lines · Masahiro Yamada
Kbuildbuildsinit/built-in.atwice; first during the ordinary directory descending, second fromscripts/link-vmlinux.sh.We do this because
UTS_VERSIONcontains the build version and the timestamp. We cannot update it during the normal directory traversal since we do not yet know if we need to update vmlinux.UTS_VERSIONis temporarily calculated, but omitted from the update check. Otherwise, vmlinux would be rebuilt every time.When
Kbuildresults in runninglink-vmlinux.sh, it increments the version number in the .version file and takes the timestamp at that time to really fixUTS_VERSION.However, updating the same file twice is a footgun. To avoid nasty timestamp issues, all build artifacts that depend on
init/built-in.amust be atomically generated inlink-vmlinux.sh, where some of them do not need rebuilding.To fix this issue, this commit changes as follows:
[1] Split
UTS_VERSIONout toinclude/generated/utsversion.hfrominclude/generated/compile.h
include/generated/utsversion.his generated just before the vmlinux link. It is generated underinclude/generated/because some decompressors (s390, x86) useUTS_VERSION.[2] Split
init_uts_nsandlinux_bannerout toinit/version-timestamp.cfrominit/version.cQuoted 7 lines
init_uts_nsandlinux_bannercontainUTS_VERSION. During the ordinary directory descending, they are compiled with__weakand used to determine if vmlinux needs relinking. Just before the vmlinux link, they are compiled without__weakto embed the real version and timestamp.Signed-off-by Masahiro Yamada <[email protected]>
Quoted 7 lines
Since this change I have noticed that the kernel image (at least on ARM64) now contains two version strings ...
$ strings arch/arm64/boot/Image | grep "Linux version" Linux version 6.0.0-rc7-00011-g2df8220cc511 (jonathanh@moonraker) (aarch64-linux-gnu-gcc (Linaro GCC 6.4-2017.08) 6.4.1 20170707, GNU ld (Linaro_Binutils-2017.08) 2.27.0.20161019) # SMP PREEMPT Linux version 6.0.0-rc7-00011-g2df8220cc511 (jonathanh@moonraker) (aarch64-linux-gnu-gcc (Linaro GCC 6.4-2017.08) 6.4.1 20170707, GNU ld (Linaro_Binutils-2017.08) 2.27.0.20161019) #20 SMP PREEMPT Thu Nov 17 09:49:18 GMT 2022Is this expected?
Yes.
The first line is a weak (i.e. unused) symbol.
The second one is a real one.
2df8220cc511326508ec4da2f43ef69311bdd7b9 fixed up arch/powerpc/boot/wrapper because it grep's vmlinux.
The weak symbols slightly increase the image size, but I do not know how to do this better.
Quoted 5 lines
Thanks!
Jon--
nvpublic
Signature · 2 lines
Best Regards Masahiro Yamada
PATCH 6/15 kbuild: generate include/generated/compile.h in top Makefile
In reply to Masahiro YamadaNow that UTS_VERSION was separated out, this header can be generated much earlier, and probably the top Makefile is a better place to do it than init/Makefile.
---
Makefile | 8 +++++++- init/Makefile | 8 +------- 2 files changed, 8 insertions(+), 8 deletions(-)
Makefile +7 -1
@@ -1198,7 +1198,7 @@ PHONY += prepare archprepare archprepare: outputmakefile archheaders archscripts scripts include/config/kernel.release \ asm-generic $(version_h) $(autoksyms_h) include/generated/utsrelease.h \ - include/generated/autoconf.h remove-stale-files + include/generated/compile.h include/generated/autoconf.h remove-stale-files prepare0: archprepare $(Q)$(MAKE) $(build)=scripts/mod
@@ -1260,6 +1260,12 @@ $(version_h): FORCE include/generated/utsrelease.h: include/config/kernel.release FORCE $(call filechk,utsrelease.h) +filechk_compile.h = $(srctree)/scripts/mkcompile_h \ + "$(UTS_MACHINE)" "$(CONFIG_CC_VERSION_TEXT)" "$(LD)" + +include/generated/compile.h: FORCE + $(call filechk,compile.h) + PHONY += headerdep headerdep: $(Q)find $(srctree)/include/ -name '*.h' | xargs --max-args 1 \
init/Makefile +1 -7
@@ -43,15 +43,9 @@ filechk_uts_version = \ $(obj)/utsversion-tmp.h: FORCE $(call filechk,uts_version) -$(obj)/version.o: include/generated/compile.h $(obj)/utsversion-tmp.h +$(obj)/version.o: $(obj)/utsversion-tmp.h CFLAGS_version.o := -include $(obj)/utsversion-tmp.h -filechk_compile.h = $(srctree)/scripts/mkcompile_h \ - "$(UTS_MACHINE)" "$(CONFIG_CC_VERSION_TEXT)" "$(LD)" - -include/generated/compile.h: FORCE - $(call filechk,compile.h) - # # Build version-timestamp.c with final UTS_VERSION #
Signature · 1 line
2.34.1
PATCH 7/15 scripts/mkcompile_h: move LC_ALL=C to '$LD -v'
In reply to Masahiro YamadaMinimize the scope of LC_ALL=C like before commit 87c94bfb8ad3 ("kbuild:
override build timestamp & version").
Give LC_ALL=C to '$LD -v' to get the consistent version output, as commit bcbcf50f5218 ("kbuild: fix ld-version.sh to not be affected by locale") mentioned the LD version is affected by locale.
While I was here, I merged two sed invocations.
---
scripts/mkcompile_h | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-)
scripts/mkcompile_h +2 -6
@@ -8,10 +8,6 @@ LD=$3 # Do not expand names set -f -# Fix the language to get consistent output -LC_ALL=C -export LC_ALL - if test -z "$KBUILD_BUILD_USER"; then LINUX_COMPILE_BY=$(whoami | sed 's/\\/\\\\/') else
@@ -23,8 +19,8 @@ else LINUX_COMPILE_HOST=$KBUILD_BUILD_HOST fi -LD_VERSION=$($LD -v | head -n1 | sed 's/(compatible with [^)]*)//' \ - | sed 's/[[:space:]]*$//') +LD_VERSION=$(LC_ALL=C $LD -v | head -n1 | + sed -e 's/(compatible with [^)]*)//' -e 's/[[:space:]]*$//') cat <<EOF #define UTS_MACHINE "${UTS_MACHINE}"
Signature · 1 line
2.34.1
PATCH 8/15 Revert "kbuild: Make scripts/compile.h when sh != bash"
In reply to Masahiro YamadaThis reverts commit [1] in the pre-git era.
I do not know what problem happened in the script when sh != bash because there is no commit message.
Now that this script is much simpler than it used to be, let's revert it, and let' see. (If this turns out to be problematic, fix the code with proper commit description.)
---
scripts/mkcompile_h | 3 --- 1 file changed, 3 deletions(-)
scripts/mkcompile_h +0 -3
@@ -5,9 +5,6 @@ UTS_MACHINE=$1 CC_VERSION="$2" LD=$3 -# Do not expand names -set -f - if test -z "$KBUILD_BUILD_USER"; then LINUX_COMPILE_BY=$(whoami | sed 's/\\/\\\\/') else
Signature · 1 line
2.34.1
PATCH 9/15 kbuild: rename modules.order in sub-directories to .modules.order
In reply to Masahiro YamadaThe next commit will move core-y from the top Makefile to ./Kbuild to use obj-y to list sub-directories.
With that, both ./Makefile and ./Kbuild would create modules.order in the top directory.
To avoid the conflict, rename the per-directory modules.order to .modules.order.
---
Makefile | 27 +++++++++++++-------------- scripts/Makefile.build | 18 +++++++++--------- scripts/Makefile.lib | 8 ++++---- 3 files changed, 26 insertions(+), 27 deletions(-)
Makefile +13 -14
@@ -1116,8 +1116,6 @@ vmlinux-alldirs := $(sort $(vmlinux-dirs) Documentation . \ build-dirs := $(vmlinux-dirs) clean-dirs := $(vmlinux-alldirs) -subdir-modorder := $(addsuffix /modules.order, $(build-dirs)) - # Externally visible symbols (used by link-vmlinux.sh) KBUILD_VMLINUX_OBJS := $(head-y) $(patsubst %/,%/built-in.a, $(core-y)) KBUILD_VMLINUX_OBJS += $(addsuffix built-in.a, $(filter %/, $(libs-y)))
@@ -1172,7 +1170,7 @@ targets := vmlinux # The actual objects are generated when descending, # make sure no implicit rule kicks in -$(sort $(vmlinux-deps) $(subdir-modorder)): descend ; +$(sort $(vmlinux-deps)): descend ; filechk_kernel.release = \ echo "$(KERNELVERSION)$$($(CONFIG_SHELL) $(srctree)/scripts/setlocalversion $(srctree))"
@@ -1444,13 +1442,6 @@ endif modules: $(if $(KBUILD_BUILTIN),vmlinux) modules_prepare -cmd_modules_order = cat $(real-prereqs) > $@ - -modules.order: $(subdir-modorder) FORCE - $(call if_changed,modules_order) - -targets += modules.order - # Target to prepare building external modules modules_prepare: prepare $(Q)$(MAKE) $(build)=scripts scripts/module.lds
@@ -1722,8 +1713,6 @@ KBUILD_BUILTIN := KBUILD_MODULES := 1 build-dirs := $(KBUILD_EXTMOD) -$(MODORDER): descend - @: compile_commands.json: $(extmod_prefix)compile_commands.json PHONY += compile_commands.json
@@ -1755,12 +1744,22 @@ help: endif # KBUILD_EXTMOD # --------------------------------------------------------------------------- -# Modules +# Modules (common for in-tree modules and external modules) PHONY += modules modules_install modules_prepare ifdef CONFIG_MODULES +subdir-modorder := $(addsuffix /.modules.order, $(build-dirs)) + +$(sort $(subdir-modorder)): %/.modules.order: % ; + +cmd_modules_order = cat $(real-prereqs) > $@ + +targets += $(MODORDER) +$(MODORDER): $(subdir-modorder) FORCE + $(call if_changed,modules_order) + modules: modules_check $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpost
@@ -1860,7 +1859,7 @@ clean: $(clean-dirs) -o -name '.*.d' -o -name '.*.tmp' -o -name '*.mod.c' \ -o -name '*.lex.c' -o -name '*.tab.[ch]' \ -o -name '*.asn1.[ch]' \ - -o -name '*.symtypes' -o -name 'modules.order' \ + -o -name '*.symtypes' -o -name '*modules.order' \ -o -name '.tmp_*' \ -o -name '*.c.[012]*.*' \ -o -name '*.ll' \
scripts/Makefile.build +9 -9
@@ -73,7 +73,7 @@ endif # subdir-builtin and subdir-modorder may contain duplications. Use $(sort ...) subdir-builtin := $(sort $(filter %/built-in.a, $(real-obj-y))) -subdir-modorder := $(sort $(filter %/modules.order, $(obj-m))) +subdir-modorder := $(sort $(filter %/.modules.order, $(obj-m))) targets-for-builtin := $(extra-y)
@@ -89,7 +89,7 @@ targets-for-modules := $(foreach x, o mod $(if $(CONFIG_TRIM_UNUSED_KSYMS), usym $(patsubst %.o, %.$x, $(filter %.o, $(obj-m)))) ifdef need-modorder -targets-for-modules += $(obj)/modules.order +targets-for-modules += $(obj)/.modules.order endif targets += $(targets-for-builtin) $(targets-for-modules)
@@ -348,7 +348,7 @@ $(obj)/%.asn1.c $(obj)/%.asn1.h: $(src)/%.asn1 $(objtree)/scripts/asn1_compiler # To build objects in subdirs, we need to descend into the directories $(subdir-builtin): $(obj)/%/built-in.a: $(obj)/% ; -$(subdir-modorder): $(obj)/%/modules.order: $(obj)/% ; +$(subdir-modorder): $(obj)/%/.modules.order: $(obj)/% ; # # Rule to compile a set of .o files into one .a file (without symbol table)
@@ -365,18 +365,18 @@ $(obj)/built-in.a: $(real-obj-y) FORCE $(call if_changed,ar_builtin) # -# Rule to create modules.order file +# Rule to create .modules.order file # -# Create commands to either record .ko file or cat modules.order from +# Create commands to either record .ko file or cat .modules.order from # a subdirectory # Add $(obj-m) as the prerequisite to avoid updating the timestamp of -# modules.order unless contained modules are updated. +# .modules.order unless contained modules are updated. cmd_modules_order = { $(foreach m, $(real-prereqs), \ - $(if $(filter %/modules.order, $m), cat $m, echo $(patsubst %.o,%.ko,$m));) :; } \ + $(if $(filter %/.modules.order, $m), cat $m, echo $(patsubst %.o,%.ko,$m));) :; } \ > $@ -$(obj)/modules.order: $(obj-m) FORCE +$(obj)/.modules.order: $(obj-m) FORCE $(call if_changed,modules_order) #
@@ -465,7 +465,7 @@ $(subdir-ym): $(Q)$(MAKE) $(build)=$@ \ $(if $(filter $@/, $(KBUILD_SINGLE_TARGETS)),single-build=) \ need-builtin=$(if $(filter $@/built-in.a, $(subdir-builtin)),1) \ - need-modorder=$(if $(filter $@/modules.order, $(subdir-modorder)),1) + need-modorder=$(if $(filter $@/.modules.order, $(subdir-modorder)),1) # Add FORCE to the prequisites of a target to force it to be always rebuilt. # ---------------------------------------------------------------------------
scripts/Makefile.lib +4 -4
@@ -26,14 +26,14 @@ subdir-ym := $(sort $(subdir-y) $(subdir-m) \ # Handle objects in subdirs: # - If we encounter foo/ in $(obj-y), replace it by foo/built-in.a and -# foo/modules.order -# - If we encounter foo/ in $(obj-m), replace it by foo/modules.order +# foo/.modules.order +# - If we encounter foo/ in $(obj-m), replace it by foo/.modules.order # -# Generate modules.order to determine modorder. Unfortunately, we don't have +# Generate .modules.order to determine modorder. Unfortunately, we don't have # information about ordering between -y and -m subdirs. Just put -y's first. ifdef need-modorder -obj-m := $(patsubst %/,%/modules.order, $(filter %/, $(obj-y)) $(obj-m)) +obj-m := $(patsubst %/,%/.modules.order, $(filter %/, $(obj-y)) $(obj-m)) else obj-m := $(filter-out %/, $(obj-m)) endif
Signature · 1 line
2.34.1
PATCH 10/15 kbuild: move core-y in top Makefile to ./Kbuild
In reply to Masahiro YamadaUse the ordinary obj-y to list subdirectories.
There are some core-y entries remaining in arch/*/Makefile. They will be moved after io_uring/built-in.a.
Note:
GNU Make seems to transform './.modules.order' to '.modules.order' before matching it against the target pattern. Split ./.modules.order to a dedicated rule to avoid "doesn't match the target pattern" warning. [1]
[1]: https://lists.gnu.org/archive/html/bug-make/2022-08/msg00059.html
---
Kbuild | 16 ++++++++++++++++ Makefile | 10 +++++----- scripts/Makefile.build | 4 ++-- 3 files changed, 23 insertions(+), 7 deletions(-)
Kbuild +16 -0
@@ -72,3 +72,19 @@ $(atomic-checks): $(obj)/.checked-%: include/linux/atomic/% FORCE PHONY += prepare prepare: $(offsets-file) missing-syscalls $(atomic-checks) @: + +# Ordinary directory descending +# --------------------------------------------------------------------------- + +obj-y += init/ +obj-y += usr/ +obj-y += arch/$(SRCARCH)/ +obj-y += kernel/ +obj-y += certs/ +obj-y += mm/ +obj-y += fs/ +obj-y += ipc/ +obj-y += security/ +obj-y += crypto/ +obj-$(CONFIG_BLOCK) += block/ +obj-$(CONFIG_IO_URING) += io_uring/
Makefile +5 -5
@@ -676,7 +676,7 @@ endif ifeq ($(KBUILD_EXTMOD),) # Objects we will link into vmlinux / subdirs we need to visit -core-y := init/ usr/ arch/$(SRCARCH)/ +core-y := ./ drivers-y := drivers/ sound/ drivers-$(CONFIG_SAMPLES) += samples/ drivers-$(CONFIG_NET) += net/
@@ -1101,9 +1101,6 @@ export MODORDER := $(extmod_prefix)modules.order export MODULES_NSDEPS := $(extmod_prefix)modules.nsdeps ifeq ($(KBUILD_EXTMOD),) -core-y += kernel/ certs/ mm/ fs/ ipc/ security/ crypto/ -core-$(CONFIG_BLOCK) += block/ -core-$(CONFIG_IO_URING) += io_uring/ vmlinux-dirs := $(patsubst %/,%,$(filter %/, \ $(core-y) $(core-m) $(drivers-y) $(drivers-m) \
@@ -1752,7 +1749,10 @@ ifdef CONFIG_MODULES subdir-modorder := $(addsuffix /.modules.order, $(build-dirs)) -$(sort $(subdir-modorder)): %/.modules.order: % ; +# Split ./.modules.order into a dedicate target to avoid +# "doesn't match the target pattern" warning +./.modules.order: . ; +$(sort $(filter-out ./.modules.order, $(subdir-modorder))): %/.modules.order: % ; cmd_modules_order = cat $(real-prereqs) > $@
scripts/Makefile.build +2 -2
@@ -464,8 +464,8 @@ PHONY += $(subdir-ym) $(subdir-ym): $(Q)$(MAKE) $(build)=$@ \ $(if $(filter $@/, $(KBUILD_SINGLE_TARGETS)),single-build=) \ - need-builtin=$(if $(filter $@/built-in.a, $(subdir-builtin)),1) \ - need-modorder=$(if $(filter $@/.modules.order, $(subdir-modorder)),1) + need-builtin=$(if $(filter $@/built-in.a, $(subdir-builtin:./%=%)),1) \ + need-modorder=$(if $(filter $@/.modules.order, $(subdir-modorder:./%=%)),1) # Add FORCE to the prequisites of a target to force it to be always rebuilt. # ---------------------------------------------------------------------------
Signature · 1 line
2.34.1
PATCH 11/15 kbuild: move .vmlinux.objs rule to Makefile.modpost
In reply to Masahiro Yamada.vmlinux.objs is used by modpost, so scripts/Makefile.modpost is a better place to generate it.
It is used only when CONFIG_MODVERSIONS=y. It should be guarded by "ifdef CONFIG_MODVERSIONS".
---
Makefile | 2 +- scripts/Makefile.modpost | 30 ++++++++++++++++++++++++++++-- scripts/link-vmlinux.sh | 18 ------------------ 3 files changed, 29 insertions(+), 21 deletions(-)
Makefile +1 -1
@@ -1489,7 +1489,7 @@ endif # CONFIG_MODULES # Directories & files removed with 'make clean' CLEAN_FILES += include/ksym vmlinux.symvers modules-only.symvers \ modules.builtin modules.builtin.modinfo modules.nsdeps \ - compile_commands.json .thinlto-cache + compile_commands.json .thinlto-cache .vmlinux.objs # Directories & files removed with 'make mrproper' MRPROPER_FILES += include/config include/generated \
scripts/Makefile.modpost +28 -2
@@ -57,6 +57,32 @@ vmlinux.symvers: vmlinux.o __modpost: vmlinux.symvers +# Generate the list of in-tree objects in vmlinux +# --------------------------------------------------------------------------- + +# This is used to retrieve symbol versions generated by genksyms. +ifdef CONFIG_MODVERSIONS +vmlinux.symvers: .vmlinux.objs +endif + +# Ignore libgcc.a +# Some architectures do '$(CC) --print-libgcc-file-name' to borrow libgcc.a +# from the toolchain, but there is no EXPORT_SYMBOL in it. + +quiet_cmd_vmlinux_objs = GEN $@ + cmd_vmlinux_objs = \ + for f in $(real-prereqs); do \ + case $${f} in \ + *libgcc.a) ;; \ + *.a) $(AR) t $${f} ;; \ + *) echo $${f} ;; \ + esac \ + done > $@ + +targets += .vmlinux.objs +.vmlinux.objs: $(KBUILD_VMLINUX_OBJS) $(KBUILD_VMLINUX_LIBS) FORCE + $(call if_changed,vmlinux_objs) + else ifeq ($(KBUILD_EXTMOD),)
@@ -134,6 +160,8 @@ ifneq ($(KBUILD_MODPOST_NOFINAL),1) $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modfinal endif +endif + PHONY += FORCE FORCE:
@@ -141,6 +169,4 @@ existing-targets := $(wildcard $(sort $(targets))) -include $(foreach f,$(existing-targets),$(dir $(f)).$(notdir $(f)).cmd) -endif - .PHONY: $(PHONY)
scripts/link-vmlinux.sh +0 -18
@@ -199,7 +199,6 @@ cleanup() rm -f System.map rm -f vmlinux rm -f vmlinux.map - rm -f .vmlinux.objs rm -f .vmlinux.export.c }
@@ -218,23 +217,6 @@ fi #link vmlinux.o ${MAKE} -f "${srctree}/scripts/Makefile.vmlinux_o" -# Generate the list of in-tree objects in vmlinux -# -# This is used to retrieve symbol versions generated by genksyms. -for f in ${KBUILD_VMLINUX_OBJS} ${KBUILD_VMLINUX_LIBS}; do - case ${f} in - *libgcc.a) - # Some architectures do '$(CC) --print-libgcc-file-name' to - # borrow libgcc.a from the toolchain. - # There is no EXPORT_SYMBOL in external objects. Ignore this. - ;; - *.a) - ${AR} t ${f} ;; - *) - echo ${f} ;; - esac -done > .vmlinux.objs - # modpost vmlinux.o to check for section mismatches ${MAKE} -f "${srctree}/scripts/Makefile.modpost" MODPOST_VMLINUX=1
Signature · 1 line
2.34.1
PATCH 12/15 kbuild: move vmlinux.o rule to the top Makefile
In reply to Masahiro YamadaMove the build rules of vmlinux.o out of scripts/link-vmlinux.sh to clearly separate 1) pre-modpost, 2) modpost, 3) post-modpost stages. This will make furture refactoring possible.
---
Makefile | 10 ++++++++-- scripts/link-vmlinux.sh | 3 --- 2 files changed, 8 insertions(+), 5 deletions(-)
Makefile +8 -2
@@ -645,6 +645,8 @@ else __all: modules endif +targets := + # Decide whether to build built-in, modular, or both. # Normally, just do built-in.
@@ -1153,6 +1155,10 @@ quiet_cmd_autoksyms_h = GEN $@ $(autoksyms_h): $(call cmd,autoksyms_h) +targets += vmlinux.o +vmlinux.o: autoksyms_recursive $(KBUILD_VMLINUX_OBJS) $(KBUILD_VMLINUX_LIBS) FORCE + $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.vmlinux_o + ARCH_POSTLINK := $(wildcard $(srctree)/arch/$(SRCARCH)/Makefile.postlink) # Final link of vmlinux with optional arch pass after final link
@@ -1160,10 +1166,10 @@ cmd_link-vmlinux = \ $(CONFIG_SHELL) $< "$(LD)" "$(KBUILD_LDFLAGS)" "$(LDFLAGS_vmlinux)"; \ $(if $(ARCH_POSTLINK), $(MAKE) -f $(ARCH_POSTLINK) $@, true) -vmlinux: scripts/link-vmlinux.sh autoksyms_recursive $(vmlinux-deps) FORCE +vmlinux: scripts/link-vmlinux.sh vmlinux.o $(KBUILD_LDS) FORCE +$(call if_changed_dep,link-vmlinux) -targets := vmlinux +targets += vmlinux # The actual objects are generated when descending, # make sure no implicit rule kicks in
scripts/link-vmlinux.sh +0 -3
@@ -214,9 +214,6 @@ if [ "$1" = "clean" ]; then exit 0 fi -#link vmlinux.o -${MAKE} -f "${srctree}/scripts/Makefile.vmlinux_o" - # modpost vmlinux.o to check for section mismatches ${MAKE} -f "${srctree}/scripts/Makefile.modpost" MODPOST_VMLINUX=1
Signature · 1 line
2.34.1
PATCH 13/15 kbuild: unify two modpost invocations
In reply to Masahiro YamadaCurrently, modpost is executed twice; first for vmlinux, second for modules.
This commit unfies them.
Current build flow
==================
1) build obj-y and obj-m objects
2) link vmlinux.o
3) modpost for vmlinux
4) link vmlinux
5) modpost for modules
6) link modules (*.ko)
The build steps 1) through 6) are serialized (that is, modules are built after vmlinux). We do not get benefits of parallel builds when scripts/link-vmlinux.sh is being run.
New build flow
==============
1) build obj-y and obj-m objects
2) link vmlinux.o
3) modpost for vmlinux and modules
4a) link vmlinux
4b) link modules (*.ko)
In the new build flow, modpost is invoked just once.
vmlinux and modules are built in parallel. One exception is CONFIG_DEBUG_INFO_BTF_MODULES=y, where modules depend on vmlinux.
---
Makefile | 30 ++++++++++--- scripts/Makefile.modfinal | 2 +- scripts/Makefile.modpost | 93 ++++++++++++--------------------------- scripts/link-vmlinux.sh | 3 -- 4 files changed, 53 insertions(+), 75 deletions(-)
Makefile +24 -6
@@ -1166,7 +1166,7 @@ cmd_link-vmlinux = \ $(CONFIG_SHELL) $< "$(LD)" "$(KBUILD_LDFLAGS)" "$(LDFLAGS_vmlinux)"; \ $(if $(ARCH_POSTLINK), $(MAKE) -f $(ARCH_POSTLINK) $@, true) -vmlinux: scripts/link-vmlinux.sh vmlinux.o $(KBUILD_LDS) FORCE +vmlinux: scripts/link-vmlinux.sh vmlinux.o $(KBUILD_LDS) modpost FORCE +$(call if_changed_dep,link-vmlinux) targets += vmlinux
@@ -1443,7 +1443,13 @@ endif # Build modules # -modules: $(if $(KBUILD_BUILTIN),vmlinux) modules_prepare +# *.ko are usually independent of vmlinux, but CONFIG_DEBUG_INFOBTF_MODULES +# is an exception. +ifdef CONFIG_DEBUG_INFO_BTF_MODULES +modules: vmlinux +endif + +modules: modules_prepare # Target to prepare building external modules modules_prepare: prepare
@@ -1766,8 +1772,12 @@ targets += $(MODORDER) $(MODORDER): $(subdir-modorder) FORCE $(call if_changed,modules_order) -modules: modules_check - $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpost +# KBUILD_MODPOST_NOFINAL can be set to skip the final link of modules. +# This is solely useful to speed up test compiles. +modules: modpost +ifneq ($(KBUILD_MODPOST_NOFINAL),1) + $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modfinal +endif PHONY += modules_check modules_check: $(MODORDER)
@@ -1798,6 +1808,11 @@ KBUILD_MODULES := endif # CONFIG_MODULES +PHONY += modpost +modpost: $(if $(single-build),, $(if $(KBUILD_BUILTIN), vmlinux.o)) \ + $(if $(KBUILD_MODULES), modules_check) + $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpost + # Single targets # --------------------------------------------------------------------------- # To build individual files in subdirectories, you can do like this:
@@ -1817,16 +1832,19 @@ single-ko := $(sort $(filter %.ko, $(MAKECMDGOALS))) single-no-ko := $(filter-out $(single-ko), $(MAKECMDGOALS)) \ $(foreach x, o mod, $(patsubst %.ko, %.$x, $(single-ko))) -$(single-ko): single_modpost +$(single-ko): single_modules @: $(single-no-ko): descend @: # Remove MODORDER when done because it is not the real one. PHONY += single_modpost -single_modpost: $(single-no-ko) modules_prepare +single_modules: $(single-no-ko) modules_prepare $(Q){ $(foreach m, $(single-ko), echo $(extmod_prefix)$m;) } > $(MODORDER) $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpost +ifneq ($(KBUILD_MODPOST_NOFINAL),1) + $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modfinal +endif $(Q)rm -f $(MODORDER) export KBUILD_SINGLE_TARGETS := $(addprefix $(extmod_prefix), $(single-no-ko))
scripts/Makefile.modfinal +1 -1
@@ -55,7 +55,7 @@ if_changed_except = $(if $(call newer_prereqs_except,$(2))$(cmd-check), \ printf '%s\n' 'cmd_$@ := $(make-cmd)' > $(dot-target).cmd, @:) # Re-generate module BTFs if either module's .ko or vmlinux changed -$(modules): %.ko: %.o %.mod.o scripts/module.lds $(if $(KBUILD_BUILTIN),vmlinux) FORCE +$(modules): %.ko: %.o %.mod.o scripts/module.lds $(and $(CONFIG_DEBUG_INFO_BTF_MODULES),$(KBUILD_BUILTIN),vmlinux) FORCE +$(call if_changed_except,ld_ko_o,vmlinux) ifdef CONFIG_DEBUG_INFO_BTF_MODULES +$(if $(newer-prereqs),$(call cmd,btf_ko))
scripts/Makefile.modpost +28 -65
141 lines not on this page · raw message
scripts/link-vmlinux.sh +0 -3
@@ -214,9 +214,6 @@ if [ "$1" = "clean" ]; then exit 0 fi -# modpost vmlinux.o to check for section mismatches -${MAKE} -f "${srctree}/scripts/Makefile.modpost" MODPOST_VMLINUX=1 - info MODINFO modules.builtin.modinfo ${OBJCOPY} -j .modinfo -O binary vmlinux.o modules.builtin.modinfo info GEN modules.builtin
Signature · 1 line
2.34.1
PATCH 14/15 kbuild: use obj-y instead extra-y for objects placed at the head
In reply to Masahiro YamadaThe objects placed at the head of vmlinux need special treatments:
- arch/$(SRCARCH)/Makefile adds them to head-y in order to place them before other archives in the linker command line.
- arch/$(SRCARCH)/kernel/Makefile adds them to extra-y instead of obj-y to avoid them going into built-in.a.
This commit gets rid of the second one.
Create vmlinux.a to collect all the objects that are unconditionally linked to vmlinux. The objects listed in head-y are moved to the head of vmlinux.a by using 'ar m'.
With this, arch/$(SRCARCH)/kernel/Makefile can consistently use obj-y for builtin objects.
There is no *.o that is directly linked to vmlinux. Drop unneeded code in scripts/clang-tools/gen_compile_commands.py.
---
Documentation/kbuild/makefiles.rst | 18 +---------------- Makefile | 18 +++++++++++++---- arch/alpha/kernel/Makefile | 4 ++-- arch/arc/kernel/Makefile | 4 ++-- arch/arm/kernel/Makefile | 4 ++-- arch/arm64/kernel/Makefile | 4 ++-- arch/csky/kernel/Makefile | 4 ++-- arch/hexagon/kernel/Makefile | 3 ++- arch/ia64/kernel/Makefile | 4 ++-- arch/loongarch/kernel/Makefile | 4 ++-- arch/m68k/68000/Makefile | 2 +- arch/m68k/coldfire/Makefile | 2 +- arch/m68k/kernel/Makefile | 21 ++++++++++---------- arch/microblaze/kernel/Makefile | 4 ++-- arch/mips/kernel/Makefile | 4 ++-- arch/nios2/kernel/Makefile | 2 +- arch/openrisc/kernel/Makefile | 4 ++-- arch/parisc/kernel/Makefile | 4 ++-- arch/powerpc/kernel/Makefile | 22 ++++++++++----------- arch/riscv/kernel/Makefile | 2 +- arch/s390/kernel/Makefile | 4 ++-- arch/sh/kernel/Makefile | 4 ++-- arch/sparc/kernel/Makefile | 3 +-- arch/x86/kernel/Makefile | 10 +++++----- arch/xtensa/kernel/Makefile | 4 ++-- scripts/Makefile.modpost | 5 ++--- scripts/Makefile.vmlinux_o | 6 +++--- scripts/clang-tools/gen_compile_commands.py | 19 +----------------- scripts/link-vmlinux.sh | 10 ++++------ 29 files changed, 87 insertions(+), 112 deletions(-)
Documentation/kbuild/makefiles.rst +1 -17
@@ -340,19 +340,7 @@ more details, with real examples. Examples are: - 1) head objects - - Some objects must be placed at the head of vmlinux. They are - directly linked to vmlinux without going through built-in.a - A typical use-case is an object that contains the entry point. - - arch/$(SRCARCH)/Makefile should specify such objects as head-y. - - Discussion: - Given that we can control the section order in the linker script, - why do we need head-y? - - 2) vmlinux linker script + 1) vmlinux linker script The linker script for vmlinux is located at arch/$(SRCARCH)/kernel/vmlinux.lds
@@ -360,10 +348,6 @@ more details, with real examples. Example:: # arch/x86/kernel/Makefile - extra-y := head_$(BITS).o - extra-y += head$(BITS).o - extra-y += ebda.o - extra-y += platform-quirks.o extra-y += vmlinux.lds $(extra-y) should only contain targets needed for vmlinux.
Makefile +14 -4
@@ -1116,7 +1116,7 @@ build-dirs := $(vmlinux-dirs) clean-dirs := $(vmlinux-alldirs) # Externally visible symbols (used by link-vmlinux.sh) -KBUILD_VMLINUX_OBJS := $(head-y) $(patsubst %/,%/built-in.a, $(core-y)) +KBUILD_VMLINUX_OBJS := $(patsubst %/,%/built-in.a, $(core-y)) KBUILD_VMLINUX_OBJS += $(addsuffix built-in.a, $(filter %/, $(libs-y))) ifdef CONFIG_MODULES KBUILD_VMLINUX_OBJS += $(patsubst %/, %/lib.a, $(filter %/, $(libs-y)))
@@ -1126,7 +1126,7 @@ KBUILD_VMLINUX_LIBS := $(patsubst %/,%/lib.a, $(libs-y)) endif KBUILD_VMLINUX_OBJS += $(patsubst %/,%/built-in.a, $(drivers-y)) -export KBUILD_VMLINUX_OBJS KBUILD_VMLINUX_LIBS +export KBUILD_VMLINUX_LIBS export KBUILD_LDS := arch/$(SRCARCH)/kernel/vmlinux.lds # used by scripts/Makefile.package export KBUILD_ALLDIRS := $(sort $(filter-out arch/%,$(vmlinux-alldirs)) LICENSES arch include scripts tools)
@@ -1155,8 +1155,18 @@ quiet_cmd_autoksyms_h = GEN $@ $(autoksyms_h): $(call cmd,autoksyms_h) +quiet_cmd_ar_vmlinux.a = AR $@ + cmd_ar_vmlinux.a = \ + rm -f $@; \ + $(AR) cDPrST $@ $(KBUILD_VMLINUX_OBJS); \ + $(AR) mPi $$($(AR) t $@| head -n1) $@ $(head-y) + +targets += vmlinux.a +vmlinux.a: $(KBUILD_VMLINUX_OBJS) FORCE + $(call if_changed,ar_vmlinux.a) + targets += vmlinux.o -vmlinux.o: autoksyms_recursive $(KBUILD_VMLINUX_OBJS) $(KBUILD_VMLINUX_LIBS) FORCE +vmlinux.o: autoksyms_recursive vmlinux.a $(KBUILD_VMLINUX_LIBS) FORCE $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.vmlinux_o ARCH_POSTLINK := $(wildcard $(srctree)/arch/$(SRCARCH)/Makefile.postlink)
@@ -1913,7 +1923,7 @@ quiet_cmd_gen_compile_commands = GEN $@ cmd_gen_compile_commands = $(PYTHON3) $< -a $(AR) -o $@ $(filter-out $<, $(real-prereqs)) $(extmod_prefix)compile_commands.json: scripts/clang-tools/gen_compile_commands.py \ - $(if $(KBUILD_EXTMOD),,$(KBUILD_VMLINUX_OBJS) $(KBUILD_VMLINUX_LIBS)) \ + $(if $(KBUILD_EXTMOD),, vmlinux.a $(KBUILD_VMLINUX_LIBS)) \ $(if $(CONFIG_MODULES), $(MODORDER)) FORCE $(call if_changed,gen_compile_commands)
arch/alpha/kernel/Makefile +2 -2
@@ -3,11 +3,11 @@ # Makefile for the linux kernel. # -extra-y := head.o vmlinux.lds +extra-y := vmlinux.lds asflags-y := $(KBUILD_CFLAGS) ccflags-y := -Wno-sign-compare -obj-y := entry.o traps.o process.o osf_sys.o irq.o \ +obj-y := head.o entry.o traps.o process.o osf_sys.o irq.o \ irq_alpha.o signal.o setup.o ptrace.o time.o \ systbls.o err_common.o io.o bugs.o
arch/arc/kernel/Makefile +2 -2
@@ -3,7 +3,7 @@ # Copyright (C) 2004, 2007-2010, 2011-2012 Synopsys, Inc. (www.synopsys.com) # -obj-y := arcksyms.o setup.o irq.o reset.o ptrace.o process.o devtree.o +obj-y := head.o arcksyms.o setup.o irq.o reset.o ptrace.o process.o devtree.o obj-y += signal.o traps.o sys.o troubleshoot.o stacktrace.o disasm.o obj-$(CONFIG_ISA_ARCOMPACT) += entry-compact.o intc-compact.o obj-$(CONFIG_ISA_ARCV2) += entry-arcv2.o intc-arcv2.o
@@ -31,4 +31,4 @@ else obj-y += ctx_sw_asm.o endif -extra-y := vmlinux.lds head.o +extra-y := vmlinux.lds
arch/arm/kernel/Makefile +2 -2
@@ -89,7 +89,7 @@ obj-$(CONFIG_VDSO) += vdso.o obj-$(CONFIG_EFI) += efi.o obj-$(CONFIG_PARAVIRT) += paravirt.o -head-y := head$(MMUEXT).o +obj-y += head$(MMUEXT).o obj-$(CONFIG_DEBUG_LL) += debug.o obj-$(CONFIG_EARLY_PRINTK) += early_printk.o obj-$(CONFIG_ARM_PATCH_PHYS_VIRT) += phys2virt.o
@@ -109,4 +109,4 @@ obj-$(CONFIG_HAVE_ARM_SMCCC) += smccc-call.o obj-$(CONFIG_GENERIC_CPU_VULNERABILITIES) += spectre.o -extra-y := $(head-y) vmlinux.lds +extra-y := vmlinux.lds
arch/arm64/kernel/Makefile +2 -2
@@ -85,8 +85,8 @@ $(obj)/vdso-wrap.o: $(obj)/vdso/vdso.so $(obj)/vdso32-wrap.o: $(obj)/vdso32/vdso.so obj-y += probes/ -head-y := head.o -extra-y += $(head-y) vmlinux.lds +obj-y += head.o +extra-y += vmlinux.lds ifeq ($(CONFIG_DEBUG_EFI),y) AFLAGS_head.o += -DVMLINUX_PATH="\"$(realpath $(objtree)/vmlinux)\""
arch/csky/kernel/Makefile +2 -2
@@ -1,7 +1,7 @@ # SPDX-License-Identifier: GPL-2.0-only -extra-y := head.o vmlinux.lds +extra-y := vmlinux.lds -obj-y += entry.o atomic.o signal.o traps.o irq.o time.o vdso.o vdso/ +obj-y += head.o entry.o atomic.o signal.o traps.o irq.o time.o vdso.o vdso/ obj-y += power.o syscall.o syscall_table.o setup.o io.o obj-y += process.o cpu-probe.o ptrace.o stacktrace.o obj-y += probes/
arch/hexagon/kernel/Makefile +2 -1
@@ -1,6 +1,7 @@ # SPDX-License-Identifier: GPL-2.0 -extra-y := head.o vmlinux.lds +extra-y := vmlinux.lds +obj-y += head.o obj-$(CONFIG_SMP) += smp.o obj-y += setup.o irq_cpu.o traps.o syscalltab.o signal.o time.o
arch/ia64/kernel/Makefile +2 -2
@@ -7,9 +7,9 @@ ifdef CONFIG_DYNAMIC_FTRACE CFLAGS_REMOVE_ftrace.o = -pg endif -extra-y := head.o vmlinux.lds +extra-y := vmlinux.lds -obj-y := entry.o efi.o efi_stub.o gate-data.o fsys.o irq.o irq_ia64.o \ +obj-y := head.o entry.o efi.o efi_stub.o gate-data.o fsys.o irq.o irq_ia64.o \ irq_lsapic.o ivt.o pal.o patch.o process.o ptrace.o sal.o \ salinfo.o setup.o signal.o sys_ia64.o time.o traps.o unaligned.o \ unwind.o mca.o mca_asm.o topology.o dma-mapping.o iosapic.o acpi.o \
arch/loongarch/kernel/Makefile +2 -2
@@ -3,9 +3,9 @@ # Makefile for the Linux/LoongArch kernel. # -extra-y := head.o vmlinux.lds +extra-y := vmlinux.lds -obj-y += cpu-probe.o cacheinfo.o env.o setup.o entry.o genex.o \ +obj-y += head.o cpu-probe.o cacheinfo.o env.o setup.o entry.o genex.o \ traps.o irq.o idle.o process.o dma.o mem.o io.o reset.o switch.o \ elf.o syscall.o signal.o time.o topology.o inst.o ptrace.o vdso.o
arch/m68k/68000/Makefile +1 -1
@@ -17,4 +17,4 @@ obj-$(CONFIG_DRAGEN2) += dragen2.o obj-$(CONFIG_UCSIMM) += ucsimm.o obj-$(CONFIG_UCDIMM) += ucsimm.o -extra-y := head.o +obj-y += head.o
arch/m68k/coldfire/Makefile +1 -1
@@ -45,4 +45,4 @@ obj-$(CONFIG_STMARK2) += stmark2.o obj-$(CONFIG_PCI) += pci.o obj-y += gpio.o -extra-y := head.o +obj-y += head.o
arch/m68k/kernel/Makefile +11 -10
@@ -3,18 +3,19 @@ # Makefile for the linux kernel. # -extra-$(CONFIG_AMIGA) := head.o -extra-$(CONFIG_ATARI) := head.o -extra-$(CONFIG_MAC) := head.o -extra-$(CONFIG_APOLLO) := head.o -extra-$(CONFIG_VME) := head.o -extra-$(CONFIG_HP300) := head.o -extra-$(CONFIG_Q40) := head.o -extra-$(CONFIG_SUN3X) := head.o -extra-$(CONFIG_VIRT) := head.o -extra-$(CONFIG_SUN3) := sun3-head.o extra-y += vmlinux.lds +obj-$(CONFIG_AMIGA) := head.o +obj-$(CONFIG_ATARI) := head.o +obj-$(CONFIG_MAC) := head.o +obj-$(CONFIG_APOLLO) := head.o +obj-$(CONFIG_VME) := head.o +obj-$(CONFIG_HP300) := head.o +obj-$(CONFIG_Q40) := head.o +obj-$(CONFIG_SUN3X) := head.o +obj-$(CONFIG_VIRT) := head.o +obj-$(CONFIG_SUN3) := sun3-head.o + obj-y := entry.o irq.o module.o process.o ptrace.o obj-y += setup.o signal.o sys_m68k.o syscalltable.o time.o traps.o
arch/microblaze/kernel/Makefile +2 -2
@@ -12,9 +12,9 @@ CFLAGS_REMOVE_ftrace.o = -pg CFLAGS_REMOVE_process.o = -pg endif -extra-y := head.o vmlinux.lds +extra-y := vmlinux.lds -obj-y += dma.o exceptions.o \ +obj-y += head.o dma.o exceptions.o \ hw_exception_handler.o irq.o \ process.o prom.o ptrace.o \ reset.o setup.o signal.o sys_microblaze.o timer.o traps.o unwind.o
arch/mips/kernel/Makefile +2 -2
@@ -3,9 +3,9 @@ # Makefile for the Linux/MIPS kernel. # -extra-y := head.o vmlinux.lds +extra-y := vmlinux.lds -obj-y += branch.o cmpxchg.o elf.o entry.o genex.o idle.o irq.o \ +obj-y += head.o branch.o cmpxchg.o elf.o entry.o genex.o idle.o irq.o \ process.o prom.o ptrace.o reset.o setup.o signal.o \ syscall.o time.o topology.o traps.o unaligned.o watch.o \ vdso.o cacheinfo.o
arch/nios2/kernel/Makefile +1 -1
@@ -3,9 +3,9 @@ # Makefile for the nios2 linux kernel. # -extra-y += head.o extra-y += vmlinux.lds +obj-y += head.o obj-y += cpuinfo.o obj-y += entry.o obj-y += insnemu.o
arch/openrisc/kernel/Makefile +2 -2
@@ -3,9 +3,9 @@ # Makefile for the linux kernel. # -extra-y := head.o vmlinux.lds +extra-y := vmlinux.lds -obj-y := setup.o or32_ksyms.o process.o dma.o \ +obj-y := head.o setup.o or32_ksyms.o process.o dma.o \ traps.o time.o irq.o entry.o ptrace.o signal.o \ sys_call_table.o unwinder.o
arch/parisc/kernel/Makefile +2 -2
@@ -3,9 +3,9 @@ # Makefile for arch/parisc/kernel # -extra-y := head.o vmlinux.lds +extra-y := vmlinux.lds -obj-y := cache.o pacache.o setup.o pdt.o traps.o time.o irq.o \ +obj-y := head.o cache.o pacache.o setup.o pdt.o traps.o time.o irq.o \ pa7300lc.o syscall.o entry.o sys_parisc.o firmware.o \ ptrace.o hardware.o inventory.o drivers.o alternative.o \ signal.o hpmc.o real2.o parisc_ksyms.o unaligned.o \
arch/powerpc/kernel/Makefile +11 -11
@@ -118,12 +118,12 @@ obj-$(CONFIG_PPC_FSL_BOOK3E) += cpu_setup_fsl_booke.o obj-$(CONFIG_PPC_DOORBELL) += dbell.o obj-$(CONFIG_JUMP_LABEL) += jump_label.o -extra-$(CONFIG_PPC64) := head_64.o -extra-$(CONFIG_PPC_BOOK3S_32) := head_book3s_32.o -extra-$(CONFIG_40x) := head_40x.o -extra-$(CONFIG_44x) := head_44x.o -extra-$(CONFIG_FSL_BOOKE) := head_fsl_booke.o -extra-$(CONFIG_PPC_8xx) := head_8xx.o +obj-$(CONFIG_PPC64) += head_64.o +obj-$(CONFIG_PPC_BOOK3S_32) += head_book3s_32.o +obj-$(CONFIG_40x) += head_40x.o +obj-$(CONFIG_44x) += head_44x.o +obj-$(CONFIG_FSL_BOOKE) += head_fsl_booke.o +obj-$(CONFIG_PPC_8xx) += head_8xx.o extra-y += vmlinux.lds obj-$(CONFIG_RELOCATABLE) += reloc_$(BITS).o
@@ -198,12 +198,12 @@ KCOV_INSTRUMENT_paca.o := n CFLAGS_setup_64.o += -fno-stack-protector CFLAGS_paca.o += -fno-stack-protector -extra-$(CONFIG_PPC_FPU) += fpu.o -extra-$(CONFIG_ALTIVEC) += vector.o -extra-$(CONFIG_PPC64) += entry_64.o -extra-$(CONFIG_PPC_OF_BOOT_TRAMPOLINE) += prom_init.o +obj-$(CONFIG_PPC_FPU) += fpu.o +obj-$(CONFIG_ALTIVEC) += vector.o +obj-$(CONFIG_PPC64) += entry_64.o +obj-$(CONFIG_PPC_OF_BOOT_TRAMPOLINE) += prom_init.o -extra-$(CONFIG_PPC_OF_BOOT_TRAMPOLINE) += prom_init_check +obj-$(CONFIG_PPC_OF_BOOT_TRAMPOLINE) += prom_init_check quiet_cmd_prom_init_check = PROMCHK $@ cmd_prom_init_check = $(CONFIG_SHELL) $< "$(NM)" $(obj)/prom_init.o; touch $@
arch/riscv/kernel/Makefile +1 -1
@@ -28,9 +28,9 @@ KASAN_SANITIZE_cpufeature.o := n endif endif -extra-y += head.o extra-y += vmlinux.lds +obj-y += head.o obj-y += soc.o obj-$(CONFIG_RISCV_ALTERNATIVE) += alternative.o obj-y += cpu.o
arch/s390/kernel/Makefile +2 -2
@@ -33,7 +33,7 @@ CFLAGS_stacktrace.o += -fno-optimize-sibling-calls CFLAGS_dumpstack.o += -fno-optimize-sibling-calls CFLAGS_unwind_bc.o += -fno-optimize-sibling-calls -obj-y := traps.o time.o process.o earlypgm.o early.o setup.o idle.o vtime.o +obj-y := head64.o traps.o time.o process.o earlypgm.o early.o setup.o idle.o vtime.o obj-y += processor.o syscall.o ptrace.o signal.o cpcmd.o ebcdic.o nmi.o obj-y += debug.o irq.o ipl.o dis.o diag.o vdso.o cpufeature.o obj-y += sysinfo.o lgr.o os_info.o machine_kexec.o
@@ -42,7 +42,7 @@ obj-y += entry.o reipl.o relocate_kernel.o kdebugfs.o alternative.o obj-y += nospec-branch.o ipl_vmparm.o machine_kexec_reloc.o unwind_bc.o obj-y += smp.o text_amode31.o stacktrace.o -extra-y += head64.o vmlinux.lds +extra-y += vmlinux.lds obj-$(CONFIG_SYSFS) += nospec-sysfs.o CFLAGS_REMOVE_nospec-branch.o += $(CC_FLAGS_EXPOLINE)
arch/sh/kernel/Makefile +2 -2
@@ -3,7 +3,7 @@ # Makefile for the Linux/SuperH kernel. # -extra-y := head_32.o vmlinux.lds +extra-y := vmlinux.lds ifdef CONFIG_FUNCTION_TRACER # Do not profile debug and lowlevel utilities
@@ -12,7 +12,7 @@ endif CFLAGS_REMOVE_return_address.o = -pg -obj-y := debugtraps.o dumpstack.o \ +obj-y := head_32.o debugtraps.o dumpstack.o \ idle.o io.o irq.o irq_32.o kdebugfs.o \ machvec.o nmi_debug.o process.o \ process_32.o ptrace.o ptrace_32.o \
arch/sparc/kernel/Makefile +1 -2
@@ -7,8 +7,6 @@ asflags-y := -ansi ccflags-y := -Werror -extra-y := head_$(BITS).o - # Undefine sparc when processing vmlinux.lds - it is used # And teach CPP we are doing $(BITS) builds (for this case) CPPFLAGS_vmlinux.lds := -Usparc -m$(BITS)
@@ -22,6 +20,7 @@ CFLAGS_REMOVE_perf_event.o := -pg CFLAGS_REMOVE_pcr.o := -pg endif +obj-y := head_$(BITS).o obj-$(CONFIG_SPARC64) += urtt_fill.o obj-$(CONFIG_SPARC32) += entry.o wof.o wuf.o obj-$(CONFIG_SPARC32) += etrap_32.o
arch/x86/kernel/Makefile +5 -5
@@ -3,10 +3,6 @@ # Makefile for the linux kernel. # -extra-y := head_$(BITS).o -extra-y += head$(BITS).o -extra-y += ebda.o -extra-y += platform-quirks.o extra-y += vmlinux.lds CPPFLAGS_vmlinux.lds += -U$(UTS_MACHINE)
@@ -42,7 +38,11 @@ KCOV_INSTRUMENT := n CFLAGS_irq.o := -I $(srctree)/$(src)/../include/asm/trace -obj-y := process_$(BITS).o signal.o +obj-y += head_$(BITS).o +obj-y += head$(BITS).o +obj-y += ebda.o +obj-y += platform-quirks.o +obj-y += process_$(BITS).o signal.o obj-$(CONFIG_COMPAT) += signal_compat.o obj-y += traps.o idt.o irq.o irq_$(BITS).o dumpstack_$(BITS).o obj-y += time.o ioport.o dumpstack.o nmi.o
arch/xtensa/kernel/Makefile +2 -2
@@ -3,9 +3,9 @@ # Makefile for the Linux/Xtensa kernel. # -extra-y := head.o vmlinux.lds +extra-y := vmlinux.lds -obj-y := align.o coprocessor.o entry.o irq.o platform.o process.o \ +obj-y := head.o align.o coprocessor.o entry.o irq.o platform.o process.o \ ptrace.o setup.o signal.o stacktrace.o syscall.o time.o traps.o \ vectors.o
scripts/Makefile.modpost +2 -3
@@ -70,13 +70,12 @@ quiet_cmd_vmlinux_objs = GEN $@ for f in $(real-prereqs); do \ case $${f} in \ *libgcc.a) ;; \ - *.a) $(AR) t $${f} ;; \ - *) echo $${f} ;; \ + *) $(AR) t $${f} ;; \ esac \ done > $@ targets += .vmlinux.objs -.vmlinux.objs: $(KBUILD_VMLINUX_OBJS) $(KBUILD_VMLINUX_LIBS) FORCE +.vmlinux.objs: vmlinux.a $(KBUILD_VMLINUX_LIBS) FORCE $(call if_changed,vmlinux_objs) vmlinux.o-if-present := $(wildcard vmlinux.o)
scripts/Makefile.vmlinux_o +3 -3
@@ -18,7 +18,7 @@ quiet_cmd_gen_initcalls_lds = GEN $@ $(PERL) $(real-prereqs) > $@ .tmp_initcalls.lds: $(srctree)/scripts/generate_initcall_order.pl \ - $(KBUILD_VMLINUX_OBJS) $(KBUILD_VMLINUX_LIBS) FORCE + vmlinux.a $(KBUILD_VMLINUX_LIBS) FORCE $(call if_changed,gen_initcalls_lds) targets := .tmp_initcalls.lds
@@ -55,7 +55,7 @@ quiet_cmd_ld_vmlinux.o = LD $@ cmd_ld_vmlinux.o = \ $(LD) ${KBUILD_LDFLAGS} -r -o $@ \ $(addprefix -T , $(initcalls-lds)) \ - --whole-archive $(KBUILD_VMLINUX_OBJS) --no-whole-archive \ + --whole-archive vmlinux.a --no-whole-archive \ --start-group $(KBUILD_VMLINUX_LIBS) --end-group \ $(cmd_objtool)
@@ -64,7 +64,7 @@ define rule_ld_vmlinux.o $(call cmd,gen_objtooldep) endef -vmlinux.o: $(initcalls-lds) $(KBUILD_VMLINUX_OBJS) $(KBUILD_VMLINUX_LIBS) FORCE +vmlinux.o: $(initcalls-lds) vmlinux.a $(KBUILD_VMLINUX_LIBS) FORCE $(call if_changed_rule,ld_vmlinux.o) targets += vmlinux.o
scripts/clang-tools/gen_compile_commands.py +1 -18
@@ -109,20 +109,6 @@ def to_cmdfile(path): return os.path.join(dir, '.' + base + '.cmd') -def cmdfiles_for_o(obj): - """Generate the iterator of .cmd files associated with the object - - Yield the .cmd file used to build the given object - - Args: - obj: The object path - - Yields: - The path to .cmd file - """ - yield to_cmdfile(obj) - - def cmdfiles_for_a(archive, ar): """Generate the iterator of .cmd files associated with the archive.
@@ -211,13 +197,10 @@ def main(): for path in paths: # If 'path' is a directory, handle all .cmd files under it. # Otherwise, handle .cmd files associated with the file. - # Most of built-in objects are linked via archives (built-in.a or lib.a) - # but some objects are linked to vmlinux directly. + # built-in objects are linked via vmlinux.a # Modules are listed in modules.order. if os.path.isdir(path): cmdfiles = cmdfiles_in_dir(path) - elif path.endswith('.o'): - cmdfiles = cmdfiles_for_o(path) elif path.endswith('.a'): cmdfiles = cmdfiles_for_a(path, ar) elif path.endswith('modules.order'):
scripts/link-vmlinux.sh +4 -6
@@ -3,17 +3,15 @@ # # link vmlinux # -# vmlinux is linked from the objects selected by $(KBUILD_VMLINUX_OBJS) and -# $(KBUILD_VMLINUX_LIBS). Most are built-in.a files from top-level directories -# in the kernel tree, others are specified in arch/$(ARCH)/Makefile. +# vmlinux is linked from the objects in vmlinux.a and $(KBUILD_VMLINUX_LIBS). +# vmlinux.a contains objects that are linked unconditionally. # $(KBUILD_VMLINUX_LIBS) are archives which are linked conditionally # (not within --whole-archive), and do not require symbol indexes added. # # vmlinux # ^ # | -# +--< $(KBUILD_VMLINUX_OBJS) -# | +--< init/built-in.a drivers/built-in.a mm/built-in.a + more +# +--< vmlinux.a # | # +--< $(KBUILD_VMLINUX_LIBS) # | +--< lib/lib.a + more
@@ -67,7 +65,7 @@ vmlinux_link() objs=vmlinux.o libs= else - objs="${KBUILD_VMLINUX_OBJS}" + objs=vmlinux.a libs="${KBUILD_VMLINUX_LIBS}" fi
Signature · 1 line
2.34.1
PATCH 15/15 kbuild: remove head-y syntax
In reply to Masahiro YamadaKbuild puts the objects listed in head-y at the head of vmlinux. Conventionally, we do this for head*.S, which contains the kernel entry point.
A counter approach is to control the section order in the linker script. Actually, the code marked as __HEAD goes into the ".head.text" section, which is placed before the normal ".text" section.
I do not know if both of them are needed. head-y is not mandatory. If you can achieve the proper code placement by the linker script only, it would be cleaner.
I collected the current head-y objects into head-object-list.txt. It is a whitelist. My hope is it will be reduced in the long run.
---
Documentation/kbuild/makefiles.rst | 9 ++--- Makefile | 4 +-- arch/alpha/Makefile | 2 -- arch/arc/Makefile | 2 -- arch/arm/Makefile | 3 -- arch/arm64/Makefile | 3 -- arch/csky/Makefile | 2 -- arch/hexagon/Makefile | 2 -- arch/ia64/Makefile | 1 - arch/loongarch/Makefile | 2 -- arch/m68k/Makefile | 9 ----- arch/microblaze/Makefile | 1 - arch/mips/Makefile | 2 -- arch/nios2/Makefile | 1 - arch/openrisc/Makefile | 2 -- arch/parisc/Makefile | 2 -- arch/powerpc/Makefile | 12 ------- arch/riscv/Makefile | 2 -- arch/s390/Makefile | 2 -- arch/sh/Makefile | 2 -- arch/sparc/Makefile | 2 -- arch/x86/Makefile | 5 --- arch/xtensa/Makefile | 2 -- scripts/head-object-list.txt | 53 ++++++++++++++++++++++++++++++ 24 files changed, 60 insertions(+), 67 deletions(-) create mode 100644 scripts/head-object-list.txt
Documentation/kbuild/makefiles.rst +5 -4
@@ -1065,8 +1065,7 @@ When kbuild executes, the following steps are followed (roughly): - The values of the above variables are expanded in arch/$(SRCARCH)/Makefile. 5) All object files are then linked and the resulting file vmlinux is located at the root of the obj tree. - The very first objects linked are listed in head-y, assigned by - arch/$(SRCARCH)/Makefile. + The very first objects linked are listed in scripts/head-object-list.txt. 6) Finally, the architecture-specific part does any required post processing and builds the final bootimage. - This includes building boot records
@@ -1214,6 +1213,9 @@ When kbuild executes, the following steps are followed (roughly): All object files for vmlinux. They are linked to vmlinux in the same order as listed in KBUILD_VMLINUX_OBJS. + The objects listed in scripts/head-object-list.txt are exceptions; + they are placed before the other objects. + KBUILD_VMLINUX_LIBS All .a "lib" files for vmlinux. KBUILD_VMLINUX_OBJS and
@@ -1257,8 +1259,7 @@ When kbuild executes, the following steps are followed (roughly): machinery is all architecture-independent. - head-y, core-y, libs-y, drivers-y - $(head-y) lists objects to be linked first in vmlinux. + core-y, libs-y, drivers-y $(libs-y) lists directories where a lib.a archive can be located.
Makefile +2 -2
@@ -1159,10 +1159,10 @@ quiet_cmd_ar_vmlinux.a = AR $@ cmd_ar_vmlinux.a = \ rm -f $@; \ $(AR) cDPrST $@ $(KBUILD_VMLINUX_OBJS); \ - $(AR) mPi $$($(AR) t $@| head -n1) $@ $(head-y) + $(AR) mPi $$($(AR) t $@| head -n1) $@ $$($(AR) t $@ | grep -F --file=$(srctree)/scripts/head-object-list.txt) targets += vmlinux.a -vmlinux.a: $(KBUILD_VMLINUX_OBJS) FORCE +vmlinux.a: $(KBUILD_VMLINUX_OBJS) scripts/head-object-list.txt FORCE $(call if_changed,ar_vmlinux.a) targets += vmlinux.o
arch/alpha/Makefile +0 -2
@@ -36,8 +36,6 @@ cflags-y += $(cpuflags-y) # BWX is most important, but we don't really want any emulation ever. KBUILD_CFLAGS += $(cflags-y) -Wa,-mev6 -head-y := arch/alpha/kernel/head.o - libs-y += arch/alpha/lib/ # export what is needed by arch/alpha/boot/Makefile
arch/arc/Makefile +0 -2
@@ -82,8 +82,6 @@ KBUILD_CFLAGS += $(cflags-y) KBUILD_AFLAGS += $(KBUILD_CFLAGS) KBUILD_LDFLAGS += $(ldflags-y) -head-y := arch/arc/kernel/head.o - # w/o this dtb won't embed into kernel binary core-y += arch/arc/boot/dts/
arch/arm/Makefile +0 -3
@@ -134,9 +134,6 @@ KBUILD_AFLAGS +=$(CFLAGS_ABI) $(AFLAGS_ISA) $(arch-y) $(tune-y) -include asm/uni CHECKFLAGS += -D__arm__ -#Default value -head-y := arch/arm/kernel/head$(MMUEXT).o - # Text offset. This list is sorted numerically by address in order to # provide a means to avoid/resolve conflicts in multi-arch kernels. # Note: the 32kB below this value is reserved for use by the kernel
arch/arm64/Makefile +0 -3
@@ -133,9 +133,6 @@ ifeq ($(CONFIG_DYNAMIC_FTRACE_WITH_REGS),y) CC_FLAGS_FTRACE := -fpatchable-function-entry=2 endif -# Default value -head-y := arch/arm64/kernel/head.o - ifeq ($(CONFIG_KASAN_SW_TAGS), y) KASAN_SHADOW_SCALE_SHIFT := 4 else ifeq ($(CONFIG_KASAN_GENERIC), y)
arch/csky/Makefile +0 -2
@@ -59,8 +59,6 @@ LDFLAGS += -EL KBUILD_AFLAGS += $(KBUILD_CFLAGS) -head-y := arch/csky/kernel/head.o - core-y += arch/csky/$(CSKYABI)/ libs-y += arch/csky/lib/ \
arch/hexagon/Makefile +0 -2
@@ -32,5 +32,3 @@ KBUILD_LDFLAGS += $(ldflags-y) TIR_NAME := r19 KBUILD_CFLAGS += -ffixed-$(TIR_NAME) -DTHREADINFO_REG=$(TIR_NAME) -D__linux__ KBUILD_AFLAGS += -DTHREADINFO_REG=$(TIR_NAME) - -head-y := arch/hexagon/kernel/head.o
arch/ia64/Makefile +0 -1
@@ -44,7 +44,6 @@ quiet_cmd_objcopy = OBJCOPY $@ cmd_objcopy = $(OBJCOPY) $(OBJCOPYFLAGS) $(OBJCOPYFLAGS_$(@F)) $< $@ KBUILD_CFLAGS += $(cflags-y) -head-y := arch/ia64/kernel/head.o libs-y += arch/ia64/lib/
arch/loongarch/Makefile +0 -2
@@ -72,8 +72,6 @@ CHECKFLAGS += $(shell $(CC) $(KBUILD_CFLAGS) -dM -E -x c /dev/null | \ sed -e "s/^\#define /-D'/" -e "s/ /'='/" -e "s/$$/'/" -e 's/\$$/&&/g') endif -head-y := arch/loongarch/kernel/head.o - libs-y += arch/loongarch/lib/ ifeq ($(KBUILD_EXTMOD),)
arch/m68k/Makefile +0 -9
@@ -86,15 +86,6 @@ ifdef CONFIG_KGDB KBUILD_CFLAGS := $(subst -fomit-frame-pointer,,$(KBUILD_CFLAGS)) -g endif -# -# Select the assembler head startup code. Order is important. The default -# head code is first, processor specific selections can override it after. -# -head-y := arch/m68k/kernel/head.o -head-$(CONFIG_SUN3) := arch/m68k/kernel/sun3-head.o -head-$(CONFIG_M68000) := arch/m68k/68000/head.o -head-$(CONFIG_COLDFIRE) := arch/m68k/coldfire/head.o - libs-y += arch/m68k/lib/
arch/microblaze/Makefile +0 -1
@@ -48,7 +48,6 @@ CPUFLAGS-1 += $(call cc-option,-mcpu=v$(CPU_VER)) # r31 holds current when in kernel mode KBUILD_CFLAGS += -ffixed-r31 $(CPUFLAGS-y) $(CPUFLAGS-1) $(CPUFLAGS-2) -head-y := arch/microblaze/kernel/head.o libs-y += arch/microblaze/lib/ boot := arch/microblaze/boot
arch/mips/Makefile +0 -2
@@ -324,8 +324,6 @@ endif OBJCOPYFLAGS += --remove-section=.reginfo -head-y := arch/mips/kernel/head.o - libs-y += arch/mips/lib/ libs-$(CONFIG_MIPS_FP_SUPPORT) += arch/mips/math-emu/
arch/nios2/Makefile +0 -1
@@ -37,7 +37,6 @@ KBUILD_CFLAGS += -DUTS_SYSNAME=\"$(UTS_SYSNAME)\" KBUILD_CFLAGS += -fno-builtin KBUILD_CFLAGS += -G 0 -head-y := arch/nios2/kernel/head.o libs-y += arch/nios2/lib/ $(LIBGCC) INSTALL_PATH ?= /tftpboot
arch/openrisc/Makefile +0 -2
@@ -55,8 +55,6 @@ ifeq ($(CONFIG_OPENRISC_HAVE_INST_SEXT),y) KBUILD_CFLAGS += $(call cc-option,-msext) endif -head-y := arch/openrisc/kernel/head.o - libs-y += $(LIBGCC) PHONY += vmlinux.bin
arch/parisc/Makefile +0 -2
@@ -113,8 +113,6 @@ cflags-$(CONFIG_PA7100LC) += -march=1.1 -mschedule=7100LC cflags-$(CONFIG_PA7300LC) += -march=1.1 -mschedule=7300 cflags-$(CONFIG_PA8X00) += -march=2.0 -mschedule=8000 -head-y := arch/parisc/kernel/head.o - KBUILD_CFLAGS += $(cflags-y) LIBGCC := $(shell $(CC) -print-libgcc-file-name) export LIBGCC
arch/powerpc/Makefile +0 -12
@@ -220,18 +220,6 @@ KBUILD_CFLAGS += $(cpu-as-y) KBUILD_AFLAGS += $(aflags-y) KBUILD_CFLAGS += $(cflags-y) -head-$(CONFIG_PPC64) := arch/powerpc/kernel/head_64.o -head-$(CONFIG_PPC_BOOK3S_32) := arch/powerpc/kernel/head_book3s_32.o -head-$(CONFIG_PPC_8xx) := arch/powerpc/kernel/head_8xx.o -head-$(CONFIG_40x) := arch/powerpc/kernel/head_40x.o -head-$(CONFIG_44x) := arch/powerpc/kernel/head_44x.o -head-$(CONFIG_FSL_BOOKE) := arch/powerpc/kernel/head_fsl_booke.o - -head-$(CONFIG_PPC64) += arch/powerpc/kernel/entry_64.o -head-$(CONFIG_PPC_FPU) += arch/powerpc/kernel/fpu.o -head-$(CONFIG_ALTIVEC) += arch/powerpc/kernel/vector.o -head-$(CONFIG_PPC_OF_BOOT_TRAMPOLINE) += arch/powerpc/kernel/prom_init.o - # Default to zImage, override when needed all: zImage
arch/riscv/Makefile +0 -2
@@ -110,8 +110,6 @@ else KBUILD_IMAGE := $(boot)/Image.gz endif -head-y := arch/riscv/kernel/head.o - libs-y += arch/riscv/lib/ libs-$(CONFIG_EFI_STUB) += $(objtree)/drivers/firmware/efi/libstub/lib.a
arch/s390/Makefile +0 -2
@@ -119,8 +119,6 @@ export KBUILD_CFLAGS_DECOMPRESSOR OBJCOPYFLAGS := -O binary -head-y := arch/s390/kernel/head64.o - libs-y += arch/s390/lib/ drivers-y += drivers/s390/
arch/sh/Makefile +0 -2
@@ -114,8 +114,6 @@ endif export ld-bfd -head-y := arch/sh/kernel/head_32.o - # Mach groups machdir-$(CONFIG_SOLUTION_ENGINE) += mach-se machdir-$(CONFIG_SH_HP6XX) += mach-hp6xx
arch/sparc/Makefile +0 -2
@@ -56,8 +56,6 @@ endif endif -head-y := arch/sparc/kernel/head_$(BITS).o - libs-y += arch/sparc/prom/ libs-y += arch/sparc/lib/
arch/x86/Makefile +0 -5
@@ -234,11 +234,6 @@ archheaders: ### # Kernel objects -head-y := arch/x86/kernel/head_$(BITS).o -head-y += arch/x86/kernel/head$(BITS).o -head-y += arch/x86/kernel/ebda.o -head-y += arch/x86/kernel/platform-quirks.o - libs-y += arch/x86/lib/ # drivers-y are linked after core-y
arch/xtensa/Makefile +0 -2
@@ -55,8 +55,6 @@ KBUILD_CPPFLAGS += $(patsubst %,-I$(srctree)/%include,$(vardirs) $(plfdirs)) KBUILD_DEFCONFIG := iss_defconfig -head-y := arch/xtensa/kernel/head.o - libs-y += arch/xtensa/lib/ boot := arch/xtensa/boot
scripts/head-object-list.txt new file +53 -0
53 lines not on this page · raw message
Signature · 1 line
2.34.1
Quoted 12 lines · Masahiro Yamada
- Avoid updating
init/built-in.atwice
- Run modpost just once instead of twice
- Link vmlinux and modules in parallel
- Remove head-y syntaxThese are ground works to make the further refactoring possible.
This patch set is applicable after the following series:
https://patchwork.kernel.org/project/linux-kbuild/list/?series=669437
Quoted 16 lines
Masahiro Yamada (15):
kbuild: remove duplicated dependency between modules andmodules_check
kbuild: refactor single builds of *.ko
kbuild: move 'PHONY +=modules_prepare' to the common partinit/version.c: remove #include <linux/version.h>
kbuild: buildinit/built-in.ajust once
kbuild: generateinclude/generated/compile.hin topMakefilescripts/mkcompile_h: move LC_ALL=C to '$LD -v'
Revert "kbuild: Makescripts/compile.hwhen sh != bash"
kbuild: rename modules.order in sub-directories to .modules.order
kbuild: move core-y in topMakefileto ./Kbuild
kbuild: move .vmlinux.objs rule to Makefile.modpost
kbuild: move vmlinux.o rule to the topMakefile
kbuild: unify two modpost invocations
kbuild: use obj-y instead extra-y for objects placed at the head
kbuild: remove head-y syntax
I moved 01-08 to for-next.
10 broke single target builds.
I will send v2 for the rest.
Quoted 71 lines
Documentation/kbuild/makefiles.rst | 27 +---- Kbuild | 16 +++ Makefile | 120 ++++++++++++-------- arch/alpha/Makefile | 2 - arch/alpha/kernel/Makefile | 4 +- arch/arc/Makefile | 2 - arch/arc/kernel/Makefile | 4 +- arch/arm/Makefile | 3 - arch/arm/kernel/Makefile | 4 +- arch/arm64/Makefile | 3 - arch/arm64/kernel/Makefile | 4 +- arch/csky/Makefile | 2 - arch/csky/kernel/Makefile | 4 +- arch/hexagon/Makefile | 2 - arch/hexagon/kernel/Makefile | 3 +- arch/ia64/Makefile | 1 - arch/ia64/kernel/Makefile | 4 +- arch/loongarch/Makefile | 2 - arch/loongarch/kernel/Makefile | 4 +- arch/m68k/68000/Makefile | 2 +- arch/m68k/Makefile | 9 -- arch/m68k/coldfire/Makefile | 2 +- arch/m68k/kernel/Makefile | 21 ++-- arch/microblaze/Makefile | 1 - arch/microblaze/kernel/Makefile | 4 +- arch/mips/Makefile | 2 - arch/mips/kernel/Makefile | 4 +- arch/nios2/Makefile | 1 - arch/nios2/kernel/Makefile | 2 +- arch/openrisc/Makefile | 2 - arch/openrisc/kernel/Makefile | 4 +- arch/parisc/Makefile | 2 - arch/parisc/kernel/Makefile | 4 +- arch/powerpc/Makefile | 12 -- arch/powerpc/kernel/Makefile | 22 ++-- arch/riscv/Makefile | 2 - arch/riscv/kernel/Makefile | 2 +- arch/s390/Makefile | 2 - arch/s390/boot/version.c | 1 + arch/s390/kernel/Makefile | 4 +- arch/sh/Makefile | 2 - arch/sh/kernel/Makefile | 4 +- arch/sparc/Makefile | 2 - arch/sparc/kernel/Makefile | 3 +- arch/x86/Makefile | 5 - arch/x86/boot/compressed/kaslr.c | 1 + arch/x86/boot/version.c | 1 + arch/x86/kernel/Makefile | 10 +- arch/xtensa/Makefile | 2 - arch/xtensa/kernel/Makefile | 4 +- init/Makefile | 55 ++++++--- init/build-version | 10 ++ init/version-timestamp.c | 31 +++++ init/version.c | 37 +++--- scripts/Makefile.build | 20 ++-- scripts/Makefile.lib | 8 +- scripts/Makefile.modfinal | 2 +- scripts/Makefile.modpost | 112 ++++++++---------- scripts/Makefile.vmlinux_o | 6 +- scripts/clang-tools/gen_compile_commands.py | 19 +--- scripts/head-object-list.txt | 53 +++++++++ scripts/link-vmlinux.sh | 51 ++------- scripts/mkcompile_h | 96 ++-------------- 63 files changed, 393 insertions(+), 457 deletions(-) create mode 100755 init/build-version create mode 100644 init/version-timestamp.c create mode 100644 scripts/head-object-list.txt--
2.34.1
Signature · 2 lines
Best Regards Masahiro Yamada