| # 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" ] | |
| _shlib_out_dir = get_label_info(":${shlib_target_name}", "root_out_dir") | |
| _shlib_path = "${_shlib_out_dir}/${shlib_target_name}.so" | |
| shared_libs = [ _shlib_path ] | |
| 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) ] | |
| } | |
| } | |
| } | |
| } |