blob: 81c6d0720b12725d98d22b25ec087b22c1b689cd [file] [log] [blame]
#!/bin/bash
# Copyright 2019 The Fuchsia Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can
# found in the LICENSE file.
set -o errexit # exit when a command fails
set -o nounset # error when an undefined variable is referenced
set -o pipefail # error if the input command to a pipe fails
readonly SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)"
readonly FUCHSIA_ROOT="$(dirname "$(dirname "$SCRIPT_DIR")")"
# Path to the fint main package, relative to fuchsia root.
readonly DOCI_PKG_PATH="tools/integration/fint/cmd"
# The go repos that fint depends on, given an an array of pairs of the form
# (<repo name>, <path in the tree to that vendored repo>).
readonly GO_DEPS=(
# Note: this assumes that all fuchsia packages to be used by fint have names
# that mirror their paths within fuchsia.git.
"go.fuchsia.dev/fuchsia"
"${FUCHSIA_ROOT}"
)
print_usage_and_exit() {
readonly exit_code=$1
# In the case of a non-zero exit, redirect the stdout below to stderr.
if [[ $exit_code -ne 0 ]]; then
exec 1 >&2
fi
echo ""
echo "Used to bootstrap the \"fint\" tool, which provides the platform's"
echo "\"integration interface\"."
echo "See //tools/integration/README.md for more details."
echo ""
echo "usage: $(basename "$0") (-o <path>)"
echo ""
echo "options:"
echo "-o: points to a file path at which to output fint; if unsupplied, it"
echo " will be output to the current working directory."
echo ""
exit "$exit_code"
}
###############################################################################
# Returns the host platform, of the form <OS>-<architecture>.
# Globals:
# None
# Arguments:
# None
# Returns:
# The host platform, if successful.
###############################################################################
host_platform() {
readonly uname="$(uname --kernel-name --machine)"
case "${uname}" in
"Linux x86_64") echo linux-x64 ;;
"Darwin x86_64") echo mac-x64 ;;
*)
echo "unsupported infrastructure platform: ${uname}" 1>&2
exit 1
;;
esac
}
###############################################################################
# Symlinks already vendored go repositories, depended on by fint, to a provided
# go path.
# Globals:
# GO_DEPS
# Arguments:
# $1 - a go path
# Returns:
# None
###############################################################################
symlink_go_deps() {
readonly gopath="$1"
for (( i=0 ; i < ${#GO_DEPS[@]} ; i += 2 )) ; do
readonly host="${GO_DEPS[i]}"
readonly src="${GO_DEPS[i+1]}"
readonly dest="${gopath}/src/${host}"
mkdir -p "$(dirname "${dest}")"
ln --symbolic --no-target-directory "${src}" "${dest}"
done
}
main() {
local output
output="$(pwd)/fint"
while getopts 'ho:' opt; do
case "$opt" in
h) print_usage_and_exit 0 ;;
o) output="${OPTARG}" ;;
?) print_usage_and_exit 1 ;;
esac
done
readonly GOPATH="$(mktemp --directory -t fint.XXXXX)"
rm_gopath() {
rm --recursive --force "${GOPATH}"
}
trap rm_gopath EXIT
export GOPATH
symlink_go_deps "${GOPATH}"
# Execute `go build` from the fuchsia root, as the package to build must be
# supplied as a relative path.
readonly go_bin="${FUCHSIA_ROOT}/prebuilt/third_party/go/$(host_platform)/bin/go"
cd "${FUCHSIA_ROOT}" && ${go_bin} build -o "${output}" "./${DOCI_PKG_PATH}"
}
main "$@"