# 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_build/python.gni")
import("$dir_pw_build/python_dist.gni")
import("$dir_pw_docgen/docs.gni")

pw_doc_group("docs") {
  inputs = [ "doc_resources/pw_env_setup_output.png" ]
  sources = [ "docs.rst" ]
}

_pigweed_python_deps = [
  # Python packages
  "$dir_pw_allocator/py",
  "$dir_pw_arduino_build/py",
  "$dir_pw_bloat/py",
  "$dir_pw_build/py",
  "$dir_pw_build_info/py",
  "$dir_pw_cli/py",
  "$dir_pw_console/py",
  "$dir_pw_cpu_exception_cortex_m/py",
  "$dir_pw_docgen/py",
  "$dir_pw_doctor/py",
  "$dir_pw_env_setup/py",
  "$dir_pw_hdlc/py",
  "$dir_pw_log:protos.python",
  "$dir_pw_log_tokenized/py",
  "$dir_pw_module/py",
  "$dir_pw_package/py",
  "$dir_pw_presubmit/py",
  "$dir_pw_protobuf/py",
  "$dir_pw_protobuf_compiler/py",
  "$dir_pw_rpc/py",
  "$dir_pw_snapshot/py:pw_snapshot",
  "$dir_pw_snapshot/py:pw_snapshot_metadata",
  "$dir_pw_status/py",
  "$dir_pw_stm32cube_build/py",
  "$dir_pw_symbolizer/py",
  "$dir_pw_thread/py",
  "$dir_pw_tls_client/py",
  "$dir_pw_tokenizer/py",
  "$dir_pw_toolchain/py",
  "$dir_pw_trace/py",
  "$dir_pw_trace_tokenized/py",
  "$dir_pw_transfer/py",
  "$dir_pw_unit_test/py",
  "$dir_pw_watch/py",
]

pw_python_group("python") {
  python_deps = _pigweed_python_deps
  python_deps += [
    # Standalone scripts
    "$dir_pw_hdlc/rpc_example:example_script",
    "$dir_pw_rpc/py:python_client_cpp_server_test",
    "$dir_pw_third_party/nanopb:generate_nanopb_proto",
    "$dir_pw_transfer/py:python_cpp_transfer_test",

    # Python requirements for CIPD packages that don't have dedicated modules.
    ":renode_requirements",
  ]
}

# Python packages for supporting specific targets.
pw_python_group("target_support_packages") {
  python_deps = [
    "$dir_pigweed/targets/lm3s6965evb_qemu/py",
    "$dir_pigweed/targets/stm32f429i_disc1/py",
  ]
}

pw_python_requirements("renode_requirements") {
  requirements = [
    "psutil",
    "pyyaml",
    "robotframework==3.1",
  ]
}

pw_create_python_source_tree("build_pigweed_python_source_tree") {
  packages = _pigweed_python_deps
  include_tests = true
  extra_files = [
    "$dir_pigweed/pw_cli/py/BUILD.bazel > pw_cli/BUILD.bazel",
    "$dir_pigweed/pw_protobuf/py/BUILD.bazel > pw_protobuf/BUILD.bazel",
    "$dir_pigweed/pw_protobuf_compiler/py/BUILD.bazel > pw_protobuf_compiler/BUILD.bazel",
    "$dir_pigweed/pw_rpc/py/BUILD.bazel > pw_rpc/BUILD.bazel",
    "$dir_pigweed/pw_status/py/BUILD.bazel > pw_status/BUILD.bazel",
  ]
}
