326 lines
13 KiB
Bash
Executable File
326 lines
13 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
# Copyright (c) 2015 Wind River Systems, Inc.
|
|
#
|
|
# Redistribution and use in source and binary forms, with or without
|
|
# modification, are permitted provided that the following conditions are met:
|
|
#
|
|
# 1) Redistributions of source code must retain the above copyright notice,
|
|
# this list of conditions and the following disclaimer.
|
|
#
|
|
# 2) Redistributions in binary form must reproduce the above copyright notice,
|
|
# this list of conditions and the following disclaimer in the documentation
|
|
# and/or other materials provided with the distribution.
|
|
#
|
|
# 3) Neither the name of Wind River Systems nor the names of its contributors
|
|
# may be used to endorse or promote products derived from this software without
|
|
# specific prior written permission.
|
|
#
|
|
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
|
|
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
# POSSIBILITY OF SUCH DAMAGE.
|
|
#
|
|
|
|
# Script to regression test kernel operation
|
|
|
|
# Import common sanity check definitions
|
|
#
|
|
if [ -z ${TIMO_BASE} ]; then
|
|
echo "shell variables required to build Zephyr OS are not set"
|
|
exit 1
|
|
fi
|
|
if [ ! -d ${TIMO_BASE} ] ; then
|
|
echo "directory ${TIMO_BASE} not found"
|
|
exit 1
|
|
fi
|
|
source ${TIMO_BASE}/scripts/sanity_chk/common.defs
|
|
|
|
# Location of master project directory
|
|
#
|
|
PRJ_PATH=${TIMO_BASE}/samples
|
|
|
|
# Pseudo-file describing sample projects to be sanitized
|
|
#
|
|
# Project info must be specified on a single line
|
|
# (which must terminate with a '\n' character, EXCEPT for the final entry).
|
|
#
|
|
# Project info consists of:
|
|
# - project directory (relative to PRJ_PATH)
|
|
# - build arguments (optional)
|
|
# - project flags, enclosed in angle brackets "<>"
|
|
# - 'u' => microkernel; 'n' => nanokernel (required; must be first flag)
|
|
# - 'q' => run as part of quick sanity check (optional)
|
|
# - list of BSP names that can be used with the project
|
|
#
|
|
# A BSP name followed by "!" indicates the project can executed using QEMU.
|
|
#
|
|
# Sanity check will select first BSP name listed if the user does not specify
|
|
# a BSP name when running sanity check (i.e. is the "default" BSP).
|
|
#
|
|
# A given project can appear more than once, allowing the project to be
|
|
# sanitized multiple times. This can be useful if the project has multiple
|
|
# configurations, or if the project should be run on more than one BSP
|
|
# during a default BSP sanity check.
|
|
#
|
|
# List of sample projects can contain comment lines (denoted by '#'),
|
|
# but be sure to terminate line with a '\n' character!
|
|
#
|
|
PRJ_LIST="\
|
|
# projects that don't indicate completion \n\
|
|
nanokernel/apps/bluetooth/init <n> pentium4 minuteia atom \n\
|
|
nanokernel/apps/bluetooth/init <n> fsl_frdm_k64f ti_lm3s6965 \n\
|
|
nanokernel/apps/bluetooth/shell <n> pentium4 minuteia atom \n\
|
|
nanokernel/apps/bluetooth/shell <n> fsl_frdm_k64f ti_lm3s6965 \n\
|
|
nanokernel/apps/hello_world <n> quark pentium4 minuteia atom \n\
|
|
nanokernel/apps/philosophers <n> pentium4 minuteia atom quark \n\
|
|
nanokernel/apps/hello_world <n> fsl_frdm_k64f ti_lm3s6965 \n\
|
|
nanokernel/apps/philosophers <n> fsl_frdm_k64f ti_lm3s6965 \n\
|
|
microkernel/apps/hello_world <u> atom pentium4 minuteia quark \n\
|
|
microkernel/apps/philosophers <u> pentium4 minuteia atom quark \n\
|
|
microkernel/apps/hello_world <u> fsl_frdm_k64f ti_lm3s6965 \n\
|
|
microkernel/apps/philosophers <u> fsl_frdm_k64f ti_lm3s6965 \n\
|
|
# projects that have been temporarily disabled \n\
|
|
# projects that don't require any special capabilities \n\
|
|
nanokernel/test/test_bluetooth <nq> pentium4! minuteia! atom \n\
|
|
nanokernel/test/test_context <nq> pentium4! minuteia! atom quark \n\
|
|
nanokernel/test/test_fifo <nq> pentium4! minuteia! atom quark \n\
|
|
nanokernel/test/test_lifo <nq> pentium4! minuteia! atom quark \n\
|
|
nanokernel/test/test_sema <nq> pentium4! minuteia! atom quark \n\
|
|
nanokernel/test/test_stack <nq> pentium4! minuteia! atom quark \n\
|
|
nanokernel/test/test_stackprot <n> pentium4! minuteia! atom quark \n\
|
|
nanokernel/test/test_static_idt <nq> pentium4! minuteia! atom quark \n\
|
|
nanokernel/test/test_xip <nq> pentium4! minuteia! atom quark \n\
|
|
nanokernel/test/test_timer <nq> pentium4! minuteia! atom quark \n\
|
|
nanokernel/test/test_fp_sharing <n> pentium4! atom \n\
|
|
nanokernel/test/test_arm_m3_irq_vector_table <nq> ti_lm3s6965! fsl_frdm_k64f \n\
|
|
nanokernel/test/test_bluetooth <nq> ti_lm3s6965! fsl_frdm_k64f \n\
|
|
nanokernel/test/test_context <nq> ti_lm3s6965! fsl_frdm_k64f \n\
|
|
nanokernel/test/test_fifo <nq> ti_lm3s6965! fsl_frdm_k64f \n\
|
|
nanokernel/test/test_lifo <nq> ti_lm3s6965! fsl_frdm_k64f \n\
|
|
microkernel/test/test_pipe <uq> ti_lm3s6965! fsl_frdm_k64f \n\
|
|
nanokernel/test/test_sema <nq> ti_lm3s6965! fsl_frdm_k64f \n\
|
|
nanokernel/test/test_stack <nq> ti_lm3s6965! fsl_frdm_k64f \n\
|
|
nanokernel/test/test_stackprot <n> ti_lm3s6965! fsl_frdm_k64f \n\
|
|
nanokernel/test/test_timer <nq> ti_lm3s6965! fsl_frdm_k64f \n\
|
|
nanokernel/test/test_xip <nq> ti_lm3s6965! fsl_frdm_k64f \n\
|
|
microkernel/test/test_bluetooth <uq> ti_lm3s6965! fsl_frdm_k64f \n\
|
|
microkernel/test/test_critical <u> ti_lm3s6965! fsl_frdm_k64f \n\
|
|
microkernel/test/test_events <uq> ti_lm3s6965! fsl_frdm_k64f \n\
|
|
microkernel/test/test_fifo <uq> ti_lm3s6965! fsl_frdm_k64f \n\
|
|
microkernel/test/test_mail <uq> ti_lm3s6965! fsl_frdm_k64f \n\
|
|
microkernel/test/test_map <uq> ti_lm3s6965! fsl_frdm_k64f \n\
|
|
microkernel/test/test_pool <uq> ti_lm3s6965! fsl_frdm_k64f \n\
|
|
microkernel/test/test_mutex <uq> ti_lm3s6965! fsl_frdm_k64f \n\
|
|
microkernel/test/test_rand32 <uq> ti_lm3s6965! fsl_frdm_k64f \n\
|
|
microkernel/test/test_sema <uq> ti_lm3s6965! fsl_frdm_k64f \n\
|
|
microkernel/test/test_sprintf <u> ti_lm3s6965! fsl_frdm_k64f \n\
|
|
microkernel/test/test_stackprot <u> ti_lm3s6965! fsl_frdm_k64f \n\
|
|
microkernel/test/test_task <uq> ti_lm3s6965! fsl_frdm_k64f \n\
|
|
microkernel/test/test_task_irq <u> ti_lm3s6965! fsl_frdm_k64f \n\
|
|
microkernel/test/test_timer <uq> ti_lm3s6965! fsl_frdm_k64f \n\
|
|
microkernel/test/test_xip <uq> ti_lm3s6965! fsl_frdm_k64f \n\
|
|
microkernel/test/test_bluetooth <uq> minuteia! pentium4! atom \n\
|
|
microkernel/test/test_critical <u> minuteia! pentium4! atom quark \n\
|
|
microkernel/test/test_events <uq> minuteia! pentium4! atom quark \n\
|
|
microkernel/test/test_fifo <uq> minuteia! pentium4! atom quark \n\
|
|
microkernel/test/test_libs <uq> minuteia! pentium4! atom quark \n\
|
|
microkernel/test/test_mail <uq> minuteia! pentium4! atom quark \n\
|
|
microkernel/test/test_map <uq> minuteia! pentium4! atom quark \n\
|
|
microkernel/test/test_pipe <uq> minuteia! pentium4! atom quark \n\
|
|
microkernel/test/test_pool <uq> minuteia! pentium4! atom quark \n\
|
|
microkernel/test/test_mutex <uq> minuteia! pentium4! atom quark \n\
|
|
microkernel/test/test_rand32 <uq> minuteia! pentium4! atom quark \n\
|
|
microkernel/test/test_sema <uq> pentium4! minuteia! atom quark \n\
|
|
microkernel/test/test_sprintf <u> pentium4! minuteia! atom quark \n\
|
|
microkernel/test/test_static_idt <uq> pentium4! minuteia! atom quark \n\
|
|
microkernel/test/test_stackprot <u> pentium4! minuteia! atom quark \n\
|
|
microkernel/test/test_task <uq> pentium4! minuteia! atom quark \n\
|
|
microkernel/test/test_task_irq <u> pentium4! minuteia! atom quark \n\
|
|
microkernel/test/test_tickless <uq> pentium4! minuteia! atom quark \n\
|
|
microkernel/test/test_xip <uq> pentium4! minuteia! atom quark \n\
|
|
microkernel/test/test_timer <uq> pentium4! minuteia! atom quark \n\
|
|
microkernel/test/test_fp_sharing <u> pentium4! atom "
|
|
|
|
# print script usage
|
|
#
|
|
help() {
|
|
cat << EOF
|
|
|
|
Usage : ${SCRIPT_NAME} [-hHcqbl] [-A <arch>] [-B <board>]
|
|
-h display this help message
|
|
-H display more detailed documentation
|
|
-c just clean projects and delete execution logs
|
|
-q just do quick sanity check
|
|
-b just build projects
|
|
-l keep successful project execution logs
|
|
-A build projects for the specified architecture
|
|
-B build projects for the specified BSP or BSP variant
|
|
|
|
EOF
|
|
}
|
|
|
|
# print long help
|
|
#
|
|
long_help() {
|
|
cat << EOF
|
|
|
|
Script to regression test kernel operation.
|
|
|
|
The sanity check builds all sample projects supported by the specified BSP
|
|
variant; if no BSP has been specified, a default BSP for each project is used.
|
|
The script also runs each sample project using QEMU, where possible; if desired
|
|
the script can be instructed to skip the QEMU execution step.
|
|
|
|
The script returns 0 on success. If an error is encountered at any point
|
|
the script returns the exit value of the command that failed, the function
|
|
and line of the script where the error was detected, as well as the full path
|
|
of the script (to help debug path issues).
|
|
|
|
*-=*-=*-=*-=*-=*-=*-=*-=*-=*-=*-=*-=*-=*-=
|
|
|
|
QEMU output from a project is sent to a log file identified by the script;
|
|
it is typically located in the associated sample project directory.
|
|
You can monitor execution by doing 'tail -f <log filename>' in another shell.
|
|
|
|
A project's log file is normally retained only if execution fails; however,
|
|
invoking the script with the '-l' option keeps the log file in all cases.
|
|
|
|
*-=*-=*-=*-=*-=*-=*-=*-=*-=*-=*-=*-=*-=*-=
|
|
|
|
All object code and executable files persist after completion. Re-run the script
|
|
with the '-c' option to delete the sample project object code and log files.
|
|
|
|
EOF
|
|
}
|
|
|
|
# main routine building and running nanokernel sample projects
|
|
#
|
|
main() {
|
|
# set up default behaviors
|
|
clean_only=0
|
|
quick_sanity=0
|
|
build_only=0
|
|
BSP_NAME=""
|
|
ARCH_NAME=""
|
|
KEEP_LOGS=0
|
|
|
|
# process command options
|
|
while getopts ":hHcqbklA:B:" arg $*
|
|
do
|
|
case $arg in
|
|
h)
|
|
help
|
|
exit 0
|
|
;;
|
|
H)
|
|
long_help
|
|
exit 0
|
|
;;
|
|
c)
|
|
clean_only=1
|
|
;;
|
|
q)
|
|
quick_sanity=1
|
|
;;
|
|
b)
|
|
build_only=1
|
|
;;
|
|
l)
|
|
KEEP_LOGS=1
|
|
;;
|
|
A)
|
|
ARCH_NAME=$OPTARG
|
|
;;
|
|
B)
|
|
BSP_NAME=$OPTARG
|
|
;;
|
|
\?)
|
|
${ECHO} "invalid option -$OPTARG"
|
|
help
|
|
exit 1
|
|
;;
|
|
:)
|
|
${ECHO} "missing argument for option -$OPTARG"
|
|
help
|
|
exit 1
|
|
;;
|
|
esac
|
|
done
|
|
|
|
# ensure no unexpected arguments have been provided
|
|
shift $((OPTIND-1))
|
|
if [ x$1 != x ] ; then
|
|
${ECHO} "unexpected argument $1"
|
|
exit 1
|
|
fi
|
|
|
|
# handle case where we're just cleaning up
|
|
if [ ${clean_only} = 1 ] ; then
|
|
print_header
|
|
${ECHO} "Cleaning all regression test sample projects"
|
|
${ECHO}
|
|
|
|
clean_all_projects
|
|
|
|
${ECHO}
|
|
print_header
|
|
${ECHO} "${SCRIPT_NAME} cleanup completed successfully"
|
|
exit 0
|
|
fi
|
|
|
|
# set up environment info used to build projects
|
|
build_info_set
|
|
|
|
# set up project info used to build projects
|
|
proj_info_set
|
|
|
|
# build (and optionally execute) projects
|
|
PRJ_CLASS="regression"
|
|
let cur_proj=0
|
|
let build_proj=0
|
|
let run_proj=0
|
|
while [ ${cur_proj} -lt ${NUM_PROJ} ] ; do
|
|
let cur_proj++
|
|
print_header
|
|
|
|
# skip non-essential projects when doing quick sanity check
|
|
if [ ${quick_sanity} = 1 -a x${PRJ_FLAG[${cur_proj}]:1:1} != xq ] ; then
|
|
skip_project ${cur_proj}
|
|
continue
|
|
fi
|
|
|
|
# build project
|
|
build_project ${cur_proj}
|
|
let build_proj++
|
|
|
|
# skip non-executable projects (or when doing "build only")
|
|
if [ ${build_only} = 1 -o x${BSP_FLAG[${cur_proj}]} = x ] ; then
|
|
continue
|
|
fi
|
|
|
|
# execute project
|
|
qemu_project ${cur_proj}
|
|
let run_proj++
|
|
done
|
|
|
|
${ECHO}
|
|
print_header
|
|
${ECHO} "${SCRIPT_NAME} completed successfully "\
|
|
"(built ${build_proj} projects and ran ${run_proj} of them)"
|
|
}
|
|
|
|
# invoke main routine passing all parameters passed to the script
|
|
#
|
|
main $*
|
|
|
|
# exit with success
|
|
exit 0
|