mirror of
https://github.com/SCST-project/scst.git
synced 2026-05-14 09:11:27 +00:00
git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@8922 d57e44dd-8a1f-0410-8b47-8ef2f437770f
754 lines
22 KiB
Bash
Executable File
754 lines
22 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
############################################################################
|
|
#
|
|
# Script for running those SCST regression tests that can be run automatically.
|
|
#
|
|
# Copyright (C) 2008-2020 Bart Van Assche <bvanassche@acm.org>
|
|
#
|
|
# This program is free software; you can redistribute it and/or
|
|
# modify it under the terms of the GNU General Public License
|
|
# as published by the Free Software Foundation, version 2
|
|
# of the License.
|
|
#
|
|
# This program is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU General Public License for more details.
|
|
#
|
|
############################################################################
|
|
|
|
############################################################################
|
|
# This script performs the following actions:
|
|
# - Creates a temporary directory for storing the output of the regression
|
|
# tests. No existing files are modified by this script.
|
|
# - Verifies whether the top-level *.patch files apply cleanly to the SCST
|
|
# tree.
|
|
# - Duplicates the entire source tree to the temporary directory and
|
|
# compiles the SCST source code.
|
|
# - Duplicates the entire source tree to the temporary directory, runs
|
|
# 'make 2release' and again compiles the SCST source code.
|
|
# - Checks whether the specified kernel version is present
|
|
# in the directory specified through option -c.
|
|
# - If the source code of the specified kernel version is not present,
|
|
# download it.
|
|
# - Convert the SCST source code into a kernel patch.
|
|
# - Extract the kernel sources.
|
|
# - Run checkpatch on the SCST kernel patch.
|
|
# - Apply the SCST kernel patch to the kernel tree.
|
|
# - Run 'make allmodconfig'.
|
|
# - Run the sparse source code checker on the SCST directory.
|
|
# - Run 'make headers_check'.
|
|
# - Compile the kernel tree.
|
|
# - Run 'make checkstack'.
|
|
# - Run 'make namespacecheck'.
|
|
# - Run 'make htmldocs'.
|
|
#
|
|
# Note: the results of the individual steps are not verified by this script
|
|
# -- the output generated by the individual steps has to be verified by
|
|
# reviewing the output files written into the temporary directory.
|
|
############################################################################
|
|
|
|
|
|
########################
|
|
# Function definitions #
|
|
########################
|
|
|
|
# shellcheck source=./kernel-functions
|
|
source "$(dirname "$0")/kernel-functions"
|
|
|
|
function usage {
|
|
echo "Usage: $0 [-c <dir>] [-d <dir>] [-f] [-h] [-j <jobs>] [-p <patchdir>] [-q] <kver1> <kver2> ..."
|
|
echo " -c - cache directory for Linux kernel tarballs."
|
|
echo " -d - directory for temporary regression test files."
|
|
echo " -h - display this help information."
|
|
echo " -j - number of jobs that 'make' should run simultaneously."
|
|
echo " -k - remove temporary files before exiting."
|
|
echo " -q - download kernel sources silently."
|
|
echo " <kver1> <kver2> ... - kernel versions to test."
|
|
}
|
|
|
|
# Test whether the *.patch files in the SCST top-level directory apply cleanly
|
|
# to the SCST tree. Does not modify any files nor produce any output files.
|
|
function test_scst_tree_patches {
|
|
local rc=0
|
|
echo "Testing whether the SCST patches apply cleanly to the SCST tree ..."
|
|
for p in *.patch srpt/patches/scst*.patch
|
|
do
|
|
if [ -e "$p" ] && ! patch -p0 -f --dry-run -s <"$p" &>/dev/null; then
|
|
echo "ERROR: patch $p does not apply cleanly."
|
|
rc=1
|
|
fi
|
|
done
|
|
if [ "${rc}" = 0 ]; then
|
|
echo "OK"
|
|
fi
|
|
}
|
|
|
|
# Copy the entire SCST source code tree from "$1" into the current directory.
|
|
# Only copy those files which are administered by Subversion.
|
|
function duplicate_scst_source_tree {
|
|
if [ -e "$1/AskingQuestions" ]; then
|
|
"${scriptsdir}"/list-source-files "$1" |
|
|
tar -C "$1" --files-from=- -c -f - |
|
|
tar -x -f -
|
|
else
|
|
return 1
|
|
fi
|
|
}
|
|
|
|
function make_rpm {
|
|
local outputfile t
|
|
|
|
for t in rpm scst-dkms-rpm; do
|
|
outputfile="${outputdir}/make-${t}-output.txt"
|
|
echo "Testing whether 'make ${t}' works fine ..."
|
|
if make ${t} > "${outputfile}" 2>&1; then
|
|
echo "OK"
|
|
else
|
|
echo "FAILED"
|
|
fi
|
|
done
|
|
}
|
|
|
|
function make_dpkg {
|
|
local outputfile="${outputdir}/make-dpkg-output.txt"
|
|
|
|
outputfile="${outputdir}/make-${t}-output.txt"
|
|
echo "Testing whether 'make dpkg' works fine ..."
|
|
if make dpkg > "${outputfile}" 2>&1; then
|
|
echo "OK"
|
|
else
|
|
echo "FAILED"
|
|
fi
|
|
}
|
|
|
|
function compile_scst {
|
|
(
|
|
for p in scst scst_local iscsi-scst srpt qla2x00t $(if [ "${mpt_scst}" = "true" ]; then echo mpt; fi); do
|
|
if [ "${p%qla2x00t}" != "$p" ]; then
|
|
BUILD_2X_MODULE=y CONFIG_SCSI_QLA_FC=y CONFIG_SCSI_QLA2XXX_TARGET=y \
|
|
make -C "$p/qla2x00-target" || return $?
|
|
else
|
|
make -C "$p" || return $?
|
|
fi
|
|
done
|
|
)
|
|
}
|
|
|
|
# Compile the unpatched SCST source code.
|
|
function compile_scst_unpatched {
|
|
local scst="$PWD"
|
|
local outputfile="${outputdir}/compilation-output-unpatched.txt"
|
|
local workingdirectory="${outputdir}/scst-unpatched"
|
|
|
|
echo "Testing whether the SCST tree compiles fine ..."
|
|
(
|
|
if mkdir -p "${workingdirectory}" \
|
|
&& cd "${workingdirectory}" \
|
|
&& duplicate_scst_source_tree "${scst}" \
|
|
&& compile_scst &> "${outputfile}"
|
|
then
|
|
echo "OK"
|
|
else
|
|
echo "FAILED"
|
|
fi
|
|
)
|
|
}
|
|
|
|
# Compile the unpatched SCST source code without DLM.
|
|
function compile_scst_no_dlm {
|
|
local scst="$PWD"
|
|
local outputfile="${outputdir}/compilation-output-no-dlm.txt"
|
|
local workingdirectory="${outputdir}/scst-no-dlm"
|
|
|
|
echo "Testing whether the SCST tree compiles fine without DLM support ..."
|
|
(
|
|
if mkdir -p "${workingdirectory}" \
|
|
&& cd "${workingdirectory}" \
|
|
&& duplicate_scst_source_tree "${scst}" \
|
|
&& CONFIG_SCST_NO_DLM=y compile_scst &> "${outputfile}"
|
|
then
|
|
echo "OK"
|
|
else
|
|
echo "FAILED"
|
|
fi
|
|
)
|
|
}
|
|
|
|
# Test out-of-tree compilation against the kernel header files in
|
|
# /lib/modules/$(uname -r)/build.
|
|
function compile_scst_patched {
|
|
local scst="$PWD"
|
|
local outputfile="${outputdir}/compilation-output-$1.txt"
|
|
local workingdirectory="${outputdir}/scst-$1"
|
|
|
|
echo "Testing whether the $1 SCST tree compiles fine ..."
|
|
(
|
|
if mkdir -p "${workingdirectory}" \
|
|
&& cd "${workingdirectory}" \
|
|
&& duplicate_scst_source_tree "${scst}" \
|
|
&& make -s "$1" \
|
|
&& compile_scst &> "${outputfile}"
|
|
then
|
|
echo "OK"
|
|
else
|
|
echo "FAILED"
|
|
fi
|
|
)
|
|
}
|
|
|
|
# Generate a kernel patch from the SCST source tree for kernel version $1
|
|
# and with generate-kernel-patch options $2. $1 may be a
|
|
# ${kver}^${distro}^${release} triplet.
|
|
function generate_kernel_patch {
|
|
local kver
|
|
local patchfile="${outputdir}/scst-${1/^*}-kernel.patch"
|
|
local patchfile_m="${outputdir}/scst-${1/^*}-kernel-matching-line-numbers.patch"
|
|
local driver_options=""
|
|
|
|
kver="$(kernel_version "${1/^*}")"
|
|
driver_options=(-l)
|
|
[ "${mpt_scst}" = "true" ] && driver_options+=("-m")
|
|
|
|
"${scriptsdir}"/generate-kernel-patch "${driver_options[@]}" $2 "$1" > "${patchfile}"
|
|
|
|
"${scriptsdir}"/generate-kernel-patch "${driver_options[@]}" -n $2 "$1" > "${patchfile_m}"
|
|
|
|
"${scriptsdir}"/generate-kernel-patch "${driver_options[@]}" -p "${outputdir}/${patchdir}" $2 "$1"
|
|
}
|
|
|
|
# Run checkpatch on the generated kernel patch. Assumes that there is a
|
|
# vanilla kernel tree present in directory "${outputdir}/linux-$1", and leaves
|
|
# this kernel tree clean.
|
|
function run_checkpatch {
|
|
local kver plevel errors warnings
|
|
local outputfile="${outputdir}/checkpatch-$1-output.txt"
|
|
local patchfile="${outputdir}/scst-$1-kernel.patch"
|
|
|
|
kver="$(kernel_version "$1")"
|
|
plevel="$(patchlevel "$1")"
|
|
if [ -e "${outputdir}/linux-$1/scripts/checkpatch.pl" ]; then
|
|
if [ "${multiple_patches}" = "false" ]; then
|
|
echo "Running checkpatch on the SCST kernel patch ..."
|
|
( cd "${outputdir}/linux-$1" \
|
|
&& scripts/checkpatch.pl --no-tree --no-signoff - < "${patchfile}" &> "${outputfile}")
|
|
else
|
|
echo "Running checkpatch on the SCST kernel patches ..."
|
|
rm -f "${outputfile}"
|
|
( cd "${outputdir}/linux-$1" \
|
|
&& for p in "${outputdir}/${patchdir}"/*
|
|
do
|
|
echo "==== $p" >>"${outputfile}"
|
|
scripts/checkpatch.pl --no-tree --no-signoff - < "$p" >> "${outputfile}" 2>&1
|
|
done
|
|
)
|
|
fi
|
|
errors=$(grep -c '^ERROR' "${outputfile}")
|
|
warnings=$(grep -c '^WARNING' "${outputfile}")
|
|
echo "${errors} errors / ${warnings} warnings."
|
|
grep -E '^WARNING|^ERROR' "${outputfile}" |
|
|
sort |
|
|
grep -v 'WARNING: missing space after return type' |
|
|
sed 's/^WARNING: Avoid CamelCase:.*/WARNING: Avoid CamelCase/' |
|
|
uniq -c
|
|
else
|
|
echo "Skipping checkpatch step for kernel $1."
|
|
fi
|
|
return 0
|
|
}
|
|
|
|
function patch_and_configure_kernel {
|
|
local kver
|
|
kver="$(kernel_version "$1")"
|
|
local patchfile="${outputdir}/scst-$1-kernel-matching-line-numbers.patch"
|
|
local patchoutput="${outputdir}/patch-command-output-$1.txt"
|
|
local configureoutput="${outputdir}/configure-output.txt"
|
|
local disable=" \
|
|
CONFIG_BINARY_PRINTF \
|
|
CONFIG_BLK_DEV_IO_TRACE \
|
|
CONFIG_BRANCH_PROFILE_NONE \
|
|
CONFIG_CONTEXT_SWITCH_TRACER \
|
|
CONFIG_DEBUG_SECTION_MISMATCH \
|
|
CONFIG_DEBUG_STRICT_USER_COPY_CHECKS \
|
|
CONFIG_DYNAMIC_FTRACE \
|
|
CONFIG_EVENT_TRACE_TEST_SYSCALLS \
|
|
CONFIG_FTRACE \
|
|
CONFIG_FTRACE_MCOUNT_RECORD \
|
|
CONFIG_FTRACE_NMI_ENTER \
|
|
CONFIG_FTRACE_SELFTEST \
|
|
CONFIG_FTRACE_STARTUP_TEST \
|
|
CONFIG_FTRACE_SYSCALLS \
|
|
CONFIG_FUNCTION_GRAPH_TRACER \
|
|
CONFIG_FUNCTION_PROFILER \
|
|
CONFIG_FUNCTION_TRACER \
|
|
CONFIG_GENERIC_TRACER \
|
|
CONFIG_HAVE_FTRACE_NMI_ENTER \
|
|
CONFIG_HEADERS_CHECK \
|
|
CONFIG_IRQSOFF_TRACER \
|
|
CONFIG_IWLWIFI_DEVICE_TRACING \
|
|
CONFIG_IWM_TRACING \
|
|
CONFIG_KVM_MMU_AUDIT \
|
|
CONFIG_MAC80211_DRIVER_API_TRACER \
|
|
CONFIG_MMIOTRACE \
|
|
CONFIG_NET_DROP_MONITOR \
|
|
CONFIG_NOP_TRACER \
|
|
CONFIG_RETPOLINE \
|
|
CONFIG_RH_KABI_SIZE_ALIGN_CHECKS \
|
|
CONFIG_SCHED_TRACER \
|
|
CONFIG_SECURITY_SELINUX \
|
|
CONFIG_STACK_TRACER \
|
|
CONFIG_STACK_VALIDATION \
|
|
CONFIG_TRACEPOINTS \
|
|
CONFIG_TRACER_MAX_TRACE \
|
|
CONFIG_TRACING \
|
|
CONFIG_UNWINDER_ORC \
|
|
CONFIG_X86_32 \
|
|
CONFIG_X86_X32 \
|
|
"
|
|
local enable="CONFIG_UNWINDER_FRAME_POINTER"
|
|
|
|
case "$1" in
|
|
2.6.32-*)
|
|
echo "Enabling CONFIG_EVENT_TRACING for CentOS 6.x"
|
|
enable="$enable \
|
|
CONFIG_DEBUG_KERNEL \
|
|
CONFIG_FTRACE \
|
|
CONFIG_EVENT_TRACING \
|
|
CONFIG_DYNAMIC_DEBUG";;
|
|
*)
|
|
disable="$disable CONFIG_EVENT_TRACING";;
|
|
esac
|
|
|
|
echo "Patching and configuring kernel ..."
|
|
if [ "$ipv6" = "false" ]; then
|
|
disable="$disable CONFIG_IPV6"
|
|
fi
|
|
(
|
|
cd "${outputdir}/linux-$1" &&
|
|
if [ "${multiple_patches}" = "false" ]; then
|
|
if ! patch -p1 -f -s <"${patchfile}" >"${patchoutput}"; then
|
|
echo "Error: applying ${patchfile} failed."
|
|
exit 1
|
|
fi
|
|
else
|
|
rm -f "${patchoutput}"
|
|
for p in "${outputdir}/${patchdir}"/*; do
|
|
echo "==== $p" >>"${patchoutput}"
|
|
patch -p1 -f -s <"${p}" >>"${patchoutput}" 2>&1
|
|
done
|
|
fi &&
|
|
make -s allmodconfig &>"${outputdir}/make-config-output.txt" &&
|
|
for c in $disable; do sed -i.tmp "s/^$c=[ym]\$/$c=n/" .config; done &&
|
|
for c in $enable; do sed -i.tmp "s/^\(# \)*$c\(=.*\| is not set\)\$/$c=y/" .config; done &&
|
|
make -s oldconfig </dev/null &>"${configureoutput}" &&
|
|
for c in $enable; do
|
|
grep -q "^$c=[ym]" .config ||
|
|
echo "Enabling $c failed."
|
|
done
|
|
)
|
|
}
|
|
|
|
# Patches and compiles a kernel tree. Assumes that there is a vanilla kernel
|
|
# tree present in directory "${outputdir}/linux-$1".
|
|
function compile_patched_kernel {
|
|
local kver plevel
|
|
kver="$(kernel_version "$1")"
|
|
plevel="$(patchlevel "$1")"
|
|
local outputfile="${outputdir}/kernel-$1-compilation-output.txt"
|
|
|
|
echo "Compiling kernel $1 ..."
|
|
(
|
|
(
|
|
cd "${outputdir}/linux-$1" \
|
|
&& LC_ALL=C make -s -k bzImage modules
|
|
)
|
|
) &> "${outputfile}"
|
|
echo "See also ${outputfile}."
|
|
return 0
|
|
}
|
|
|
|
# Compile subdirectories $2..$n of the patched kernel tree linux-$1.
|
|
function compile_kernel {
|
|
local kver plevel
|
|
local k=$1
|
|
kver="$(kernel_version "$1")"
|
|
plevel="$(patchlevel "$1")"
|
|
local outputfile="${outputdir}/compilation-$1-output.txt"
|
|
shift
|
|
|
|
echo "Compiling the patched kernel ..."
|
|
if (cd "${outputdir}/linux-$k" \
|
|
&& make -s prepare \
|
|
&& make -s scripts \
|
|
&& for subdir; do LC_ALL=C make -k M="${subdir}"; done
|
|
) &> "${outputfile}"
|
|
then
|
|
local errors warnings
|
|
errors=$(grep -c ' error:' "${outputfile}")
|
|
warnings=$(grep -c ' warning:' "${outputfile}")
|
|
echo "${errors} errors / ${warnings} warnings."
|
|
else
|
|
echo FAILED
|
|
fi
|
|
grep -E 'warning:|error:' < "${outputfile}" | sort | uniq -c
|
|
return 0
|
|
}
|
|
|
|
# Run the source code verification tool 'sparse' on the SCST code. Assumes that
|
|
# there is a patched kernel tree present in directory "${outputdir}/linux-$1".
|
|
# For more information about endianness annotations, see also
|
|
# http://lwn.net/Articles/205624/.
|
|
function run_sparse {
|
|
local k="$1"
|
|
local kver plevel
|
|
kver="$(kernel_version "$1")"
|
|
plevel="$(patchlevel "$1")"
|
|
local outputfile="${outputdir}/sparse-$1-output.txt"
|
|
shift
|
|
|
|
echo "Running sparse on the patched kernel in $* ..."
|
|
if (cd "${outputdir}/linux-$k" \
|
|
&& make -s prepare \
|
|
&& make -s scripts \
|
|
&& if grep -q '^CONFIG_PPC=y$' .config; then LC_ALL=C make -k M=arch/powerpc/lib; fi \
|
|
&& for subdir; do
|
|
LC_ALL=C make -k C=2 CF="-D__CHECK_ENDIAN__ -DCONFIG_SPARSE_RCU_POINTER" M="${subdir}"
|
|
done
|
|
) &> "${outputfile}"
|
|
then
|
|
local errors warnings
|
|
errors=$(grep -c ' error:' "${outputfile}")
|
|
warnings=$(grep -c ' warning:' "${outputfile}")
|
|
echo "${errors} errors / ${warnings} warnings."
|
|
grep -E ' warning:| error:' < "${outputfile}" \
|
|
| sed -e 's/^[^:]*:[0-9:]* //' \
|
|
-e "s/context imbalance in '[^']*':/context imbalance in <function>:/g" \
|
|
-e "s/context problem in '[^']*': '[^']*'/context problem in <function>: <function>/g" \
|
|
-e "s/function '[^']*'/function/g" \
|
|
-e "s/symbol '[^']*'/symbol/g" \
|
|
| sort \
|
|
| uniq -c
|
|
else
|
|
echo FAILED
|
|
fi
|
|
|
|
return 0
|
|
}
|
|
|
|
# Run smatch for kernel version $1 on directories $2..$n
|
|
function run_smatch {
|
|
local k="$1"
|
|
local kver plevel
|
|
kver="$(kernel_version "$1")"
|
|
plevel="$(patchlevel "$1")"
|
|
local outputfile="${outputdir}/smatch-$1-output.txt"
|
|
local disable="" # "CONFIG_DYNAMIC_DEBUG"
|
|
shift
|
|
|
|
echo "Running smatch on the patched kernel in $* ..."
|
|
if (cd "${outputdir}/linux-$k" &&
|
|
for c in $disable; do sed -i.tmp "s/^$c=y\$/$c=n/" .config; done &&
|
|
make -s oldconfig </dev/null &&
|
|
make -s prepare &&
|
|
make -s scripts &&
|
|
if grep -q '^CONFIG_PPC=y$' .config; then LC_ALL=C make -k M=arch/powerpc/lib; fi &&
|
|
for subdir; do
|
|
LC_ALL=C make -k CHECK="smatch -p=kernel" C=2 CF=-D__CHECK_ENDIAN__ M="${subdir}"
|
|
done
|
|
) &> "${outputfile}"
|
|
then
|
|
local errors warnings
|
|
errors=$(grep -c ' error:' "${outputfile}")
|
|
warnings=$(grep -c ' warning:' "${outputfile}")
|
|
echo "${errors} errors / ${warnings} warnings."
|
|
grep -E ' info:| warning:| error:' < "${outputfile}" |
|
|
sed 's/^\([^:]*\):[0-9:]* /\1: /;s/\((see line \)[0-9]*\()\)/\1...\2/' |
|
|
sort |
|
|
uniq -c
|
|
else
|
|
echo FAILED
|
|
fi
|
|
|
|
return 0
|
|
}
|
|
|
|
function run_checkstack {
|
|
local kver plevel
|
|
kver="$(kernel_version "$1")"
|
|
plevel="$(patchlevel "$1")"
|
|
local outputfile="${outputdir}/checkstack-$1-output.txt"
|
|
|
|
echo "Running checkstack on the patched $1 kernel ..."
|
|
(
|
|
cd "${outputdir}/linux-$1" \
|
|
&& make -s prepare \
|
|
&& make -s scripts \
|
|
&& LC_ALL=C make -k checkstack
|
|
) &> "${outputfile}"
|
|
echo "See also ${outputfile}."
|
|
return 0
|
|
}
|
|
|
|
function run_namespacecheck {
|
|
local kver plevel
|
|
kver="$(kernel_version "$1")"
|
|
plevel="$(patchlevel "$1")"
|
|
local outputfile="${outputdir}/namespacecheck-$1-output.txt"
|
|
|
|
echo "Running namespacecheck on the patched $1 kernel ..."
|
|
(
|
|
cd "${outputdir}/linux-$1" \
|
|
&& make -s prepare \
|
|
&& make -s scripts \
|
|
&& LC_ALL=C make -k namespacecheck
|
|
) &> "${outputfile}"
|
|
echo "See also ${outputfile}."
|
|
return 0
|
|
}
|
|
|
|
function run_headers_check {
|
|
local kver plevel
|
|
kver="$(kernel_version "$1")"
|
|
plevel="$(patchlevel "$1")"
|
|
local outputfile="${outputdir}/headers_check-$1-output.txt"
|
|
|
|
echo "Running headers check on the patched $1 kernel ..."
|
|
(
|
|
cd "${outputdir}/linux-$1" \
|
|
&& make -s prepare \
|
|
&& make -s scripts \
|
|
&& LC_ALL=C make -k headers_check
|
|
) &> "${outputfile}"
|
|
local errors
|
|
errors=$(grep -c '^[^ ]' "${outputfile}")
|
|
echo "${errors} errors."
|
|
grep '^[^ ]' "${outputfile}" | sed 's/.*: //' | sort | uniq -c
|
|
return 0
|
|
}
|
|
|
|
function run_make_htmldocs {
|
|
local kver plevel
|
|
kver="$(kernel_version "$1")"
|
|
plevel="$(patchlevel "$1")"
|
|
local outputfile="${outputdir}/htmldocs-$1-output.txt"
|
|
|
|
echo "Generating HTML documentation for the patched $1 kernel ..."
|
|
(
|
|
cd "${outputdir}/linux-$1" \
|
|
&& make -s prepare \
|
|
&& make -s scripts \
|
|
&& LC_ALL=C make -k htmldocs
|
|
) &> "${outputfile}"
|
|
echo "See also ${outputfile}."
|
|
return 0
|
|
}
|
|
|
|
|
|
#########################
|
|
# Argument verification #
|
|
#########################
|
|
|
|
export LC_ALL=C
|
|
|
|
if [ ! -e scst ] || [ ! -e iscsi-scst ] || [ ! -e srpt ]; then
|
|
echo "Please run this script from inside the SCST subversion source tree."
|
|
exit 1
|
|
fi
|
|
|
|
scriptsdir="$(dirname "$0")"
|
|
if [ "${scriptsdir:0:1}" != "/" ]; then
|
|
scriptsdir="$PWD/${scriptsdir}"
|
|
fi
|
|
# Where to store persistenly downloaded kernel tarballs and kernel patches.
|
|
kernel_sources="$HOME/software/downloads"
|
|
kernel_versions=""
|
|
# Directory in which the regression test output files will be stored. Must be
|
|
# an absolute path.
|
|
outputdir="${PWD}/regression-test-output-$(date +%Y-%m-%d_%Hh%Mm%Ss)"
|
|
# Driver configuration.
|
|
mpt_scst="false"
|
|
multiple_patches="false"
|
|
qla2x00t="true"
|
|
remove_temporary_files_at_end="false"
|
|
run_local_compilation="true"
|
|
quiet_download="false"
|
|
|
|
{
|
|
# shellcheck disable=SC2046
|
|
set -- $(/usr/bin/getopt "c:d:j:hklpq" "$@")
|
|
}
|
|
while [ "$1" != "${1#-}" ]
|
|
do
|
|
case "$1" in
|
|
'-c') kernel_sources="$2"; shift; shift;;
|
|
'-d') outputdir="$2"; shift; shift;;
|
|
'-h') usage; exit 1;;
|
|
'-j') export MAKEFLAGS="-j$2"; shift; shift;;
|
|
'-k') remove_temporary_files_at_end="true"; shift;;
|
|
'-l') run_local_compilation="false"; shift;;
|
|
'-p') multiple_patches="true"; shift;;
|
|
'-q') quiet_download="true"; shift;;
|
|
'--') shift;;
|
|
*) usage; exit 1;;
|
|
esac
|
|
done
|
|
|
|
kernel_versions="$*"
|
|
|
|
if [ "${kernel_versions}" = "" ]; then
|
|
usage
|
|
exit 1
|
|
fi
|
|
|
|
|
|
####################
|
|
# Regression tests #
|
|
####################
|
|
|
|
if [ "$(type -p sparse)" = "" ]; then
|
|
echo "Error: sparse has not yet been installed."
|
|
echo "See also http://www.kernel.org/pub/software/devel/sparse/."
|
|
fi
|
|
|
|
if [ "$(type -p smatch)" = "" ]; then
|
|
echo "Error: smatch has not yet been installed."
|
|
echo "See also http://smatch.sourceforge.net/."
|
|
fi
|
|
|
|
if ! mkdir -p "${outputdir}"; then
|
|
if [ -e "${outputdir}" ]; then
|
|
echo "Error: directory ${outputdir} already exists."
|
|
else
|
|
echo "Error: could not create directory ${outputdir}."
|
|
fi
|
|
fi
|
|
|
|
test_scst_tree_patches || exit $?
|
|
if [ "${run_local_compilation}" = "true" ]; then
|
|
compile_scst_unpatched || exit $?
|
|
compile_scst_no_dlm || exit $?
|
|
compile_scst_patched 2release || exit $?
|
|
compile_scst_patched 2perf || exit $?
|
|
if type rpmbuild >/dev/null 2>&1; then
|
|
make_rpm || exit $?
|
|
fi
|
|
if type debuild >/dev/null 2>&1; then
|
|
make_dpkg || exit $?
|
|
fi
|
|
fi
|
|
|
|
for kv in ${kernel_versions}
|
|
do
|
|
echo "=========================="
|
|
printf "= kernel %-15s =\n" "${kv}"
|
|
echo "=========================="
|
|
|
|
full_check="false"
|
|
generate_kernel_patch_options=""
|
|
ibmvio="false"
|
|
run_checkpatch="true"
|
|
run_sparse="true"
|
|
run_smatch="true"
|
|
ipv6="true"
|
|
global_multiple_patches="${multiple_patches}"
|
|
while true; do
|
|
kv_without_opt="${kv%-?}"
|
|
if [ "${kv_without_opt}" = "${kv}" ]; then
|
|
kv_without_opt="${kv%-??}"
|
|
fi
|
|
kopt="${kv#${kv_without_opt}}"
|
|
case "${kopt}" in
|
|
'-4') ipv6="false";;
|
|
'-f') full_check="true";;
|
|
'-i') ibmvio="true";;
|
|
'-nc') run_checkpatch="false";;
|
|
'-ns') run_sparse="false";;
|
|
'-nm') run_smatch="false";;
|
|
'-u') generate_kernel_patch_options="-u";;
|
|
'-p') multiple_patches="true";;
|
|
*) break;;
|
|
esac
|
|
kv="${kv_without_opt}"
|
|
done
|
|
patchdir="patchdir-${kv}"
|
|
k="${kv}"
|
|
|
|
generate_kernel_patch "$k" "${generate_kernel_patch_options}" || continue
|
|
(
|
|
cd "${outputdir}" &&
|
|
download_and_extract_kernel_tree "$k" &&
|
|
k="${k/^*}" &&
|
|
cd "linux-$k/include/linux" &&
|
|
if [ ! -e compiler-gcc6.h ]; then
|
|
for f in compiler-gcc5.h compiler-gcc4.h; do
|
|
if [ -e "$f" ]; then
|
|
cp "$f" compiler-gcc6.h
|
|
break
|
|
fi
|
|
done
|
|
fi
|
|
) ||
|
|
continue
|
|
k="${k/^*}"
|
|
if [ "${run_checkpatch}" = "true" ]; then
|
|
run_checkpatch "$k"
|
|
fi
|
|
patch_and_configure_kernel "$k" || continue
|
|
case "$k" in
|
|
*^*)
|
|
# CentOS.
|
|
;;
|
|
2.*|3.*)
|
|
# Tell the kernel that we are using gcc 4.6 since older kernel
|
|
# versions do not suppor recent gcc versions.
|
|
KCFLAGS="-U__GNUC__ -U__GNUC_MINOR__ -D__GNUC__=4 -D__GNUC_MINOR__=6"
|
|
esac
|
|
case "$k" in
|
|
3.10.0-*)
|
|
# Make the CentOS 7.x build less noisy.
|
|
KCFLAGS+=" -Wno-deprecated-declarations";
|
|
esac
|
|
# See also commit bd664f6b3e37 ("disable new gcc-7.1.1 warnings for now";
|
|
# v4.13) and commit 6f303d60534c ("gcc-9: silence 'address-of-packed-member'
|
|
# warning"; v5.1).
|
|
for w in -Wno-format-truncation -Wno-format-overflow -Wno-int-in-bool-context -Wno-address-of-packed-member; do
|
|
if gcc -c -xc -E - "$w" </dev/null >&/dev/null; then
|
|
KCFLAGS+=" $w"
|
|
fi
|
|
done
|
|
export KCFLAGS
|
|
subdirs=(drivers/scst)
|
|
if [ "${run_sparse}" = "true" ]; then
|
|
run_sparse "$k" "${subdirs[@]}"
|
|
mv "${outputdir}/sparse-$k-output.txt" \
|
|
"${outputdir}/sparse-$k-scst-output.txt"
|
|
if [ "${ibmvio}" = "true" ]; then
|
|
run_sparse "$k" drivers/scsi libsrp.ko scsi_sysfs.ko \
|
|
scsi_transport_fc.ko scsi_transport_srp.ko
|
|
mv "${outputdir}/sparse-$k-output.txt" \
|
|
"${outputdir}/sparse-$k-scsi-output.txt"
|
|
fi
|
|
fi
|
|
if [ "${run_smatch}" = "true" ]; then
|
|
run_smatch "$k" "${subdirs[@]}"
|
|
fi
|
|
if [ "${qla2x00t}" = "true" ] && kernel_version_le 2.6.37 "$k"; then
|
|
subdirs+=(drivers/scsi/qla2xxx)
|
|
fi
|
|
compile_kernel "$k" "${subdirs[@]}"
|
|
if [ "${full_check}" = "true" ]; then
|
|
run_headers_check "$k"
|
|
compile_patched_kernel "$k"
|
|
run_checkstack "$k"
|
|
run_namespacecheck "$k"
|
|
run_make_htmldocs "$k"
|
|
fi
|
|
if [ "${remove_temporary_files_at_end}" = "true" ]; then
|
|
rm -rf "${outputdir}"
|
|
mkdir -p "${outputdir}"
|
|
fi
|
|
|
|
multiple_patches="${global_multiple_patches}"
|
|
done
|