@@ -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.
931931check_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# ##############################################################################
9811023kernel_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# ##############################################################################
68006858detect_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