1*4882a593Smuzhiyun#!/bin/bash 2*4882a593Smuzhiyun 3*4882a593Smuzhiyun# Test Script for task re-execution 4*4882a593Smuzhiyun# 5*4882a593Smuzhiyun# Copyright 2012 Intel Corporation 6*4882a593Smuzhiyun# 7*4882a593Smuzhiyun# SPDX-License-Identifier: GPL-2.0-or-later 8*4882a593Smuzhiyun# 9*4882a593Smuzhiyun# DESCRIPTION 10*4882a593Smuzhiyun# This script is intended to address issues for re-execution of 11*4882a593Smuzhiyun# tasks. The test results are saved in ./reexeclogs. Force build 12*4882a593Smuzhiyun# logs are saved with prefix "force". Build failure logs are saved with 13*4882a593Smuzhiyun# prefix "failed". Log files with prefix "initial" are used to save 14*4882a593Smuzhiyun# initial build logs for each recipe. Log files with prefix "clean" are 15*4882a593Smuzhiyun# used to save logs of clean task after testing for a recipe is finished. 16*4882a593Smuzhiyun# 17*4882a593Smuzhiyun 18*4882a593Smuzhiyuntargets=`bitbake -s | cut -d " " -f 1` 19*4882a593Smuzhiyun 20*4882a593SmuzhiyunLOGS=./reexeclogs 21*4882a593Smuzhiyun 22*4882a593Smuzhiyunmkdir -p $LOGS 23*4882a593Smuzhiyun 24*4882a593Smuzhiyun# Clear sstate files for specified recipe 25*4882a593Smuzhiyunfunction clearsstate { 26*4882a593Smuzhiyun target=$1 27*4882a593Smuzhiyun 28*4882a593Smuzhiyun sstate_dir=`bitbake $target -e | grep "^SSTATE_DIR=" | cut -d "\"" -f 2` 29*4882a593Smuzhiyun sstate_pkgspec=`bitbake $target -e | grep "^SSTATE_PKGSPEC=" | cut -d "\"" -f 2` 30*4882a593Smuzhiyun sstasks=`bitbake $target -e | grep "^SSTATETASKS=" | cut -d "\"" -f 2` 31*4882a593Smuzhiyun 32*4882a593Smuzhiyun for sstask in $sstasks 33*4882a593Smuzhiyun do 34*4882a593Smuzhiyun sstask=${sstask:3} 35*4882a593Smuzhiyun case $sstask in 36*4882a593Smuzhiyun populate_sysroot) sstask="populate-sysroot" 37*4882a593Smuzhiyun ;; 38*4882a593Smuzhiyun populate_lic) sstask="populate-lic" 39*4882a593Smuzhiyun ;; 40*4882a593Smuzhiyun package_write_ipk) sstask="deploy-ipk" 41*4882a593Smuzhiyun ;; 42*4882a593Smuzhiyun package_write_deb) sstask="deploy-deb" 43*4882a593Smuzhiyun ;; 44*4882a593Smuzhiyun package_write_rpm) sstask="deploy-rpm" 45*4882a593Smuzhiyun ;; 46*4882a593Smuzhiyun package) sstask="package" 47*4882a593Smuzhiyun ;; 48*4882a593Smuzhiyun deploy) sstask="deploy" 49*4882a593Smuzhiyun ;; 50*4882a593Smuzhiyun *) 51*4882a593Smuzhiyun ;; 52*4882a593Smuzhiyun esac 53*4882a593Smuzhiyun 54*4882a593Smuzhiyun echo "Removing ${sstate_dir}/${sstate_pkgspec}*_${sstask}.tgz* for $target" 55*4882a593Smuzhiyun rm -rf ${sstate_dir}/${sstate_pkgspec}*_${sstask}.tgz* 56*4882a593Smuzhiyun done 57*4882a593Smuzhiyun} 58*4882a593Smuzhiyun 59*4882a593Smuzhiyun# Function to re-execute specified task of recipe 60*4882a593Smuzhiyunfunction testit { 61*4882a593Smuzhiyun target=$1 62*4882a593Smuzhiyun task=$2 63*4882a593Smuzhiyun 64*4882a593Smuzhiyun task=`echo $task | sed 's/_setscene//'` 65*4882a593Smuzhiyun 66*4882a593Smuzhiyun if [ -f $LOGS/force.$target.$task ]; then 67*4882a593Smuzhiyun return 68*4882a593Smuzhiyun fi 69*4882a593Smuzhiyun 70*4882a593Smuzhiyun case $task in 71*4882a593Smuzhiyun clean|build|cleansstate|cleanall|package|cleansstate2|package_write|package_write_ipk|package_write_rpm|package_write_deb|fetch|populate_lic) return;; 72*4882a593Smuzhiyun fetchall|devshell|buildall|listtasks|checkuri|checkuriall) return;; 73*4882a593Smuzhiyun esac 74*4882a593Smuzhiyun 75*4882a593Smuzhiyun echo "Attempting target $target, task $task" 76*4882a593Smuzhiyun echo "Initial build" 77*4882a593Smuzhiyun bitbake $target -c cleansstate > $LOGS/initial.$target.$task 78*4882a593Smuzhiyun bitbake $target >> $LOGS/initial.$target.$task 79*4882a593Smuzhiyun clearsstate $target >> $LOGS/initial.$target.$task 80*4882a593Smuzhiyun echo "Re-execution build" 81*4882a593Smuzhiyun bitbake $target -c $task -f > $LOGS/force.$target.$task 82*4882a593Smuzhiyun if [ "$?" != 0 ]; then 83*4882a593Smuzhiyun echo "FAILURE for $target $task" 84*4882a593Smuzhiyun cp $LOGS/force.$target.$task $LOGS/failed.$target.$task 85*4882a593Smuzhiyun bitbake $target -c clean > $LOGS/clean.$target.$task 86*4882a593Smuzhiyun else 87*4882a593Smuzhiyun bitbake $target >> $LOGS/force.$target.$task 88*4882a593Smuzhiyun if [ "$?" != 0 ]; then 89*4882a593Smuzhiyun echo "FAILURE2 for $target $task" 90*4882a593Smuzhiyun cp $LOGS/force.$target.$task $LOGS/failed.$target.$task 91*4882a593Smuzhiyun bitbake $target -c clean > $LOGS/clean.$target.$task 92*4882a593Smuzhiyun fi 93*4882a593Smuzhiyun fi 94*4882a593Smuzhiyun echo "Done" 95*4882a593Smuzhiyun} 96*4882a593Smuzhiyun 97*4882a593Smuzhiyun# Go through the recipe list and these recipes' task list 98*4882a593Smuzhiyun# Then re-execute them 99*4882a593Smuzhiyunfor target in $targets; do 100*4882a593Smuzhiyun # Remove log messages from bitbake output 101*4882a593Smuzhiyun case $target in 102*4882a593Smuzhiyun Summary*|WARNING*|Loading*|Loaded*|Package*|=====*) continue;; 103*4882a593Smuzhiyun esac 104*4882a593Smuzhiyun tasks=`bitbake $target -c listtasks | grep ^do_ | sed s/do_//` 105*4882a593Smuzhiyun for task in $tasks; do 106*4882a593Smuzhiyun testit $target $task 107*4882a593Smuzhiyun done 108*4882a593Smuzhiyundone 109*4882a593Smuzhiyun 110*4882a593Smuzhiyun 111