blob: add57814d9f5be1f6b4b79a35edf1256095e3be9 [file] [log] [blame]
# Copyright 2025 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/compiled_action.gni")
import("//build/fidl/toolchain.gni")
import("//build/python/python_library.gni")
# Generates Python bindings for a FIDL library.
#
# Parameters
#
# * library_name
# - Required: The name of the FIDL library.
# - Type: string
#
# * fidl_gen_dir
# - Required: The directory under which bindings should be generated.
# - Type: path
#
# * fidl_ir_json
# - Required: The path to the associated FIDL IR JSON file.
# - Type: path
#
# * fidl_ir_target
# - Required: The label of the target that generates the FIDL IR JSON file.
# - Type: label
# * deps
# - Optional: Dependencies added unaltered to the deps for this library.
# Used only to set non-fidl python bindings. The use of public_deps is
# instead of deps is strongly advised.
#
# * testonly, visibility, public_deps
# - Optional: Usual GN meanings.
#
template("fidl_python") {
assert(defined(invoker.library_name),
"fidl_python(\"$target_name\") must define `library_name`")
assert(defined(invoker.fidl_gen_dir),
"fidl_python(\"$target_name\") must define `fidl_gen_dir`")
assert(defined(invoker.fidl_ir_json),
"fidl_python(\"$target_name\") must define `fidl_ir_json`")
assert(defined(invoker.fidl_ir_target),
"fidl_python(\"$target_name\") must define `fidl_ir_target`")
generation_target = "${target_name}_generate"
forward_variables_from(invoker, [ "fidl_gen_dir" ])
python_library_name = "fidl_" + string_replace(invoker.library_name, ".", "_")
if (is_fidl_toolchain) {
not_needed(invoker,
[
"deps",
"visibility",
"fidl_target",
])
compiled_action(generation_target) {
forward_variables_from(invoker,
[
"applicable_licenses",
"testonly",
"fidl_ir_json",
"fidl_ir_target",
"public_deps",
])
visibility = [
":*",
"//tools/fidl/fidlgen_python:*",
]
tool = "//tools/fidl/fidlgen_python"
mnemonic = "FIDLGEN"
inputs = [
fidl_ir_json,
"//prebuilt/third_party/black/linux-x64/black",
"//.gitignore",
"//pyproject.toml",
]
output = "$fidl_gen_dir/$python_library_name/__init__.py"
outputs = [ output ]
args = [
"--fidl-ir-json",
rebase_path(fidl_ir_json, root_build_dir),
"--output",
rebase_path(output, root_build_dir),
"--black",
rebase_path("//prebuilt/third_party/black/linux-x64/black",
root_build_dir),
"--pyproject-toml",
rebase_path("//pyproject.toml", root_build_dir),
]
deps = [ fidl_ir_target ]
metadata = {
generated_sources = rebase_path(outputs, root_build_dir)
fidl_python_output = [ rebase_path(fidl_gen_dir, root_build_dir) ]
}
}
} else {
not_needed(invoker,
[
"fidl_ir_json",
"fidl_ir_target",
])
python_library(target_name) {
forward_variables_from(invoker,
[
"applicable_licenses",
"testonly",
"visibility",
"deps",
"library_name",
"fidl_target",
])
library_name = python_library_name
source_root = "$fidl_gen_dir/$python_library_name"
# TODO(https://fxbug.dev/394425397): These dependencies should be lifted into proper
# locations adjacent or within fidlgen_python. Ideally, this can be done when the dependency
# on dynamic Python bindings is removed. Otherwise, the dynamic Python bindings would have to
# point to the new location, causing similar dissonance.
library_deps = [
"//src/developer/ffx/lib/fuchsia-controller:fidl_bindings",
"//src/developer/ffx/lib/fuchsia-controller:fuchsia_controller_py",
"//src/developer/ffx/lib/fuchsia-controller/cpp:fidl_codec",
]
data_deps = [
":${fidl_target}_host_test_data",
"//src/developer/ffx/lib/fuchsia-controller/tests:fuchsia_controller_test_data",
]
if (defined(invoker.public_deps)) {
foreach(dep, invoker.public_deps) {
label = get_label_info(dep, "label_no_toolchain")
library_deps += [ "${label}_python" ]
}
}
sources = [ "__init__.py" ]
if (!defined(deps)) {
deps = []
}
deps += [ ":$generation_target($fidl_toolchain)" ]
}
}
}