diff options
Diffstat (limited to 'third_party/get_cross.sh')
-rwxr-xr-x | third_party/get_cross.sh | 186 |
1 files changed, 186 insertions, 0 deletions
diff --git a/third_party/get_cross.sh b/third_party/get_cross.sh new file mode 100755 index 0000000..f69291c --- /dev/null +++ b/third_party/get_cross.sh @@ -0,0 +1,186 @@ +#!/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 "$@" |