xref: /openbmc/openbmc/poky/scripts/buildall-qemu (revision 82c905dc)
1*82c905dcSAndrew Geissler#!/bin/sh
2*82c905dcSAndrew Geissler#  Copyright (c) 2020 Wind River Systems, Inc.
3*82c905dcSAndrew Geissler#
4*82c905dcSAndrew Geissler# SPDX-License-Identifier: GPL-2.0-only
5*82c905dcSAndrew Geissler#
6*82c905dcSAndrew Geissler# buildall-qemu: a tool for automating build testing of recipes
7*82c905dcSAndrew Geissler# TODO: Add support for selecting which qemu architectures to build
8*82c905dcSAndrew Geissler# TODO: Add support for queueing up multiple recipe builds
9*82c905dcSAndrew Geissler# TODO: Add more logging options (e.g. local.conf info, bitbake env info)
10*82c905dcSAndrew Geissler
11*82c905dcSAndrew Geisslerusage ()
12*82c905dcSAndrew Geissler{
13*82c905dcSAndrew Geissler    base=$(basename "$0")
14*82c905dcSAndrew Geissler    echo "Usage: $base [options] [recipename/target]"
15*82c905dcSAndrew Geissler    echo "Executes a build of a given target for selected LIBCs. With no options, default to both libc and musl."
16*82c905dcSAndrew Geissler    echo "Options:"
17*82c905dcSAndrew Geissler    echo "-l, --libc            Specify one of \"glibc\" or \"musl\""
18*82c905dcSAndrew Geissler}
19*82c905dcSAndrew Geissler
20*82c905dcSAndrew Geissler
21*82c905dcSAndrew Geisslerbuildall ()
22*82c905dcSAndrew Geissler{
23*82c905dcSAndrew Geissler    # Get path to oe-core directory. Since oe-init-build-env prepends $PATH with
24*82c905dcSAndrew Geissler    # the path to the scripts directory, get it from there
25*82c905dcSAndrew Geissler    SCRIPTS_PATH="$(echo "$PATH" | cut -d ":" -f 1)"
26*82c905dcSAndrew Geissler    OE_CORE_PATH=$(echo "$SCRIPTS_PATH" | sed 's|\(.*\)/.*|\1|')
27*82c905dcSAndrew Geissler
28*82c905dcSAndrew Geissler    # Get target list and host machine information
29*82c905dcSAndrew Geissler    TARGET_LIST=$(find "$OE_CORE_PATH"/meta/conf/machine -maxdepth 1 -type f | grep qemu | sed 's|.*/||' | sed -e 's/\.conf//')
30*82c905dcSAndrew Geissler
31*82c905dcSAndrew Geissler    # Set LIBC value to use for the builds based on options provided by the user
32*82c905dcSAndrew Geissler    if [ -n "$2" ]
33*82c905dcSAndrew Geissler    then
34*82c905dcSAndrew Geissler	LIBC_LIST="$2"
35*82c905dcSAndrew Geissler	echo "$LIBC_LIST"
36*82c905dcSAndrew Geissler    else
37*82c905dcSAndrew Geissler	LIBC_LIST="glibc musl"
38*82c905dcSAndrew Geissler	echo "$LIBC_LIST"
39*82c905dcSAndrew Geissler    fi
40*82c905dcSAndrew Geissler
41*82c905dcSAndrew Geissler    START_TIME=$(date "+%Y-%m-%d_%H:%M:%S")
42*82c905dcSAndrew Geissler    LOG_FILE="$1-buildall.log"
43*82c905dcSAndrew Geissler    OS_INFO=$(grep "PRETTY_NAME=" /etc/os-release | awk -F "=" '{print $2}' | sed -e 's/^"//' -e 's/"$//')
44*82c905dcSAndrew Geissler
45*82c905dcSAndrew Geissler    # Append an existing log file for this build with .old if one exists
46*82c905dcSAndrew Geissler    if [ -f "${LOG_FILE}" ]
47*82c905dcSAndrew Geissler    then
48*82c905dcSAndrew Geissler       mv "${LOG_FILE}" "${LOG_FILE}.old"
49*82c905dcSAndrew Geissler    else
50*82c905dcSAndrew Geissler	   touch "${LOG_FILE}"
51*82c905dcSAndrew Geissler    fi
52*82c905dcSAndrew Geissler
53*82c905dcSAndrew Geissler    # Fill the log file with build and host info
54*82c905dcSAndrew Geissler    echo "BUILDALL-QEMU LOG FOR $1" >> "${LOG_FILE}"
55*82c905dcSAndrew Geissler    echo "START TIME: ${START_TIME}" >> "${LOG_FILE}"
56*82c905dcSAndrew Geissler    echo "HOSTNAME: $(uname -n)" >> "${LOG_FILE}"
57*82c905dcSAndrew Geissler    echo "HOST OS: ${OS_INFO}" >> "${LOG_FILE}"
58*82c905dcSAndrew Geissler    echo "HOST KERNEL: $(uname -r)" >> "${LOG_FILE}"
59*82c905dcSAndrew Geissler    echo "===============" >> "${LOG_FILE}"
60*82c905dcSAndrew Geissler    echo "BUILD RESULTS:" >> "${LOG_FILE}"
61*82c905dcSAndrew Geissler
62*82c905dcSAndrew Geissler    # start the builds for each MACHINE and TCLIBC
63*82c905dcSAndrew Geissler    for j in ${LIBC_LIST}
64*82c905dcSAndrew Geissler    do
65*82c905dcSAndrew Geissler	echo "[$j]" >> "${LOG_FILE}"
66*82c905dcSAndrew Geissler	for i in ${TARGET_LIST}
67*82c905dcSAndrew Geissler	do
68*82c905dcSAndrew Geissler	    echo "$i" "$j"; \
69*82c905dcSAndrew Geissler	    TCLIBC=$j MACHINE=$i bitbake "$1" && echo "PASS: $i" >> "${LOG_FILE}" || echo "FAIL: $i" >> "${LOG_FILE}"
70*82c905dcSAndrew Geissler	done
71*82c905dcSAndrew Geissler    done
72*82c905dcSAndrew Geissler
73*82c905dcSAndrew Geissler    # Get pass/fail totals and add them to the end of the log
74*82c905dcSAndrew Geissler    PASSED=$(grep "PASS:" "${LOG_FILE}" | wc -l)
75*82c905dcSAndrew Geissler    FAILED=$(grep "FAIL:" "${LOG_FILE}" | wc -l)
76*82c905dcSAndrew Geissler
77*82c905dcSAndrew Geissler    echo "===============" >> "${LOG_FILE}"
78*82c905dcSAndrew Geissler    echo "PASSED: ${PASSED}" >> "${LOG_FILE}"
79*82c905dcSAndrew Geissler    echo "FAILED: ${FAILED}" >> "${LOG_FILE}"
80*82c905dcSAndrew Geissler}
81*82c905dcSAndrew Geissler
82*82c905dcSAndrew Geissler
83*82c905dcSAndrew Geissler# fail entire script if any command fails
84*82c905dcSAndrew Geisslerset -e
85*82c905dcSAndrew Geissler
86*82c905dcSAndrew Geissler# print usage and exit if not enough args given
87*82c905dcSAndrew Geissler[ $# -eq 0 ] && usage && exit 1
88*82c905dcSAndrew Geissler
89*82c905dcSAndrew Geissler# handle arguments
90*82c905dcSAndrew GeisslerRECIPE=
91*82c905dcSAndrew Geisslerwhile [ $# -gt 0 ]
92*82c905dcSAndrew Geisslerdo
93*82c905dcSAndrew Geissler    arg=$1
94*82c905dcSAndrew Geissler    case $arg in
95*82c905dcSAndrew Geissler	-l|--libc)
96*82c905dcSAndrew Geissler	if [ "$2" = "glibc" ] || [ "$2" = "musl" ]
97*82c905dcSAndrew Geissler	then
98*82c905dcSAndrew Geissler	    LIBC_LIST="$2"
99*82c905dcSAndrew Geissler	else
100*82c905dcSAndrew Geissler	    echo "Unrecognized libc option."
101*82c905dcSAndrew Geissler	    usage && exit 1
102*82c905dcSAndrew Geissler	fi
103*82c905dcSAndrew Geissler	shift
104*82c905dcSAndrew Geissler	shift
105*82c905dcSAndrew Geissler	;;
106*82c905dcSAndrew Geissler	*)
107*82c905dcSAndrew Geissler        RECIPE="$1"
108*82c905dcSAndrew Geissler	shift
109*82c905dcSAndrew Geissler	;;
110*82c905dcSAndrew Geissler    esac
111*82c905dcSAndrew Geisslerdone
112*82c905dcSAndrew Geissler
113*82c905dcSAndrew Geisslerset -- "$RECIPE"
114*82c905dcSAndrew Geissler
115*82c905dcSAndrew Geissler# run buildall for the given recipe and LIBC
116*82c905dcSAndrew Geisslerif [ -n "$1" ]
117*82c905dcSAndrew Geisslerthen
118*82c905dcSAndrew Geissler	buildall "$1" "$LIBC_LIST"
119*82c905dcSAndrew Geisslerfi
120*82c905dcSAndrew Geissler
121