| #!/bin/bash |
| # Copyright 2019 The Fuchsia 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 -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")")" |
| |
| 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 -s -m)" |
| 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 |
| } |
| |
| # The `realpath` command is not available on all systems, so we reimplement it |
| # here in pure bash. It converts relative paths to absolute, and leaves |
| # absolute paths as-is. |
| realpath() { |
| [[ $1 == /* ]] && echo "$1" || echo "$PWD/${1#./}" |
| } |
| |
| main() { |
| local output |
| output="$(pwd)/fint" |
| while getopts 'ho:' opt; do |
| case "$opt" in |
| h) print_usage_and_exit 0 ;; |
| o) output=$(realpath "${OPTARG}") ;; |
| ?) print_usage_and_exit 1 ;; |
| esac |
| done |
| |
| # Build in a temporary directory where we can arrange the module. Use `mktemp` |
| # instead of directly referencing $TMPDIR or a similar environment variable |
| # that may not be set on all platforms. |
| BUILD_DIR=$(mktemp -d) |
| trap 'rm -rf $BUILD_DIR' EXIT |
| cd "$BUILD_DIR" |
| for target in go.{mod,sum} vendor; do |
| ln -s "$FUCHSIA_ROOT"/third_party/golibs/$target . |
| done |
| ln -s "$FUCHSIA_ROOT"/tools . |
| |
| GOCACHE_DIR=$(mktemp -d) |
| trap 'rm -rf $GOCACHE_DIR' EXIT |
| |
| readonly go_bin="$FUCHSIA_ROOT/prebuilt/third_party/go/$(host_platform)/bin/go" |
| GOCACHE="$GOCACHE_DIR" GOPROXY=off $go_bin build \ |
| -o "$output" ./tools/integration/fint/cmd/fint |
| } |
| |
| main "$@" |