aboutsummaryrefslogtreecommitdiff
path: root/scripts
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2025-04-05 15:46:50 -0700
committerLinus Torvalds <torvalds@linux-foundation.org>2025-04-05 15:46:50 -0700
commitf4d2ef48250ad057e4f00087967b5ff366da9f39 (patch)
tree3dc3df2372bf6670f08b19580ec077eeda0b37fe /scripts
parent758e4c86a159bdd67a8ef60ea118ddb8b2043714 (diff)
parenta7c699d090a1f3795c3271c2b399230e182db06e (diff)
Merge tag 'kbuild-v6.15' of git://git.kernel.org/pub/scm/linux/kernel/git/masahiroy/linux-kbuild
Pull Kbuild updates from Masahiro Yamada: - Improve performance in gendwarfksyms - Remove deprecated EXTRA_*FLAGS and KBUILD_ENABLE_EXTRA_GCC_CHECKS - Support CONFIG_HEADERS_INSTALL for ARCH=um - Use more relative paths to sources files for better reproducibility - Support the loong64 Debian architecture - Add Kbuild bash completion - Introduce intermediate vmlinux.unstripped for architectures that need static relocations to be stripped from the final vmlinux - Fix versioning in Debian packages for -rc releases - Treat missing MODULE_DESCRIPTION() as an error - Convert Nios2 Makefiles to use the generic rule for built-in DTB - Add debuginfo support to the RPM package * tag 'kbuild-v6.15' of git://git.kernel.org/pub/scm/linux/kernel/git/masahiroy/linux-kbuild: (40 commits) kbuild: rpm-pkg: build a debuginfo RPM kconfig: merge_config: use an empty file as initfile nios2: migrate to the generic rule for built-in DTB rust: kbuild: skip `--remap-path-prefix` for `rustdoc` kbuild: pacman-pkg: hardcode module installation path kbuild: deb-pkg: don't set KBUILD_BUILD_VERSION unconditionally modpost: require a MODULE_DESCRIPTION() kbuild: make all file references relative to source root x86: drop unnecessary prefix map configuration kbuild: deb-pkg: add comment about future removal of KDEB_COMPRESS kbuild: Add a help message for "headers" kbuild: deb-pkg: remove "version" variable in mkdebian kbuild: deb-pkg: fix versioning for -rc releases Documentation/kbuild: Fix indentation in modules.rst example x86: Get rid of Makefile.postlink kbuild: Create intermediate vmlinux build with relocations preserved kbuild: Introduce Kconfig symbol for linking vmlinux with relocations kbuild: link-vmlinux.sh: Make output file name configurable kbuild: do not generate .tmp_vmlinux*.map when CONFIG_VMLINUX_MAP=y Revert "kheaders: Ignore silly-rename files" ...
Diffstat (limited to 'scripts')
-rw-r--r--scripts/Makefile.build4
-rw-r--r--scripts/Makefile.compiler4
-rw-r--r--scripts/Makefile.extrawarn3
-rw-r--r--scripts/Makefile.lib8
-rw-r--r--scripts/Makefile.vmlinux34
-rw-r--r--scripts/bash-completion/make451
-rwxr-xr-xscripts/checkpatch.pl14
-rwxr-xr-xscripts/clang-tools/gen_compile_commands.py8
-rwxr-xr-xscripts/config26
-rw-r--r--scripts/gendwarfksyms/die.c2
-rw-r--r--scripts/gendwarfksyms/dwarf.c152
-rw-r--r--scripts/gendwarfksyms/gendwarfksyms.h2
-rw-r--r--scripts/gendwarfksyms/types.c2
-rwxr-xr-xscripts/generate_builtin_ranges.awk5
-rw-r--r--scripts/genksyms/lex.l6
-rw-r--r--scripts/kconfig/confdata.c19
-rwxr-xr-xscripts/kconfig/merge_config.sh4
-rw-r--r--scripts/kconfig/symbol.c2
-rwxr-xr-xscripts/link-vmlinux.sh24
-rw-r--r--scripts/mod/modpost.c45
-rw-r--r--scripts/mod/modpost.h1
-rw-r--r--scripts/mod/sumversion.c17
-rw-r--r--scripts/package/PKGBUILD6
-rwxr-xr-xscripts/package/debian/rules10
-rw-r--r--scripts/package/kernel.spec46
-rwxr-xr-xscripts/package/mkdebian23
-rwxr-xr-xscripts/package/mkspec10
-rwxr-xr-xscripts/show_delta2
28 files changed, 729 insertions, 201 deletions
diff --git a/scripts/Makefile.build b/scripts/Makefile.build
index 56be83024851..13dcd86e74ca 100644
--- a/scripts/Makefile.build
+++ b/scripts/Makefile.build
@@ -20,10 +20,6 @@ always-m :=
targets :=
subdir-y :=
subdir-m :=
-EXTRA_AFLAGS :=
-EXTRA_CFLAGS :=
-EXTRA_CPPFLAGS :=
-EXTRA_LDFLAGS :=
asflags-y :=
ccflags-y :=
rustflags-y :=
diff --git a/scripts/Makefile.compiler b/scripts/Makefile.compiler
index 8c1029687e2e..8956587b8547 100644
--- a/scripts/Makefile.compiler
+++ b/scripts/Makefile.compiler
@@ -67,6 +67,10 @@ gcc-min-version = $(call test-ge, $(CONFIG_GCC_VERSION), $1)
# Usage: cflags-$(call clang-min-version, 110000) += -foo
clang-min-version = $(call test-ge, $(CONFIG_CLANG_VERSION), $1)
+# rustc-min-version
+# Usage: rustc-$(call rustc-min-version, 108500) += -Cfoo
+rustc-min-version = $(call test-ge, $(CONFIG_RUSTC_VERSION), $1)
+
# ld-option
# Usage: KBUILD_LDFLAGS += $(call ld-option, -X, -Y)
ld-option = $(call try-run, $(LD) $(KBUILD_LDFLAGS) $(1) -v,$(1),$(2),$(3))
diff --git a/scripts/Makefile.extrawarn b/scripts/Makefile.extrawarn
index dc081cf46d21..d75897559d18 100644
--- a/scripts/Makefile.extrawarn
+++ b/scripts/Makefile.extrawarn
@@ -82,9 +82,6 @@ KBUILD_CFLAGS += $(call cc-option,-Werror=designated-init)
# Warn if there is an enum types mismatch
KBUILD_CFLAGS += $(call cc-option,-Wenum-conversion)
-# Explicitly clear padding bits during variable initialization
-KBUILD_CFLAGS += $(call cc-option,-fzero-init-padding-bits=all)
-
KBUILD_CFLAGS += -Wextra
KBUILD_CFLAGS += -Wunused
diff --git a/scripts/Makefile.lib b/scripts/Makefile.lib
index 4d543054f723..2fe73cda0bdd 100644
--- a/scripts/Makefile.lib
+++ b/scripts/Makefile.lib
@@ -1,9 +1,4 @@
# SPDX-License-Identifier: GPL-2.0
-# Backward compatibility
-asflags-y += $(EXTRA_AFLAGS)
-ccflags-y += $(EXTRA_CFLAGS)
-cppflags-y += $(EXTRA_CPPFLAGS)
-ldflags-y += $(EXTRA_LDFLAGS)
# flags that take effect in current and sub directories
KBUILD_AFLAGS += $(subdir-asflags-y)
@@ -377,9 +372,6 @@ quiet_cmd_ar = AR $@
quiet_cmd_objcopy = OBJCOPY $@
cmd_objcopy = $(OBJCOPY) $(OBJCOPYFLAGS) $(OBJCOPYFLAGS_$(@F)) $< $@
-quiet_cmd_strip_relocs = RSTRIP $@
-cmd_strip_relocs = $(OBJCOPY) --remove-section='.rel*' $@
-
# Gzip
# ---------------------------------------------------------------------------
diff --git a/scripts/Makefile.vmlinux b/scripts/Makefile.vmlinux
index 873caaa55313..b0a6cd5b818c 100644
--- a/scripts/Makefile.vmlinux
+++ b/scripts/Makefile.vmlinux
@@ -9,6 +9,20 @@ include $(srctree)/scripts/Makefile.lib
targets :=
+ifdef CONFIG_ARCH_VMLINUX_NEEDS_RELOCS
+vmlinux-final := vmlinux.unstripped
+
+quiet_cmd_strip_relocs = RSTRIP $@
+ cmd_strip_relocs = $(OBJCOPY) --remove-section='.rel*' $< $@
+
+vmlinux: $(vmlinux-final) FORCE
+ $(call if_changed,strip_relocs)
+
+targets += vmlinux
+else
+vmlinux-final := vmlinux
+endif
+
%.o: %.c FORCE
$(call if_changed_rule,cc_o_c)
@@ -47,7 +61,7 @@ targets += .builtin-dtbs-list
ifdef CONFIG_GENERIC_BUILTIN_DTB
targets += .builtin-dtbs.S .builtin-dtbs.o
-vmlinux: .builtin-dtbs.o
+$(vmlinux-final): .builtin-dtbs.o
endif
# vmlinux
@@ -55,11 +69,11 @@ endif
ifdef CONFIG_MODULES
targets += .vmlinux.export.o
-vmlinux: .vmlinux.export.o
+$(vmlinux-final): .vmlinux.export.o
endif
ifdef CONFIG_ARCH_WANTS_PRE_LINK_VMLINUX
-vmlinux: arch/$(SRCARCH)/tools/vmlinux.arch.o
+$(vmlinux-final): arch/$(SRCARCH)/tools/vmlinux.arch.o
arch/$(SRCARCH)/tools/vmlinux.arch.o: vmlinux.o FORCE
$(Q)$(MAKE) $(build)=arch/$(SRCARCH)/tools $@
@@ -69,14 +83,18 @@ ARCH_POSTLINK := $(wildcard $(srctree)/arch/$(SRCARCH)/Makefile.postlink)
# Final link of vmlinux with optional arch pass after final link
cmd_link_vmlinux = \
- $< "$(LD)" "$(KBUILD_LDFLAGS)" "$(LDFLAGS_vmlinux)"; \
+ $< "$(LD)" "$(KBUILD_LDFLAGS)" "$(LDFLAGS_vmlinux)" "$@"; \
$(if $(ARCH_POSTLINK), $(MAKE) -f $(ARCH_POSTLINK) $@, true)
-targets += vmlinux
-vmlinux: scripts/link-vmlinux.sh vmlinux.o $(KBUILD_LDS) FORCE
+targets += $(vmlinux-final)
+$(vmlinux-final): scripts/link-vmlinux.sh vmlinux.o $(KBUILD_LDS) FORCE
+$(call if_changed_dep,link_vmlinux)
ifdef CONFIG_DEBUG_INFO_BTF
-vmlinux: $(RESOLVE_BTFIDS)
+$(vmlinux-final): $(RESOLVE_BTFIDS)
+endif
+
+ifdef CONFIG_BUILDTIME_TABLE_SORT
+vmlinux: scripts/sorttable
endif
# module.builtin.ranges
@@ -92,7 +110,7 @@ modules.builtin.ranges: $(srctree)/scripts/generate_builtin_ranges.awk \
modules.builtin vmlinux.map vmlinux.o.map FORCE
$(call if_changed,modules_builtin_ranges)
-vmlinux.map: vmlinux
+vmlinux.map: $(vmlinux-final)
@:
endif
diff --git a/scripts/bash-completion/make b/scripts/bash-completion/make
new file mode 100644
index 000000000000..42e8dcead25a
--- /dev/null
+++ b/scripts/bash-completion/make
@@ -0,0 +1,451 @@
+# SPDX-License-Identifier: GPL-2.0-only
+# bash completion for GNU make with kbuild extension -*- shell-script -*-
+
+# Load the default completion script for make. It is typically located at
+# /usr/share/bash-completion/completions/make, but we do not rely on it.
+__kbuild_load_default_make_completion()
+{
+ local -a dirs=("${BASH_COMPLETION_USER_DIR:-${XDG_DATA_HOME:-$HOME/.local/share}/bash-completion}/completions")
+ local ifs=$IFS IFS=: dir compfile this_dir
+
+ for dir in ${XDG_DATA_DIRS:-/usr/local/share:/usr/share}; do
+ dirs+=("$dir"/bash-completion/completions)
+ done
+ IFS=$ifs
+
+ this_dir="$(realpath "$(dirname "${BASH_SOURCE[0]}")")"
+
+ for dir in "${dirs[@]}"; do
+ if [[ ! -d ${dir} || ${dir} = "${this_dir}" ]]; then
+ continue
+ fi
+
+ for compfile in make make.bash _make; do
+ compfile=$dir/$compfile
+ # Avoid trying to source dirs; https://bugzilla.redhat.com/903540
+ if [[ -f ${compfile} ]] && . "${compfile}" &>/dev/null; then
+
+ __kbuild_default_make_completion=$(
+ # shellcheck disable=SC2046 # word splitting is the point here
+ set -- $(complete -p make)
+
+ while [[ $# -gt 1 && "$1" != -F ]]; do
+ shift
+ done
+
+ if [[ "$1" = -F ]]; then
+ echo "$2"
+ fi
+ )
+
+ return
+ fi
+ done
+ done
+}
+
+__kbuild_load_default_make_completion
+
+__kbuild_handle_variable()
+{
+ local var=${1%%=*}
+ local cur=${cur#"${var}"=}
+ local srctree=$2
+ local keywords=()
+
+ case $var in
+ ARCH)
+ # sub-directories under arch/
+ keywords+=($(find "${srctree}/arch" -mindepth 1 -maxdepth 1 -type d -printf '%P\n'))
+ # architectures hard-coded in the top Makefile
+ keywords+=(i386 x86_64 sparc32 sparc64 parisc64)
+ ;;
+ CROSS_COMPILE)
+ # toolchains with a full path
+ local cross_compile=()
+ local c c2
+ _filedir
+
+ for c in "${COMPREPLY[@]}"; do
+ # eval for tilde expansion
+ # suppress error, as this fails when it contains a space
+ eval "c2=${c}" 2>/dev/null || continue
+ if [[ ${c} == *-elfedit && ! -d ${c2} && -x ${c2} ]]; then
+ cross_compile+=("${c%elfedit}")
+ fi
+ done
+
+ # toolchains in the PATH environment
+ while read -r c; do
+ if [[ ${c} == *-elfedit ]]; then
+ keywords+=("${c%elfedit}")
+ fi
+ done < <(compgen -c)
+
+ COMPREPLY=()
+ _filedir -d
+
+ # Add cross_compile directly without passing it to compgen.
+ # Otherwise, toolchain paths with a tilde do not work.
+ # e.g.)
+ # CROSS_COMPILE=~/0day/gcc-14.2.0-nolibc/aarch64-linux/bin/aarch64-linux-
+ COMPREPLY+=("${cross_compile[@]}")
+ ;;
+ LLVM)
+ # LLVM=1 uses the default 'clang' etc.
+ keywords+=(1)
+
+ # suffix for a particular version. LLVM=-18 uses 'clang-18' etc.
+ while read -r c; do
+ if [[ ${c} == clang-[0-9]* ]]; then
+ keywords+=("${c#clang}")
+ fi
+ done < <(compgen -c)
+
+ # directory path to LLVM toolchains
+ _filedir -d
+ ;;
+ KCONFIG_ALLCONFIG)
+ # KCONFIG_ALLCONFIG=1 selects the default fragment
+ keywords+=(1)
+ # or the path to a fragment file
+ _filedir
+ ;;
+ C | KBUILD_CHECKSRC)
+ keywords+=(1 2)
+ ;;
+ V | KBUILD_VERBOSE)
+ keywords+=({,1}{,2})
+ ;;
+ W | KBUILD_EXTRA_WARN)
+ keywords+=({,1}{,2}{,3}{,c}{,e})
+ ;;
+ KBUILD_ABS_SRCTREE | KBUILD_MODPOST_NOFINAL | KBUILD_MODPOST_WARN | \
+ CLIPPY | KBUILD_CLIPPY | KCONFIG_NOSILENTUPDATE | \
+ KCONFIG_OVERWRITECONFIG | KCONFIG_WARN_UNKNOWN_SYMBOL | \
+ KCONFIG_WERROR )
+ keywords+=(1)
+ ;;
+ INSTALL_MOD_STRIP)
+ keywords+=(1 --strip-debug --strip-unneeded)
+ ;;
+ O | KBUILD_OUTPUT | M | KBUILD_EXTMOD | MO | KBUILD_EXTMOD_OUTPUT | *_PATH)
+ # variables that take a directory.
+ _filedir -d
+ return
+ ;;
+ KBUILD_EXTRA_SYMBOL | KBUILD_KCONFIG | KCONFIG_CONFIG)
+ # variables that take a file.
+ _filedir
+ return
+ esac
+
+ COMPREPLY+=($(compgen -W "${keywords[*]}" -- "${cur}"))
+}
+
+# Check the -C, -f options and 'source' symlink. Return the source tree we are
+# working in.
+__kbuild_get_srctree()
+{
+ local words=("$@")
+ local cwd makef_dir
+
+ # see if a path was specified with -C/--directory
+ for ((i = 1; i < ${#words[@]}; i++)); do
+ if [[ ${words[i]} == -@(C|-directory) ]]; then
+ # eval for tilde expansion.
+ # suppress error, as this fails when it contains a space
+ eval "cwd=${words[i + 1]}" 2>/dev/null
+ break
+ fi
+ done
+
+ if [[ -z ${cwd} ]]; then
+ cwd=.
+ fi
+
+ # see if a Makefile was specified with -f/--file/--makefile
+ for ((i = 1; i < ${#words[@]}; i++)); do
+ if [[ ${words[i]} == -@(f|-?(make)file) ]]; then
+ # eval for tilde expansion
+ # suppress error, as this fails when it contains a space
+ eval "makef_dir=${words[i + 1]%/*}" 2>/dev/null
+ break
+ fi
+ done
+
+ if [ -z "${makef_dir}" ]; then
+ makef_dir=${cwd}
+ elif [[ ${makef_dir} != /* ]]; then
+ makef_dir=${cwd}/${makef_dir}
+ fi
+
+ # If ${makef_dir} is a build directory created by the O= option, there
+ # is a symbolic link 'source', which points to the kernel source tree.
+ if [[ -L ${makef_dir}/source ]]; then
+ makef_dir=$(readlink "${makef_dir}/source")
+ fi
+
+ echo "${makef_dir}"
+}
+
+# Get SRCARCH to do a little more clever things
+__kbuild_get_srcarch()
+{
+ local words=("$@")
+ local arch srcarch uname_m
+
+ # see if ARCH= is explicitly specified
+ for ((i = 1; i < ${#words[@]}; i++)); do
+ if [[ ${words[i]} == ARCH=* ]]; then
+ arch=${words[i]#ARCH=}
+ break
+ fi
+ done
+
+ # If ARCH= is not specified, check the build marchine's architecture
+ if [[ -z ${arch} ]]; then
+ uname_m=$(uname -m)
+
+ # shellcheck disable=SC2209 # 'sh' is SuperH, not a shell command
+ case ${uname_m} in
+ arm64 | aarch64*) arch=arm64 ;;
+ arm* | sa110) arch=arm ;;
+ i?86 | x86_64) arch=x86 ;;
+ loongarch*) arch=loongarch ;;
+ mips*) arch=mips ;;
+ ppc*) arch=powerpc ;;
+ riscv*) arch=riscv ;;
+ s390x) arch=s390 ;;
+ sh[234]*) arch=sh ;;
+ sun4u) arch=sparc64 ;;
+ *) arch=${uname_m} ;;
+ esac
+ fi
+
+ case ${arch} in
+ parisc64) srcarch=parisc ;;
+ sparc32 | sparc64) srcarch=sparc ;;
+ i386 | x86_64) srcarch=x86 ;;
+ *) srcarch=${arch} ;;
+ esac
+
+ echo "$srcarch"
+}
+
+# small Makefile to parse obj-* syntax
+__kbuild_tmp_makefile()
+{
+cat <<'EOF'
+.PHONY: __default
+__default:
+ $(foreach m,$(obj-y) $(obj-m) $(obj-),$(foreach s, -objs -y -m -,$($(m:%.o=%$s))) $(m))
+EOF
+echo "include ${1}"
+}
+
+_make_for_kbuild ()
+{
+ # shellcheck disable=SC2034 # these are set by _init_completion
+ local cur prev words cword split
+ _init_completion -s || return
+
+ local srctree
+ srctree=$(__kbuild_get_srctree "${words[@]}")
+
+ # If 'kernel' and 'Documentation' directories are found, we assume this
+ # is a kernel tree. Otherwise, we fall back to the generic rule provided
+ # by the bash-completion project.
+ if [[ ! -d ${srctree}/kernel || ! -d ${srctree}/Documentation ]]; then
+ if [ -n "${__kbuild_default_make_completion}" ]; then
+ "${__kbuild_default_make_completion}" "$@"
+ fi
+ return
+ fi
+
+ # make options with a parameter (copied from the bash-completion project)
+ case ${prev} in
+ --file | --makefile | --old-file | --assume-old | --what-if | --new-file | \
+ --assume-new | -!(-*)[foW])
+ _filedir
+ return
+ ;;
+ --include-dir | --directory | -!(-*)[ICm])
+ _filedir -d
+ return
+ ;;
+ -!(-*)E)
+ COMPREPLY=($(compgen -v -- "$cur"))
+ return
+ ;;
+ --eval | -!(-*)[DVx])
+ return
+ ;;
+ --jobs | -!(-*)j)
+ COMPREPLY=($(compgen -W "{1..$(($(_ncpus) * 2))}" -- "$cur"))
+ return
+ ;;
+ esac
+
+ local keywords=()
+
+ case ${cur} in
+ -*)
+ # make options (copied from the bash-completion project)
+ local opts
+ opts="$(_parse_help "$1")"
+ COMPREPLY=($(compgen -W "${opts:-$(_parse_usage "$1")}" -- "$cur"))
+ if [[ ${COMPREPLY-} == *= ]]; then
+ compopt -o nospace
+ fi
+ return
+ ;;
+ *=*)
+ __kbuild_handle_variable "${cur}" "${srctree}"
+ return
+ ;;
+ KBUILD_*)
+ # There are many variables prefixed with 'KBUILD_'.
+ # Display them only when 'KBUILD_' is entered.
+ # shellcheck disable=SC2191 # '=' is appended for variables
+ keywords+=(
+ KBUILD_{CHECKSRC,EXTMOD,EXTMOD_OUTPUT,OUTPUT,VERBOSE,EXTRA_WARN,CLIPPY}=
+ KBUILD_BUILD_{USER,HOST,TIMESTAMP}=
+ KBUILD_MODPOST_{NOFINAL,WARN}=
+ KBUILD_{ABS_SRCTREE,EXTRA_SYMBOLS,KCONFIG}=
+ )
+ ;;
+ KCONFIG_*)
+ # There are many variables prefixed with 'KCONFIG_'.
+ # Display them only when 'KCONFIG_' is entered.
+ # shellcheck disable=SC2191 # '=' is appended for variables
+ keywords+=(
+ KCONFIG_{CONFIG,ALLCONFIG,NOSILENTUPDATE,OVERWRITECONFIG}=
+ KCONFIG_{SEED,PROBABILITY}=
+ KCONFIG_WARN_UNKNOWN_SYMBOL=
+ KCONFIG_WERROR=
+ )
+ ;;
+ *)
+ # By default, hide KBUILD_* and KCONFIG_* variables.
+ # Instead, display only the prefix parts.
+ keywords+=(KBUILD_ KCONFIG_)
+ ;;
+ esac
+
+ if [[ ${cur} != /* && ${cur} != *//* ]]; then
+ local dir srcarch kbuild_file tmp
+ srcarch=$(__kbuild_get_srcarch "${words[@]}")
+
+ # single build
+ dir=${cur}
+ while true; do
+ if [[ ${dir} == */* ]]; then
+ dir=${dir%/*}
+ else
+ dir=.
+ fi
+
+ # Search for 'Kbuild' or 'Makefile' in the parent
+ # directories (may not be a direct parent)
+ if [[ -f ${srctree}/${dir}/Kbuild ]]; then
+ kbuild_file=${srctree}/${dir}/Kbuild
+ break
+ fi
+ if [[ -f ${srctree}/${dir}/Makefile ]]; then
+ kbuild_file=${srctree}/${dir}/Makefile
+ break
+ fi
+
+ if [[ ${dir} == . ]]; then
+ break
+ fi
+ done
+
+ if [[ -n ${kbuild_file} ]]; then
+ tmp=($(__kbuild_tmp_makefile "${kbuild_file}" |
+ SRCARCH=${srcarch} obj=${dir} src=${srctree}/${dir} \
+ "${1}" -n -f - 2>/dev/null))
+
+ # Add $(obj)/ prefix
+ if [[ ${dir} != . ]]; then
+ tmp=("${tmp[@]/#/${dir}\/}")
+ fi
+
+ keywords+=("${tmp[@]}")
+ fi
+
+ # *_defconfig and *.config files. These might be grouped into
+ # subdirectories, e.g., arch/powerpc/configs/*/*_defconfig.
+ if [[ ${cur} == */* ]]; then
+ dir=${cur%/*}
+ else
+ dir=.
+ fi
+
+ tmp=($(find "${srctree}/arch/${srcarch}/configs/${dir}" \
+ "${srctree}/kernel/configs/${dir}" \
+ -mindepth 1 -maxdepth 1 -type d -printf '%P/\n' \
+ -o -printf '%P\n' 2>/dev/null))
+
+ if [[ ${dir} != . ]]; then
+ tmp=("${tmp[@]/#/${dir}\/}")
+ fi
+
+ keywords+=("${tmp[@]}")
+ fi
+
+ # shellcheck disable=SC2191 # '=' is appended for variables
+ keywords+=(
+ #
+ # variables (append =)
+ #
+ ARCH=
+ CROSS_COMPILE=
+ LLVM=
+ C= M= MO= O= V= W=
+ INSTALL{,_MOD,_HDR,_DTBS}_PATH=
+ KERNELRELEASE=
+
+ #
+ # targets
+ #
+ all help
+ clean mrproper distclean
+ clang-{tidy,analyzer} compile_commands.json
+ coccicheck
+ dtbs{,_check,_install} dt_binding_{check,schemas}
+ headers{,_install}
+ vmlinux install
+ modules{,_prepare,_install,_sign}
+ vdso_install
+ tags TAGS cscope gtags
+ rust{available,fmt,fmtcheck}
+ kernel{version,release} image_name
+ kselftest{,-all,-install,-clean,-merge}
+
+ # configuration
+ {,old,olddef,sync,def,savedef,rand,listnew,helpnew,test,tiny}config
+ {,build_}{menu,n,g,x}config
+ local{mod,yes}config
+ all{no,yes,mod,def}config
+ {yes2mod,mod2yes,mod2no}config
+
+ # docs
+ {html,textinfo,info,latex,pdf,epub,xml,linkcheck,refcheck,clean}docs
+
+ # package
+ {,bin,src}{rpm,deb}-pkg
+ {pacman,dir,tar}-pkg
+ tar{,gz,bz2,xz,zst}-pkg
+ perf-tar{,gz,bz2,xz,zst}-src-pkg
+ )
+
+ COMPREPLY=($(compgen -W "${keywords[*]}" -- "${cur}"))
+
+ # Do not append a space for variables, subdirs, "KBUILD_", "KCONFIG_".
+ if [[ ${COMPREPLY-} == *[=/] || ${COMPREPLY-} =~ ^(KBUILD|KCONFIG)_$ ]]; then
+ compopt -o nospace
+ fi
+
+} && complete -F _make_for_kbuild make
diff --git a/scripts/checkpatch.pl b/scripts/checkpatch.pl
index 784912f570e9..3d22bf863eec 100755
--- a/scripts/checkpatch.pl
+++ b/scripts/checkpatch.pl
@@ -3690,20 +3690,6 @@ sub process {
}
}
- if (($realfile =~ /Makefile.*/ || $realfile =~ /Kbuild.*/) &&
- ($line =~ /\+(EXTRA_[A-Z]+FLAGS).*/)) {
- my $flag = $1;
- my $replacement = {
- 'EXTRA_AFLAGS' => 'asflags-y',
- 'EXTRA_CFLAGS' => 'ccflags-y',
- 'EXTRA_CPPFLAGS' => 'cppflags-y',
- 'EXTRA_LDFLAGS' => 'ldflags-y',
- };
-
- WARN("DEPRECATED_VARIABLE",
- "Use of $flag is deprecated, please use \`$replacement->{$flag} instead.\n" . $herecurr) if ($replacement->{$flag});
- }
-
# check for DT compatible documentation
if (defined $root &&
(($realfile =~ /\.dtsi?$/ && $line =~ /^\+\s*compatible\s*=\s*\"/) ||
diff --git a/scripts/clang-tools/gen_compile_commands.py b/scripts/clang-tools/gen_compile_commands.py
index e4fb686dfaa9..96e6e46ad1a7 100755
--- a/scripts/clang-tools/gen_compile_commands.py
+++ b/scripts/clang-tools/gen_compile_commands.py
@@ -167,10 +167,10 @@ def process_line(root_directory, command_prefix, file_path):
root_directory or file_directory.
"""
# The .cmd files are intended to be included directly by Make, so they
- # escape the pound sign '#', either as '\#' or '$(pound)' (depending on the
- # kernel version). The compile_commands.json file is not interepreted
- # by Make, so this code replaces the escaped version with '#'.
- prefix = command_prefix.replace(r'\#', '#').replace('$(pound)', '#')
+ # escape the pound sign '#' as '$(pound)'. The compile_commands.json file
+ # is not interepreted by Make, so this code replaces the escaped version
+ # with '#'.
+ prefix = command_prefix.replace('$(pound)', '#')
# Return the canonical path, eliminating any symbolic links encountered in the path.
abs_path = os.path.realpath(os.path.join(root_directory, file_path))
diff --git a/scripts/config b/scripts/config
index ff88e2faefd3..ea475c07de28 100755
--- a/scripts/config
+++ b/scripts/config
@@ -32,6 +32,7 @@ commands:
Disable option directly after other option
--module-after|-M beforeopt option
Turn option into module directly after other option
+ --refresh Refresh the config using old settings
commands can be repeated multiple times
@@ -124,16 +125,22 @@ undef_var() {
txt_delete "^# $name is not set" "$FN"
}
-if [ "$1" = "--file" ]; then
- FN="$2"
- if [ "$FN" = "" ] ; then
- usage
+FN=.config
+CMDS=()
+while [[ $# -gt 0 ]]; do
+ if [ "$1" = "--file" ]; then
+ if [ "$2" = "" ]; then
+ usage
+ fi
+ FN="$2"
+ shift 2
+ else
+ CMDS+=("$1")
+ shift
fi
- shift 2
-else
- FN=.config
-fi
+done
+set -- "${CMDS[@]}"
if [ "$1" = "" ] ; then
usage
fi
@@ -217,9 +224,8 @@ while [ "$1" != "" ] ; do
set_var "${CONFIG_}$B" "${CONFIG_}$B=m" "${CONFIG_}$A"
;;
- # undocumented because it ignores --file (fixme)
--refresh)
- yes "" | make oldconfig
+ yes "" | make oldconfig KCONFIG_CONFIG=$FN
;;
*)
diff --git a/scripts/gendwarfksyms/die.c b/scripts/gendwarfksyms/die.c
index 66bd4c9bc952..6183bbbe7b54 100644
--- a/scripts/gendwarfksyms/die.c
+++ b/scripts/gendwarfksyms/die.c
@@ -6,7 +6,7 @@
#include <string.h>
#include "gendwarfksyms.h"
-#define DIE_HASH_BITS 15
+#define DIE_HASH_BITS 16
/* {die->addr, state} -> struct die * */
static HASHTABLE_DEFINE(die_map, 1 << DIE_HASH_BITS);
diff --git a/scripts/gendwarfksyms/dwarf.c b/scripts/gendwarfksyms/dwarf.c
index 534d9aa7c114..eed247d8abfc 100644
--- a/scripts/gendwarfksyms/dwarf.c
+++ b/scripts/gendwarfksyms/dwarf.c
@@ -3,6 +3,7 @@
* Copyright (C) 2024 Google LLC
*/
+#define _GNU_SOURCE
#include <assert.h>
#include <inttypes.h>
#include <stdarg.h>
@@ -193,79 +194,17 @@ static void process_fmt(struct die *cache, const char *fmt, ...)
va_end(args);
}
-#define MAX_FQN_SIZE 64
-
-/* Get a fully qualified name from DWARF scopes */
-static char *get_fqn(Dwarf_Die *die)
+static void update_fqn(struct die *cache, Dwarf_Die *die)
{
- const char *list[MAX_FQN_SIZE];
- Dwarf_Die *scopes = NULL;
- bool has_name = false;
- char *fqn = NULL;
- char *p;
- int count = 0;
- int len = 0;
- int res;
- int i;
-
- res = checkp(dwarf_getscopes_die(die, &scopes));
- if (!res) {
- list[count] = get_name_attr(die);
-
- if (!list[count])
- return NULL;
-
- len += strlen(list[count]);
- count++;
-
- goto done;
- }
-
- for (i = res - 1; i >= 0 && count < MAX_FQN_SIZE; i--) {
- if (dwarf_tag(&scopes[i]) == DW_TAG_compile_unit)
- continue;
-
- list[count] = get_name_attr(&scopes[i]);
-
- if (list[count]) {
- has_name = true;
- } else {
- list[count] = "<anonymous>";
- has_name = false;
- }
+ struct die *fqn;
- len += strlen(list[count]);
- count++;
-
- if (i > 0) {
- list[count++] = "::";
- len += 2;
- }
+ if (!cache->fqn) {
+ if (!__die_map_get((uintptr_t)die->addr, DIE_FQN, &fqn) &&
+ *fqn->fqn)
+ cache->fqn = xstrdup(fqn->fqn);
+ else
+ cache->fqn = "";
}
-
- free(scopes);
-
- if (count == MAX_FQN_SIZE)
- warn("increase MAX_FQN_SIZE: reached the maximum");
-
- /* Consider the DIE unnamed if the last scope doesn't have a name */
- if (!has_name)
- return NULL;
-done:
- fqn = xmalloc(len + 1);
- *fqn = '\0';
-
- p = fqn;
- for (i = 0; i < count; i++)
- p = stpcpy(p, list[i]);
-
- return fqn;
-}
-
-static void update_fqn(struct die *cache, Dwarf_Die *die)
-{
- if (!cache->fqn)
- cache->fqn = get_fqn(die) ?: "";
}
static void process_fqn(struct die *cache, Dwarf_Die *die)
@@ -1148,8 +1087,81 @@ static void process_symbol_ptr(struct symbol *sym, void *arg)
cache_free(&state.expansion_cache);
}
+static int resolve_fqns(struct state *parent, struct die *unused,
+ Dwarf_Die *die)
+{
+ struct state state;
+ struct die *cache;
+ const char *name;
+ bool use_prefix;
+ char *prefix = NULL;
+ char *fqn = "";
+ int tag;
+
+ if (!__die_map_get((uintptr_t)die->addr, DIE_FQN, &cache))
+ return 0;
+
+ tag = dwarf_tag(die);
+
+ /*
+ * Only namespaces and structures need to pass a prefix to the next
+ * scope.
+ */
+ use_prefix = tag == DW_TAG_namespace || tag == DW_TAG_class_type ||
+ tag == DW_TAG_structure_type;
+
+ state.expand.current_fqn = NULL;
+ name = get_name_attr(die);
+
+ if (parent && parent->expand.current_fqn && (use_prefix || name)) {
+ /*
+ * The fqn for the current DIE, and if needed, a prefix for the
+ * next scope.
+ */
+ if (asprintf(&prefix, "%s::%s", parent->expand.current_fqn,
+ name ? name : "<anonymous>") < 0)
+ error("asprintf failed");
+
+ if (use_prefix)
+ state.expand.current_fqn = prefix;
+
+ /*
+ * Use fqn only if the DIE has a name. Otherwise fqn will
+ * remain empty.
+ */
+ if (name) {
+ fqn = prefix;
+ /* prefix will be freed by die_map. */
+ prefix = NULL;
+ }
+ } else if (name) {
+ /* No prefix from the previous scope. Use only the name. */
+ fqn = xstrdup(name);
+
+ if (use_prefix)
+ state.expand.current_fqn = f