# Copyright 2026 The Fuchsia Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import("//build/config/python_interpreter.gni")
import("//build/python/python_action.gni")

# Defines a Python wheel.
#
# Parameters
#
#   deps (required)
#     List of python_library or python_c_extension targets to include in the wheel.
#
#   pyproject_toml (required)
#     Path to the pyproject.toml file for the wheel. Note that the packaging
#     script generates a setuptools-based setup.py, so the pyproject.toml must
#     configure setuptools.build_meta as its build backend.
#
#   version (optional)
#     Version of the wheel. Defaults to "0.0.1".
#
#   package_name (optional)
#     Name of the package. Defaults to target_name.
#
#   packages (optional)
#     List of packages (directories) to include in the wheel.
#
#   wheel_tags (optional)
#     Compatibility tags for the wheel adhering to PEP 427
#     ({python tag}-{abi tag}-{platform tag}). Defaults to "py3-none-any" for
#     pure Python wheels. For wheels containing C extensions or native shared
#     libraries, specify the target platform tags (e.g.,
#     "cp311-cp311-linux_x86_64").
#
#   output_name (optional)
#     Name of the output wheel file. Defaults to
#     "${_normalized_package_name}-${_normalized_version}-${_wheel_tags}.whl" to
#     conform to the PEP 427 wheel filename specification.
#
#   wheel_name (optional)
#     Alias for output_name.
#
#   output_dir (optional)
#     Directory where the wheel will be placed. Defaults to
#     ${target_out_dir}/${target_name}.
#
#   testonly
#   visibility
template("python_wheel") {
  assert(defined(invoker.deps), "deps is required")
  assert(defined(invoker.pyproject_toml), "pyproject_toml is required")

  _version = "0.0.1"
  if (defined(invoker.version)) {
    _version = invoker.version
  }

  _package_name = target_name
  if (defined(invoker.package_name)) {
    _package_name = invoker.package_name
  }

  # PEP 427 specifies distribution name normalization rules where runs of
  # non-alphanumeric characters (like hyphens) are replaced with a single
  # underscore. Ensure package_name does not contain whitespace.
  assert(string_replace(_package_name, " ", "") == _package_name,
         "package_name must not contain whitespace: '${_package_name}'")

  _wheel_tags = "py3-none-any"
  if (defined(invoker.wheel_tags)) {
    _wheel_tags = invoker.wheel_tags
  }

  # PEP 427 specifies distribution name normalization rules where runs of
  # non-alphanumeric characters (like hyphens, dots) are replaced with a single
  # underscore. GN lacks regex support, so we chain string_replace.
  _normalized_package_name = string_replace(_package_name, "-", "_")
  _normalized_package_name = string_replace(_normalized_package_name, ".", "_")
  _normalized_package_name =
      string_replace(_normalized_package_name, "___", "_")
  _normalized_package_name = string_replace(_normalized_package_name, "__", "_")

  # Per PEP 427 / PEP 440, version numbers retain periods and only replace
  # hyphens with underscores.
  _normalized_version = string_replace(_version, "-", "_")
  _wheel_name =
      "${_normalized_package_name}-${_normalized_version}-${_wheel_tags}.whl"
  if (defined(invoker.wheel_name)) {
    _wheel_name = invoker.wheel_name
  } else if (defined(invoker.output_name)) {
    _wheel_name = invoker.output_name
  }

  _output_dir = "${target_out_dir}/${target_name}"
  if (defined(invoker.output_dir)) {
    _output_dir = invoker.output_dir
  }
  _wheel_file = "${_output_dir}/${_wheel_name}"

  _library_infos_target = "${target_name}.library_infos"
  _library_infos_json = "${target_gen_dir}/${target_name}.library_infos.json"

  generated_file(_library_infos_target) {
    forward_variables_from(invoker, [ "testonly" ])
    visibility = [ ":*" ]
    public_deps = invoker.deps
    outputs = [ _library_infos_json ]
    output_conversion = "json"
    data_keys = [ "library_info" ]
    walk_keys = [ "library_info_barrier" ]
  }

  python_action(target_name) {
    forward_variables_from(invoker,
                           [
                             "testonly",
                             "visibility",
                           ])

    binary_label = "//build/python:package_python_wheel"
    depfile = "${target_out_dir}/${target_name}.d"

    # Explicitly declare the stamp file and predictable wheel filename in
    # outputs so they are tracked and downloaded by remote execution/caching
    # systems (e.g., Siso).
    _stamp_file = "${target_gen_dir}/${target_name}.wheel.stamp"
    outputs = [
      _stamp_file,
      _wheel_file,
    ]

    inputs = [
      _library_infos_json,
      invoker.pyproject_toml,
    ]

    deps = [ ":${_library_infos_target}" ] + invoker.deps

    args = [
      "--target_name",
      target_name,
      "--python_interpreter",
      rebase_path(python_exe_src, root_build_dir),
      "--gen_dir",
      rebase_path(target_gen_dir, root_build_dir),
      "--wheel_file",
      rebase_path(_wheel_file, root_build_dir),
      "--stamp_file",
      rebase_path(_stamp_file, root_build_dir),
      "--library_infos",
      rebase_path(_library_infos_json, root_build_dir),
      "--pyproject_toml",
      rebase_path(invoker.pyproject_toml, root_build_dir),
      "--depfile",
      rebase_path(depfile, root_build_dir),
      "--version",
      _version,
      "--package_name",
      _package_name,
    ]
    if (defined(invoker.packages)) {
      args += [ "--packages" ] + invoker.packages
    }
  }
}
