xref: /OK3568_Linux_fs/yocto/poky/scripts/test-reexec (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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