Skip to content

Commit c4e178e

Browse files
committed
add: support Ubuntu/Debian kernel config sources
check_kernel_config() previously only read /proc/config.gz. - utils/functestlib.sh: - check_kernel_config(): probe a fallback chain of config sources: /proc/config.gz -> /boot/config-$(uname -r) -> /lib/modules/$(uname -r)/build/.config -> /usr/src/linux-headers-$(uname -r)/.config. - Updated detect_platform(): classifies the running OS as ubuntu/debian/yocto/unknown from /etc/os-release Signed-off-by: Vamsee Narapareddi <vnarapar@qti.qualcomm.com>
1 parent 5c1d788 commit c4e178e

1 file changed

Lines changed: 139 additions & 36 deletions

File tree

‎Runner/utils/functestlib.sh‎

Lines changed: 139 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -930,12 +930,44 @@ find_test_case_script_by_name() {
930930
# Logs PASS or FAIL for each config and returns 0 on success, 1 on first mismatch.
931931
check_kernel_config() {
932932
cfgs=$1
933+
kver="$(uname -r 2>/dev/null)"
934+
cfg_source=""
935+
cfg_is_gz=0
933936

934-
if [ ! -r /proc/config.gz ]; then
935-
log_fail "Kernel config source /proc/config.gz is not available"
937+
if [ -r /proc/config.gz ]; then
938+
cfg_source="/proc/config.gz"
939+
cfg_is_gz=1
940+
else
941+
for cand in \
942+
"/boot/config-${kver}" \
943+
"/lib/modules/${kver}/build/.config" \
944+
"/usr/src/linux-headers-${kver}/.config"
945+
do
946+
if [ -n "$kver" ] && [ -r "$cand" ]; then
947+
cfg_source="$cand"
948+
cfg_is_gz=0
949+
break
950+
fi
951+
done
952+
fi
953+
954+
if [ -z "$cfg_source" ]; then
955+
log_fail "No readable kernel config source found (checked /proc/config.gz, /boot/config-${kver:-<unknown>}, /lib/modules/${kver:-<unknown>}/build/.config, /usr/src/linux-headers-${kver:-<unknown>}/.config)"
936956
return 1
937957
fi
938958

959+
960+
if command -v detect_platform >/dev/null 2>&1; then
961+
detect_platform >/dev/null 2>&1 || true
962+
fi
963+
cfg_os_family="${PLATFORM_OS_FAMILY:-unknown}"
964+
965+
if [ -n "${PLATFORM_OS_NAME:-}" ]; then
966+
log_info "Using kernel config source: $cfg_source (OS: $PLATFORM_OS_NAME, family: $cfg_os_family)"
967+
else
968+
log_info "Using kernel config source: $cfg_source (family: $cfg_os_family)"
969+
fi
970+
939971
for cfg in $cfgs; do
940972
[ -n "$cfg" ] || continue
941973

@@ -952,20 +984,23 @@ check_kernel_config() {
952984
;;
953985
esac
954986

955-
if command -v zgrep >/dev/null 2>&1; then
956-
if zgrep -qE "$pattern" /proc/config.gz 2>/dev/null; then
957-
log_pass "$pass_msg"
987+
cfg_matched=0
988+
989+
if [ "$cfg_is_gz" -eq 1 ]; then
990+
if command -v zgrep >/dev/null 2>&1; then
991+
zgrep -qE "$pattern" "$cfg_source" 2>/dev/null && cfg_matched=1
958992
else
959-
log_fail "$fail_msg"
960-
return 1
993+
gzip -dc "$cfg_source" 2>/dev/null | grep -qE "$pattern" && cfg_matched=1
961994
fi
962995
else
963-
if gzip -dc /proc/config.gz 2>/dev/null | grep -qE "$pattern"; then
964-
log_pass "$pass_msg"
965-
else
966-
log_fail "$fail_msg"
967-
return 1
968-
fi
996+
grep -qE "$pattern" "$cfg_source" 2>/dev/null && cfg_matched=1
997+
fi
998+
999+
if [ "$cfg_matched" -eq 1 ]; then
1000+
log_pass "$pass_msg"
1001+
else
1002+
log_fail "$fail_msg"
1003+
return 1
9691004
fi
9701005
done
9711006

@@ -977,41 +1012,62 @@ check_kernel_config() {
9771012
# Prints CONFIG_NAME=value from the running kernel configuration, including
9781013
# CONFIG_NAME=n for an explicitly disabled option. Returns 0 when found, 1
9791014
# when unavailable or absent, and 3 when the name is omitted.
1015+
#
1016+
# Uses the same config-source fallback chain as check_kernel_config():
1017+
# /proc/config.gz -> /boot/config-<uname -r> ->
1018+
# /lib/modules/<uname -r>/build/.config -> /usr/src/linux-headers-<uname -r>/.config
1019+
# This covers embedded/Yocto builds (config.gz) as well as Ubuntu/Debian and
1020+
# other distros that only ship a plain-text build config under /boot or the
1021+
# kernel headers/module tree.
9801022
###############################################################################
9811023
kernel_config_value() {
9821024
config_name="$1"
9831025
[ -n "$config_name" ] || return 3
9841026

1027+
kcv_kver="$(uname -r 2>/dev/null)"
1028+
kcv_source=""
1029+
kcv_is_gz=0
1030+
9851031
if [ -r /proc/config.gz ]; then
1032+
kcv_source="/proc/config.gz"
1033+
kcv_is_gz=1
1034+
else
1035+
for kcv_cand in \
1036+
"/boot/config-${kcv_kver}" \
1037+
"/lib/modules/${kcv_kver}/build/.config" \
1038+
"/usr/src/linux-headers-${kcv_kver}/.config"
1039+
do
1040+
if [ -n "$kcv_kver" ] && [ -r "$kcv_cand" ]; then
1041+
kcv_source="$kcv_cand"
1042+
kcv_is_gz=0
1043+
break
1044+
fi
1045+
done
1046+
fi
1047+
1048+
[ -n "$kcv_source" ] || return 1
1049+
1050+
if [ "$kcv_is_gz" -eq 1 ]; then
9861051
if command -v zgrep >/dev/null 2>&1; then
987-
config_line=$(zgrep -m 1 -E "^${config_name}=" /proc/config.gz 2>/dev/null || true)
988-
config_disabled=$(zgrep -m 1 -E "^# ${config_name} is not set$" /proc/config.gz 2>/dev/null || true)
1052+
kcv_line=$(zgrep -m 1 -E "^${config_name}=" "$kcv_source" 2>/dev/null || true)
1053+
kcv_disabled=$(zgrep -m 1 -E "^# ${config_name} is not set$" "$kcv_source" 2>/dev/null || true)
9891054
else
990-
config_line=$(gzip -dc /proc/config.gz 2>/dev/null | grep -m 1 -E "^${config_name}=" || true)
991-
config_disabled=$(gzip -dc /proc/config.gz 2>/dev/null | grep -m 1 -E "^# ${config_name} is not set$" || true)
1055+
kcv_line=$(gzip -dc "$kcv_source" 2>/dev/null | grep -m 1 -E "^${config_name}=" || true)
1056+
kcv_disabled=$(gzip -dc "$kcv_source" 2>/dev/null | grep -m 1 -E "^# ${config_name} is not set$" || true)
9921057
fi
1058+
else
1059+
kcv_line=$(grep -m 1 -E "^${config_name}=" "$kcv_source" 2>/dev/null || true)
1060+
kcv_disabled=$(grep -m 1 -E "^# ${config_name} is not set$" "$kcv_source" 2>/dev/null || true)
1061+
fi
9931062

994-
if [ -n "$config_line" ]; then
995-
printf '%s\n' "$config_line"
996-
return 0
997-
fi
998-
if [ -n "$config_disabled" ]; then
999-
printf '%s=n\n' "$config_name"
1000-
return 0
1001-
fi
1063+
if [ -n "$kcv_line" ]; then
1064+
printf '%s\n' "$kcv_line"
1065+
return 0
10021066
fi
10031067

1004-
boot_config="/boot/config-$(uname -r 2>/dev/null)"
1005-
if [ -r "$boot_config" ]; then
1006-
config_line=$(grep -m 1 -E "^${config_name}=" "$boot_config" 2>/dev/null || true)
1007-
if [ -n "$config_line" ]; then
1008-
printf '%s\n' "$config_line"
1009-
return 0
1010-
fi
1011-
if grep -q -E "^# ${config_name} is not set$" "$boot_config" 2>/dev/null; then
1012-
printf '%s=n\n' "$config_name"
1013-
return 0
1014-
fi
1068+
if [ -n "$kcv_disabled" ]; then
1069+
printf '%s=n\n' "$config_name"
1070+
return 0
10151071
fi
10161072

10171073
return 1
@@ -6795,6 +6851,8 @@ log_soc_info() {
67956851
# PLATFORM_SOC_MACHINE, PLATFORM_SOC_ID, PLATFORM_SOC_FAMILY
67966852
# PLATFORM_DT_MODEL, PLATFORM_DT_COMPAT
67976853
# PLATFORM_OS_LIKE, PLATFORM_OS_NAME
6854+
# PLATFORM_OS_ID (lowercased /etc/os-release ID, e.g. ubuntu/debian/poky)
6855+
# PLATFORM_OS_FAMILY (normalized: ubuntu | debian | yocto | unknown)
67986856
# PLATFORM_TARGET, PLATFORM_MACHINE
67996857
###############################################################################
68006858
detect_platform() {
@@ -6841,9 +6899,16 @@ detect_platform() {
68416899
fi
68426900

68436901
# --- OS (parse, do not source /etc/os-release) ---
6902+
PLATFORM_OS_ID=""
68446903
PLATFORM_OS_LIKE=""
68456904
PLATFORM_OS_NAME=""
6905+
PLATFORM_OS_FAMILY="unknown"
6906+
_os_cpe_name=""
68466907
if [ -r /etc/os-release ]; then
6908+
PLATFORM_OS_ID="$(
6909+
awk -F= '$1=="ID"{gsub(/"/,"",$2); print $2}' /etc/os-release 2>/dev/null |
6910+
tr '[:upper:]' '[:lower:]'
6911+
)"
68476912
PLATFORM_OS_LIKE="$(
68486913
awk -F= '$1=="ID_LIKE"{gsub(/"/,"",$2); print $2}' /etc/os-release 2>/dev/null
68496914
)"
@@ -6855,7 +6920,44 @@ detect_platform() {
68556920
PLATFORM_OS_NAME="$(
68566921
awk -F= '$1=="PRETTY_NAME"{gsub(/"/,"",$2); print $2}' /etc/os-release 2>/dev/null
68576922
)"
6923+
_os_cpe_name="$(
6924+
awk -F= '$1=="CPE_NAME"{gsub(/"/,"",$2); print $2}' /etc/os-release 2>/dev/null |
6925+
tr '[:upper:]' '[:lower:]'
6926+
)"
68586927
fi
6928+
6929+
_os_like_lc="$(printf '%s' "$PLATFORM_OS_LIKE" | tr '[:upper:]' '[:lower:]')"
6930+
case "$PLATFORM_OS_ID" in
6931+
ubuntu)
6932+
PLATFORM_OS_FAMILY="ubuntu"
6933+
;;
6934+
debian)
6935+
PLATFORM_OS_FAMILY="debian"
6936+
;;
6937+
poky)
6938+
PLATFORM_OS_FAMILY="yocto"
6939+
;;
6940+
*)
6941+
case "$_os_like_lc" in
6942+
*debian*)
6943+
# Debian derivatives other than Ubuntu (e.g. Raspbian, Devuan).
6944+
PLATFORM_OS_FAMILY="debian"
6945+
;;
6946+
*poky*)
6947+
PLATFORM_OS_FAMILY="yocto"
6948+
;;
6949+
*)
6950+
case "$_os_cpe_name" in
6951+
*openembedded*)
6952+
# Covers qcom-distro and other Yocto/OpenEmbedded
6953+
# builds that set neither ID=poky nor ID_LIKE.
6954+
PLATFORM_OS_FAMILY="yocto"
6955+
;;
6956+
esac
6957+
;;
6958+
esac
6959+
;;
6960+
esac
68596961

68606962
# --- Target guess (mutually-exclusive; generic names only) ---
68616963
lc_compat="$(printf '%s %s' "$PLATFORM_DT_MODEL" "$PLATFORM_DT_COMPAT" \
@@ -6903,6 +7005,7 @@ detect_platform() {
69037005
PLATFORM_KERNEL PLATFORM_ARCH PLATFORM_UNAME_S PLATFORM_HOSTNAME \
69047006
PLATFORM_SOC_MACHINE PLATFORM_SOC_ID PLATFORM_SOC_FAMILY \
69057007
PLATFORM_DT_MODEL PLATFORM_DT_COMPAT PLATFORM_OS_LIKE PLATFORM_OS_NAME \
7008+
PLATFORM_OS_ID PLATFORM_OS_FAMILY \
69067009
PLATFORM_TARGET PLATFORM_MACHINE
69077010

69087011
return 0

0 commit comments

Comments
 (0)