| # Copyright 2018 The Chromium 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/config/fuchsia/config.gni") |
| |
| assert(is_fuchsia) |
| |
| # Template for FIDL libraries. Following parameters can be passed when |
| # instantiating this template: |
| # sources - List of .fidl files. |
| # library_name - (optional) Name of the library. target_name is used if name |
| # is not specified explicitly. |
| # namespace - (optional) Namespace for the library. |
| # deps - (optional) List of other fidl_library() targets that this |
| # FIDL library depends on. |
| # languages - Generate bindings for the given languages, defaults to |
| # [ "cpp" ]. "js" also supported. |
| # |
| # $namespace.$library_name must match the the library name specified in the FIDL |
| # files. |
| |
| template("fidl_library") { |
| forward_variables_from(invoker, |
| [ |
| "languages", |
| "namespace", |
| ]) |
| |
| _library_basename = target_name |
| if (defined(invoker.library_name)) { |
| _library_basename = invoker.library_name |
| } |
| |
| if (defined(namespace)) { |
| _library_name = "${namespace}.${_library_basename}" |
| _namespace_path = string_replace(namespace, ".", "/") |
| _library_path = "${_namespace_path}/${_library_basename}" |
| } else { |
| _library_name = _library_basename |
| _library_path = _library_basename |
| } |
| |
| if (!defined(invoker.languages)) { |
| languages = [ "cpp" ] |
| } |
| |
| _define_cpp_action = false |
| _define_js_action = false |
| |
| foreach(language, languages) { |
| if (language == "cpp") { |
| _define_cpp_action = true |
| } else if (language == "js") { |
| _define_js_action = true |
| } |
| } |
| |
| _response_file = "$target_gen_dir/$target_name.rsp" |
| _json_representation = "$target_gen_dir/${_library_name}.fidl.json" |
| _output_gen_dir = "$target_gen_dir/fidl" |
| _output_base = "$_output_gen_dir/${_library_path}/cpp/fidl" |
| _tables_file = "$_output_gen_dir/${_library_name}.fidl-tables.cc" |
| |
| action("${target_name}_response_file") { |
| script = "//third_party/fuchsia-sdk/gen_fidl_response_file.py" |
| |
| forward_variables_from(invoker, |
| [ |
| "deps", |
| "public_deps", |
| "sources", |
| "testonly", |
| ]) |
| |
| _libraries_file = "$target_gen_dir/${invoker.target_name}.fidl_libraries" |
| |
| outputs = [ |
| _response_file, |
| _libraries_file, |
| ] |
| |
| args = [ |
| "--out-response-file", |
| rebase_path(_response_file, root_build_dir), |
| "--out-libraries", |
| rebase_path(_libraries_file, root_build_dir), |
| "--tables", |
| rebase_path(_tables_file, root_build_dir), |
| "--json", |
| rebase_path(_json_representation, root_build_dir), |
| "--name", |
| _library_name, |
| "--sources", |
| ] + rebase_path(sources, root_build_dir) |
| |
| if (defined(invoker.deps) || defined(invoker.public_deps)) { |
| merged_deps = [] |
| |
| if (defined(invoker.deps)) { |
| merged_deps += invoker.deps |
| } |
| |
| if (defined(invoker.public_deps)) { |
| merged_deps += invoker.public_deps |
| } |
| |
| dep_libraries = [] |
| deps = [] |
| |
| foreach(dep, merged_deps) { |
| gen_dir = get_label_info(dep, "target_gen_dir") |
| name = get_label_info(dep, "name") |
| dep_libraries += [ "$gen_dir/$name.fidl_libraries" ] |
| deps += [ "${dep}_response_file" ] |
| } |
| |
| inputs = dep_libraries |
| |
| args += [ "--dep-libraries" ] + rebase_path(dep_libraries, root_build_dir) |
| } |
| } |
| |
| action("${target_name}_compile") { |
| forward_variables_from(invoker, [ "testonly" ]) |
| |
| visibility = [ ":*" ] |
| |
| deps = [ |
| ":${invoker.target_name}_response_file", |
| ] |
| |
| script = "//build/gn_run_binary.py" |
| |
| inputs = [ |
| # Depend on the SDK hash, to ensure rebuild if the SDK tools change. |
| "${fuchsia_sdk}/.hash", |
| _response_file, |
| ] |
| |
| outputs = [ |
| _json_representation, |
| _tables_file, |
| ] |
| |
| rebased_response_file = rebase_path(_response_file, root_build_dir) |
| args = [ |
| rebase_path("//third_party/fuchsia-sdk/sdk/tools/fidlc", root_build_dir), |
| "@$rebased_response_file", |
| ] |
| } |
| |
| if (_define_cpp_action) { |
| action("${target_name}_cpp_gen") { |
| visibility = [ ":${invoker.target_name}" ] |
| forward_variables_from(invoker, [ "testonly" ]) |
| |
| deps = [ |
| ":${invoker.target_name}_compile", |
| ] |
| |
| inputs = [ |
| # Depend on the SDK hash, to ensure rebuild if the SDK tools change. |
| "${fuchsia_sdk}/.hash", |
| _json_representation, |
| ] |
| |
| outputs = [ |
| "${_output_base}.h", |
| "${_output_base}.cc", |
| ] |
| |
| script = "//build/gn_run_binary.py" |
| args = [ |
| rebase_path("//third_party/fuchsia-sdk/sdk/tools/fidlgen", |
| root_build_dir), |
| "-generators", |
| "cpp", |
| "-json", |
| rebase_path(_json_representation, root_build_dir), |
| "-include-base", |
| rebase_path(_output_gen_dir, root_build_dir), |
| "-output-base", |
| rebase_path("${_output_base}", root_build_dir), |
| ] |
| } |
| } |
| |
| if (_define_js_action) { |
| _output_js_path = "$_output_gen_dir/${_library_path}/js/fidl.js" |
| action("${target_name}_js_gen") { |
| visibility = [ ":${invoker.target_name}" ] |
| forward_variables_from(invoker, [ "testonly" ]) |
| |
| deps = [ |
| ":${invoker.target_name}_compile", |
| ] |
| |
| inputs = [ |
| # Depend on the SDK hash, to ensure rebuild if the SDK tools change. |
| "${fuchsia_sdk}/.hash", |
| _json_representation, |
| "//build/fuchsia/fidlgen_js/fidl.py", # The schema helper file. |
| ] |
| |
| outputs = [ |
| _output_js_path, |
| ] |
| |
| script = "//build/fuchsia/fidlgen_js/gen.py" |
| |
| args = [ |
| rebase_path(_json_representation, root_build_dir), |
| "--output", |
| rebase_path("${_output_js_path}", root_build_dir), |
| ] |
| |
| data = [] |
| foreach(o, outputs) { |
| data += [ o ] |
| } |
| } |
| } |
| |
| config("${target_name}_config") { |
| visibility = [ ":${invoker.target_name}" ] |
| include_dirs = [ _output_gen_dir ] |
| } |
| |
| source_set("${target_name}") { |
| forward_variables_from(invoker, |
| [ |
| "deps", |
| "public_deps", |
| "testonly", |
| "visibility", |
| ]) |
| |
| sources = [ |
| "${_output_base}.cc", |
| "${_output_base}.h", |
| _tables_file, |
| ] |
| |
| if (!defined(deps)) { |
| deps = [] |
| } |
| deps += [ ":${invoker.target_name}_compile" ] |
| |
| foreach(language, languages) { |
| deps += [ ":${invoker.target_name}_${language}_gen" ] |
| } |
| |
| if (!defined(public_deps)) { |
| public_deps = [] |
| } |
| public_deps += [ "//third_party/fuchsia-sdk/sdk:fidl" ] |
| public_deps += [ "//third_party/fuchsia-sdk/sdk:fidl_cpp" ] |
| |
| public_configs = [ ":${invoker.target_name}_config" ] |
| } |
| } |