blob: 995a5d3d3e398b3cd16756a33c98450a787e41b5 [file] [log] [blame]
# 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" ]
}
}