# Copyright 2016 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.

import("//build/config/clang/clang.gni")
import("//build/config/clang/crash_diagnostics.gni")
import("//build/config/clang/time_trace.gni")
import("//build/config/compiler.gni")
import("//build/config/linker.gni")
import("//build/rust/config.gni")
import("//build/toolchain/ccache.gni")
import("//build/toolchain/concurrent_jobs.gni")
import("//build/toolchain/goma.gni")
import("//build/unification/global_variables.gni")

declare_args() {
  if (is_fuchsia) {
    # Controls whether the compiler emits full stack frames for function calls.
    # This reduces performance but increases the ability to generate good
    # stack traces, especially when we have bugs around unwind table generation.
    # It applies only for Fuchsia targets (see below where it is unset).
    #
    # TODO(fxbug.dev/32216): Theoretically unwind tables should be good enough so we can
    # remove this option when the issues are addressed.
    enable_frame_pointers = is_debug
  }

  # Controls whether the rust compiler uses v0 symbol mangling scheme
  # (see https://github.com/rust-lang/rfcs/blob/HEAD/text/2603-rust-symbol-name-mangling-v0.md).
  # The v0 symbol mangling scheme requires upstream LLVM support when demangling,
  # so it is not on by default.
  # TODO(fxbug.dev/57302): Enable v0 mangling by default.
  rust_v0_symbol_mangling = false
}

# No frame pointers for host compiles.
if (!is_fuchsia) {
  enable_frame_pointers = false
}

# Turns on the rust compilation analysis generator. This will produce a
# directory $OUT/save-analysis-temp, which will dump all the source analysis
# that the compiler collected while analyzing the source.  This config is
# included conditionally, see //build/config/BUILDCONFIG.gn for details.
config("rust_analysis") {
  rustflags = [ "-Zsave-analysis" ]
}

config("rust_edition_2018") {
  rustflags = [ "--edition=2018" ]
}

config("rust_edition_2015") {
  rustflags = [ "--edition=2015" ]
}

config("rust_opt_level_z") {
  rustflags = [ "-Copt-level=z" ]
}

config("rust_no_features") {
  rustflags = [ "-Zallow-features=" ]
}

config("netstack3_only_specialization_feature") {
  rustflags = [
    "-Zallow-features=specialization",
    "-Aincomplete-features",
  ]
}

config("rust_2018_idioms") {
  rustflags = [ "-Wrust-2018-idioms" ]
}

config("rust_target") {
  rustflags = [
    "--target",
    rust_target,
    "--cap-lints=$rust_cap_lints",
  ]
}

config("rust_panic_abort") {
  rustflags = [
    "-Cpanic=abort",
    "-Cforce-unwind-tables=yes",
    "-Zpanic_abort_tests",
  ]
}

config("rust_v0_symbol_mangling") {
  if (rust_v0_symbol_mangling) {
    rustflags = [ "-Zsymbol-mangling-version=v0" ]
  }
}

config("language") {
  cflags_c = [ "-std=c11" ]
  cflags_cc = [ "-std=c++17" ]
  if (current_os == "mac") {
    # macOS needs this to not complain about C++17isms that older macOS
    # system libc++ doesn't support.  But we use our own toolchain's static
    # libc++ anyway.
    cflags_cc += [ "-faligned-allocation" ]

    # libc++ headers mark some symbols as unavailable on macOS by default
    # because the system libc++ doesn't support them.  But we use our own
    # toolchain's static libc++ anyway.
    defines = [ "_LIBCPP_DISABLE_AVAILABILITY" ]
  }
}

config("color_diagnostics") {
  # GCC correctly defaults this from the terminal, so leave it alone.
  if (!is_gcc) {
    cflags = [ "-fcolor-diagnostics" ]
    asmflags = cflags
    ldflags = cflags

    # The macOS linker does not support `--color-diagnostics`.
    if (current_os != "mac") {
      ldflags += [ "-Wl,--color-diagnostics" ]
    }
  }
}

config("crash-diagnostics-dir") {
  if (!is_gcc && crash_diagnostics_dir != "") {
    cflags = [ "-fcrash-diagnostics-dir=" +
               rebase_path(crash_diagnostics_dir, root_build_dir) ]
    asmflags = cflags
    ldflags = cflags
  }
}

config("time-trace") {
  if (!is_gcc && time_trace) {
    cflags = [ "-ftime-trace" ]
    asmflags = cflags
    ldflags = cflags
  }
}

config("compiler") {
  cflags = []
  cflags_cc = [ "-fvisibility-inlines-hidden" ]
  cflags_objcc = [ "-fvisibility-inlines-hidden" ]
  configs = [
    ":color_diagnostics",
    ":crash-diagnostics-dir",
    ":rust_panic_cfg",
    ":time-trace",
    ":toolchain_version_stamp",
  ]

  if (!is_gcc) {
    configs += [ ":clang_defaults" ]
  }

  if (current_os == "fuchsia") {
    configs += [ "//build/config/fuchsia:compiler" ]
  } else {
    if (current_os == "linux") {
      configs += [ "//build/config/linux:compiler" ]
    } else if (current_os == "mac") {
      configs += [ "//build/config/mac:compiler" ]
    }
  }

  asmflags = cflags
}

# These flags are enabled by default in Fuchsia's Clang toolchain, but we set
# them explicitly to support other Clang toolchains and Clang-based tools.
config("clang_defaults") {
  cflags = [ "-fexperimental-new-pass-manager" ]
  asmflags = cflags
  ldflags = cflags
  if (clang_embed_bitcode) {
    cflags += [
      "-Xclang",
      "-fembed-bitcode=all",
    ]
  }
  if (current_cpu == "x64") {
    asmflags += [ "-Wa,--mrelax-relocations=yes" ]
  }
}

# We want to force a recompile and relink of the world whenever our toolchain
# changes since artifacts from an older version of the toolchain may or may not
# be compatible with newer ones.
#
# To achieve this, we insert an unused flag in the compile line.
config("toolchain_version_stamp") {
  if (clang_prefix == default_clang_prefix) {
    clang_version = read_file(
            "//prebuilt/third_party/clang/${host_platform}/.versions/clang.cipd_version",
            "json")
    defines = [ "TOOLCHAIN_VERSION=${clang_version.instance_id}" ]
  }
  rustflags = [ "--cfg=__rust_toolchain=\"${rustc_version_string}\"" ]
}

config("relative_paths") {
  # TODO(fxbug.dev/54161): Keep in sync with //zircon/public/gn/config:relative_paths
  # until build unification completes.

  if (is_gcc) {
    if (use_goma) {
      # TODO(fxbug.dev/27308): `-fdebug-prefix-map` is also used by Goma to canonicalize
      # build commands, allowing it to reuse compilation results for users running
      # out of different working directories. However, it only supports a single
      # "-fdebug-prefix-map" prefix. Attempting to provide more than one causes
      # canonicalization to fail, meaning that builds running out of different
      # directories won't share cache results. For now, we just provide a single
      # debug-prefix-map, even though more would be ideal.

      # Map "/some/dir/fuchsia" to "../..".
      cflags = [ "-fdebug-prefix-map=" + rebase_path("$zx/..") + "=" +
                 rebase_path("$zx/..", root_build_dir) ]
    } else {
      cflags = [
        # Map "/some/dir/fuchsia/out/my-build.my-arch" to ".".
        "-fdebug-prefix-map=" + rebase_path(root_build_dir) + "=.",

        # Map "/some/dir/fuchsia/out" to "..".
        "-fdebug-prefix-map=" + rebase_path("$root_build_dir/..") + "=..",

        # Map "/some/dir/fuchsia" to "../..".
        "-fdebug-prefix-map=" + rebase_path("$zx/..") + "=" +
            rebase_path("$zx/..", root_build_dir),
      ]
    }
  } else {
    # Make builds independent of the absolute file path. -fdebug-prefix-map=
    # can be used to the same effect, but it requires putting the absolute path
    # to the build directory in the compile command, thus making it dependent
    # on the absolute path of build directory. -fdebug-compilation-dir is
    # designed to address this issue, making both debug info and the compile
    # command itself independent of the absolute path of the build directory.
    cflags = [
      "-fdebug-compilation-dir",
      ".",
    ]
  }

  if (!is_gcc) {
    # This makes sure that include directories in the toolchain are
    # represented as relative to the build directory (because that's how we
    # invoke the compiler), rather than absolute.  This can affect __FILE__
    # expansions (e.g. assertions in system headers).  We normally run a
    # compiler that's someplace within the source tree, so its absolute
    # installation path will have a prefix matching `absolute_path` and
    # hence be mapped to `relative_path` in the debugging information, so
    # this should actually be superfluous for purposes of the debugging
    # information.
    cflags += [ "-no-canonical-prefixes" ]
  }

  asmflags = cflags
  ldflags = cflags

  if (current_os == "win") {
    ldflags += [
      # This embeds just "name.pdb" in the binary instead of the absolute
      # path to the PDB file.
      "-Wl,/pdbaltpath:%_PDB%",

      # This embeds a fake Windows-style absolute path rather than the real
      # build-time absolute path in the PDB file.  Windows apparently
      # requires an absolute path here, so we use an arbitrary fake one for
      # reproducibility.
      "-Wl,/pdbsourcepath:c:\\src",
    ]
  }

  rustflags = [
    "--remap-path-prefix",
    rebase_path("//") + "=" + rebase_path("//", root_build_dir),
  ]
}

config("debug") {
  # TODO(phosek): remove this config when nothing refers on it.
}

config("release") {
  defines = [ "NDEBUG=1" ]
}

config("exceptions") {
  cflags_cc = [ "-fexceptions" ]
  cflags_objcc = cflags_cc
  ldflags = cflags_cc
}

config("no_exceptions") {
  cflags_cc = [ "-fno-exceptions" ]
  cflags_objcc = cflags_cc
  ldflags = cflags_cc
}

config("rtti") {
  cflags_cc = [ "-frtti" ]
  cflags_objcc = cflags_cc
  ldflags = cflags_cc
}

config("no_rtti") {
  cflags_cc = [ "-fno-rtti" ]
  cflags_objcc = cflags_cc
  ldflags = cflags_cc
}

config("default_include_dirs") {
  include_dirs = [
    "//",
    root_gen_dir,
  ]
}

config("linker_gc") {
  cflags = [
    "-fdata-sections",
    "-ffunction-sections",
  ]
  ldflags = cflags
  if (current_os == "mac") {
    ldflags += [ "-Wl,-dead_strip" ]
  } else if (current_os == "win") {
    ldflags += [ "-Wl,/opt:ref" ]
  } else {
    ldflags += [ "-Wl,--gc-sections" ]
  }
}

config("linker_string_merging") {
  if (current_os == "win") {
    ldflags = [ "-Wl,/opt:lldtailmerge" ]
  } else if (current_os != "mac") {
    ldflags = [ "-Wl,-O2" ]
  }
}

# Each optimize_$optimize config below corresponds to a single setting that's
# controlled by the optimize argument. The default_optimize level is set to
# optimize_$optimize for convenience, but individual targets can override their
# optimization level by remove default_optimize and manually applying one of
# the configs below.
#
# The linker_gc_$optimize configs are an exact parallel.  default_linker_gc
# is separate from default_optimize so it can be removed separately.

# NOTE: Keep in sync with //zircon/public/gn/config/BUILD.gn

config("optimize_none") {
  cflags = [ "-O0" ]
  ldflags = cflags
  rustflags = [ "-Copt-level=0" ]
}

config("optimize_debug") {
  if (false) {
    # TODO(phosek): consider different settings to improve performance.
    # -Og is what the compiler documents as "optimize the debugging
    # experience", but zxdb team has reported Clang's -Og is problematic.
    # This should have a bug# for a detailed bug about -Og and/or Rust-O1
    # making debugging difficult in known specific reproducible ways.
    cflags = [ "-Og" ]
    ldflags = cflags
    rustflags = [ "-Copt-level=1" ]
  } else {
    configs = [ ":optimize_none" ]
  }
}

config("optimize_default") {
  cflags = [ "-O2" ]
  ldflags = cflags
  rustflags = [ "-Copt-level=2" ]
}

config("optimize_size") {
  if (is_gcc) {
    cflags = [ "-Os" ]
  } else {
    cflags = [ "-Oz" ]
  }
  ldflags = cflags
  if (!is_gcc && clang_ml_inliner) {
    cflags += [
      # `release` uses AOT model embedded inside the compiler.
      "-mllvm",
      "-enable-ml-inliner=release",
    ]
  }
  rustflags = [ "-Copt-level=z" ]
  configs = [ ":linker_string_merging" ]
}

config("optimize_speed") {
  cflags = [ "-O3" ]
  ldflags = cflags

  # TODO(http://fxbug.dev/63313): This should be the same as for C/C++. Also,
  # we don't fully understand why -Os is smaller than -Oz.
  rustflags = [ "-Copt-level=s" ]
  configs = [ ":linker_string_merging" ]
}

config("optimize_sanitizer") {
  # Instrumentation adds overhead that is greatly improved by optimization.
  # -O1 is well-tested with the instrumentation modes and does not degrade the
  # comprehensibility of backtraces produced by sanitizer failures.
  cflags = [ "-O1" ]
  ldflags = cflags
  rustflags = [ "-Copt-level=1" ]
}

config("optimize_profile") {
  # TODO(fxbug.dev/51509): Perhaps use a different default.
  configs = [ ":optimize_none" ]
}

config("default_optimize") {
  configs = [ ":optimize_${optimize}" ]
}

config("linker_gc_none") {
  # No linker GC when wholly unoptimized.
}

# Linker GC is a good default for most cases.
config("linker_gc_debug") {
  configs = [ ":linker_gc" ]
}

config("linker_gc_default") {
  configs = [ ":linker_gc" ]
}

config("linker_gc_size") {
  configs = [ ":linker_gc" ]
}

config("linker_gc_speed") {
  configs = [ ":linker_gc" ]
}

config("linker_gc_sanitizer") {
  configs = [ ":linker_gc" ]
}

config("linker_gc_profile") {
  # TODO(fxbug.dev/51509): See if we can enable linker GC for profile.
}

config("default_linker_gc") {
  configs = [ ":linker_gc_$optimize" ]
}

# Each of the debuginfo_$debuginfo configs below corresponds to a single setting
# that controls the amount of debugging information used and is controlled by
# the debuginfo argument. The default_debuginfo level is set to
# debuginfo_$debuginfo for convenience, but individual targets can override
# their debuginfo level by manually applying one of the configs below.

# NOTE: Keep in sync with //zircon/public/gn/config/BUILD.gn

config("debuginfo_none") {
  cflags = [ "-g0" ]
  asmflags = cflags
  ldflags = cflags
  rustflags = [ "-Cdebuginfo=0" ]
}

config("debuginfo_backtrace") {
  cflags = [ "-g1" ]
  asmflags = cflags
  ldflags = cflags
  rustflags = [ "-Cdebuginfo=1" ]
}

config("debuginfo_debug") {
  cflags = [ "-g3" ]
  asmflags = cflags
  ldflags = cflags
  rustflags = [ "-Cdebuginfo=2" ]
}

config("default_debuginfo") {
  configs = [ ":debuginfo_${debuginfo}" ]
  if (debuginfo != "none" && current_os == "win") {
    # TODO(fxbug.dev/55244): This produces the .pdb file, but it doesn't seem
    # to get the DWARF data out of the main output file.
    ldflags = [ "-Wl,/debug:full" ]
  }
}

config("default_frame_pointers") {
  if (enable_frame_pointers) {
    configs = [ ":frame_pointers" ]
  } else {
    configs = [ ":no_frame_pointers" ]
  }
}

config("frame_pointers") {
  cflags = [ "-fno-omit-frame-pointer" ]
  ldflags = cflags
  rustflags = [ "-Cforce-frame-pointers" ]
}

config("no_frame_pointers") {
  cflags = [ "-fomit-frame-pointer" ]
  ldflags = cflags

  # rustc automatically does this for release builds, and there's no way to
  # force it for non-release.
}

config("default_warnings") {
  cflags = [
    "-Wall",
    "-Wextra",
    "-Wnewline-eof",
    "-Wconversion",
    "-Wno-unused-parameter",
    "-Wno-unknown-warning-option",
    "-Wno-sign-conversion",

    # TODO(fxbug.dev/35965): Temporarily disable C99 designator warnings introduced in
    # https://reviews.llvm.org/D59754. After the new Clang toolchain lands
    # and we do some cleanup, this will be re-enabled.
    "-Wno-unknown-warning-option",
    "-Wno-c99-designator",

    # TODO(fxbug.dev/37215): Temporarily disable this warning until we roll toolchain.
    # Then we can re-enable it and cleanup instances it appears.
    "-Wno-int-in-bool-context",

    # TODO(fxbug.dev/37765): Keep this flag here while it is enabled in ZN to keep the
    # flags unified.
    "-Wno-address-of-packed-member",

    # TODO(fxbug.dev/43681): Temporarily disable this warning until we roll toolchain,
    # then come back and fix the instances this appears after rolling.
    "-Wno-range-loop-analysis",

    # TODO(fxbug.dev/49143): Temporarily disable this warning until we disable it
    # individually for affected third_party libraries.
    "-Wno-deprecated-declarations",
  ]
  cflags_cc = [
    # TODO(fxbug.dev/38640): Keep this flag here while it is enabled in ZN to keep the
    # flags unified.
    "-Wno-deprecated-copy",

    # TODO(fxbug.dev/45689): Temporarily disable this warning until we roll toolchain,
    # then come back and fix the instances this appears after rolling.
    "-Wno-non-c-typedef-for-linkage",

    # TODO(fxbug.dev/56202): Temporarily disable this warning until we roll toolchain,
    # then come back and fix the instances this appears after rolling.
    "-Wno-unknown-warning-option",
    "-Wno-suggest-override",
  ]
}

# TODO(fxbug.dev/58160): clean up instances of this outside of third party code.
config("Wno-reorder-init-list") {
  cflags = [ "-Wno-reorder-init-list" ]
  visibility = [
    "//garnet/examples/intl/wisdom/tests/*",
    "//src/developer/memory/metrics/tests/*",
    "//src/graphics/examples/vkcube/*",
    "//src/graphics/lib/compute/tests/*",
    "//src/graphics/tests/vkext/*",
    "//src/lib/elflib/*",
    "//src/lib/vulkan/tests/*",
    "//src/modular/bin/basemgr/*",
    "//src/modular/tests/*",
    "//third_party/*",
  ]
}

# TODO(fxbug.dev/58161): clean up instances of this outside of third party code.
config("Wno-unused-function") {
  cflags = [ "-Wno-unused-function" ]
  visibility = [
    "//src/devices/i2c/drivers/aml-i2c:aml-i2c",
    "//src/devices/i2c/drivers/intel-i2c",
    "//zircon/third_party/uapp/dash",
  ]
}

# TODO(fxbug.dev/58162): clean up instances of this outside of third party code.
config("Wno-conversion") {
  cflags = [ "-Wno-conversion" ]
  visibility = [
    "//garnet/bin/catapult_converter/*",
    "//garnet/bin/cpuperf/*",
    "//garnet/bin/cpuperf_provider/*",
    "//garnet/bin/insntrace/*",
    "//garnet/bin/insntrace/tests/*",
    "//garnet/bin/ktrace_provider/*",
    "//garnet/bin/run_test_component/*",
    "//garnet/bin/sched/*",
    "//garnet/bin/test_runner/report_result/*",
    "//garnet/bin/thermd/*",
    "//garnet/bin/time/*",
    "//garnet/bin/trace/*",
    "//garnet/bin/trace2json/*",
    "//garnet/bin/trace_manager/*",
    "//garnet/bin/ui/benchmarks/*",
    "//garnet/bin/ui/benchmarks/transparency_benchmark/*",
    "//garnet/lib/debugger_utils/*",
    "//garnet/lib/loader/*",
    "//garnet/lib/perfmon/*",
    "//garnet/lib/profiler/*",
    "//garnet/lib/trace_converters/*",
    "//garnet/public/lib/fostr/*",
    "//garnet/public/lib/test_runner/cpp/*",
    "//sdk/lib/media/audio/cpp/*",
    "//sdk/lib/media/cpp/*",
    "//sdk/lib/sys/cpp/*",
    "//sdk/lib/sys/service/cpp/*",
    "//sdk/lib/syslog/streams/cpp/*",
    "//sdk/lib/ui/scenic/cpp/*",
    "//sdk/lib/vfs/cpp/*",
    "//src/bringup/bin/bootsvc/*",
    "//src/bringup/bin/netsvc/*",
    "//src/bringup/bin/ptysvc/*",
    "//src/cobalt/bin/system-metrics/*",
    "//src/cobalt/bin/testapp/*",
    "//src/cobalt/bin/testing/*",
    "//src/connectivity/bluetooth/core/bt-host/*",
    "//src/connectivity/bluetooth/examples/bt-le-heart-rate-peripheral/*",
    "//src/connectivity/bluetooth/hci/transport/uart/*",
    "//src/connectivity/bluetooth/hci/vendor/broadcom/*",
    "//src/connectivity/bluetooth/hci/vendor/intel/*",
    "//src/connectivity/bluetooth/tools/bt-hci-tool/*",
    "//src/connectivity/bluetooth/tools/bt-intel-tool/*",
    "//src/connectivity/network/tools/nc/third_party/openbsd-netcat:nc",
    "//src/connectivity/openthread/drivers/ot-radio/*",
    "//src/connectivity/openthread/ot-stack/*",
    "//src/connectivity/openthread/tests/fake-drivers/fake-ot-radio/*",
    "//src/connectivity/openthread/third_party/*",
    "//src/connectivity/telephony/drivers/qmi-fake-transport/*",
    "//src/connectivity/telephony/drivers/qmi-usb-transport/*",
    "//src/connectivity/telephony/tests/driver-unit/*",
    "//src/connectivity/telephony/tests/fake-drivers/*",
    "//src/connectivity/wlan/drivers/realtek/rtl88xx/*",
    "//src/connectivity/wlan/drivers/testing/lib/sim-env/*",
    "//src/connectivity/wlan/drivers/third_party/*",
    "//src/connectivity/wlan/lib/common/cpp/*",
    "//src/connectivity/wlan/lib/mlme/cpp/*",
    "//src/connectivity/wlan/testing/wlantap-driver/*",
    "//src/developer/debug/debug_agent/*",
    "//src/developer/debug/ipc/*",
    "//src/developer/debug/shared/*",
    "//src/developer/debug/third_party/libunwindstack/*",
    "//src/developer/debug/zxdb/client/*",
    "//src/developer/debug/zxdb/common/*",
    "//src/developer/debug/zxdb/console/*",
    "//src/developer/debug/zxdb/expr/*",
    "//src/developer/debug/zxdb/symbols/*",
    "//src/developer/forensics/crash_reports/*",
    "//src/developer/forensics/exceptions/limbo_client/*",
    "//src/developer/forensics/feedback_data/*",
    "//src/developer/forensics/last_reboot/*",
    "//src/developer/forensics/testing/stubs/*",
    "//src/developer/forensics/utils/*",
    "//src/developer/memory/mem/*",
    "//src/developer/memory/metrics/*",
    "//src/developer/memory/metrics/tests/*",
    "//src/developer/memory/monitor/*",
    "//src/developer/system_monitor/*",
    "//src/developer/system_monitor/bin/harvester/*",
    "//src/devices/usb/bin/lsusb/*",
    "//src/diagnostics/validator/inspect/lib/cpp/*",
    "//src/graphics/display/drivers/*",
    "//src/graphics/display/drivers/display/*",
    "//src/graphics/display/drivers/ssd1306/*",
    "//src/graphics/display/testing/*",
    "//src/graphics/drivers/misc/goldfish/*",
    "//src/graphics/drivers/misc/goldfish_address_space/*",
    "//src/graphics/lib/compute/common/*",
    "//src/graphics/lib/compute/hotsort/hotsort_gen/*",
    "//src/graphics/lib/compute/hotsort/platforms/vk/*",
    "//src/graphics/lib/compute/spinel/*",
    "//src/graphics/lib/compute/svg/*",
    "//src/graphics/lib/compute/tests/*",
    "//src/graphics/tests/goldfish_benchmark/*",
    "//src/lib/backoff/*",
    "//src/lib/chunked-compression/*",
    "//src/lib/cobalt/cpp/*",
    "//src/lib/containers/cpp/*",
    "//src/lib/ddk/*",
    "//src/lib/elflib/*",
    "//src/lib/fidl_codec/*",
    "//src/lib/files/*",
    "//src/lib/fsl/socket/*",
    "//src/lib/fsl/vmo/*",
    "//src/lib/fxl/*",
    "//src/lib/icu/tools/extractor/*",
    "//src/lib/inet/*",
    "//src/lib/json_parser/*",
    "//src/lib/line_input/*",
    "//src/lib/listnode/*",
    "//src/lib/process_builder/*",
    "//src/lib/ui/input/*",
    "//src/lib/ui/scenic/cpp/*",
    "//src/lib/usb_bulk/cpp/*",
    "//src/lib/vulkan/imagepipe_view/*",
    "//src/lib/vulkan/swapchain/*",
    "//src/lib/vulkan/tests/*",
    "//src/media/audio/audio_core/*",
    "//src/media/audio/audio_core/mixer/*",
    "//src/media/audio/audio_core/test/hardware/*",
    "//src/media/audio/drivers/aml-g12-tdm/test/*",
    "//src/media/audio/drivers/intel-hda/controller/*",
    "//src/media/audio/drivers/test/*",
    "//src/media/audio/drivers/virtual_audio/*",
    "//src/media/audio/effects/test_effects/*",
    "//src/media/audio/examples/effects/*",
    "//src/media/audio/examples/fx/*",
    "//src/media/audio/examples/simple_sine/*",
    "//src/media/audio/examples/sync_sine/*",
    "//src/media/audio/examples/tones/*",
    "//src/media/audio/lib/analysis/*",
    "//src/media/audio/lib/clock/*",
    "//src/media/audio/lib/effects_loader/*",
    "//src/media/audio/lib/format/*",
    "//src/media/audio/lib/simple-audio-stream/*",
    "//src/media/audio/lib/test/*",
    "//src/media/audio/lib/timeline/*",
    "//src/media/audio/lib/wav/*",
    "//src/media/audio/tools/audio-capture-timestamp-validator/*",
    "//src/media/audio/tools/audio-driver-ctl/*",
    "//src/media/codec/codecs/*",
    "//src/media/codec/examples/encode_camera/*",
    "//src/media/codec/examples/encode_file/*",
    "//src/media/codec/examples/use_media_decoder/*",
    "//src/media/drivers/amlogic_decoder/*",
    "//src/media/lib/codec_impl/*",
    "//src/media/lib/test/*",
    "//src/media/playback/mediaplayer/*",
    "//src/media/playback/mediaplayer/demux/*",
    "//src/media/playback/mediaplayer/graph/*",
    "//src/media/playback/mediaplayer/metrics/*",
    "//src/media/sounds/soundplayer/*",
    "//src/modular/bin/sessionctl/*",
    "//src/modular/bin/sessionmgr/*",
    "//src/modular/lib/async/cpp/*",
    "//src/modular/lib/fidl/*",
    "//src/modular/lib/integration_testing/cpp/*",
    "//src/security/tee_manager/*",
    "//src/storage/bin/dd/*",
    "//src/storage/blobfs/*",
    "//src/storage/blobfs/test/*",
    "//src/storage/minfs/*",
    "//src/storage/volume_image/ftl/*",
    "//src/storage/volume_image/utils/*",
    "//src/sys/activity/*",
    "//src/sys/appmgr/*",
    "//src/sys/bin/psutils/*",
    "//src/sys/lib/chrealm/*",
    "//src/sys/pkg/lib/far/*",
    "//src/sys/sysmgr/*",
    "//src/sys/time/lib/network_time/*",
    "//src/sys/tools/activity-ctl/*",
    "//src/sys/tools/log/*",
    "//src/testing/loadbench/*",
    "//src/ui/a11y/bin/a11y_manager/tests/util/*",
    "//src/ui/a11y/lib/annotation/*",
    "//src/ui/a11y/lib/semantics/util/tests/*",
    "//src/ui/a11y/lib/util/*",
    "//src/ui/bin/root_presenter/*",
    "//src/ui/examples/*",
    "//src/ui/examples/bouncing_ball/*",
    "//src/ui/examples/embedder/*",
    "//src/ui/input/drivers/ft8201/*",
    "//src/ui/input/drivers/hid/*",
    "//src/ui/input/drivers/pc-ps2/*",
    "//src/ui/input/lib/hid-input-report/*",
    "//src/ui/scenic/lib/display/*",
    "//src/ui/scenic/lib/gfx/*",
    "//src/ui/scenic/lib/scenic/util/*",
    "//src/ui/scenic/lib/scheduling/*",
    "//src/ui/scenic/lib/watchdog/*",
    "//src/ui/tools/simple-touch/*",
    "//src/ui/tools/tiles_ctl/*",
    "//src/virtualization/bin/guest/*",
    "//src/virtualization/bin/guest_manager/*",
    "//src/virtualization/bin/vmm/*",
    "//src/virtualization/bin/vmm/device/*",
    "//src/virtualization/buildtools/*",
    "//src/virtualization/lib/vsh/*",
    "//src/virtualization/tests/*",
    "//src/virtualization/third_party/fdt/*",
    "//src/zircon/tests/evil/*",
    "//third_party/*",
    "//tools/bootserver_old/*",
    "//tools/fidlcat/*",
    "//tools/loglistener/*",
    "//tools/netprotocol/*",
    "//tools/vboot_reference/*",
    "//vendor/*",
    "//zircon/system/ulib/audio-utils-legacy/*",
    "//zircon/system/ulib/audio-utils/*",
    "//zircon/system/ulib/cobalt-client/*",
    "//zircon/system/ulib/disk_inspector/*",
    "//zircon/system/ulib/driver-info/*",
    "//zircon/system/ulib/edid/*",
    "//zircon/system/ulib/elf-search/*",
    "//zircon/system/ulib/framebuffer/*",
    "//zircon/system/ulib/fs-host/*",
    "//zircon/system/ulib/fs/*",
    "//zircon/system/ulib/ftl/*",
    "//zircon/system/ulib/fvm/*",
    "//zircon/system/ulib/fzl/*",
    "//zircon/system/ulib/hid-parser/*",
    "//zircon/system/ulib/hid/*",
    "//zircon/system/ulib/image-format/*",
    "//zircon/system/ulib/inet6/*",
    "//zircon/system/ulib/inspect/*",
    "//zircon/system/ulib/inspector/*",
    "//zircon/system/ulib/intel-hda/*",
    "//zircon/system/ulib/kcounter/*",
    "//zircon/system/ulib/ktrace/*",
    "//zircon/system/ulib/launchpad/*",
    "//zircon/system/ulib/log/*",
    "//zircon/system/ulib/logger/*",
    "//zircon/system/ulib/memfs/*",
    "//zircon/system/ulib/mini-process/*",
    "//zircon/system/ulib/profile/*",
    "//zircon/system/ulib/ramdevice-client/*",
    "//zircon/system/ulib/runtests-utils/*",
    "//zircon/system/ulib/sysconfig-client/*",
    "//zircon/system/ulib/syslog/*",
    "//zircon/system/ulib/sysmem-version/*",
    "//zircon/system/ulib/task-utils/*",
    "//zircon/system/ulib/tee-client-api/*",
    "//zircon/system/ulib/trace-engine/*",
    "//zircon/system/ulib/trace-reader/*",
    "//zircon/system/ulib/trace-test-utils/*",
    "//zircon/system/ulib/trace/*",
    "//zircon/system/ulib/unittest/*",
    "//zircon/system/ulib/virtio/*",
    "//zircon/system/ulib/zbi-bootfs/*",
    "//zircon/system/ulib/zxio/*",
    "//zircon/system/utest/msd/*",
    "//zircon/third_party/*",
    "//zircon/tools/blobfs/*",
    "//zircon/tools/fvm/*",
    "//zircon/tools/ktrace-dump/*",
    "//zircon/tools/lz4/*",
    "//zircon/tools/merkleroot/*",
    "//zircon/tools/minfs/*",
    "//zircon/tools/mtd-redundant-storage/*",
    "//zircon/tools/xdc-server/*",
  ]
}

# TODO(fxbug.dev/58162): clean up instances of this outside of third party code.
# This is the same as "Wno-conversion" above but without a visibility list.
# This in turn allows us to have generated code depend on this config. Having
# an explicit allowlist for generated code (e.g. fidl_cpp template expansions)
# is not practical.
# Please use with care, or not at all.
config("Wno-conversion-generated") {
  cflags = [ "-Wno-conversion" ]
}

config("symbol_visibility_hidden") {
  # Disable libc++ visibility annotations to make sure that the compiler option
  # has effect on symbols defined in libc++ headers. Note that we don't want to
  # disable these annotations altogether to ensure that our toolchain is usable
  # outside of our build since not every user uses hidden visibility by default.
  defines = [ "_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS" ]
  cflags = [ "-fvisibility=hidden" ]
}

config("symbol_no_undefined") {
  if (current_os == "mac") {
    ldflags = [ "-Wl,-undefined,error" ]
  } else {
    ldflags = [ "-Wl,--no-undefined" ]
  }
}

config("shared_library_config") {
  configs = []
  cflags = []

  if (current_os == "fuchsia") {
    configs += [ "//build/config/fuchsia:shared_library_config" ]
  } else if (current_os == "linux") {
    cflags += [ "-fPIC" ]
  } else if (current_os == "mac") {
    configs += [ "//build/config/mac:mac_dynamic_flags" ]
  }
}

config("executable_config") {
  configs = []

  if (current_os == "fuchsia") {
    configs += [ "//build/config/fuchsia:executable_config" ]
  } else if (current_os == "mac") {
    configs += [
      "//build/config/mac:mac_dynamic_flags",
      "//build/config/mac:mac_executable_flags",
    ]
  }
}

config("default_libs") {
  configs = []

  if (current_os == "mac") {
    configs += [ "//build/config/mac:default_libs" ]
  }
}

config("no-shadow-call-stack") {
  if (current_cpu == "arm64") {
    cflags = [ "-fsanitize=no-shadow-call-stack" ]
  }
}

# Defines a Rust cfg flag with the value of the rust_panic build arg.
# Useful for changing behavior of code based on panic behavior.
config("rust_panic_cfg") {
  rustflags = [ "--cfg=rust_panic=\"${rust_panic}\"" ]
}

config("werror") {
  if (!use_ccache) {
    cflags = [
      "-Werror",

      # Declarations marked as deprecated should cause build failures, rather
      # they should emit warnings to notify developers about the use of
      # deprecated interfaces.
      "-Wno-error=deprecated-declarations",

      # Do not add additional -Wno-error to this config.
    ]

    asmflags = [ "-Wa,--fatal-warnings" ]
    cflags += asmflags
  }
  rustflags = [ "-Dwarnings" ]
}

config("temporarily_disable_ubsan_do_not_use") {
  cflags = [ "-fno-sanitize=undefined" ]
}

config("no_stack_protector") {
  cflags = [ "-fno-stack-protector" ]
}

config("no_sanitizers") {
  cflags = [
    "-fno-sanitize=all",
    "-fsanitize-coverage=0",
  ]
  configs = [ ":no_stack_protector" ]
}

config("no_profile") {
  # The difference between this config and removing //build/config/profile is
  # the dynamic linker setting which is necessary for it to use at runtime with
  # the libraries it was linked against.
  cflags = [
    "-fno-profile-instr-generate",
    "-fno-coverage-mapping",
  ]
}

# IMPORTANT: Keep the configs below in sync with //zircon/public/gn/config/BUILD.zircon.gn
# TODO(fxbug.dev/54322): Remove above comment after build unification.

config("icf") {
  # This changes C/C++ semantics and might be incompatible with third-party
  # code that relies on function pointers comparison.
  if (current_os == "win" && (linker == "lld" || !is_gcc)) {
    ldflags = [ "-Wl,/opt:icf=all" ]
  } else if (linker == "gold" || linker == "lld") {
    ldflags = [ "-Wl,--icf=all" ]
  }
}

# "_ALL_SOURCE" is used by some system headers to expose more features (say in fcntl.h) beyond those
# strictly defined in standard.
config("all_source") {
  defines = [ "_ALL_SOURCE" ]
}

config("thread_safety_annotations") {
  if (!is_gcc) {
    cflags = [ "-Wthread-safety" ]
    defines = [ "_LIBCPP_ENABLE_THREAD_SAFETY_ANNOTATIONS" ]
  }
}

# Tools that must be executed locally.
pool("local") {
  depth = default_concurrent_jobs.local
}
