# Copyright 2020 The Pigweed Authors
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may not
# use this file except in compliance with the License. You may obtain a copy of
# the License at
#
#     https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations under
# the License.

import("//build_overrides/pi_pico.gni")
import("//build_overrides/pigweed.gni")

import("$dir_pw_android_toolchain/android.gni")
import("$dir_pw_arduino_build/arduino.gni")
import("$dir_pw_build/coverage_report.gni")
import("$dir_pw_build/host_tool.gni")
import("$dir_pw_build/python.gni")
import("$dir_pw_docgen/docs.gni")
import("$dir_pw_perf_test/perf_test.gni")
import("$dir_pw_rpc/config.gni")
import("$dir_pw_rust/rust.gni")
import("$dir_pw_third_party/ambiq/ambiq.gni")
import("$dir_pw_third_party/fuzztest/fuzztest.gni")
import("$dir_pw_third_party/mcuxpresso/mcuxpresso.gni")
import("$dir_pw_toolchain/c_optimization.gni")
import("$dir_pw_toolchain/generate_toolchain.gni")
import("$dir_pw_toolchain/non_c_toolchain.gni")
import("$dir_pw_trace/backend.gni")
import("$dir_pw_unit_test/test.gni")

# Main build file for upstream Pigweed.

declare_args() {
  # The default C++ optimization level for building upstream Pigweed targets.
  #
  # Must be one of "debug", "size_optimized", or "speed_optimized".
  pw_DEFAULT_C_OPTIMIZATION_LEVEL = "debug"

  # The C++ optimization levels for which to generate targets.
  #
  # Supported levels are "debug", "size_optimized", or "speed_optimized".
  pw_C_OPTIMIZATION_LEVELS = [
    "debug",
    "size_optimized",
  ]

  # List of application image GN targets specific to the Pigweed target.
  pw_TARGET_APPLICATIONS = []

  # Gates known broken configurations from building. This is what allows the
  # implicit `all` target to work even though there are known broken targets.
  pw_BUILD_BROKEN_GROUPS = false
}

# This toolchain is used to force some dependencies to not be parsed by the
# default toolchain. This is desirable because the default toolchain generates
# build steps for all parsed targets, not just desired dependencies.
if (current_toolchain == default_toolchain) {
  pw_non_c_toolchain("non_default_toolchain") {
  }
}

# List any optimization levels in pw_C_OPTIMIZATION_LEVELS that are not in
# pw_toolchain_SUPPORTED_C_OPTIMIZATION_LEVELS. This is accomplished by adding
# all supported levels to the selected levels, then removing all supported
# levels. The remaining list contains only the unsupported levels.
_unknown_optimization_levels =
    pw_C_OPTIMIZATION_LEVELS + pw_toolchain_SUPPORTED_C_OPTIMIZATION_LEVELS -
    pw_toolchain_SUPPORTED_C_OPTIMIZATION_LEVELS

assert(_unknown_optimization_levels == [],
       "pw_C_OPTIMIZATION_LEVELS includes unsupported optimization levels: " +
           "$_unknown_optimization_levels")

# Assert that the selected pw_DEFAULT_C_OPTIMIZATION_LEVEL is in the
# pw_toolchain_SUPPORTED_C_OPTIMIZATION_LEVELS list. This is done by adding then
# removing all instances of the selected levels from the supported levels list.
# If the resulting list did not change, then no supported levels were removed,
# indicating that pw_DEFAULT_C_OPTIMIZATION_LEVEL is not a supported value.
assert(pw_toolchain_SUPPORTED_C_OPTIMIZATION_LEVELS +
           [ pw_DEFAULT_C_OPTIMIZATION_LEVEL ] -
           [ pw_DEFAULT_C_OPTIMIZATION_LEVEL ] !=
           pw_toolchain_SUPPORTED_C_OPTIMIZATION_LEVELS,
       "pw_DEFAULT_C_OPTIMIZATION_LEVEL (\"$pw_DEFAULT_C_OPTIMIZATION_LEVEL" +
           "\") must be one of the supported values: " +
           "$pw_toolchain_SUPPORTED_C_OPTIMIZATION_LEVELS")

# Enumerate all of the different targets that upstream Pigweed will build by
# default. Downstream projects should not depend on this target; this target is
# exclusively to facilitate easy upstream development and testing.
group("default") {
  deps = [
    ":docs",
    ":host",
    ":pi_pico",
    ":python.lint",
    ":python.tests",
    ":static_analysis",
    ":stm32f429i",
    ":warn_if_modules_out_of_date",
  ]
}

# This group tries to collect together most build steps in Pigweed's build.
# Some targets in this group are not included in the main build to keep the
# default build time down, while others are excluded from the main build because
# they require additional configuration or don't work on every OS.
#
# To increase coverage, use `pw package` to install these packages:
#   boringssl
#   freertos
#   mbedtls
#   micro-ecc
#   nanopb
#   pico_sdk
#   protobuf
#   stm32cube_f4
#   teensy
group("extended_default") {
  deps = [
    ":cpp20_compatibility",
    ":default",
    ":host_clang_debug_dynamic_allocation",
    ":pw_system_demo",
    ":stm32f429i",
  ]

  if (host_os != "win") {
    deps += [
      ":qemu_clang",
      ":qemu_gcc",
    ]
  }

  if (host_os == "linux") {
    deps += [
      ":integration_tests",
      ":runtime_sanitizers",
    ]
  }

  # Requires setting pw_arduino_build_CORE_PATH.
  if (pw_arduino_build_CORE_PATH != "") {
    deps += [ ":arduino" ]
  }

  # Requires setting pw_third_party_mcuxpresso_SDK.
  if (pw_third_party_mcuxpresso_SDK != "") {
    deps += [ ":mimxrt595" ]
  }
}

# Verify that this BUILD.gn file is only used by Pigweed itself.
assert(get_path_info("//", "abspath") == get_path_info(".", "abspath"),
       "Pigweed's top-level BUILD.gn may only be used when building upstream " +
           "Pigweed. To pull all Pigweed code into your build, import " +
           "\$dir_pigweed/modules.gni and create a top-level pw_test_group " +
           "that depends on the tests in pw_module_tests. See " +
           "https://pigweed.dev/build_system.html for details.")

_update_or_check_modules_lists = {
  script = "$dir_pw_build/py/pw_build/generate_modules_lists.py"
  args = [
    rebase_path(".", root_build_dir),
    rebase_path("PIGWEED_MODULES", root_build_dir),
    rebase_path("$dir_pw_build/generated_pigweed_modules_lists.gni",
                root_build_dir),
  ]
  inputs = [
    "$dir_pw_build/generated_pigweed_modules_lists.gni",
    "PIGWEED_MODULES",
  ]
}

# There are races if the module check and module file update are run at the same
# time. Force them to be serialized to prevent races. As long as the generated
# module file is up to date, they'll pass.
pool("module_check_pool") {
  depth = 1
}

# Warns if PIGWEED_MODULES is not up-to-date and sorted.
action("warn_if_modules_out_of_date") {
  forward_variables_from(_update_or_check_modules_lists, "*")
  outputs = [ "$target_gen_dir/$target_name.passed" ]
  args += [
            "--mode=WARN",
            "--stamp",
          ] + rebase_path(outputs, root_build_dir)
  pool = ":module_check_pool"
}

# Fails if PIGWEED_MODULES is not up-to-date and sorted.
action("check_modules") {
  forward_variables_from(_update_or_check_modules_lists, "*")
  outputs = [ "$target_gen_dir/$target_name.ALWAYS_RERUN" ]  # Never created
  args += [ "--mode=CHECK" ]
  pool = ":module_check_pool"
}

# Run this command after adding an item to PIGWEED_MODULES to update the
# generated .gni with Pigweed modules lists.
action("update_modules") {
  forward_variables_from(_update_or_check_modules_lists, "*")
  outputs = [ "$target_gen_dir/$target_name.ALWAYS_RERUN" ]  # Never created
  args += [ "--mode=UPDATE" ]
  pool = ":module_check_pool"
}

group("pw_system_demo") {
  deps = [ "$dir_pw_system:system_examples(:non_default_toolchain)" ]
}

group("pi_pico") {
  if (PICO_SRC_DIR != "") {
    deps = [ ":pigweed_default(targets/rp2040:rp2040.size_optimized)" ]
  }
}

_internal_toolchains = "$dir_pigweed/targets/host/pigweed_internal"

# This template generates a group that builds pigweed_default with a particular
# toolchain.
template("_build_pigweed_default_at_all_optimization_levels") {
  _toolchain_prefix = invoker.toolchain_prefix

  group(target_name) {
    deps = [
      ":pigweed_default(${_toolchain_prefix}$pw_DEFAULT_C_OPTIMIZATION_LEVEL)",
    ]
  }

  foreach(optimization, pw_C_OPTIMIZATION_LEVELS) {
    group(target_name + "_$optimization") {
      deps = [ ":pigweed_default($_toolchain_prefix$optimization)" ]
    }
  }
}

# Select a default toolchain based on host OS.
if (host_os == "linux") {
  _default_toolchain_prefix = "$_internal_toolchains:pw_strict_host_clang_"
} else if (host_os == "mac") {
  _default_toolchain_prefix = "$_internal_toolchains:pw_strict_host_clang_"
} else if (host_os == "win") {
  _default_toolchain_prefix = "$_internal_toolchains:pw_strict_host_gcc_"
} else {
  assert(false, "Please define a host config for your system: $host_os")
}

# Below are a list of GN targets you can build to force Pigweed to build for a
# specific Pigweed target.
_build_pigweed_default_at_all_optimization_levels("host") {
  toolchain_prefix = _default_toolchain_prefix
}

_build_pigweed_default_at_all_optimization_levels("host_clang") {
  toolchain_prefix = "$_internal_toolchains:pw_strict_host_clang_"
}

# GCC is only supported for Windows. Pigweed doesn't yet provide a Windows
# clang toolchain, and Pigweed does not provide gcc toolchains for macOS and
# Linux.
if (host_os == "win") {
  _build_pigweed_default_at_all_optimization_levels("host_gcc") {
    toolchain_prefix = "$_internal_toolchains:pw_strict_host_gcc_"
  }
}

if (pw_third_party_mcuxpresso_SDK != "") {
  _build_pigweed_default_at_all_optimization_levels("mimxrt595") {
    toolchain_prefix = "$dir_pigweed/targets/mimxrt595_evk:mimxrt595_evk_"
  }

  _build_pigweed_default_at_all_optimization_levels("mimxrt595_freertos") {
    toolchain_prefix =
        "$dir_pigweed/targets/mimxrt595_evk_freertos:mimxrt595_evk_freertos_"
  }
}

if (dir_pw_third_party_ambiq_SDK != "") {
  _build_pigweed_default_at_all_optimization_levels("apollo4") {
    toolchain_prefix = "$dir_pigweed/targets/apollo4:apollo4_"
  }
}

_build_pigweed_default_at_all_optimization_levels("stm32f429i") {
  toolchain_prefix = "$dir_pigweed/targets/stm32f429i_disc1:stm32f429i_disc1_"
}

if (pw_arduino_build_CORE_PATH != "") {
  _build_pigweed_default_at_all_optimization_levels("arduino") {
    toolchain_prefix = "$dir_pigweed/targets/arduino:arduino_"
  }
}

# TODO: b/244604080 - Inline string tests are too big to fit in the QEMU firmware
# except under a size-optimized build. For now, only build size-optimized.
if (pw_BUILD_BROKEN_GROUPS) {
  _build_pigweed_default_at_all_optimization_levels("qemu_gcc") {
    toolchain_prefix =
        "$dir_pigweed/targets/lm3s6965evb_qemu:lm3s6965evb_qemu_gcc_"
  }
  _build_pigweed_default_at_all_optimization_levels("qemu_clang") {
    toolchain_prefix =
        "$dir_pigweed/targets/lm3s6965evb_qemu:lm3s6965evb_qemu_clang_"
  }
} else {
  group("qemu_gcc_size_optimized") {
    deps = [ ":pigweed_default($dir_pigweed/targets/lm3s6965evb_qemu:lm3s6965evb_qemu_gcc_size_optimized)" ]
  }
  group("qemu_gcc") {
    deps = [ ":qemu_gcc_size_optimized" ]
  }
  group("qemu_clang_size_optimized") {
    deps = [ ":pigweed_default($dir_pigweed/targets/lm3s6965evb_qemu:lm3s6965evb_qemu_clang_size_optimized)" ]
  }
  group("qemu_clang") {
    deps = [ ":qemu_clang_size_optimized" ]
  }
}

# Run clang-tidy on pigweed_default with pw_strict_host_clang_debug toolchain options.
# Make sure to invoke gn clean out when any relevant .clang-tidy
# file is updated.
group("static_analysis") {
  # Static analysis is only supported on Linux and macOS using clang-tidy.
  if (host_os != "win") {
    _toolchain = "$_internal_toolchains:pw_strict_host_clang_debug"
    deps = [ ":pigweed_default($_toolchain.static_analysis)" ]
  }
}

if (pw_android_toolchain_NDK_PATH != "") {
  group("android") {
    deps = []
    foreach(_cpu, pw_android_toolchain_cpu_targets) {
      _toolchain_prefix = "$dir_pigweed/targets/android:${_cpu}_android_"
      deps += [
        ":pigweed_default($_toolchain_prefix$pw_DEFAULT_C_OPTIMIZATION_LEVEL)",
      ]
    }
  }

  foreach(_cpu, pw_android_toolchain_cpu_targets) {
    _build_pigweed_default_at_all_optimization_levels("${_cpu}_android") {
      toolchain_prefix = "$dir_pigweed/targets/android:${_cpu}_android_"
    }
  }
}

group("docs") {
  deps = [ "$dir_pigweed/docs($dir_pigweed/targets/docs)" ]
}

# Tests that are run as host actions, such as tests of the build system.
#
# These are distinguished from `integration_tests` in that they are short
# unit tests of specific functionality that should be tested in the default
# build.
group("action_tests") {
  _default_tc = _default_toolchain_prefix + pw_DEFAULT_C_OPTIMIZATION_LEVEL
  deps = [ ":pw_action_tests.run($_default_tc)" ]
}

# Tests larger than unit tests, typically run in a specific configuration.
group("integration_tests") {
  _default_tc = _default_toolchain_prefix + pw_DEFAULT_C_OPTIMIZATION_LEVEL
  deps = [ ":pw_integration_tests.run($_default_tc)" ]
}

group("pip_constraint_update") {
  public_deps = []

  if (current_toolchain == pw_build_PYTHON_TOOLCHAIN) {
    public_deps += [ "$dir_pw_env_setup:pigweed_build_venv._compile_requirements($pw_build_PYTHON_TOOLCHAIN)" ]
  } else {
    public_deps = [ ":${target_name}($pw_build_PYTHON_TOOLCHAIN)" ]
  }
}

group("pip_vendor_wheels") {
  public_deps = []

  if (current_toolchain == pw_build_PYTHON_TOOLCHAIN) {
    public_deps += [ "$dir_pw_env_setup:pigweed_build_venv.vendor_wheels($pw_build_PYTHON_TOOLCHAIN)" ]
  } else {
    public_deps = [ ":${target_name}($pw_build_PYTHON_TOOLCHAIN)" ]
  }
}

group("fuzzers") {
  deps = []

  if (host_os != "win" && dir_pw_third_party_fuzztest != "") {
    # Coverage-guided fuzzing is only supported on Linux and MacOS using clang.
    # Fuzztest-based fuzzers will run in unit test mode. libFuzzer-based fuzzers
    # will only build.
    _clang_fuzz_tc = _default_toolchain_prefix + "fuzz"
    deps += [ ":pw_module_tests.run($_clang_fuzz_tc)" ]
  }

  # Also build (but do not run) bespoke fuzzers.
  if (!pw_toolchain_OSS_FUZZ_ENABLED) {
    _default_tc = _default_toolchain_prefix + pw_DEFAULT_C_OPTIMIZATION_LEVEL
    deps += [ ":pw_custom_fuzzers($_default_tc)" ]
  }
}

# Build-only target for OSS-Fuzz. No-op unless OSS-Fuzz is enabled.
group("oss_fuzz") {
  if (pw_toolchain_OSS_FUZZ_ENABLED) {
    _clang_fuzz_tc = _default_toolchain_prefix + "fuzz"
    deps = [ ":pw_module_tests($_clang_fuzz_tc)" ]
  }
}

group("asan") {
  # TODO: b/302181521 - asan doesn't work on Windows yet.
  if (host_os != "win") {
    deps = [ ":pw_module_tests.run($dir_pigweed/targets/host:host_clang_asan)" ]
  }
}

# TODO: b/234876100 - msan will not work without false positives until the C++
# standard library included in the sysroot has a variant built with msan.
group("msan") {
  # TODO: b/259695498 - msan doesn't work on macOS yet.
  # TODO: b/302181521 - msan doesn't work on Windows yet.
  if (pw_BUILD_BROKEN_GROUPS) {
    deps = [ ":pw_module_tests.run($dir_pigweed/targets/host:host_clang_msan)" ]
  }
}

group("tsan") {
  # TODO: b/302181521 - tsan doesn't work on Windows yet.
  if (host_os != "win") {
    deps = [ ":pw_module_tests.run($dir_pigweed/targets/host:host_clang_tsan)" ]
  }
}

group("ubsan") {
  # TODO: b/259695498 - ubsan doesn't work on macOS yet.
  # TODO: b/302181521 - ubsan doesn't work on Windows yet.
  if ((host_os != "win" && host_os != "mac") || pw_BUILD_BROKEN_GROUPS) {
    deps =
        [ ":pw_module_tests.run($dir_pigweed/targets/host:host_clang_ubsan)" ]
  }
}

group("ubsan_heuristic") {
  # TODO: b/259695498 - ubsan_heuristic doesn't work on macOS yet.
  # TODO: b/302181521 - ubsan doesn't work on Windows yet.
  if ((host_os != "win" && host_os != "mac") || pw_BUILD_BROKEN_GROUPS) {
    deps = [ ":pw_module_tests.run($dir_pigweed/targets/host:host_clang_ubsan_heuristic)" ]
  }
}

group("runtime_sanitizers") {
  if (host_os != "win" || pw_BUILD_BROKEN_GROUPS) {
    deps = [
      ":asan",
      ":tsan",
      ":ubsan",
    ]

    if (pw_BUILD_BROKEN_GROUPS) {
      # TODO: b/234876100 - msan will not work until the C++ standard library
      # included in the sysroot has a variant built with msan.
      deps += [ ":msan" ]

      # No ubsan_heuristic, which may have false positives.
      deps += [ ":ubsan_heuristic" ]
    }
  }
}

group("coverage") {
  if (host_os == "linux") {
    deps = [ ":coverage_report($dir_pigweed/targets/host:host_clang_coverage)" ]
  }
}

pw_python_group("python") {
  python_deps = [
    "$dir_pw_env_setup:python($pw_build_PYTHON_TOOLCHAIN)",
    "$dir_pw_env_setup:sample_project_action($pw_build_PYTHON_TOOLCHAIN)",
    "$dir_pw_env_setup:target_support_packages($pw_build_PYTHON_TOOLCHAIN)",
  ]
}

group("pigweed_pypi_distribution") {
  deps = [ "$dir_pw_env_setup:pypi_pigweed_python_source_tree($pw_build_PYTHON_TOOLCHAIN)" ]
}

# Build host-only tooling.
group("host_tools") {
  deps = [
    "$dir_pw_target_runner/go:simple_client(:non_default_toolchain)",
    "$dir_pw_target_runner/go:simple_server(:non_default_toolchain)",
  ]

  if (pw_rust_ENABLE_EXPERIMENTAL_BUILD) {
    deps += [ "$dir_pw_rust/examples/host_executable:host_executable($dir_pigweed/targets/host:host_clang_debug)" ]
  }
}

# By default, Pigweed will build this target when invoking ninja.
group("pigweed_default") {
  deps = []

  # Prevent the default toolchain from parsing any other BUILD.gn files.
  if (current_toolchain != default_toolchain) {
    _is_host_toolchain = defined(pw_toolchain_SCOPE.is_host_toolchain) &&
                         pw_toolchain_SCOPE.is_host_toolchain

    deps = [ ":apps" ]

    # Upstream GoogleTest assumes the presence of a POSIX filesystem. If an
    # external gtest backend has been provided, limit the tests to host-only.
    if (pw_unit_test_BACKEND == "$dir_pw_unit_test:light" ||
        _is_host_toolchain) {
      if (pw_unit_test_AUTOMATIC_RUNNER == "") {
        # Without a test runner defined, build the tests but don't run them.
        deps += [ ":pw_module_tests" ]
      } else {
        # With a test runner, depend on the run targets so they run with the
        # build.
        deps += [ ":pw_module_tests.run" ]
      }

      # Add performance tests to the automatic build
      deps += [ ":pw_perf_tests" ]
    }

    # Add action tests to the automatic build
    if (_is_host_toolchain) {
      deps += [ ":pw_action_tests.run" ]
    }

    # Trace examples currently only support running on non-windows host
    if (_is_host_toolchain && host_os != "win") {
      deps += [ "$dir_pw_trace:trace_example_basic" ]

      if (get_label_info(pw_trace_BACKEND, "label_no_toolchain") ==
          get_label_info(":pw_trace_tokenized", "label_no_toolchain")) {
        deps += [
          "$dir_pw_trace_tokenized:trace_tokenized_example_basic",
          "$dir_pw_trace_tokenized:trace_tokenized_example_filter",
          "$dir_pw_trace_tokenized:trace_tokenized_example_linux_group_by_tid",
          "$dir_pw_trace_tokenized:trace_tokenized_example_rpc",
          "$dir_pw_trace_tokenized:trace_tokenized_example_trigger",
        ]
      }
    }
  }
}

# Build Pigweed with -std=c++20 to ensure compatibility. Compile with
# optimizations since the compiler tends to catch more errors with optimizations
# enabled than without.
group("cpp20_compatibility") {
  _cpp20_tc = "$_internal_toolchains:pw_strict_host_clang_size_optimized_cpp20"
  deps = [ ":pigweed_default($_cpp20_tc)" ]
}

group("build_with_pw_minimal_cpp_stdlib") {
  _toolchain = "$_internal_toolchains:pw_strict_host_clang_size_optimized_minimal_cpp_stdlib"

  # This list of supported modules is incomplete.
  deps = [
    "$dir_pw_base64($_toolchain)",
    "$dir_pw_containers:inline_var_len_entry_queue($_toolchain)",
    "$dir_pw_status($_toolchain)",
    "$dir_pw_tokenizer:base64($_toolchain)",
    "$dir_pw_tokenizer($_toolchain)",
    "$dir_pw_varint($_toolchain)",
  ]
}

group("host_clang_debug_dynamic_allocation") {
  _toolchain =
      "$_internal_toolchains:pw_strict_host_clang_debug_dynamic_allocation"
  deps = [ ":pigweed_default($_toolchain)" ]
}

# The default toolchain is not used for compiling C/C++ code.
if (current_toolchain != default_toolchain) {
  group("apps") {
    # Application images built for all targets.
    deps = [ "$dir_pw_hdlc/rpc_example" ]

    # Add target-specific images.
    deps += pw_TARGET_APPLICATIONS

    # Add host-only targets to the build.
    if (defined(pw_toolchain_SCOPE.is_host_toolchain) &&
        pw_toolchain_SCOPE.is_host_toolchain) {
      # TODO: b/240982565 - Build integration tests on Windows and macOS when
      #     SocketStream supports those platforms.
      if (host_os == "linux") {
        # Build the integration test binaries, but don't run them by default.
        deps += [
          "$dir_pw_rpc:client_integration_test",
          "$dir_pw_rpc:test_rpc_server",
          "$dir_pw_unit_test:test_rpc_server",
        ]
      }
    }

    if (current_os == "linux") {
      deps += [
        "$dir_pw_digital_io_linux:pw_digital_io_linux_cli",
        "$dir_pw_spi_linux:pw_spi_linux_cli",
      ]
    }
  }

  # All Pigweed modules that can be built using gn. Not built by default.
  group("pw_modules") {
    deps = pw_modules
  }

  # Targets for all module unit test groups.
  pw_test_group("pw_module_tests") {
    group_deps = pw_module_tests
    output_metadata = true
  }

  pw_test_group("pw_action_tests") {
    tests = [ "$dir_pw_unit_test:test_group_metadata_test" ]
  }

  pw_test_group("pw_integration_tests") {
    tests = [
      "$dir_pw_build/py/gn_tests:python_package_integration_tests",
      "$dir_pw_cli/py:process_integration_test",
      "$dir_pw_rpc:cpp_client_server_integration_test",
      "$dir_pw_rpc/py:python_client_cpp_server_test",
      "$dir_pw_unit_test/py:rpc_service_test",
    ]

    output_metadata = true
  }

  pw_test_group("pw_perf_tests") {
    tests = [
      "$dir_pw_checksum:perf_tests",
      "$dir_pw_perf_test:examples",
      "$dir_pw_protobuf:perf_tests",
    ]
    output_metadata = true
  }

  # Fuzzers not based on a fuzzing engine. Engine-based fuzzers should be
  # included in `pw_module_tests`.
  pw_test_group("pw_custom_fuzzers") {
    # TODO: b/274437709 - The RPC client_fuzzer encounters build errors on macos.
    # Limit it to Linux hosts for now.
    if (host_os == "linux") {
      tests = [ "$dir_pw_rpc/fuzz:client_fuzzer" ]
    }
    output_metadata = true
  }

  pw_coverage_report("coverage_report") {
    filter_paths = []
    ignore_filename_patterns = [
      "third_party",
      "protocol_buffer/gen",
    ]
    group_deps = [ ":pw_module_tests" ]
  }
}
