From: Siddharth Menon <simeddon@gmail.com>
To: linux-kselftest@vger.kernel.org, shuah@kernel.org
Cc: skhan@linuxfoundation.org, pmladek@suse.com, mbenes@suse.cz,
linux-kernel@vger.kernel.org,
Siddharth Menon <simeddon@gmail.com>
Subject: [PATCH v3 1/2 RESEND] selftests: Introduce script to validate required dependencies
Date: Thu, 27 Feb 2025 10:59:26 +0530 [thread overview]
Message-ID: <20250227053322.114215-2-simeddon@gmail.com> (raw)
In-Reply-To: <20250227053322.114215-1-simeddon@gmail.com>
This patch adds a script to validate that the current kernel configuration
satisfies the requirements for selftests by comparing the current
kernel configs against the required selftest configs.
The script also runs kselftest_deps.sh to check for any missing libraries
required by the selftest.
A config mismatch exits with error value 1 while matching configs or
missing config files exit with value 0. In order to silence missing
dependency output, set the environment variable SILENCE=1.
The code for extracting the current kernel configs is adapted from
scripts/kconfig/streamline_config.pl.
Suggested-by: Petr Mladek <pmladek@suse.com>
Suggested-by: Miroslav Benes <mbenes@suse.cz>
Signed-off-by: Siddharth Menon <simeddon@gmail.com>
---
v1->v2:
- check selftest/config directly rather than a separate set in the test
makefile
v2->v3:
- Integrate kselftest_deps.sh to check for missing libraries (I have not
set it to skip the tests here, as it sometimes throws outputs such as
missing $(LIB) or $(MNL_LDLIBS))
- Replaced spaces with tabs, removed trailing spaces and other minor
formatting changes
- Introduced flag to silence the missing dependencies debug statements
- Rename script to a more meaningful name
.../testing/selftests/check_kselftest_deps.pl | 170 ++++++++++++++++++
1 file changed, 170 insertions(+)
create mode 100755 tools/testing/selftests/check_kselftest_deps.pl
diff --git a/tools/testing/selftests/check_kselftest_deps.pl b/tools/testing/selftests/check_kselftest_deps.pl
new file mode 100755
index 000000000000..ef1a5fe8c321
--- /dev/null
+++ b/tools/testing/selftests/check_kselftest_deps.pl
@@ -0,0 +1,170 @@
+#!/usr/bin/env perl
+# SPDX-License-Identifier: GPL-2.0
+use warnings;
+use strict;
+use Getopt::Long;
+use File::Spec;
+use File::Basename;
+
+# set the environment variable SILENCE to silence
+# debug output.
+
+# Check if required arguments are provided
+die "Usage: $0 <selftest_path> <compiler>\n" unless @ARGV >= 2;
+
+my $test_path = $ARGV[0];
+my $cc = join(' ', @ARGV[1..$#ARGV]);
+my $script_dir = dirname(__FILE__);
+
+my $silenceprint;
+$silenceprint = 1 if (defined($ENV{SILENCE}));
+
+sub dprint {
+ return if ($silenceprint);
+ print STDERR @_;
+}
+
+my $uname = `uname -r`;
+chomp $uname;
+
+my @searchconfigs = (
+ {
+ "file" => ".config",
+ "exec" => "cat",
+ },
+ {
+ "file" => "/proc/config.gz",
+ "exec" => "zcat",
+ },
+ {
+ "file" => "/boot/config-$uname",
+ "exec" => "cat",
+ },
+ {
+ "file" => "/boot/vmlinuz-$uname",
+ "exec" => "scripts/extract-ikconfig",
+ "test" => "scripts/extract-ikconfig",
+ },
+ {
+ "file" => "vmlinux",
+ "exec" => "scripts/extract-ikconfig",
+ "test" => "scripts/extract-ikconfig",
+ },
+ {
+ "file" => "/lib/modules/$uname/kernel/kernel/configs.ko",
+ "exec" => "scripts/extract-ikconfig",
+ "test" => "scripts/extract-ikconfig",
+ },
+ {
+ "file" => "/lib/modules/$uname/build/.config",
+ "exec" => "cat",
+ },
+ {
+ "file" => "kernel/configs.ko",
+ "exec" => "scripts/extract-ikconfig",
+ "test" => "scripts/extract-ikconfig",
+ },
+ {
+ "file" => "kernel/configs.o",
+ "exec" => "scripts/extract-ikconfig",
+ "test" => "scripts/extract-ikconfig",
+ },
+);
+
+sub read_config {
+ foreach my $conf (@searchconfigs) {
+ my $file = $conf->{"file"};
+
+ next unless -f $file;
+
+ if (defined $conf->{"test"}) {
+ `$conf->{"test"} $file 2>/dev/null`;
+ next if $?;
+ }
+
+ my $exec = $conf->{"exec"};
+
+ # dprint "Kernel config: '$file'\n";
+
+ open(my $infile, '-|', "$exec $file") or die "Failed to run $exec $file";
+ my @config_content = <$infile>;
+ close $infile;
+
+ return @config_content;
+ }
+
+ dprint "Unable to find kernel config file, skipping check\n";
+ exit 0;
+}
+
+sub check_libs {
+ my $command = "cd $script_dir && ./kselftest_deps.sh \"$cc\" $test_path";
+ my $lib_test = `$command 2>&1`;
+ my $exit_code = $? >> 8;
+
+ if ($exit_code != 0) {
+ die "Error: Failed to run kselftest_deps.sh with exit code $exit_code\n";
+ }
+
+ return $lib_test;
+}
+
+# Check for missing libraries
+my $lib_test = check_libs();
+my $fail_libs;
+
+if ($lib_test =~
+/(--------------------------------------------------------\s
+*Missing libraries system.*?
+--------------------------------------------------------)/s) {
+ $fail_libs = $1;
+}
+
+dprint("$fail_libs\n") if $fail_libs;
+
+# Read and parse kernel config
+my @config_file = read_config();
+my %kern_configs;
+foreach my $line (@config_file) {
+ chomp $line;
+ next if $line =~ /^\s*$/ || $line =~ /^#/;
+
+ if ($line =~ /^(CONFIG_\w+)=(.+)$/) {
+ $kern_configs{$1} = $2;
+ }
+}
+
+# Read and parse test config
+my %test_configs;
+open(my $fh, '<', "$test_path/config") or exit 0;
+
+while (my $line = <$fh>) {
+ chomp $line;
+ next if $line =~ /^\s*$/ || $line =~ /^#/;
+
+ if ($line =~ /^(CONFIG_\w+)=(.+)$/) {
+ $test_configs{$1} = $2;
+ }
+}
+close $fh;
+
+# Compare selftest configs with kernel configs
+my $all_match = 1;
+my @missing_or_mismatched;
+
+foreach my $key (keys %test_configs) {
+ if (!exists $kern_configs{$key} || $kern_configs{$key} ne $test_configs{$key}) {
+ push @missing_or_mismatched, "Required: $key=$test_configs{$key}";
+ $all_match = 0;
+ }
+}
+
+if ($all_match && !$fail_libs) {
+ exit 0;
+} else {
+ dprint("--------------------------------------------------------\n") unless $fail_libs;
+ dprint("$_\n") for @missing_or_mismatched;
+ dprint("--------------------------------------------------------\n") if @missing_or_mismatched;
+
+ exit 1;
+}
--
2.48.1
next prev parent reply other threads:[~2025-02-27 5:33 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-02-27 5:29 [PATCH v3 0/2 RESEND] update kselftest framework to check for required configs Siddharth Menon
2025-02-27 5:29 ` Siddharth Menon [this message]
2025-02-27 5:29 ` [PATCH v3 2/2] selftests/lib.mk: Introduce check to validate required dependencies Siddharth Menon
2025-02-27 16:51 ` [PATCH v3 0/2 RESEND] update kselftest framework to check for required configs Shuah Khan
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20250227053322.114215-2-simeddon@gmail.com \
--to=simeddon@gmail.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-kselftest@vger.kernel.org \
--cc=mbenes@suse.cz \
--cc=pmladek@suse.com \
--cc=shuah@kernel.org \
--cc=skhan@linuxfoundation.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.