166 lines
4.6 KiB
Bash
Executable File
166 lines
4.6 KiB
Bash
Executable File
#! /bin/bash
|
|
|
|
RHCP=redhat/configs
|
|
RHCP_RHEL=$RHCP
|
|
WORK=.work
|
|
PACKAGE_NAME='kernel' # should come from Makefile.common
|
|
|
|
die()
|
|
{
|
|
echo "$1"
|
|
exit 1
|
|
}
|
|
|
|
get_configarch()
|
|
{
|
|
# given a filename provide the <arch> for $RHCP_RHEL/pending-common/generic/
|
|
# the supported arch is embedded in the filename, translate that
|
|
# to the srcarch used in the $RHCP_RHEL/pending-common/generic path.
|
|
file=$1
|
|
|
|
# make dist-configs-prep uses <package-name>-<arch>-<variant>.config
|
|
# the trick is to get the <package-name> and filter it out
|
|
arch="${file/$PACKAGE_NAME-/}"
|
|
arch="${arch/-*/}"
|
|
|
|
# translate arch
|
|
case $arch in
|
|
x86_64 ) echo "x86/x86_64" ;;
|
|
ppc64le ) echo "powerpc" ;;
|
|
s390x ) echo "s390x" ;;
|
|
aarch64 ) echo "arm/aarch64" ;;
|
|
riscv64 ) echo "riscv/riscv64" ;;
|
|
*) die "Unsupported arch $arch" ;;
|
|
esac
|
|
}
|
|
|
|
find_conflicts()
|
|
{
|
|
# create master array, duplicate entries should have matching values
|
|
# if they don't, we can't create a 'pending-common/generic/' entry. We will have to
|
|
# resort to a 'pending-common/generic/<arch>' entry instead. Print config options that
|
|
# have conflicting defaults.
|
|
/usr/bin/awk '
|
|
|
|
/is not set/ {
|
|
split($0, a, "#");
|
|
split(a[2], b);
|
|
if (configs[b[1]] == "") {
|
|
configs[b[1]]="is not set";
|
|
} else {
|
|
if (configs[b[1]] != "is not set")
|
|
print "configs[b[1]]"
|
|
}
|
|
}
|
|
|
|
/=/ {
|
|
split($0, a, "=");
|
|
if (configs[a[1]] == "") {
|
|
configs[a[1]]=a[2];
|
|
} else {
|
|
if (configs[a[1]] != a[2])
|
|
print "configs[a[1]]"
|
|
}
|
|
}
|
|
# punt all arch specific stuff to the <arch> directory
|
|
/CONFIG_X86/ || /CONFIG_PPC/ || /CONFIG_ARM/ || /CONFIG_S390/ || /CONFIG_RISCV/
|
|
|
|
' $WORK/kernel*.config
|
|
}
|
|
|
|
save_defaults()
|
|
{
|
|
conflicts=$1
|
|
|
|
echo "Saving config defaults"
|
|
|
|
# write shared config values to $RHCP_RHEL/pending-common/generic
|
|
# combine all configs and filter out conflicts, then unique sort them
|
|
# this avoids the duplicate configs from each kernel*.config file.
|
|
# With conflicts filtered out, all files should be new.
|
|
cat $WORK/kernel*.config | grep -v -f "$conflicts" | sort -u > $WORK/.configs
|
|
while read -r config
|
|
do
|
|
file="$(echo "$config" | cut -f1 -d '=')"
|
|
path="$RHCP_RHEL/pending-common/generic/$file"
|
|
|
|
# translate the =n to 'is not set'
|
|
if [[ "$config" = *"=n" ]]
|
|
then
|
|
value="# $file is not set"
|
|
else
|
|
value="$config"
|
|
fi
|
|
|
|
# normal path
|
|
test ! -e "$path" && echo "$value" > "$path" && continue
|
|
|
|
# Existing files should come from newly invalid config values
|
|
# if so, let's find and overwrite all instances of it
|
|
paths="$(find $RHCP_RHEL -name "$file")"
|
|
for path in $paths
|
|
do
|
|
# special case, anything not set, don't overwrite, keep disabled.
|
|
# a disabled config option is never invalid
|
|
grep -q 'is not set' "$path" && continue
|
|
|
|
echo "$value" > "$path"
|
|
done
|
|
|
|
done < $WORK/.configs
|
|
|
|
# write conflicting config values to $RHCP_RHEL/pending-common/generic/arch
|
|
for f in "$WORK"/kernel*.config
|
|
do
|
|
grep -f "$conflicts" "$f" > $WORK/.configs
|
|
test ! -s $WORK/.configs && continue
|
|
arch="$(get_configarch "$(basename "$f")")" || die "$arch"
|
|
|
|
while read -r config
|
|
do
|
|
file="$(echo "$config" | cut -f1 -d '=')"
|
|
path="$RHCP_RHEL/pending-common/generic/$arch/$file"
|
|
|
|
# translate the =n to 'is not set'
|
|
if [[ "$config" = *"=n" ]]
|
|
then
|
|
value="# $file is not set"
|
|
else
|
|
value="$config"
|
|
fi
|
|
|
|
echo "$value" > "$path"
|
|
done < $WORK/.configs
|
|
done
|
|
}
|
|
|
|
generate_rh_config()
|
|
{
|
|
echo "Generating rh_config diffs"
|
|
rm -rf $WORK
|
|
mkdir $WORK
|
|
|
|
# generate the new config options
|
|
# invalid config values are handle inherently here because the kconf tool
|
|
# spits them out as new configs
|
|
for f in "$RHCP"/kernel*.config
|
|
do
|
|
echo "Working on $f"
|
|
|
|
cp "$f" .config
|
|
config="$(basename "$f")"
|
|
arch="$(head -1 "$f" | cut -b 3-)" || die "$arch"
|
|
|
|
make ARCH="$arch" listnewconfig 2>/dev/null | grep -E 'CONFIG_' | cut -d'#' -f1 > $WORK/"$config"
|
|
done
|
|
|
|
# check for conflicting default config values
|
|
find_conflicts > $WORK/.conflicts
|
|
save_defaults "$WORK/.conflicts"
|
|
|
|
rm -rf $WORK
|
|
}
|
|
|
|
make dist-configs-prep > /dev/null || die "Failed make dist-prep"
|
|
generate_rh_config
|