| # Copyright 2019 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("$zx/public/gn/subtarget_aliases.gni") |
| |
| # This is the $fidl_support module for C bindings. See fidl_library() for |
| # details. This file should not normally be imported by other code. |
| |
| # This tells fidl_library() to invoke fidl_c_library(). |
| fidl_support_templates = [ |
| { |
| import = "$zx/public/gn/fidl/c.gni" |
| target = "fidl_c_library" |
| fidlc = "c" |
| }, |
| ] |
| |
| # This tells fidl_library() what fidlc outputs fidl_c_library() requires. |
| fidl_support_fidlc = [ |
| { |
| name = "c" |
| files = [ |
| { |
| switch = "--c-header" |
| path_prefix = "include/" |
| path_suffix = "/c/fidl.h" |
| }, |
| { |
| switch = "--c-client" |
| path = "client.c" |
| }, |
| { |
| switch = "--c-server" |
| path = "server.c" |
| }, |
| ] |
| }, |
| ] |
| |
| # Provide C bindings for fidl_library(). **Do not use directly!** |
| # |
| # This is never used directly, but only indirectly by fidl_library(). |
| # See there for details. |
| template("fidl_c_library") { |
| not_needed([ "target_name" ]) |
| not_needed(invoker, "*") |
| if (current_toolchain != default_toolchain) { |
| fidl_target = target_name |
| library_target = "$fidl_target.c" |
| |
| config("_fidl_c_library.config.$library_target") { |
| visibility = [ |
| ":$library_target.headers", |
| ":$library_target.static", |
| ] |
| include_dirs = [ "${invoker.fidlc_gen_dir}/include" ] |
| } |
| |
| library(library_target) { |
| forward_variables_from(invoker, |
| [ |
| "visibility", |
| "testonly", |
| ]) |
| |
| # Depend on the fidlc generation step and compile what it produces. |
| deps = invoker.fidlc_deps |
| sources = invoker.fidlc_outputs |
| |
| # Users of the bindings library need the generated headers. |
| public_configs = [ ":_fidl_c_library.config.$library_target" ] |
| |
| # The `.headers` subtarget of a library() only depends on its |
| # public_deps. But all users of the headers need to depend on the |
| # generation step too, so put it in public_deps as well. |
| public_deps = invoker.fidlc_deps |
| |
| # The generated headers of a dependent fidl_library() will #include the |
| # generated headers for its dependencies' bindings libraries, so those |
| # headers are needed in public_deps. The generated bindings code may |
| # call into its dependencies' bindings code, so the libraries |
| # themselves are needed in deps too. |
| foreach(dep, invoker.fidl_deps) { |
| deps += [ "$dep.c" ] |
| public_deps += [ "$dep.c.headers" ] |
| } |
| |
| # The generated code uses these. |
| deps += [ |
| ":$fidl_target.tables", |
| "$zx/system/ulib/fidl", |
| "$zx/system/ulib/zircon", |
| ] |
| } |
| |
| # Things normally depend on "fidl/foo:c" rather than "fidl/foo:foo.c". |
| subtarget_aliases(target_name) { |
| forward_variables_from(invoker, |
| [ |
| "visibility", |
| "testonly", |
| ]) |
| outputs = [ |
| "c", |
| "c.headers", |
| "c.static", |
| ] |
| } |
| } |
| } |