All of lore.kernel.org
 help / color / mirror / Atom feed
From: Andrew Jones <drjones@redhat.com>
To: kvm@vger.kernel.org
Cc: lvivier@redhat.com, thuth@redhat.com, david@redhat.com,
	frankja@linux.ibm.com, pbonzini@redhat.com
Subject: [PATCH kvm-unit-tests v2] arch-run: Add reserved variables to the default environ
Date: Tue,  7 Apr 2020 13:33:12 +0200	[thread overview]
Message-ID: <20200407113312.65587-1-drjones@redhat.com> (raw)

Add the already reserved (see README) variables to the default
environ. To do so neatly we rework the environ creation a bit too.
mkstandalone also learns to honor config.mak as to whether or not
to make environs, and we allow the $ERRATATXT file to be selected
at configure time.

Signed-off-by: Andrew Jones <drjones@redhat.com>
---

v2: Improve error handling of missing erratatxt files.

 configure               |  13 ++++-
 scripts/arch-run.bash   | 125 +++++++++++++++++++++++++---------------
 scripts/mkstandalone.sh |   9 ++-
 3 files changed, 97 insertions(+), 50 deletions(-)

diff --git a/configure b/configure
index 579765165fdf..5d2cd90cd180 100755
--- a/configure
+++ b/configure
@@ -17,6 +17,7 @@ environ_default=yes
 u32_long=
 vmm="qemu"
 errata_force=0
+erratatxt="errata.txt"
 
 usage() {
     cat <<-EOF
@@ -37,6 +38,8 @@ usage() {
 	    --[enable|disable]-default-environ
 	                           enable or disable the generation of a default environ when
 	                           no environ is provided by the user (enabled by default)
+	    --erratatxt=FILE       specify a file to use instead of errata.txt. Use
+	                           '--erratatxt=' to ensure no file is used.
 EOF
     exit 1
 }
@@ -85,6 +88,9 @@ while [[ "$1" = -* ]]; do
 	--disable-default-environ)
 	    environ_default=no
 	    ;;
+	--erratatxt)
+	    erratatxt="$arg"
+	    ;;
 	--help)
 	    usage
 	    ;;
@@ -94,6 +100,11 @@ while [[ "$1" = -* ]]; do
     esac
 done
 
+if [ "$erratatxt" ] && [ ! -f "$erratatxt" ]; then
+    echo "erratatxt: $erratatxt does not exist or is not a regular file"
+    exit 1
+fi
+
 arch_name=$arch
 [ "$arch" = "aarch64" ] && arch="arm64"
 [ "$arch_name" = "arm64" ] && arch_name="aarch64"
@@ -194,7 +205,7 @@ FIRMWARE=$firmware
 ENDIAN=$endian
 PRETTY_PRINT_STACKS=$pretty_print_stacks
 ENVIRON_DEFAULT=$environ_default
-ERRATATXT=errata.txt
+ERRATATXT=$erratatxt
 U32_LONG_FMT=$u32_long
 EOF
 
diff --git a/scripts/arch-run.bash b/scripts/arch-run.bash
index da1a9d7871e5..8348761d86ff 100644
--- a/scripts/arch-run.bash
+++ b/scripts/arch-run.bash
@@ -28,9 +28,9 @@ run_qemu ()
 {
 	local stdout errors ret sig
 
+	initrd_create || return $?
 	echo -n "$@"
-	initrd_create &&
-		echo -n " #"
+	[ "$ENVIRON_DEFAULT" = "yes" ] && echo -n " #"
 	echo " $INITRD"
 
 	# stdout to {stdout}, stderr to $errors and stderr
@@ -195,60 +195,91 @@ search_qemu_binary ()
 
 initrd_create ()
 {
-	local ret
-
-	env_add_errata
-	ret=$?
+	if [ "$ENVIRON_DEFAULT" = "yes" ]; then
+		trap_exit_push 'rm -f $KVM_UNIT_TESTS_ENV; [ "$KVM_UNIT_TESTS_ENV_OLD" ] && export KVM_UNIT_TESTS_ENV="$KVM_UNIT_TESTS_ENV_OLD" || unset KVM_UNIT_TESTS_ENV; unset KVM_UNIT_TESTS_ENV_OLD'
+		[ -f "$KVM_UNIT_TESTS_ENV" ] && export KVM_UNIT_TESTS_ENV_OLD="$KVM_UNIT_TESTS_ENV"
+		export KVM_UNIT_TESTS_ENV=$(mktemp)
+		env_params
+		env_file
+		env_errata || return $?
+	fi
 
 	unset INITRD
 	[ -f "$KVM_UNIT_TESTS_ENV" ] && INITRD="-initrd $KVM_UNIT_TESTS_ENV"
 
-	return $ret
+	return 0
 }
 
-env_add_errata ()
+env_add_params ()
 {
-	local line errata ret=1
+	local p
 
-	if [ -f "$KVM_UNIT_TESTS_ENV" ] && grep -q '^ERRATA_' <(env); then
-		for line in $(grep '^ERRATA_' "$KVM_UNIT_TESTS_ENV"); do
-			errata=${line%%=*}
-			[ -n "${!errata}" ] && continue
+	for p in "$@"; do
+		if eval test -v $p; then
+			eval export "$p"
+		else
+			eval export "$p="
+		fi
+		grep "^$p=" <(env) >>$KVM_UNIT_TESTS_ENV
+	done
+}
+
+env_params ()
+{
+	local qemu have_qemu
+	local _ rest
+
+	qemu=$(search_qemu_binary) && have_qemu=1
+
+	if [ "$have_qemu" ]; then
+		if [ -n "$ACCEL" ] || [ -n "$QEMU_ACCEL" ]; then
+			[ -n "$ACCEL" ] && QEMU_ACCEL=$ACCEL
+		fi
+		QEMU_VERSION_STRING="$($qemu -h | head -1)"
+		IFS='[ .]' read -r _ _ _ QEMU_MAJOR QEMU_MINOR QEMU_MICRO rest <<<"$QEMU_VERSION_STRING"
+	fi
+	env_add_params QEMU_ACCEL QEMU_VERSION_STRING QEMU_MAJOR QEMU_MINOR QEMU_MICRO
+
+	KERNEL_VERSION_STRING=$(uname -r)
+	IFS=. read -r KERNEL_VERSION KERNEL_PATCHLEVEL rest <<<"$KERNEL_VERSION_STRING"
+	IFS=- read -r KERNEL_SUBLEVEL KERNEL_EXTRAVERSION <<<"$rest"
+	KERNEL_SUBLEVEL=${KERNEL_SUBLEVEL%%[!0-9]*}
+	KERNEL_EXTRAVERSION=${KERNEL_EXTRAVERSION%%[!0-9]*}
+	! [[ $KERNEL_SUBLEVEL =~ ^[0-9]+$ ]] && unset $KERNEL_SUBLEVEL
+	! [[ $KERNEL_EXTRAVERSION =~ ^[0-9]+$ ]] && unset $KERNEL_EXTRAVERSION
+	env_add_params KERNEL_VERSION_STRING KERNEL_VERSION KERNEL_PATCHLEVEL KERNEL_SUBLEVEL KERNEL_EXTRAVERSION
+}
+
+env_file ()
+{
+	local line var
+
+	[ ! -f "$KVM_UNIT_TESTS_ENV_OLD" ] && return
+
+	for line in $(grep -E '^[[:blank:]]*[[:alpha:]_][[:alnum:]_]*=' "$KVM_UNIT_TESTS_ENV_OLD"); do
+		var=${line%%=*}
+		if ! grep -q "^$var=" $KVM_UNIT_TESTS_ENV; then
 			eval export "$line"
-		done
-	elif [ ! -f "$KVM_UNIT_TESTS_ENV" ]; then
+			grep "^$var=" <(env) >>$KVM_UNIT_TESTS_ENV
+		fi
+	done
+}
+
+env_errata ()
+{
+	if [ "$ERRATATXT" ] && [ ! -f "$ERRATATXT" ]; then
+		echo "$ERRATATXT not found. (ERRATATXT=$ERRATATXT)" >&2
+		return 2
+	elif [ "$ERRATATXT" ]; then
 		env_generate_errata
 	fi
-
-	if grep -q '^ERRATA_' <(env); then
-		export KVM_UNIT_TESTS_ENV_OLD="$KVM_UNIT_TESTS_ENV"
-		export KVM_UNIT_TESTS_ENV=$(mktemp)
-		trap_exit_push 'rm -f $KVM_UNIT_TESTS_ENV; [ "$KVM_UNIT_TESTS_ENV_OLD" ] && export KVM_UNIT_TESTS_ENV="$KVM_UNIT_TESTS_ENV_OLD" || unset KVM_UNIT_TESTS_ENV; unset KVM_UNIT_TESTS_ENV_OLD'
-		[ -f "$KVM_UNIT_TESTS_ENV_OLD" ] && grep -v '^ERRATA_' "$KVM_UNIT_TESTS_ENV_OLD" > $KVM_UNIT_TESTS_ENV
-		grep '^ERRATA_' <(env) >> $KVM_UNIT_TESTS_ENV
-		ret=0
-	fi
-
-	return $ret
+	sort <(env | grep '^ERRATA_') <(grep '^ERRATA_' $KVM_UNIT_TESTS_ENV) | uniq -u >>$KVM_UNIT_TESTS_ENV
 }
 
 env_generate_errata ()
 {
-	local kernel_version_string=$(uname -r)
-	local kernel_version kernel_patchlevel kernel_sublevel kernel_extraversion
 	local line commit minver errata rest v p s x have
 
-	IFS=. read -r kernel_version kernel_patchlevel rest <<<"$kernel_version_string"
-	IFS=- read -r kernel_sublevel kernel_extraversion <<<"$rest"
-	kernel_sublevel=${kernel_sublevel%%[!0-9]*}
-	kernel_extraversion=${kernel_extraversion%%[!0-9]*}
-
-	! [[ $kernel_sublevel =~ ^[0-9]+$ ]] && unset $kernel_sublevel
-	! [[ $kernel_extraversion =~ ^[0-9]+$ ]] && unset $kernel_extraversion
-
-	[ "$ENVIRON_DEFAULT" != "yes" ] && return
-	[ ! -f "$ERRATATXT" ] && return
-
 	for line in $(grep -v '^#' "$ERRATATXT" | tr -d '[:blank:]' | cut -d: -f1,2); do
 		commit=${line%:*}
 		minver=${line#*:}
@@ -269,16 +300,16 @@ env_generate_errata ()
 		! [[ $s =~ ^[0-9]+$ ]] && unset $s
 		! [[ $x =~ ^[0-9]+$ ]] && unset $x
 
-		if (( $kernel_version > $v ||
-		      ($kernel_version == $v && $kernel_patchlevel > $p) )); then
+		if (( $KERNEL_VERSION > $v ||
+		      ($KERNEL_VERSION == $v && $KERNEL_PATCHLEVEL > $p) )); then
 			have=y
-		elif (( $kernel_version == $v && $kernel_patchlevel == $p )); then
-			if [ "$kernel_sublevel" ] && [ "$s" ]; then
-				if (( $kernel_sublevel > $s )); then
+		elif (( $KERNEL_VERSION == $v && $KERNEL_PATCHLEVEL == $p )); then
+			if [ "$KERNEL_SUBLEVEL" ] && [ "$s" ]; then
+				if (( $KERNEL_SUBLEVEL > $s )); then
 					have=y
-				elif (( $kernel_sublevel == $s )); then
-					if [ "$kernel_extraversion" ] && [ "$x" ]; then
-						if (( $kernel_extraversion >= $x )); then
+				elif (( $KERNEL_SUBLEVEL == $s )); then
+					if [ "$KERNEL_EXTRAVERSION" ] && [ "$x" ]; then
+						if (( $KERNEL_EXTRAVERSION >= $x )); then
 							have=y
 						else
 							have=n
diff --git a/scripts/mkstandalone.sh b/scripts/mkstandalone.sh
index c1ecb7f99cdc..9d506cc95072 100755
--- a/scripts/mkstandalone.sh
+++ b/scripts/mkstandalone.sh
@@ -36,7 +36,7 @@ generate_test ()
 
 	echo "#!/usr/bin/env bash"
 	echo "export STANDALONE=yes"
-	echo "export ENVIRON_DEFAULT=yes"
+	echo "export ENVIRON_DEFAULT=$ENVIRON_DEFAULT"
 	echo "export HOST=\$(uname -m | sed -e 's/i.86/i386/;s/arm.*/arm/;s/ppc64.*/ppc64/')"
 	echo "export PRETTY_PRINT_STACKS=no"
 
@@ -59,7 +59,7 @@ generate_test ()
 		echo 'export FIRMWARE'
 	fi
 
-	if [ "$ERRATATXT" ]; then
+	if [ "$ENVIRON_DEFAULT" = "yes" ] && [ "$ERRATATXT" ]; then
 		temp_file ERRATATXT "$ERRATATXT"
 		echo 'export ERRATATXT'
 	fi
@@ -99,6 +99,11 @@ function mkstandalone()
 	echo Written $standalone.
 }
 
+if [ "$ENVIRON_DEFAULT" = "yes" ] && [ "$ERRATATXT" ] && [ ! -f "$ERRATATXT" ]; then
+	echo "$ERRATATXT not found. (ERRATATXT=$ERRATATXT)" >&2
+	exit 2
+fi
+
 trap 'rm -f $cfg' EXIT
 cfg=$(mktemp)
 
-- 
2.25.1


             reply	other threads:[~2020-04-07 11:33 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-04-07 11:33 Andrew Jones [this message]
2020-04-07 15:45 ` [PATCH kvm-unit-tests v2] arch-run: Add reserved variables to the default environ Paolo Bonzini

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=20200407113312.65587-1-drjones@redhat.com \
    --to=drjones@redhat.com \
    --cc=david@redhat.com \
    --cc=frankja@linux.ibm.com \
    --cc=kvm@vger.kernel.org \
    --cc=lvivier@redhat.com \
    --cc=pbonzini@redhat.com \
    --cc=thuth@redhat.com \
    /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.