# Copyright 2021 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/pigweed.gni")

import("$dir_pw_arduino_build/arduino.gni")
import("$dir_pw_build/python.gni")
import("$dir_pw_third_party/stm32cube/stm32cube.gni")
import("$dir_pw_tokenizer/database.gni")
import("$dir_pw_unit_test/test.gni")

# Lists all the targets build by default with e.g. `ninja -C out`.
group("default") {
  deps = [
    ":applications",
    ":arduino",
    ":host",
    ":python.lint",
    ":python.tests",
  ]
}

# Group all targets that run on host only, e.g. tests, utils.
group("host") {
  deps = [ ":host_tests(//targets/host:host_debug_tests)" ]
}

# Arduino specific targets.
group("arduino") {
  if (pw_arduino_build_CORE_PATH != "") {
    deps = [ ":arduino_tests(//targets/arduino:arduino_debug_tests)" ]

    if (pw_arduino_build_CORE_NAME == "teensy") {
      deps += []
    }
  }
}

# stm32f429i_disc1 specific targets.
group("stm32f429i_disc1") {
  _default_toolchain = "//targets/stm32f429i_disc1:stm32f429i_disc1_debug"
  _testing_toolchain = "${_default_toolchain}_tests"
  deps = [
    # ":app(${_default_toolchain})",
    ":tests(${_testing_toolchain})",
  ]
}

# Python packages are built using the host toolchain.
pw_python_group("python") {
  # This depends on the 'tools' target in //tools/BUILD.gn
  python_deps = [
    "tools",
    "//applications/tls_example/trust_store/py",
    "//third_party/pigweed/pw_env_setup:python",
    "//third_party/pigweed/pw_env_setup:target_support_packages",
  ]
}

group("applications") {
  deps = []

  # Teensy 3.0/4.0 applications steps.
  if (pw_arduino_build_CORE_PATH != "") {
    deps += [
      ":applications_tests(//targets/arduino:arduino_debug_tests)",
      "//applications/blinky:blinky(//targets/arduino:arduino_debug)",
      "//applications/rpc:all(//targets/arduino:arduino_debug)",
      "//applications/strings:all(//targets/arduino:arduino_debug)",
      "//applications/tls_example:boringssl_teensy_ethernet(//targets/arduino:arduino_debug)",
      "//applications/tls_example:mbedtls_teensy_ethernet(//targets/arduino:arduino_debug)",
      "//applications/tls_example:picotls_teensy_ethernet(//targets/arduino:arduino_debug)",
    ]
  }

  # STMicroelectronics STM32F429I-DISC1 applications steps.
  deps += [
    ":applications_tests(//targets/stm32f429i_disc1:stm32f429i_disc1_debug_tests)",
    "//applications/blinky:blinky(//targets/stm32f429i_disc1:stm32f429i_disc1_debug)",
    "//applications/rpc:all(//targets/stm32f429i_disc1:stm32f429i_disc1_debug)",
    "//applications/strings:all(//targets/stm32f429i_disc1:stm32f429i_disc1_debug)",
  ]

  if (dir_pw_third_party_stm32cube_f4 != "") {
    # STMicroelectronics STM32F429I-DISC1 STM32Cube applications steps.
    deps += [
      ":applications_tests(//targets/stm32f429i_disc1_stm32cube:stm32f429i_disc1_stm32cube_debug)",
      "//applications/blinky:blinky(//targets/stm32f429i_disc1_stm32cube:stm32f429i_disc1_stm32cube_debug)",
    ]

    # STMicroelectronics STM32F439ZI-Nucleo applications steps.
    deps += [
      ":applications_tests(//targets/stm32f439zi_nucleo:stm32f439zi_nucleo_debug)",
      "//applications/blinky:blinky(//targets/stm32f439zi_nucleo:stm32f439zi_nucleo_debug)",
    ]
  }

  if (dir_pw_third_party_stm32cube_f2 != "") {
    deps += [ "//applications/blinky:blinky(//targets/stm32f207zg-nucleo:stm32f207zg_nucleo_debug)" ]
  }

  if (dir_pw_third_party_stm32cube_l5 != "") {
    deps += [ "//applications/blinky:blinky(//targets/stm32l552ze-nucleo:stm32l552ze_nucleo_debug)" ]
  }

  # Host applications steps.
  deps += [
    ":applications_tests(//targets/host:host_debug_tests)",
    "//applications/strings:all(//targets/host:host_debug)",
  ]
}

# Group the different modules tests together.
pw_test_group("tests") {
  group_deps = [ "//applications/strings:tests" ]

  if (pw_arduino_build_CORE_NAME == "teensy") {
    group_deps += []
  }
}

# Test groups for each platform that will build and optionally run the tests.
foreach(test_group,
        [
          "arduino",
          "host",
          "applications",
        ]) {
  group("${test_group}_tests") {
    deps = []
    if (pw_unit_test_AUTOMATIC_RUNNER == "") {
      # Without a test runner defined, build the tests but don't run them.
      deps += [ ":tests" ]
    } else {
      # With a test runner, build and run tests.
      deps += [ ":tests_run" ]
    }
  }
}
