blob: fff2b4a36615d07db7ad826c0aac452101ca6b41 [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
# 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=$(mktemp -d)
echo "Temp dir is ${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.
"${SRC_ROOT}/scripts/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
rm -rf "${temp}"
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
}
main() {
if [[ -z ${FLAGS_package} ]]; then
die "Please select a package using --package [${DRIVERS// /|}]"
fi
local params
local typed
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
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
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
for params in "${!array}"; do
build_board ${params}
done
}
main "$@"