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