This commit is contained in:
Mark Brown
2026-07-31 14:28:53 +01:00
13 changed files with 100 additions and 57 deletions
@@ -164,6 +164,11 @@ applicable everywhere (see syntax).
That will limit the usefulness but on the other hand avoid
the illegal configurations all over.
select should also not be used on the member options of a choice.
Selecting a choice option will do nothing (dead code). Instead,
consider making these a dependency, or using the defaults of the
choice to enable the member option when it's needed.
If "select" <symbol> is followed by "if" <expr>, <symbol> will be
selected by the logical AND of the value of the current menu symbol
and <expr>. This means, the lower limit can be downgraded due to the
+6
View File
@@ -1225,6 +1225,12 @@ KBUILD_RUSTFLAGS += $(KRUSTFLAGS)
KBUILD_LDFLAGS_MODULE += --build-id=sha1
LDFLAGS_vmlinux += --build-id=sha1
# Specific code, such as outlined KASAN checks, may be placed in
# COMDAT-deduplicated sections. Use --force-group-allocation to resolve these
# groups when linking modules. The option is available from ld.bfd 2.29 and
# ld.lld 19.1.0.
KBUILD_LDFLAGS_MODULE += $(call ld-option,--force-group-allocation)
KBUILD_LDFLAGS += -z noexecstack
ifeq ($(CONFIG_LD_IS_BFD),y)
KBUILD_LDFLAGS += $(call ld-option,--no-warn-rwx-segments)
-13
View File
@@ -4,19 +4,6 @@ SECTIONS {
.text.ftrace_trampoline 0 : { BYTE(0) }
.init.text.ftrace_trampoline 0 : { BYTE(0) }
#ifdef CONFIG_KASAN_SW_TAGS
/*
* Outlined checks go into comdat-deduplicated sections named .text.hot.
* Because they are in comdats they are not combined by the linker and
* we otherwise end up with multiple sections with the same .text.hot
* name in the .ko file. The kernel module loader warns if it sees
* multiple sections with the same name so we use this sections
* directive to force them into a single section and silence the
* warning.
*/
.text.hot 0 : { *(.text.hot) }
#endif
#ifdef CONFIG_UNWIND_TABLES
/*
* Currently, we only use unwind info at module load time, so we can
+3 -2
View File
@@ -28,6 +28,7 @@ ldflags-y :=
subdir-asflags-y :=
subdir-ccflags-y :=
subdir-rustflags-y :=
# Read auto.conf if it exists, otherwise ignore
-include $(objtree)/include/config/auto.conf
@@ -159,10 +160,10 @@ targets += $(targets-for-builtin) $(targets-for-modules)
# Linus' kernel sanity checking tool
ifeq ($(KBUILD_CHECKSRC),1)
quiet_cmd_checksrc = CHECK $<
quiet_cmd_checksrc = CHECK $(patsubst $(srctree)/%,%,$<)
cmd_checksrc = $(CHECK) $(CHECKFLAGS) $(c_flags) $<
else ifeq ($(KBUILD_CHECKSRC),2)
quiet_cmd_force_checksrc = CHECK $<
quiet_cmd_force_checksrc = CHECK $(patsubst $(srctree)/%,%,$<)
cmd_force_checksrc = $(CHECK) $(CHECKFLAGS) $(c_flags) $<
endif
+5 -5
View File
@@ -15,13 +15,13 @@
* gcc produces a very nice and correct list of dependencies which
* tells make when to remake a file.
*
* To use this list as-is however has the drawback that virtually
* However, to use this list as-is has the drawback that virtually
* every file in the kernel includes autoconf.h.
*
* If the user re-runs make *config, autoconf.h will be
* regenerated. make notices that and will rebuild every file which
* includes autoconf.h, i.e. basically all files. This is extremely
* annoying if the user just changed CONFIG_HIS_DRIVER from n to m.
* annoying if the user just changed CONFIG_USER_DRIVER from n to m.
*
* So we play the same trick that "mkdep" played before. We replace
* the dependency on autoconf.h by a dependency on every config
@@ -33,9 +33,9 @@
* which then let make pick up the changes and the files that use
* the config symbols are rebuilt.
*
* So if the user changes his CONFIG_HIS_DRIVER option, only the objects
* which depend on "include/config/HIS_DRIVER" will be rebuilt,
* so most likely only his driver ;-)
* So if the user changes their CONFIG_USER_DRIVER option, only the objects
* which depend on "include/config/USER_DRIVER" will be rebuilt,
* so most likely only the user's driver ;-)
*
* The idea above dates, by the way, back to Michael E Chastain, AFAIK.
*
+24 -20
View File
@@ -38,7 +38,7 @@ commands:
options:
--file config-file .config file to change (default .config)
--keep-case|-k Keep next symbols' case (dont' upper-case it)
--keep-case|-k Keep next symbols' case (don't upper-case it)
$myname doesn't check the validity of the .config file. This is done at next
make time.
@@ -71,48 +71,45 @@ txt_append() {
local anchor="$1"
local insert="$2"
local infile="$3"
local tmpfile="$infile.swp"
# sed append cmd: 'a\' + newline + text + newline
cmd="$(printf "a\\%b$insert" "\n")"
sed -e "/$anchor/$cmd" "$infile" >"$tmpfile"
# replace original file with the edited one
mv "$tmpfile" "$infile"
# We don't really need a backup file, but in-place editing with backup
# skipped is not portable due to different implementations parsing
# arguments in incompatible manners.
# Create a backup file anyway to ensure portability. The file will be
# deleted on exit.
sed -E -i.swp -e "/$anchor/$cmd" "$infile"
SED_EDITED=1
}
txt_subst() {
local before="$1"
local after="$2"
local infile="$3"
local tmpfile="$infile.swp"
sed -e "s$SED_DELIM$before$SED_DELIM$after$SED_DELIM" "$infile" >"$tmpfile"
# replace original file with the edited one
mv "$tmpfile" "$infile"
sed -E -i.swp -e "s$SED_DELIM$before$SED_DELIM$after$SED_DELIM" "$infile"
SED_EDITED=1
}
txt_delete() {
local text="$1"
local infile="$2"
local tmpfile="$infile.swp"
sed -e "/$text/d" "$infile" >"$tmpfile"
# replace original file with the edited one
mv "$tmpfile" "$infile"
sed -E -i.swp -e "/$text/d" "$infile"
SED_EDITED=1
}
set_var() {
local name=$1 new=$2 before=$3
name_re="^($name=|# $name is not set)"
name_re="^($name=.*|# $name is not set)"
before_re="^($before=|# $before is not set)"
if test -n "$before" && grep -Eq "$before_re" "$FN"; then
txt_append "^$before=" "$new" "$FN"
txt_append "^# $before is not set" "$new" "$FN"
txt_append "$before_re" "$new" "$FN"
elif grep -Eq "$name_re" "$FN"; then
txt_subst "^$name=.*" "$new" "$FN"
txt_subst "^# $name is not set" "$new" "$FN"
txt_subst "$name_re" "$new" "$FN"
else
echo "$new" >>"$FN"
fi
@@ -121,10 +118,17 @@ set_var() {
undef_var() {
local name=$1
txt_delete "^$name=" "$FN"
txt_delete "^# $name is not set" "$FN"
txt_delete "^($name=|# $name is not set)" "$FN"
}
SED_EDITED=0
on_exit() {
if [ "$SED_EDITED" -ge 1 ]; then
rm -f "$FN.swp"
fi
}
trap on_exit EXIT
FN=.config
CMDS=()
while [[ $# -gt 0 ]]; do
+1
View File
@@ -36,6 +36,7 @@ sed -E -e '
s/(^|[^a-zA-Z0-9])__packed([^a-zA-Z0-9_]|$)/\1__attribute__((packed))\2/g
s/(^|[[:space:](])(inline|asm|volatile)([[:space:](]|$)/\1__\2__\3/g
s@#(ifndef|define|endif[[:space:]]*/[*])[[:space:]]*_UAPI@#\1 @
s/__ASSEMBLY__/__ASSEMBLER__/g
' $INFILE > $TMPFILE || exit 1
scripts/unifdef -U__KERNEL__ -D__EXPORTED_HEADERS__ $TMPFILE > $OUTFILE
+17
View File
@@ -348,6 +348,23 @@ static int conf_string(struct menu *menu)
}
if (def && sym_set_string_value(sym, def))
return 0;
/*
* A new int or hex symbol whose default fails validation
* cannot be set from an empty answer. When standard input is
* exhausted, as it is for a non-interactive oldconfig or
* syncconfig, re-asking would loop forever and grow the output
* until it exhausts memory. Stop with an error that names the
* symbol instead. String symbols accept any text, and bool and
* tristate symbols (conf_sym()) and choices (conf_choice())
* accept the default on an empty line, so they are unaffected.
*/
if (feof(stdin)) {
fprintf(stderr,
"\nerror: no value for new symbol '%s' at end of input\n",
sym->name);
exit(1);
}
}
}
+2 -2
View File
@@ -38,7 +38,7 @@ union expr_data {
* struct expr - expression
*
* @node: link node for the hash table
* @type: expressoin type
* @type: expression type
* @val: calculated tristate value
* @val_is_valid: indicate whether the value is valid
* @left: left node
@@ -160,7 +160,7 @@ struct symbol {
#define SYMBOL_MAXLENGTH 256
/* A property represent the config options that can be associated
/* A property represents the config options that can be associated
* with a config "symbol".
* Sample:
* config FOO
+1 -1
View File
@@ -122,7 +122,7 @@ fi
MERGE_LIST=$*
TMP_FILE=$(mktemp ./.tmp.config.XXXXXXXXXX)
TMP_FILE=$(mktemp --tmpdir="$OUTPUT" .tmp.config.XXXXXXXXXX)
echo "Using $INITFILE as base"
+1 -1
View File
@@ -38,7 +38,7 @@ is_enabled() {
}
# Nice output in kbuild format
# Will be supressed by "make -s"
# Will be suppressed by "make -s"
info()
{
printf " %-7s %s\n" "${1}" "${2}"
+3 -3
View File
@@ -1591,14 +1591,14 @@ static void read_symbols(const char *modname)
struct elf_info info = { };
Elf_Sym *sym;
if (!parse_elf(&info, modname))
return;
if (!strends(modname, ".o")) {
error("%s: filename must be suffixed with .o\n", modname);
return;
}
if (!parse_elf(&info, modname))
return;
/* strip trailing .o */
mod = new_module(modname, strlen(modname) - strlen(".o"));
+32 -10
View File
@@ -46,13 +46,31 @@ elif [ "${ALLSOURCE_ARCHS}" = "all" ]; then
ALLSOURCE_ARCHS=$(find ${tree}arch/ -mindepth 1 -maxdepth 1 -type d -printf '%f ')
fi
setup_name_pattern()
{
pattern=()
for ext; do
if [ ${#pattern[@]} -gt 0 ]; then
pattern+=("-o" "-name" "$ext")
else
pattern+=("(" "-name" "$ext")
fi
done
if [ ${#pattern[@]} -gt 0 ]; then
pattern+=(")")
fi
}
# find sources in arch/$1
find_arch_sources()
{
for i in $archincludedir; do
local prune="$prune ( -path $i ) -prune -o"
done
find ${tree}arch/$1 $ignore $prune -name "$2" -not -type l -print;
local src=${tree}arch/$1
shift
setup_name_pattern "$@"
find $src $ignore $prune "${pattern[@]}" -not -type l -print;
}
# find sources in arch/$1/include
@@ -61,14 +79,17 @@ find_arch_include_sources()
local include=$(find ${tree}arch/$1/ -name include -type d -print);
if [ -n "$include" ]; then
archincludedir="$archincludedir $include"
find $include $ignore -name "$2" -not -type l -print;
shift
setup_name_pattern "$@"
find $include $ignore "${pattern[@]}" -not -type l -print;
fi
}
# find sources in include/
find_include_sources()
{
find ${tree}include $ignore -name config -prune -o -name "$1" \
setup_name_pattern "$@"
find ${tree}include $ignore -name config -prune -o "${pattern[@]}" \
-not -type l -print;
}
@@ -76,23 +97,24 @@ find_include_sources()
# we could benefit from a list of dirs to search in here
find_other_sources()
{
setup_name_pattern "$@"
find ${tree}* $ignore \
\( -path ${tree}include -o -path ${tree}arch -o -name '.tmp_*' \) -prune -o \
-name "$1" -not -type l -print;
"${pattern[@]}" -not -type l -print;
}
all_sources()
{
find_arch_include_sources ${SRCARCH} '*.[chS]'
find_arch_include_sources ${SRCARCH} '*.[chS]' '*.rs'
if [ -n "$archinclude" ]; then
find_arch_include_sources $archinclude '*.[chS]'
find_arch_include_sources $archinclude '*.[chS]' '*.rs'
fi
find_include_sources '*.[chS]'
find_include_sources '*.[chS]' '*.rs'
for arch in $ALLSOURCE_ARCHS
do
find_arch_sources $arch '*.[chS]'
find_arch_sources $arch '*.[chS]' '*.rs'
done
find_other_sources '*.[chS]'
find_other_sources '*.[chS]' '*.rs'
}
all_compiled_sources()
@@ -100,7 +122,7 @@ all_compiled_sources()
{
echo include/generated/autoconf.h
find $ignore -name "*.cmd" -exec \
grep -Poh '(?<=^ )\S+|(?<== )\S+[^\\](?=$)' {} \+ |
grep -Poh '(?<=^ )\S+\.([chS]|rs)(?=\s)|(?<== )\S+\.(?1)(?=$)' {} \+ |
awk '!a[$0]++'
} | xargs realpath -esq $([ -z "$KBUILD_ABS_SRCTREE" ] && echo --relative-to=.) |
sort -u