| # 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/sdk/sdk_atom.gni") |
| |
| # A set of C++ code exportable in an SDK as sources. |
| # |
| # Parameters |
| # |
| # type (required) |
| # GN template type for the library. |
| # |
| # category (required) |
| # Publication level of the library in SDKs. |
| # See //build/sdk/sdk_atom.gni. |
| # |
| # sdk_name (optional) |
| # Name of the library in the SDK. |
| # If not specified, a name is inferred from the target's label. |
| # |
| # source_dir (optional) |
| # If set, path to the base directory of the sources. |
| # This is useful if the sources are generated and therefore not hosted |
| # directly under the directory where the GN rules are declared. |
| # |
| # include_base (optional) |
| # Path to the root directory for includes. |
| # Defaults to "include". |
| |
| template("sdk_library") { |
| assert(defined(invoker.type), "Must specify a library type.") |
| library_type = invoker.type |
| |
| assert(defined(invoker.category), "Must define an SDK category") |
| |
| main_target_name = target_name |
| sdk_target_name = "${target_name}_sdk" |
| |
| target(library_type, main_target_name) { |
| forward_variables_from(invoker, |
| "*", |
| [ |
| "category", |
| "include_base", |
| "sdk_name", |
| "source_dir", |
| "type", |
| ]) |
| |
| if (defined(visibility)) { |
| visibility += [ ":$sdk_target_name" ] |
| } |
| } |
| |
| compute_name = !defined(invoker.sdk_name) |
| if (compute_name) { |
| name_target_name = "${target_name}_name" |
| default_name = target_name |
| target_label = get_label_info(":$target_name", "label_no_toolchain") |
| atom_name_file = "$target_gen_dir/${target_name}_sdk_name.txt" |
| |
| action(name_target_name) { |
| script = "//build/cpp/compute_sdk_name.py" |
| |
| outputs = [ |
| atom_name_file, |
| ] |
| |
| args = [ |
| "--out", |
| rebase_path(atom_name_file), |
| "--default-name", |
| default_name, |
| "--label", |
| target_label, |
| ] |
| } |
| } else { |
| atom_name = invoker.sdk_name |
| } |
| |
| sdk_atom(sdk_target_name) { |
| forward_variables_from(invoker, |
| [ |
| "source_dir", |
| "testonly", |
| ]) |
| |
| domain = "cpp" |
| if (compute_name) { |
| name_file = atom_name_file |
| } else { |
| name = atom_name |
| } |
| |
| category = invoker.category |
| |
| tags = [ "type:sources" ] |
| |
| headers = [] |
| sources = [] |
| source_headers_are_public = true |
| if (defined(invoker.public)) { |
| source_headers_are_public = false |
| headers += invoker.public |
| } |
| if (defined(invoker.sources)) { |
| foreach(source_file, invoker.sources) { |
| extension = get_path_info(source_file, "extension") |
| if (extension == "h" && source_headers_are_public) { |
| headers += [ source_file ] |
| } else { |
| sources += [ source_file ] |
| } |
| } |
| } |
| |
| files = [] |
| foreach(source_file, sources) { |
| files += [ |
| { |
| source = source_file |
| }, |
| ] |
| } |
| foreach(header_file, headers) { |
| include_base = "include" |
| if (defined(invoker.include_base)) { |
| include_base = invoker.include_base |
| } |
| destination = rebase_path(header_file, include_base) |
| files += [ |
| { |
| source = header_file |
| dest = "include/$destination" |
| }, |
| ] |
| } |
| |
| deps = [] |
| if (defined(invoker.public_deps)) { |
| foreach(dep, invoker.public_deps) { |
| full_label = get_label_info(dep, "label_no_toolchain") |
| deps += [ "${full_label}_sdk" ] |
| } |
| } |
| |
| non_sdk_deps = [ ":$main_target_name" ] |
| if (compute_name) { |
| non_sdk_deps += [ ":$name_target_name" ] |
| } |
| |
| # Explicitly add non-public dependencies, in case some of the source files |
| # are generated. |
| if (defined(invoker.deps)) { |
| non_sdk_deps += invoker.deps |
| } |
| } |
| } |