# 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_build/python_gn_args.gni")
import("$dir_pw_build/python_venv.gni")
import("$dir_pw_docgen/docs.gni")
import("$dir_pw_unit_test/test.gni")

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

pw_python_group("core_pigweed_python_packages") {
  python_deps = [
    "$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_compilation_testing/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_thread_freertos/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 = [
    ":core_pigweed_python_packages",

    # This target creates and installs Python package named 'pigweed' including
    # every package listed in :core_pigweed_python_packages
    ":pip_install_pigweed_package",

    # Standalone scripts
    "$dir_pw_hdlc/rpc_example:example_script",
    "$dir_pw_rpc/py:python_client_cpp_server_test",
    "$dir_pw_third_party/fuchsia:generate_fuchsia_patch",
    "$dir_pw_third_party/nanopb:generate_nanopb_proto",
    "$dir_pw_transfer/py:python_cpp_transfer_test",
  ]
}

pw_python_venv("pigweed_build_venv") {
  path = "$root_build_dir/python-venv"
  source_packages = [ ":core_pigweed_python_packages" ]
}

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

# This target is responsible for building the Python source uploaded to PyPI:
# https://pypi.org/project/pigweed/
pw_python_distribution("pypi_pigweed_python_source_tree") {
  packages = [ ":core_pigweed_python_packages" ]
  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",
  ]
}

# 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_python_distribution("generate_pigweed_python_package") {
  packages = [ ":core_pigweed_python_packages" ]

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

# This pip installs the generate_pigweed_python_package into the user venv.
pw_python_pip_install("pip_install_pigweed_package") {
  packages = [ ":generate_pigweed_python_package" ]
}

# The next three targets are not built by default but demonstrate how to
# generate Python distributions with only a subset of Python packages
# included. The result could be bundled into PyOxidizer or distributed as a
# standalone wheel.

# To create this wheel run:
#   ninja -C out pw_env_setup:generate_pw_env_setup_distribution.wheel
# The resulting wheel is available in
#   out/obj/pw_env_setup/generate_pw_env_setup_distribution._build_wheel/
pw_python_distribution("generate_pw_env_setup_distribution") {
  packages = [ "$dir_pw_env_setup/py" ]
  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",
  ]
}

# To create this wheel run:
#   ninja -C out pw_env_setup:generate_pw_system_distribution.wheel
# The resulting wheel is available in
#   out/obj/pw_env_setup/generate_pw_system_distribution._build_wheel/
pw_python_distribution("generate_pw_system_distribution") {
  packages = [ "$dir_pw_system/py" ]
  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",
  ]
}

pw_python_group("hdlc_proto_rpc_python_packages") {
  python_deps = [
    "$dir_pw_hdlc/py",
    "$dir_pw_protobuf_compiler/py",
    "$dir_pw_rpc/py",
    "$dir_pw_tokenizer/py",
  ]
}

# To create this wheel run:
#   ninja -C out pw_env_setup:generate_hdlc_proto_rpc_tokenizer_distribution.wheel
# The resulting wheel is available in
#   out/obj/pw_env_setup/generate_hdlc_proto_rpc_tokenizer_distribution._build_wheel/
pw_python_distribution("generate_hdlc_proto_rpc_tokenizer_distribution") {
  packages = [ ":hdlc_proto_rpc_python_packages" ]

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

pw_test_group("tests") {
}
