#!/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