|  | #!/bin/bash | 
|  | # Copyright 2016 The Weave Authors. All rights reserved. | 
|  | # Use of this source code is governed by a BSD-style license that can be | 
|  | # found in the LICENSE file. | 
|  |  | 
|  | set -e | 
|  |  | 
|  | SCRIPT=$(readlink -f "$0") | 
|  | THIRD_PARTY=$(dirname "${SCRIPT}") | 
|  | cd "${THIRD_PARTY}" | 
|  |  | 
|  | OUT="cross" | 
|  | DISTDIR="${OUT}/distfiles" | 
|  |  | 
|  | CROS_OVERLAY_URL="https://chromium.googlesource.com/chromiumos/overlays/chromiumos-overlay/+/master/chromeos" | 
|  | CONF_SDK_LATEST="${CROS_OVERLAY_URL}/binhost/host/sdk_version.conf" | 
|  |  | 
|  | SDK_BUCKET="https://commondatastorage.googleapis.com/chromiumos-sdk" | 
|  | BINPKG_BUCKET="https://commondatastorage.googleapis.com/chromeos-prebuilt" | 
|  | CROS_BUCKET="https://commondatastorage.googleapis.com/chromeos-image-archive" | 
|  |  | 
|  | PKGS=( | 
|  | app-emulation/qemu | 
|  | ) | 
|  | TARGETS=( | 
|  | #  aarch64-cros-linux-gnu | 
|  | armv7a-cros-linux-gnueabi | 
|  | i686-pc-linux-gnu | 
|  | #  mips-cros-linux-gnu | 
|  | mipsel-cros-linux-gnu | 
|  | x86_64-cros-linux-gnu | 
|  | ) | 
|  | BOARDS=( | 
|  | #  aarch64-generic-full | 
|  | amd64-generic-full | 
|  | arm-generic-full | 
|  | #  mips-o32-generic-full | 
|  | mipsel-o32-generic-full | 
|  | x86-generic-full | 
|  | ) | 
|  |  | 
|  | usage() { | 
|  | cat <<EOF | 
|  | Usage: get_cross.sh | 
|  |  | 
|  | Download cross-compilers for building & testing against other arches. | 
|  | EOF | 
|  | exit 0 | 
|  | } | 
|  |  | 
|  | get_gitiles() { | 
|  | local url="$1" data | 
|  | data=$(curl -s "${url}?format=TEXT") | 
|  | echo "${data}" | base64 -d | 
|  | } | 
|  |  | 
|  | json() { | 
|  | local file="$1" arg="$2" | 
|  | python <<EOF | 
|  | import json | 
|  | print(json.load(open("${file}"))${arg}) | 
|  | EOF | 
|  | } | 
|  |  | 
|  | fetch() { | 
|  | local url=$1 | 
|  | file="${2:-${DISTDIR}/${url##*/}}" | 
|  | if [[ ! -e ${file} ]]; then | 
|  | printf '[downloading] ' | 
|  | mkdir -p "${DISTDIR}" | 
|  | wget "${url}" -O "${file}" | 
|  | fi | 
|  | } | 
|  |  | 
|  | unpack() { | 
|  | local out="$1" file="$2" | 
|  | printf '[unpacking] ' | 
|  | rm -rf "${out}" | 
|  | mkdir -p "${out}" | 
|  | tar xf "${file}" -C "${out}" | 
|  | } | 
|  |  | 
|  | fetch_pkgs() { | 
|  | local pkg | 
|  | local sub_url url file manifest | 
|  | local out ver_file old_ver ver | 
|  |  | 
|  | # Grab a few helper packages. | 
|  | printf 'Getting SDK manifest ... ' | 
|  | sub_url="cros-sdk-${SDK_LATEST_VERSION}.tar.xz.Manifest" | 
|  | url="${SDK_BUCKET}/${sub_url}" | 
|  | fetch "${url}" | 
|  | manifest=${file} | 
|  | printf '%s\n' "${manifest}" | 
|  |  | 
|  | for pkg in "${PKGS[@]}"; do | 
|  | printf 'Getting binpkg %s ... ' "${pkg}" | 
|  | ver=$(json "${manifest}" '["packages"]["app-emulation/qemu"][0][0]') | 
|  | sub_url="host/amd64/amd64-host/chroot-${SDK_LATEST_VERSION}/packages/${pkg}-${ver}.tbz2" | 
|  | url="${BINPKG_BUCKET}/${sub_url}" | 
|  | fetch "${url}" | 
|  |  | 
|  | out="${OUT}/${pkg}" | 
|  | ver_file="${out}/.ver" | 
|  | old_ver=$(cat "${ver_file}" 2>/dev/null || :) | 
|  | if [[ "${old_ver}" != "${ver}" ]]; then | 
|  | unpack "${out}" "${file}" | 
|  | echo "${ver}" > "${ver_file}" | 
|  | fi | 
|  |  | 
|  | printf '%s\n' "${ver}" | 
|  | done | 
|  | } | 
|  |  | 
|  | fetch_toolchains() { | 
|  | local target | 
|  | local sub_url url file | 
|  | local out ver_file ver | 
|  |  | 
|  | # Download the base toolchains. | 
|  | for target in "${TARGETS[@]}"; do | 
|  | printf 'Getting toolchain for %s ... ' "${target}" | 
|  |  | 
|  | sub_url="${TC_PATH/\%(target)s/${target}}" | 
|  | url="${SDK_BUCKET}/${sub_url}" | 
|  | file="${DISTDIR}/${url##*/}" | 
|  | fetch "${url}" | 
|  |  | 
|  | out="${OUT}/${target}" | 
|  | ver_file="${out}/.ver" | 
|  | ver=$(cat "${ver_file}" 2>/dev/null || :) | 
|  | if [[ "${ver}" != "${SDK_LATEST_VERSION}" ]]; then | 
|  | unpack "${out}" "${file}" | 
|  | echo "${SDK_LATEST_VERSION}" > "${ver_file}" | 
|  | fi | 
|  |  | 
|  | printf '%s\n' "${sub_url}" | 
|  | done | 
|  | } | 
|  |  | 
|  | fetch_sysroots() { | 
|  | local board | 
|  | local board_latest_url sub_url url file | 
|  | local out ver_file ver | 
|  |  | 
|  | # Get the full sysroot. | 
|  | for board in "${BOARDS[@]}"; do | 
|  | printf 'Getting sysroot for %s ... ' "${board}" | 
|  | board_latest_url="${CROS_BUCKET}/${board}/LATEST-master" | 
|  | if ! board_ver=$(curl --fail -s "${board_latest_url}"); then | 
|  | echo 'error: not found' | 
|  | continue | 
|  | fi | 
|  |  | 
|  | url="${CROS_BUCKET}/${board}/${board_ver}/sysroot_chromeos-base_chromeos-chrome.tar.xz" | 
|  | file="${DISTDIR}/${board}-${board_ver}-${url##*/}" | 
|  | fetch "${url}" "${file}" | 
|  |  | 
|  | out="${OUT}/${board}" | 
|  | ver_file="${out}/.ver" | 
|  | ver=$(cat "${ver_file}" 2>/dev/null || :) | 
|  | if [[ "${ver}" != "${board_ver}" ]]; then | 
|  | unpack "${out}" "${file}" | 
|  | echo "${board_ver}" > "${ver_file}" | 
|  | fi | 
|  |  | 
|  | printf '%s\n' "${board_ver}" | 
|  | done | 
|  | } | 
|  |  | 
|  | main() { | 
|  | if [[ $# -ne 0 ]]; then | 
|  | usage | 
|  | fi | 
|  |  | 
|  | # Get the current SDK versions. | 
|  | printf 'Getting CrOS SDK version ... ' | 
|  | data=$(get_gitiles "${CONF_SDK_LATEST}") | 
|  | eval "${data}" | 
|  | echo "${SDK_LATEST_VERSION}" | 
|  |  | 
|  | fetch_pkgs | 
|  | fetch_toolchains | 
|  | fetch_sysroots | 
|  | } | 
|  | main "$@" |