blob: 5e6c22050cd668b3c810d13b22d5caff68b03473 [file] [log] [blame]
#!/bin/bash
# Copyright 2017 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.
### build Fuchsia
## usage: fx build [ninja option,...] [target,...]
source "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"/lib/vars.sh
fx-config-read
readonly LOCK_FILE="${FUCHSIA_DIR}"/.build_lock
# Use a lock file around a command if possible.
# Print a message if the lock isn't immediately entered,
# and block until it is.
function try_locked {
if !(command -v shlock >/dev/null); then
# Can't lock! Fall back to unlocked operation.
"$@"
elif shlock -f "${LOCK_FILE}" -p $$; then
# This will cause a deadlock if any subcommand calls back to fx build,
# because shlock isn't reentrant by forked processes.
cmd_locked "$@"
else
echo "Locked by ${LOCK_FILE}..."
while ! shlock -f "${LOCK_FILE}" -p $$; do sleep .1; done
cmd_locked "$@"
fi
}
# Exit trap to clean up lock file
function _rmlock () {
[[ -n "${LOCK_FILE}" ]] && rm -f "${LOCK_FILE}"
}
function cmd_locked {
trap _rmlock EXIT
"$@"
exit $?
}
function main {
# TERM is passed for the pretty ninja UI
# PATH is passed as some tools are referenced via $PATH due to platform differences.
# TMPDIR is passed for Goma on macOS. TMPDIR must be set, or unset, not
# empty. Some Dart build tools have been observed writing into source paths
# when TMPDIR="" - it is deliberately unquoted and using the ${+} expansion
# expression).
try_locked env -i TERM="${TERM}" PATH="${PATH}" ${TMPDIR+"TMPDIR=$TMPDIR"} \
"${FUCHSIA_DIR}/buildtools/ninja" -j "$(fx-choose-build-concurrency)" \
-l "$(fx-cpu-count)" \
-C "${FUCHSIA_BUILD_DIR}" "$@"
}
main "$@"