test-reexec: Add script to address issues when task re-execution

The script is used to address build issues when tasks of different
recipes are re-executed. The script goes through all available recipes
and their tasks. The test results are saved in ./reexeclogs. Force build
logs are saved with prefix "force". Build failure logs are saved with
prefix "failed".

[YOCTO #2123]

(From OE-Core rev: 6258a11f22103d68d02e329c2e7fb198202cc6ef)

Signed-off-by: Jiajun Xu <jiajun.xu@intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
Jiajun Xu 2012-05-18 17:18:14 +03:00 committed by Richard Purdie
parent f3c07ace4b
commit 3e57b1d749
1 changed files with 123 additions and 0 deletions

123
scripts/test-reexec Executable file
View File

@ -0,0 +1,123 @@
#!/bin/bash
# Test Script for task re-execution
#
# Copyright 2012 Intel Corporation
# All rights reserved.
#
# 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; either version 2 of the License, or
# (at your option) any later version.
#
# 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.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
# DESCRIPTION
# This script is intended to address issues for re-execution of
# tasks. The test results are saved in ./reexeclogs. Force build
# logs are saved with prefix "force". Build failure logs are saved with
# prefix "failed". Log files with prefix "initial" are used to save
# initial build logs for each recipe. Log files with prefix "clean" are
# used to save logs of clean task after testing for a recipe is finished.
#
targets=`bitbake -s | cut -d " " -f 1`
LOGS=./reexeclogs
mkdir -p $LOGS
# Clear sstate files for specified recipe
function clearsstate {
target=$1
sstate_dir=`bitbake $target -e | grep "^SSTATE_DIR" | cut -d "\"" -f 2`
sstate_pkgspec=`bitbake $target -e | grep "^SSTATE_PKGSPEC" | cut -d "\"" -f 2`
sstasks=`bitbake $target -e | grep "^SSTATETASKS" | cut -d "\"" -f 2`
for sstask in $sstasks
do
sstask=${sstask:3}
case $sstask in
populate_sysroot) sstask="populate-sysroot"
;;
populate_lic) sstask="populate-lic"
;;
package_write_ipk) sstask="deploy-ipk"
;;
package_write_deb) sstask="deploy-deb"
;;
package_write_rpm) sstask="deploy-rpm"
;;
package) sstask="package"
;;
deploy) sstask="deploy"
;;
*)
;;
esac
echo "Removing ${sstate_dir}/${sstate_pkgspec}*_${sstask}.tgz* for $target"
rm -rf ${sstate_dir}/${sstate_pkgspec}*_${sstask}.tgz*
done
}
# Function to re-execute specified task of recipe
function testit {
target=$1
task=$2
task=`echo $task | sed 's/_setscene//'`
if [ -f $LOGS/force.$target.$task ]; then
return
fi
case $task in
clean|build|cleansstate|cleanall|package|cleansstate2|package_write|package_write_ipk|package_write_rpm|package_write_deb|fetch|populate_lic) return;;
fetchall|devshell|buildall|listtasks|checkuri|checkuriall) return;;
esac
echo "Attempting target $target, task $task"
echo "Initial build"
bitbake $target -c cleansstate > $LOGS/initial.$target.$task
bitbake $target >> $LOGS/initial.$target.$task
clearsstate $target >> $LOGS/initial.$target.$task
echo "Re-execution build"
bitbake $target -c $task -f > $LOGS/force.$target.$task
if [ "$?" != 0 ]; then
echo "FAILURE for $target $task"
cp $LOGS/force.$target.$task $LOGS/failed.$target.$task
bitbake $target -c clean > $LOGS/clean.$target.$task
else
bitbake $target >> $LOGS/force.$target.$task
if [ "$?" != 0 ]; then
echo "FAILURE2 for $target $task"
cp $LOGS/force.$target.$task $LOGS/failed.$target.$task
bitbake $target -c clean > $LOGS/clean.$target.$task
fi
fi
echo "Done"
}
# Go through the recipe list and these recipes' task list
# Then re-execute them
for target in $targets; do
# Remove log messages from bitbake output
case $target in
Summary*|WARNING*|Loading*|Loaded*|Package*|=====*) continue;;
esac
tasks=`bitbake $target -c listtasks | grep ^do_ | sed s/do_//`
for task in $tasks; do
testit $target $task
done
done