| #!/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 qla2x00t-32gbit; 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) |
| |
| "${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_CTF \ |
| CONFIG_DEBUG_SECTION_MISMATCH \ |
| CONFIG_DEBUG_STRICT_USER_COPY_CHECKS \ |
| CONFIG_DTRACE \ |
| CONFIG_DT_CORE \ |
| 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_KALLMODSYMS \ |
| CONFIG_KCOV \ |
| 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_TARGET_CORE \ |
| CONFIG_TRACEPOINTS \ |
| CONFIG_TRACER_MAX_TRACE \ |
| CONFIG_TRACE_BRANCH_PROFILING \ |
| 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 modules_prepare \ |
| && make -s scripts \ |
| && for subdir; do LC_ALL=C make -j$(nproc) -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 modules_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 modules_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 modules_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 modules_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 modules_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 modules_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. |
| 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 |
| if ! ( |
| cd "${outputdir}" && |
| download_and_extract_kernel_tree "$k" |
| ); then |
| echo "Error: download_and_extract_kernel_tree $k failed" |
| continue |
| fi |
| k="${k/^*}" |
| if [ "${run_checkpatch}" = "true" ]; then |
| run_checkpatch "$k" |
| fi |
| patch_and_configure_kernel "$k" || continue |
| 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 |