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