# Copyright 2023 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/python/python_c_extension_shared_lib.gni")
import("//build/python/python_library.gni")

# Defines a python C extension library.
#
# This can be imported into a `.pyz` library, but the user must make sure the
# .so that this is appending to the path is located in the output build directory,
# as this will be appending to PYTHONPATH.
#
# Parameters
#
#   sources (required)
#     Forwarded to python_c_extension_shared_lib.
#     Type: list(path)
#
#   deps (optional)
#     Forwarded to python_c_extension_shared_lib.
#     Type: list(target)
#
#   assert_no_deps (optional)
#     Forwarded to python_c_extension_shared_lib.
#     Type: bool
#     Default: False
#
#   configs (optional)
#     Forwarded to python_c_extension_shared_lib.
#     Type: list(target)
#
#   public_configs (optional)
#     Forwarded to python_c_extension_shared_lib.
#     Type: list(target)
#
#   stubs_root (optional)
#     Base path for paths specified in `stubs`. This argument is required when `stubs` is
#     provided.
#     Type: path
#
#   stubs(optional)
#     Paths to .pyi stub files relative to `stubs_root`. When providing this argument, `stubs_root`
#     must be provided too. The stub files provided will be copied to the Python library generated
#     by this template with the same directory structure relative to `stubs_root`.
#     Type: list(path)
#
#   testonly
#   visibility
template("python_c_extension") {
  assert(is_host, "python C extensions can only be built on the host")

  visibility = [ ":*" ]

  main_target_name = target_name
  shlib_target_name = "lib${target_name}"
  python_c_extension_shared_lib(shlib_target_name) {
    forward_variables_from(invoker,
                           [
                             "assert_no_deps",
                             "configs",
                             "public_configs",
                             "deps",
                             "sources",
                             "testonly",
                           ])
    if (defined(invoker.visibility)) {
      visibility += invoker.visibility
    }
  }

  if (defined(invoker.stubs)) {
    assert(defined(invoker.stubs_root),
           "stubs_root must be provided with stubs")
    stub_target_names = []
    stub_outputs = []
    foreach(stub, invoker.stubs) {
      stub_target_name = "${main_target_name}_stubs__${stub}"
      stub_target_names += [ stub_target_name ]
      stub = "${invoker.stubs_root}/${stub}"
      stub_output = "${target_gen_dir}/${main_target_name}/" +
                    rebase_path(stub, invoker.stubs_root)
      stub_outputs += [ stub_output ]
      copy(stub_target_name) {
        sources = [ stub ]
        outputs = [ stub_output ]
      }
    }
  }

  action("${main_target_name}_wrapper") {
    forward_variables_from(invoker,
                           [
                             "assert_no_deps",
                             "testonly",
                           ])
    deps = [ ":${shlib_target_name}" ]

    script = "//build/python/create_c_extension_import_hook.py"
    outputs = [ "${target_gen_dir}/${main_target_name}/__init__.py" ]
    args = [
      "--target_name",
      main_target_name,
      "--shlib",
      rebase_path(get_label_info(":${shlib_target_name}", "root_out_dir"),
                  root_build_dir) + "/${shlib_target_name}",
      "--gen_dir",
      rebase_path(target_gen_dir, root_build_dir),
    ]
  }

  python_library(target_name) {
    forward_variables_from(invoker,
                           [
                             "assert_no_deps",
                             "testonly",
                           ])
    if (defined(invoker.visibility)) {
      visibility += invoker.visibility
    }

    deps = [ ":${main_target_name}_wrapper" ]
    source_root = "${target_gen_dir}/${main_target_name}"
    sources = [ "__init__.py" ]
    if (defined(invoker.stubs)) {
      foreach(stub_target_name, stub_target_names) {
        deps += [ ":${stub_target_name}" ]
      }
      foreach(stub_output, stub_outputs) {
        sources += [ rebase_path(stub_output, source_root) ]
      }
    }
  }
}
