blob: 6e0c00456c1b794b12eb5abc9c6f668a94013cea [file] [log] [blame]
#!/bin/bash
# Copyright 2015 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
# This script builds gpu drivers (mali-drivers[-bifrost], img-ddk) for a list
# of boards. It uploads the binaries to Google storage and makes them available
# in the public repository.
# Loads script libraries.
CONTRIB_DIR=$(dirname "$(readlink -f "$0")")
. "${CONTRIB_DIR}/common.sh" || exit 1
DEFINE_string package "" \
"selects which gpu drivers package to build"
DEFINE_boolean dryrun ${FLAGS_FALSE} \
"dry run, don't upload anything and don't delete temporary dirs" n
DEFINE_boolean usebinpkg ${FLAGS_TRUE} \
"use prebuilt binaries, instead of building driver locally" b
# Parse command line.
FLAGS "$@" || exit 1
eval set -- "${FLAGS_ARGV}"
# Script must run inside the chroot.
assert_inside_chroot
# The temp dir to use for scratch space.
TEMP_DIR=""
# All drivers are in media-libs/ portage category.
CATEGORY="media-libs"
# List of supported drivers
DRIVERS="mali-drivers mali-drivers-bifrost img-ddk"
# List of parameters to pass to build_board, for a given package $pn:
# - Build board names.
# - Suffixes for tarball name.
# - Overlay paths for each board.
#
# Variable name: "PARAMS_${pn//-/_}"
PARAMS_mali_drivers=(
"daisy daisy overlay-daisy"
"kevin gru baseboard-gru"
"peach_pit peach overlay-peach"
"veyron_jerry veyron overlay-veyron"
)
PARAMS_mali_drivers_bifrost=(
"kukui kukui chipset-mt8183"
)
PARAMS_img_ddk=(
"elm oak chipset-mt8173"
)
create_run_script() {
local script="$1"
local outputtarball="$2"
cat > "${script}" <<\__HDREOF__
#!/bin/sh
#
# Copyright 2015 The Chromium OS Authors. All rights reserved.
#
# Usage is subject to the enclosed license agreement.
# To be generated by Makeself 1.5.3
skip=@HDRSZ@
echo
echo The license for this software will now be displayed.
echo You must agree to this license before using this software.
echo
more << __EOF__
__HDREOF__
cat "${SRC_ROOT}/third_party/chromiumos-overlay/licenses/Google-TOS" >> "${script}"
echo __EOF__ >> "${script}"
cat >> "${script}" <<\__BODYEOF__
if [ $? != 0 ]; then
echo "ERROR: Couldn't display license file" 1>&2
exit 1
fi
echo
printf 'Type "y" if you agree to the terms of the license: '
read typed
if [ "${typed}" != y ]; then
echo
echo "You didn't accept the license. Extraction aborted."
exit 2
fi
echo
tail -n +${skip} "$0" | tar xjv 2>/dev/null
if [ $? -ne 0 ]; then
echo
echo "ERROR: Couldn't extract files." 1>&2
exit 3
else
echo
echo "Files extracted successfully."
fi
exit 0
__BODYEOF__
local hdrsize=$(wc -l < "${script}")
sed -i "s/@HDRSZ@/$(( hdrsize + 1 ))/g" "${script}"
cat "${outputtarball}" >> "${script}"
chmod +x "${script}"
du -b "${script}"
}
# arguments:
# $1 board name (Chrome OS board name to build)
# $2 binary package suffix (suffix added to tar package name)
# $3 overlay path
build_board() {
local board=$1
local suffix=$2
local opath=$3
echo "Board is ${board}"
# Source PVR (e.g. 13.0-r6)
local pvr
local inputtarball
local temp="${TEMP_DIR}/${suffix}"
mkdir "${temp}"
pushd "${temp}" > /dev/null
if [[ ${FLAGS_usebinpkg} -eq ${FLAGS_TRUE} ]]; then
# Fetch binary package from Google Storage.
local partner_overlay="${SRC_ROOT}/private-overlays/chromeos-partner-overlay"
# Fetch latest preflight prebuilt version.
git --git-dir "${partner_overlay}/.git" fetch --all
local binhost_gs="$(git --git-dir "${partner_overlay}/.git" show \
"m/master:chromeos/binhost/target/${board}-PREFLIGHT_BINHOST.conf" | \
sed -nE 's/PREFLIGHT_BINHOST=\"(.*)\"/\1/p')"
# Parse Packages file to find GS path of the latest ${pn} prebuilt.
local prebuilt_path="$(gsutil cat "${binhost_gs}Packages" | \
awk '
$1 == "CPV:" && $2 ~ /'"${CATEGORY}"'\/'"${pn}"'-[0-9]/ { m = 1 }
m && $1 == "PATH:" { print $2 }
m && $1 == "" { exit }
')"
local package_gs="gs://chromeos-prebuilt/${prebuilt_path}"
gsutil cp "${package_gs}" .
inputtarball="${temp}/${package_gs##*/}"
pvr="${package_gs%.*}"
pvr="${pvr##*${pn}-}"
else
# Build from source.
setup_board --board="${board}"
if [[ $? != 0 ]]; then
die "Setting up board ${board} failed."
fi
# Make sure we are not building -9999 ebuild.
# This could fail if cros_workon is already stopped so ignore return code.
cros_workon --board="${board}" stop "${pn}"
"emerge-${board}" "${pn}"
if [[ $? != 0 ]]; then
die "Emerging ${pn} for ${board} failed."
fi
pvr="$("equery-${board}" -q list -p -o --format="\$fullversion" "${pn}" | \
sort -V | head -n 1)"
inputtarball="/build/${board}/packages/${CATEGORY}/${pn}-${pvr}.tbz2"
fi
# Binary PV (e.g. 13.0_p6)
local pv="${pvr/-r/_p}"
local outputtarball="${pn}-${suffix}-${pv}.tbz2"
local script="${pn}-${suffix}-${pv}.run"
local gspath="gs://chromeos-localmirror/distfiles"
echo "Current version is ${pvr}"
echo "Input tarball is ${inputtarball}"
echo "Output tarball is ${outputtarball}"
echo "Script is ${script}"
mkdir work
if [[ $? != 0 ]]; then
die "Couldn't create work directory."
fi
tar -C work -xpjvf "${inputtarball}"
if [[ $? != 0 ]]; then
die "Couldn't decompress package tarball ${inputtarball}."
fi
tar -C work --exclude=usr/lib/debug -cpjvf "${outputtarball}" ./
if [[ $? != 0 ]]; then
die "Couldn't create ${outputtarball}."
fi
create_run_script "${script}" "${outputtarball}"
echo "Uploading tarball to ${gspath}/${script}"
if [[ ${FLAGS_dryrun} -eq ${FLAGS_TRUE} ]]; then
echo "Would run: gsutil cp -a public-read \"${script}\" \"${gspath}/${script}\""
else
gsutil cp -a public-read "${script}" "${gspath}/${script}"
if [[ $? != 0 ]]; then
die "Couldn't upload ${script} to ${gspath}/${script}."
fi
fi
# Uprev ebuild in git if it exists.
if [[ -d "${SRC_ROOT}/overlays/${opath}/${CATEGORY}/${pnbin}" ]]; then
cd "${SRC_ROOT}/overlays/${opath}/${CATEGORY}/${pnbin}"
# Grab the version of the current release of the binary package.
local pvbin="$(printf '%s\n' *.ebuild | \
sed -nE "s/^${pnbin}-(.*)\.ebuild\$/\1/p" | \
sort -V | tail -n 1)"
echo "New binary version: ${pv} (current binary version: ${pvbin})"
# following git commands may fail if they have been issued previously
git checkout -b "gpudriverbinupdate-${pnbin}-${pv}"
git mv "${pnbin}-${pvbin}.ebuild" "${pnbin}-${pv}.ebuild"
ebuild "${pnbin}-${pv}.ebuild" manifest
fi
popd > /dev/null
}
cleanup() {
trap - INT TERM ERR EXIT
rm -rf "${TEMP_DIR}"
}
main() {
if [[ -z ${FLAGS_package} ]]; then
die "Please select a package using --package [${DRIVERS// /|}]"
fi
local params
local typed
trap cleanup INT TERM ERR EXIT
echo 'This script builds gpu drivers for a list of boards. It uploads the'
echo 'binaries to Google storage and makes them available in the public'
echo 'repository. It expects you have configured gsutil.'
echo
if [[ ${FLAGS_dryrun} -eq ${FLAGS_TRUE} ]]; then
echo "Running with --dryrun, moving forward."
else
printf 'Type "y" if you know what you are doing and want to go ahead: '
read typed
if [[ "${typed}" != y ]]; then
echo
echo "Good choice."
exit 2
fi
fi
if [[ ! -f "${HOME}/.boto" ]]; then
die "You did not configure gsutil after all."
fi
local pn="${FLAGS_package}"
local pnbin="${pn}-bin"
local array="PARAMS_${pn//-/_}[@]"
if [[ -z "${!array}" ]]; then
echo
echo "Nothing to do for ${pn}, you probably chose an incorrect package name."
echo "Supported packages: ${DRIVERS}"
exit 1
fi
TEMP_DIR="$(mktemp -d)"
echo "Temp dir is ${TEMP_DIR}"
for params in "${!array}"; do
build_board ${params}
done
}
main "$@"