blob: 4e2659deb950e6472de472d7ed2444236e2098b5 [file] [log] [blame]
# 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")
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) ]
}
}
}
}