| #!/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 "$@" |