| # 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/compiled_action.gni") |
| import("//build/fidl/toolchain.gni") |
| |
| # Generates some C++ bindings for a FIDL library. |
| # |
| # The parameters for this template are defined in //build/fidl/fidl.gni. The |
| # relevant parameters in this template are: |
| # - name; |
| # - sources; |
| # - cpp_legacy_callbacks. |
| |
| template("fidl_cpp") { |
| assert(is_fuchsia, "This template can only be used in $target_toolchain.") |
| |
| not_needed(invoker, |
| [ |
| "sdk_category", |
| "sources", |
| ]) |
| |
| main_target_name = target_name |
| generation_target_name = "${target_name}_cpp_generate" |
| |
| library_name = target_name |
| if (defined(invoker.name)) { |
| library_name = invoker.name |
| } |
| |
| # Generate the source code just once in the base toolchain, even if it |
| # gets compiled separately in multiple variants of the target toolchains. |
| # The generation happens in the base (C++) toolchain, but put its output |
| # into fidl_toolchain's gen/ directory instead so that a single |
| # `-Ifidling/gen` lets `#include <fuchsia/cpp/library.h>` find the |
| # files without adding `-Igen` when gen/ is for a different actual C++ |
| # toolchain. Since `fidling/gen` contains nothing but FIDL-generated |
| # code, it's not so scary to have that included in code built by multiple |
| # other toolchains. |
| fidl_target_gen_dir = |
| get_label_info(":$target_name($fidl_toolchain)", "target_gen_dir") |
| fidl_root_gen_dir = |
| get_label_info(":$target_name($fidl_toolchain)", "root_gen_dir") |
| |
| include_stem = exec_script("//build/cpp/fidl_cpp_stem_from_library.py", |
| [ |
| "--name", |
| library_name, |
| ], |
| "trim string") |
| file_stem = "$fidl_root_gen_dir/$include_stem" |
| coding_tables = "$fidl_target_gen_dir/$target_name.fidl.tables.cc" |
| |
| # Only do the generation in the base toolchain, since it would |
| # be identical in all variants. |
| if (current_toolchain == toolchain_variant.base) { |
| fidl_root_gen_dir = |
| get_label_info(":$target_name($fidl_toolchain)", "root_gen_dir") |
| json_representation = "$fidl_target_gen_dir/$target_name.fidl.json" |
| |
| compiled_action(generation_target_name) { |
| forward_variables_from(invoker, [ "testonly" ]) |
| |
| visibility = [ ":$main_target_name" ] |
| |
| tool = "//garnet/go/src/fidl:fidlgen" |
| |
| inputs = [ |
| json_representation, |
| ] |
| |
| outputs = [ |
| "$file_stem.h", |
| "$file_stem.cc", |
| ] |
| |
| args = [ |
| "--json", |
| rebase_path(json_representation, root_build_dir), |
| "--output-base", |
| rebase_path(file_stem, root_build_dir), |
| "--include-base", |
| rebase_path(fidl_root_gen_dir, root_build_dir), |
| "--generators", |
| "cpp", |
| ] |
| |
| if (!defined(invoker.cpp_legacy_callbacks) || invoker.cpp_legacy_callbacks) { |
| args += [ "--cpp-legacy-callbacks" ] |
| } |
| |
| deps = [ |
| ":$main_target_name($fidl_toolchain)", |
| ] |
| } |
| } else { |
| not_needed(invoker, "*") |
| } |
| |
| source_set(main_target_name) { |
| forward_variables_from(invoker, |
| [ |
| "testonly", |
| "visibility", |
| ]) |
| |
| sources = [ |
| "$file_stem.cc", |
| "$file_stem.h", |
| coding_tables, |
| ] |
| |
| # Let dependencies use `#include "$file_stem.h"`. |
| public_configs = [ "//build/cpp:fidl_gen_config" ] |
| |
| deps = [ |
| ":$generation_target_name(${toolchain_variant.base})", |
| ":$main_target_name($fidl_toolchain)", |
| ] |
| |
| public_deps = [ |
| "//garnet/public/lib/fidl/cpp", |
| ] |
| |
| if (defined(invoker.deps)) { |
| deps += invoker.deps |
| } |
| |
| if (defined(invoker.public_deps)) { |
| public_deps += invoker.public_deps |
| } |
| } |
| } |