# 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_build_mcuxpresso/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_metric/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_software_update/py",
  "$dir_pw_status/py",
  "$dir_pw_stm32cube_build/py",
  "$dir_pw_symbolizer/py",
  "$dir_pw_system/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
  if (pw_build_USE_NEW_PYTHON_BUILD) {
    # This target creates and installs Python package named 'pigweed' including
    # every package listed in _pigweed_python_deps.
    python_deps += [ ":pip_install_pigweed_package" ]
  }
  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",
  ]
}

if (pw_build_USE_NEW_PYTHON_BUILD) {
  group("create_gn_venv") {
    if (current_toolchain == default_toolchain) {
      exec_script("create_gn_venv.py",
                  [
                    "--destination-dir",
                    rebase_path("$root_build_dir/python-venv", root_build_dir),
                  ])
    }
  }

  pw_python_action("install_3p_deps") {
    module = "pip"
    _pw_internal_run_in_venv = true
    skip_installing_external_python_deps = true
    args = [
      "install",
      "--no-build-isolation",
    ]
    inputs = pw_build_PIP_CONSTRAINTS
    foreach(_constraints_file, pw_build_PIP_CONSTRAINTS) {
      args += [
        "--requirement",
        rebase_path(_constraints_file, root_build_dir),
      ]
    }
    outputs = [ "$root_build_dir/python-venv" ]
    deps = [ ":create_gn_venv" ]
    stamp = true
    pool = "$dir_pw_build/pool:pip($default_toolchain)"
  }
} else {
  group("create_gn_venv") {
  }
  group("install_3p_deps") {
  }
}

# Python packages for supporting specific targets.
if (pw_build_USE_NEW_PYTHON_BUILD) {
  pw_internal_pip_install("target_support_packages") {
    packages = [
      "$dir_pigweed/targets/lm3s6965evb_qemu/py",
      "$dir_pigweed/targets/stm32f429i_disc1/py",
    ]
    editable = true
  }
} else {
  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",
  ]
}

# This target creates a Python source tree with some included bazel build files.
pw_create_python_source_tree("build_pigweed_python_source_tree") {
  packages = _pigweed_python_deps
  include_tests = true
  extra_files = [
    "$dir_pigweed/pw_build/py/BUILD.bazel > pw_build/BUILD.bazel",
    "$dir_pigweed/pw_cli/py/BUILD.bazel > pw_cli/BUILD.bazel",
    "$dir_pigweed/pw_hdlc/py/BUILD.bazel > pw_hdlc/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",
  ]
}

# This target is responsible for building the Python source uploaded to PyPI:
# https://pypi.org/project/pigweed/
pw_create_python_source_tree("pypi_pigweed_python_source_tree") {
  packages = _pigweed_python_deps
  generate_setup_cfg = {
    common_config_file = "pypi_common_setup.cfg"
  }
  extra_files = [
    "$dir_pigweed/LICENSE > LICENSE",
    "$dir_pigweed/README.md > README.md",
    "pypi_pyproject.toml > pyproject.toml",
  ]
}

if (pw_build_USE_NEW_PYTHON_BUILD) {
  # This target is creates the 'pigweed' Python package installed to the user's
  # dev environment. It's similar to the source tree for PyPI but it appends the
  # current date to the version so pip will consider it more up to date than the
  # one in PyPI.
  pw_create_python_source_tree("generate_pigweed_python_package") {
    packages = _pigweed_python_deps
    public_deps = _pigweed_python_deps

    generate_setup_cfg = {
      common_config_file = "pypi_common_setup.cfg"
      append_date_to_version = true
    }
    extra_files = [
      "$dir_pigweed/LICENSE > LICENSE",
      "$dir_pigweed/README.md > README.md",
      "pypi_pyproject.toml > pyproject.toml",
    ]
  }

  # This pip installs the generate_pigweed_python_package
  pw_internal_pip_install("pip_install_pigweed_package") {
    packages = [ ":generate_pigweed_python_package" ]
  }
}
