Skip to content

Instantly share code, notes, and snippets.

@alexreg
Last active April 16, 2020 22:00
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save alexreg/49346f9f2026e528b248d0a240334c14 to your computer and use it in GitHub Desktop.
Save alexreg/49346f9f2026e528b248d0a240334c14 to your computer and use it in GitHub Desktop.
GCC Farm Build Script
#!/usr/bin/env bash
set -e
if [[ ! -r "./x.py" ]]; then
echo >&2 "error: not in 'rustc' repository"
exit 1
fi
GCC_FARM_PREBUILD=$'
/usr/bin/env bash -c \'
HOST_PATH="$HOST_PATH"
CONFIG_FILE="${HOST_PATH/#\~/\$HOME}/config.toml"
echo "Updating rustc config file \`\$CONFIG_FILE\`..."
CODEGEN_UNITS=$(( $(nproc) / 2 ))
sed -ibak -E "s/^#? ?(codegen-units) = .+$/\\1 = \$CODEGEN_UNITS/" "\$CONFIG_FILE"
\'
'
GCC_FARM_SYNC_BACK_PATH="src/test/"
GCC_FARM_SYNC_BACK_RSYNC_ARGS=("--filter=show **/*.stdout" "--filter=show **/*.stderr" "--filter=show **/*.fixed" "--filter=hide,! */")
source gcc-farm
#!/usr/bin/env bash
set -e
PROGRAM_NAME="$(basename -- "$0")"
show_help() {
echo "usage: $PROGRAM_NAME -h | [-s] [-t] COMMAND"
}
SYNC=0
SYNC_BACK=0
OPTIND=1
while getopts "hst" opt; do
case "$opt" in
h)
show_help
exit 0
;;
s)
SYNC=1
;;
t)
SYNC_BACK=1
;;
esac
done
shift $(( OPTIND - 1 ))
[[ "$1" == "--" ]] && shift
if [[ -z "$GCC_FARM_SERVER" ]]; then
echo >&2 "error: \`GCC_FARM_SERVER\` environment variable not specified"
exit 1
fi
if (( SYNC )) && [[ ! -r "./.git" ]]; then
echo >&2 "error: working directory is not Git repository"
exit 1
fi
get_default_rpath() {
CUR_DIR_NAME="$(basename "$PWD")"
GIT_BRANCH="$(git branch --show-current)"
if (( $? == 0 )); then
echo "$CUR_DIR_NAME/$GIT_BRANCH"
else
echo "$CUR_DIR_NAME"
fi
}
envsubst2() {
sed 's/\\\$/\${ENVSUBST_IGNORE}/g' | ENVSUBST_IGNORE='$' envsubst "$@"
}
HOST="$GCC_FARM_SERVER.fsffrance.org"
HOST_PORT="$GCC_FARM_PORT"
HOST_PATH="${GCC_FARM_PATH-~/src/$(get_default_rpath)}"
RUN_CMD=("$@")
SSH_ARGS=()
RSYNC_ARGS=()
if [[ -n "$HOST_PORT" ]]; then
SSH_ARGS+=("-p" "$HOST_PORT")
RSYNC_ARGS+=("--port" "$RSYNC_ARGS")
fi
PREBUILD_CMD="$(echo "$GCC_FARM_PREBUILD" | HOST_PATH="$HOST_PATH" envsubst2)"
echo "Setting up master connection to \`$HOST\`..."
if ssh "${SSH_ARGS[@]}" -O check "$HOST" &> /dev/null; then
SSH_NEW_MASTER=0
else
SSH_NEW_MASTER=1
ssh "${SSH_ARGS[@]}" -o ControlPersist=yes "$HOST" true
fi
ssh "${SSH_ARGS[@]}" "$HOST" "mkdir -p "$HOST_PATH""
if (( SYNC )); then
echo "Syncing repository to \`$HOST_PATH\`..."
rsync -ahz -e "ssh "${SSH_ARGS[@]}"" --delete "${RSYNC_ARGS[@]}" --info=progress2 --include="/config.toml" --exclude=".*" --filter="protect /build/" --filter="dir-merge,-n /.gitignore" . "$HOST:$HOST_PATH"
fi
quote_args() {
QUOTED_RUN_CMD=()
for ARG in "${RUN_CMD[@]}"; do
QUOTED_ARG="${ARG// /\\ }"
QUOTED_RUN_CMD+=("$QUOTED_ARG")
done
}
if [[ "$RUN_CMD" ]]; then
echo "Running \`${RUN_CMD[*]}\` on server..."
QUOTED_RUN_CMD=()
for ARG in "${RUN_CMD[@]}"; do
QUOTED_ARG="${ARG// /\\ }"
QUOTED_RUN_CMD+=("$QUOTED_ARG")
done
ssh "${SSH_ARGS[@]}" -t "$HOST" $"cd "$HOST_PATH" && ${PREBUILD_CMD:-true} && ${QUOTED_RUN_CMD[@]}"
fi
if (( SYNC_BACK )); then
echo "Syncing back results..."
rsync -ahz -e "ssh "${SSH_ARGS[@]}"" -v "${RSYNC_ARGS[@]}" --info=progress2 --filter="protect .git/" "${GCC_FARM_SYNC_BACK_RSYNC_ARGS[@]}" "$HOST:$HOST_PATH/$GCC_FARM_SYNC_BACK_PATH" "./$GCC_FARM_SYNC_BACK_PATH"
fi
if (( $SSH_NEW_MASTER )); then
ssh "${SSH_ARGS[@]}" -O exit "$HOST"
fi
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment