| # Copyright 2018 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/banjo/toolchain.gni") |
| import("//build/compiled_action.gni") |
| import("//build/sdk/sdk_atom_alias.gni") |
| |
| # C/C++ bindings for a Banjo protocol. |
| # |
| # The parameters for this template are defined in //build/banjo/banjo.gni. The |
| # relevant parameters in this template are: |
| # name: string, name of the Banjo protocol |
| |
| template("banjo_c_target") { |
| assert(is_fuchsia, "This template can only be used in $target_toolchain.") |
| |
| not_needed(invoker, [ "sources" ]) |
| |
| main_target_name = target_name |
| |
| library_name = target_name |
| if (defined(invoker.name)) { |
| library_name = invoker.name |
| } |
| |
| c_root = string_replace(string_replace(library_name, ".", "/"), "_", "-") |
| banjo_root_gen_dir = |
| get_label_info(":$target_name($banjo_toolchain)", "root_gen_dir") |
| c_header = "$banjo_root_gen_dir/$c_root/c/banjo.h" |
| cpp_header = "$banjo_root_gen_dir/$c_root/cpp/banjo.h" |
| cpp_internal_header = "$banjo_root_gen_dir/$c_root/cpp/banjo-internal.h" |
| cpp_mock_header = "$banjo_root_gen_dir/$c_root/cpp/banjo-mock.h" |
| |
| # The C/C++ headers are generated by the frontend, so we just need to |
| # produce a target with the generated file name and configuration information. |
| source_set(main_target_name) { |
| forward_variables_from(invoker, |
| [ |
| "deps", |
| "testonly", |
| "visibility", |
| ]) |
| |
| public = [ |
| c_header, |
| cpp_header, |
| cpp_internal_header, |
| ] |
| |
| # The generated headers #include <ddk/*.h> and #include <ddktl/*.h> |
| # files from the libraries (that aren't generated). |
| public_deps = [ |
| "//src/lib/ddk", |
| "//src/lib/ddktl", |
| ] |
| |
| # Let dependencies use `#include "$file_stem.h"`. |
| public_configs = [ "//build/c:banjo_gen_config" ] |
| |
| if (!defined(deps)) { |
| deps = [] |
| } |
| deps += [ |
| ":${main_target_name}_c_compile($banjo_toolchain)", |
| ":${main_target_name}_cpp_compile($banjo_toolchain)", |
| ":${main_target_name}_cpp_i_compile($banjo_toolchain)", |
| "//src/zircon/lib/zircon", |
| ] |
| } |
| |
| # Define a separate target for mocks to avoid requiring all Banjo users to |
| # link to the C++ standard library. |
| source_set("${main_target_name}_mock") { |
| testonly = true |
| |
| forward_variables_from(invoker, |
| [ |
| "deps", |
| "visibility", |
| ]) |
| |
| public = [ cpp_mock_header ] |
| |
| if (!defined(deps)) { |
| deps = [] |
| } |
| deps += [ |
| ":${main_target_name}", |
| ":${main_target_name}_cpp_mock($banjo_toolchain)", |
| ] |
| |
| public_deps = [ |
| "//zircon/public/lib/fbl", |
| "//zircon/public/lib/mock-function", |
| "//zircon/public/lib/zxtest", |
| ] |
| } |
| |
| if (current_toolchain != banjo_toolchain) { |
| # Set up an SDK item for this library |
| if (defined(invoker.sdk_category)) { |
| # Instead of depending on the generated bindings, set up a dependency on |
| # the original library. |
| sdk_target_name = "${target_name}_sdk" |
| sdk_atom_alias(sdk_target_name) { |
| atom = ":$sdk_target_name($banjo_toolchain)" |
| } |
| } |
| } |
| } |
| |
| template("banjo_dummy_c_target") { |
| assert(is_fuchsia, "This template can only be used in $target_toolchain.") |
| |
| not_needed(invoker, |
| [ |
| "sources", |
| "name", |
| ]) |
| |
| main_target_name = target_name |
| |
| # The headers referenced by a dummy target all exist in the sysroot. |
| source_set(main_target_name) { |
| forward_variables_from(invoker, |
| [ |
| "deps", |
| "testonly", |
| "visibility", |
| ]) |
| |
| public_deps = [ "//zircon/public/sysroot:headers" ] |
| deps = [ "//src/zircon/lib/zircon" ] |
| } |
| } |