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