aboutsummaryrefslogtreecommitdiff
path: root/third_party/get_cross.sh
diff options
context:
space:
mode:
Diffstat (limited to 'third_party/get_cross.sh')
-rwxr-xr-xthird_party/get_cross.sh186
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 "$@"