303 lines
9.2 KiB
Bash
Executable File
303 lines
9.2 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 verify if projects and BSPs can reside out of tree
|
|
|
|
# Test is disabled until building out-of-the-tree is supported
|
|
exit 0
|
|
|
|
# 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
|
|
|
|
# Out of tree location
|
|
OUT_OF_TREE_BASE_REL=${TIMO_BASE}/../$(basename ${TIMO_BASE})-sanity
|
|
OUT_OF_TREE_BASE=$(${ABS_PATH} ${OUT_OF_TREE_BASE_REL})
|
|
|
|
# Location of master project directory
|
|
#
|
|
PRJ_PATH=${OUT_OF_TREE_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="\
|
|
# Nanokernel projects \n\
|
|
nanokernel/test/test_fifo ZEPHYR_BSP_BASE=${OUT_OF_TREE_BASE}/bsp <n> ti_lm3s6965! fsl_frdm_k64f \n\
|
|
nanokernel/test/test_lifo ZEPHYR_BSP_BASE=${OUT_OF_TREE_BASE}/bsp <n> ti_lm3s6965! fsl_frdm_k64f \n\
|
|
nanokernel/test/test_sema ZEPHYR_BSP_BASE=${OUT_OF_TREE_BASE}/bsp <n> ti_lm3s6965! fsl_frdm_k64f \n\
|
|
# Microkernel projects \n\
|
|
microkernel/test/test_fifo ZEPHYR_BSP_BASE=${OUT_OF_TREE_BASE}/bsp <u> ti_lm3s6965! fsl_frdm_k64f \n\
|
|
microkernel/test/test_events ZEPHYR_BSP_BASE=${OUT_OF_TREE_BASE}/bsp <u> ti_lm3s6965! fsl_frdm_k64f \n\
|
|
microkernel/test/test_sema ZEPHYR_BSP_BASE=${OUT_OF_TREE_BASE}/bsp <u> ti_lm3s6965! fsl_frdm_k64f \n\
|
|
# Nanokernel projects \n\
|
|
nanokernel/test/test_fifo ZEPHYR_BSP_BASE=${OUT_OF_TREE_BASE}/bsp <n> pentium4! minuteia! quark \n\
|
|
nanokernel/test/test_lifo ZEPHYR_BSP_BASE=${OUT_OF_TREE_BASE}/bsp <n> pentium4! minuteia! quark \n\
|
|
nanokernel/test/test_sema ZEPHYR_BSP_BASE=${OUT_OF_TREE_BASE}/bsp <n> pentium4! minuteia! quark \n\
|
|
# Microkernel projects \n\
|
|
microkernel/test/test_fifo ZEPHYR_BSP_BASE=${OUT_OF_TREE_BASE}/bsp <u> pentium4! minuteia! quark \n\
|
|
microkernel/test/test_events ZEPHYR_BSP_BASE=${OUT_OF_TREE_BASE}/bsp <u> pentium4! minuteia! quark \n\
|
|
microkernel/test/test_sema ZEPHYR_BSP_BASE=${OUT_OF_TREE_BASE}/bsp <u> pentium4! minuteia! quark "
|
|
|
|
# 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 delete copied samples and BSPs
|
|
-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 verify projects can be built out of tree with a BSP
|
|
residing out of tree.
|
|
|
|
The sanity check builds a selection of sample of 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.
|
|
|
|
BSPs and samples are copied to:
|
|
TIMO_BASE/../sanity/bsp
|
|
TIMO_BASE/../sanity/samples
|
|
|
|
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
|
|
ARCH_NAME=""
|
|
BSP_NAME=""
|
|
KEEP_LOGS=0
|
|
|
|
# process command options
|
|
while getopts ":hHcqblA: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
|
|
|
|
print_header
|
|
${ECHO} "Deleting all **OUT OF TREE** BSPs and sample projects"
|
|
|
|
${RM} -rf ${OUT_OF_TREE_BASE}
|
|
|
|
${ECHO} "${SCRIPT_NAME} cleanup completed successfully"
|
|
|
|
# handle case where we're only cleaning up
|
|
if [ ${clean_only} = 1 ] ; then
|
|
exit 0
|
|
fi
|
|
|
|
# handle case where we're doing a quick sanity check
|
|
if [ ${quick_sanity} = 1 ] ; then
|
|
${ECHO}
|
|
${ECHO} "${SCRIPT_NAME} testing skipped during quick sanity check"
|
|
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
|
|
|
|
${MKDIR} -p ${OUT_OF_TREE_BASE}
|
|
|
|
# copy the BSPs
|
|
${CP} -r ${TIMO_BASE}/target/bsp ${OUT_OF_TREE_BASE}
|
|
[ $? -eq 0 ] || fail_exit $? $FUNCNAME $LINENO
|
|
|
|
# copy the samples/include directory used by certain projects
|
|
${MKDIR} -p ${PRJ_PATH}
|
|
[ $? -eq 0 ] || fail_exit $? $FUNCNAME $LINENO
|
|
${CP} -r ${TIMO_BASE}/samples/include ${PRJ_PATH}
|
|
[ $? -eq 0 ] || fail_exit $? $FUNCNAME $LINENO
|
|
|
|
# build (and optionally execute) projects
|
|
PRJ_CLASS="out of tree"
|
|
let cur_proj=0
|
|
let build_proj=0
|
|
let run_proj=0
|
|
while [ ${cur_proj} -lt ${NUM_PROJ} ] ; do
|
|
let cur_proj++
|
|
print_header
|
|
|
|
# Create a "fresh" copy of the project
|
|
|
|
${RM} -rf ${OUT_OF_TREE_BASE}/samples/${PRJ_NAME[${cur_proj}]}
|
|
|
|
${MKDIR} -p ${PRJ_PATH}/${PRJ_NAME[${cur_proj}]}
|
|
[ $? -eq 0 ] || fail_exit $? $FUNCNAME $LINENO
|
|
|
|
${CP} -r ${TIMO_BASE}/samples/${PRJ_NAME[${cur_proj}]}/* ${PRJ_PATH}/${PRJ_NAME[${cur_proj}]}
|
|
[ $? -eq 0 ] || fail_exit $? $FUNCNAME $LINENO
|
|
|
|
# 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
|
|
|
|
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
|