# 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/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 = []
}

# 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",
  ]
}

# 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)" ]
  }
}

_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_"
  }
}

_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.
#
# _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_"
# }
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)" ]
  }
}

# Build-only target for fuzzers.
group("fuzzers") {
  deps = []

  if (host_os != "win") {
    # 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)" ]
  }

  # Include additional, bespoke fuzzers.
  if (!pw_toolchain_OSS_FUZZ_ENABLED) {
    _default_tc = _default_toolchain_prefix + pw_DEFAULT_C_OPTIMIZATION_LEVEL
    deps += [ ":pw_custom_fuzzers($_default_tc)" ]
  }
}

group("asan") {
  if (host_os != "win") {
    deps = [ ":pw_module_tests.run($dir_pigweed/targets/host:host_clang_asan)" ]
  }
}

# TODO(b/234876100): msan will not work 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.
  if (host_os != "win" && host_os != "mac" && host_os != "linux") {
    deps = [ ":pw_module_tests.run($dir_pigweed/targets/host:host_clang_msan)" ]
  }
}

group("tsan") {
  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.
  if (host_os != "win" && host_os != "mac") {
    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.
  if (host_os != "win" && host_os != "mac") {
    deps = [ ":pw_module_tests.run($dir_pigweed/targets/host:host_clang_ubsan_heuristic)" ]
  }
}

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

      # TODO(b/234876100): msan will not work until the C++ standard library
      # included in the sysroot has a variant built with msan.
      # ":msan",

      # No ubsan_heuristic, which may have false positives.
    ]
  }
}

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_GOOGLETEST_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",
        ]
      }
    }
  }
}

group("cpp14_compatibility") {
  _cpp14_toolchain = "$_internal_toolchains:pw_strict_host_clang_debug_cpp14"
  deps = [
    ":cpp14_modules($_cpp14_toolchain)",
    ":cpp14_tests.run($_cpp14_toolchain)",
  ]
}

# 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_status($_toolchain)",
    "$dir_pw_tokenizer($_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) {
      deps += [ "$dir_pw_tool" ]

      # 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",
        ]
      }
    }
  }

  # 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:perf_test_tests_test",
      "$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
  }

  # Modules that support C++14.
  # TODO(hepler): pw_kvs is supposed to compile as C++14, but does not.
  group("cpp14_modules") {
    public_deps = [
      dir_pw_polyfill,
      dir_pw_preprocessor,
      dir_pw_tokenizer,
      dir_pw_varint,
    ]
  }

  # Tests that support C++14.
  pw_test_group("cpp14_tests") {
    group_deps = [
      "$dir_pw_polyfill:tests",
      "$dir_pw_span:tests",
    ]
    tests = [
      "$dir_pw_tokenizer:simple_tokenize_test",
      "$dir_pw_containers:to_array_test",
      "$dir_pw_string:string_test",
    ]
    output_metadata = true
  }

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