#!/bin/bash 
 | 
  
 | 
# Test Script for task re-execution 
 | 
#  
 | 
# Copyright 2012 Intel Corporation 
 | 
# 
 | 
# SPDX-License-Identifier: GPL-2.0-or-later 
 | 
# 
 | 
# 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 
 |