| #!/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 "$@" |