blob: 65b8062f0518861fb0a9def1986cf2010d7865b6 [file] [log] [blame]
#!/bin/bash
# Copyright 2022 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.
script="$0"
script_basename="$(basename "$script")"
script_dir="$(dirname "$script")"
function msg() {
echo "[$script_basename]: $@"
}
# project_root is the same as the remote execution 'exec_root',
# which typically points to a source checkout.
project_root="$(realpath "$script_dir"/../..)"
function usage() {
cat <<EOF
$script compiler command...
This wrapper script rewrites and executes a remote compilation commmand.
This script allows a command to use host platform tools locally while
using different platform binaries remotely.
This script itself is only intended to be run in a remote environment.
Responsibility for uploading remote platform tools lies outside of this script.
Pass this script as: rewrapper --remote_wrapper=$script
EOF
}
# realpath doesn't ship with Mac OS X (provided by coreutils package).
# We only want it for calculating relative paths.
# Work around this using Python.
if which realpath 2>&1 > /dev/null
then
function relpath() {
local -r from="$1"
local -r to="$2"
# -s: preserve symlinks, do not follow them
# We want rewrapper to treat symlinks as inputs and set them up remotely.
realpath -s --relative-to="$from" "$to"
}
else
# Point to our prebuilt python3.
python="$(ls "$project_root"/prebuilt/third_party/python3/*/bin/python3)" || {
echo "*** Python interpreter not found under $project_root/prebuilt/third_party/python3."
exit 1
}
function relpath() {
local -r from="$1"
local -r to="$2"
"$python" -c "import os; print(os.path.relpath('$to', start='$from'))"
}
fi
project_root_rel="$(relpath . "$project_root")"
# System headers were uploaded from the host toolchain's path.
# We assume that headers and target libs are usable from
# the remote toolchain's package, and structured the same way.
# Ideally, such files should be identical.
(
# This directory contains subdirs like mac-x64, linux-x64.
cd "$project_root_rel"/prebuilt/third_party/clang
for platform in *
do
case "$platform" in
linux-x64) dst="$platform" ;;
*) src="$platform" ;;
esac
done
# linux-x64 exists because it holds bin/clang and bin/clang++
cd "$dst"
ln -s ../"$src"/include .
ln -s ../"$src"/lib .
)
remote_command=()
for tok
do
remote_only_tok="$tok"
case "$tok" in
*/third_party/clang/*/bin/*)
remote_only_tok="${tok/third_party\/clang\/*\/bin/third_party/clang/linux-x64/bin}"
;;
*/third_party/gcc/*/bin/*)
remote_only_tok="${tok/third_party\/gcc\/*\/bin/third_party/gcc/linux-x64/bin}"
;;
esac
remote_command+=( "$remote_only_tok" )
done
"${remote_command[@]}"
status="$?"
test "$status" = 0 ||
msg "substituted remote command failed (exit=$status): ${remote_command[@]}"
exit "$status"