| #!/bin/bash |
| # Copyright 2024 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. |
| |
| #### CATEGORY=Source tree |
| #### PREBUILTS=${PREBUILT_BAZEL} ${PREBUILT_BUILDIFIER} ${PREBUILT_GN} ${PREBUILT_JQ} ${PREBUILT_PYTHON3} |
| ### Syncs BUILD.gn and BUILD.bazel for targets that are dual-building in both. |
| |
| ## usage: fx bazel2gn [-d|--directory <path/to/dir>]... [-h|--help] [--no-build] |
| ## |
| ## -h|--help Print out this message. |
| ## -d|--directory Directory to sync, repeatable. |
| ## --no-build Skip building required dependencies. |
| ## |
| ## Updates BUILD.gn files from the BUILD.bazel files in their directories. Without |
| ## -d, syncs every directory whose BUILD.gn contains the bazel2gn sentinel. |
| |
| set -eo pipefail |
| |
| _script_dir="${BASH_SOURCE[0]%/*}"; |
| if [[ "${_script_dir}" == "${BASH_SOURCE[0]}" ]]; then _script_dir="."; fi |
| readonly _script_dir |
| |
| # shellcheck source=/dev/null |
| source "${_script_dir}/../lib/vars.sh" || exit $? |
| fx-config-read |
| |
| # shellcheck source=/dev/null |
| source "${_script_dir}/../lib/bazel_utils.sh" || exit $? |
| |
| declare -r BAZEL2GN_TARGET="//build/tools/bazel2gn" |
| |
| BAZEL2GN_BIN="$(fx-get-bazel-workspace)/bazel-bin/build/tools/bazel2gn/bazel2gn_/bazel2gn" |
| readonly BAZEL2GN_BIN |
| |
| dir_list_file="" |
| |
| function main { |
| local build=true |
| local directories=() |
| while [[ "${#}" -ge 1 ]]; do |
| case "${1}" in |
| -d|--directory) |
| shift |
| directories+=("${1}") |
| ;; |
| -h|--help) |
| fx-command-help |
| exit 0 |
| ;; |
| --no-build) |
| build=false |
| ;; |
| *) |
| fx-error "Unexpected command line arg ${1}" |
| fx-command-help |
| exit 1 |
| esac |
| shift |
| done |
| |
| # Without explicit directories, bazel2gn discovers all directories whose |
| # BUILD.gn contains the bazel2gn sentinel. |
| local -a dir_list_args=() |
| if [[ "${#directories[@]}" -gt 0 ]]; then |
| # Write the directories to a temporary file. |
| dir_list_file="$(mktemp /tmp/bazel2gn-dirlist-XXXXXX)" |
| trap 'rm -f "${dir_list_file}"' EXIT |
| for directory in "${directories[@]}"; do |
| printf "%s\n" "${directory}" >> "${dir_list_file}" |
| done |
| dir_list_args=(--directory_list "${dir_list_file}") |
| fi |
| |
| if [[ "${build}" == "true" ]]; then |
| fx-run-bazel false "$(fx-get-bazel)" build --config=host "${BAZEL2GN_TARGET}" |
| fi |
| |
| "${BAZEL2GN_BIN}" \ |
| "${dir_list_args[@]}" \ |
| --fuchsia_dir "${FUCHSIA_DIR}" \ |
| --gn_bin "${PREBUILT_GN}" \ |
| --buildifier_bin "${PREBUILT_BUILDIFIER}" |
| } |
| |
| main "$@" |