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

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

# NOTE: All the `deps` listed in `//BUILD.gn` must either be instantiated with a
# toolchain, e.g. `":my_host_target(//path/to/host:toolchain)"`, or listed
# within an `if (current_toolchain != default_toolchain)` statement.
# It also prevents the default toolchain from parsing any unnecessary BUILD.gn
# files.

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

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

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

# Arduino specific targets.
group("arduino") {
  # If the 'pw_arduino_build_CORE_PATH' build arg is defined assume an arduino
  # core is available for building.
  #
  # For example:
  #   pw_arduino_build_CORE_PATH="//third_party/pigweed/third_party/arduino/cores"

  if (pw_arduino_build_CORE_PATH != "") {
    deps = [ ":run_tests(//targets/arduino:arduino_debug_tests)" ]
  }
}

# stm32f429i_disc1 specific targets
group("stm32f429i_disc1") {
  _default_toolchain =
      "//targets/stm32f429i_disc1_stm32cube:stm32f429i_disc1_debug"
  _testing_toolchain = "${_default_toolchain}_tests"
  deps = [ ":run_tests(${_testing_toolchain})" ]
}

# In-tree Python packages
_sample_project_python_packages = [ "//tools:tools" ]

# This group contains all the python packages that should be tested and linted.
pw_python_group("python") {
  python_deps = _sample_project_python_packages
}

# Pigweed Python packages to include
_pigweed_python_packages = [
  "$dir_pw_env_setup:core_pigweed_python_packages",
  "$dir_pigweed/targets/lm3s6965evb_qemu/py",
  "$dir_pigweed/targets/stm32f429i_disc1/py",
]

_all_python_packages =
    _sample_project_python_packages + _pigweed_python_packages

# The default venv for Python actions in GN
# Set this gn arg in a declare_args block in this file 'BUILD.gn' or in '.gn' to
# use this venv.
#
#   pw_build_PYTHON_BUILD_VENV = "//:sample_project_build_venv"
#
pw_python_venv("sample_project_build_venv") {
  path = "$root_build_dir/python-venv"
  constraints = pw_build_PIP_CONSTRAINTS
  requirements = pw_build_PIP_REQUIREMENTS

  # Ensure all third party Python dependencies are installed into this venv.
  # This works by checking the setup.cfg files for all packages listed here and
  # installing the packages listed in the [options].install_requires field.
  source_packages = _all_python_packages
}

# This template collects all python packages and their dependencies into a
# single super Python package for installation into the bootstrapped virtual
# environment.
pw_python_distribution("sample_project_python_distribution") {
  packages = _all_python_packages
  generate_setup_cfg = {
    name = "sample-project-tools"
    version = "0.0.1"
    append_date_to_version = true
    include_default_pyproject_file = true
  }
}

# Install the sample-project-tools super Python package into the bootstrapped
# Python venv.
pw_python_pip_install("pip_install_sample_project_tools") {
  packages = [ ":sample_project_python_distribution" ]
}

group("examples") {
  deps = []

  # STMicroelectronics STM32F429I-DISC1 examples.
  deps += [
    "//examples/01_blinky:blinky(//targets/stm32f429i_disc1_stm32cube:stm32f429i_disc1_stm32cube.size_optimized)",
    "//examples/02_unit_testing:test_runner_app(//targets/stm32f429i_disc1_stm32cube:stm32f429i_disc1_stm32cube.size_optimized)",
    "//examples/03_rpc:rpc_main(//targets/stm32f429i_disc1_stm32cube:stm32f429i_disc1_stm32cube.size_optimized)",
  ]

  # Raspberry Pi Pico RP2040 examples.
  deps += [
    "//examples/01_blinky:blinky(//targets/rp2040:rp2040.size_optimized)",
    "//examples/02_unit_testing:test_runner_app(//targets/rp2040:rp2040.size_optimized)",
    "//examples/03_rpc:rpc_main(//targets/rp2040:rp2040.size_optimized)",
  ]

  # Host examples.
  deps += [
    "//examples/01_blinky:blinky(//targets/host:host_device_simulator.speed_optimized)",
    "//examples/02_unit_testing:test_runner_app(//targets/host:host_device_simulator.speed_optimized)",
    "//examples/03_rpc:rpc_main(//targets/host:host_device_simulator.speed_optimized)",
  ]
}

# TODO: b/301306292 - Removing this causes a duplicate toolchain to be
# generated if any tests are present in the test group. Figure out why, and set
# up a more scalable solution.
if (current_toolchain != default_toolchain) {
  # All the tests that should run as part of the build.
  pw_test_group("tests") {
    group_deps = [
      # Uncomment this to automatically run the example unit test.
      # "//examples/02_unit_testing:tests",
    ]
  }

  group("run_tests") {
    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" ]
    }
  }
}
