| # 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") |
| import("//build/config/sysroot.gni") |
| |
| # Creates a Fuchsia .far package file. |
| # |
| # Parameters are: |
| # package_name: The name of the package to build. |
| # binary: The name of the executable which should be launched by the package. |
| # Will be renamed as "bin/app" in the package contents. |
| # sandbox_policy: A path to the sandbox_policy applied to this package. |
| # deps: A list of targets whose output will be included in the package. |
| template("package") { |
| pkg = { |
| package_name = target_name |
| forward_variables_from(invoker, "*") |
| } |
| assert(defined(pkg.binary)) |
| |
| _pm_tool_path = "${fuchsia_sdk}/tools/pm" |
| |
| _pkg_out_dir = "$root_out_dir/gen/" + get_label_info(pkg.package_name, "dir") |
| _runtime_deps_file = "$_pkg_out_dir/${pkg.package_name}.runtime_deps" |
| _manifest_file = "$_pkg_out_dir/${pkg.package_name}.archive_manifest" |
| _key_file = "$_pkg_out_dir/signing-key" |
| _meta_far_file = "$_pkg_out_dir/meta.far" |
| _combined_far_file = "$_pkg_out_dir/${pkg.package_name}-0.far" |
| _final_far_file = "$_pkg_out_dir/${pkg.package_name}.far" |
| |
| _write_manifest_target = "${pkg.package_name}__write_manifest" |
| _generate_key_target = "${pkg.package_name}__genkey" |
| _package_target = "${pkg.package_name}__pkg" |
| _bundle_target = "${pkg.package_name}__bundle" |
| |
| # Generates a manifest file based on the GN runtime deps |
| # suitable for "pm" tool consumption. |
| action(_write_manifest_target) { |
| _depfile = "${target_gen_dir}/${target_name}_stamp.d" |
| |
| forward_variables_from(invoker, |
| [ |
| "deps", |
| "public_deps", |
| "testonly", |
| ]) |
| |
| script = "//build/config/fuchsia/build_manifest.py" |
| |
| inputs = [ |
| _runtime_deps_file, |
| "//build/config/fuchsia/sandbox_policy", |
| ] |
| |
| outputs = [ |
| _manifest_file, |
| ] |
| |
| data_deps = pkg.deps |
| |
| # Use a depfile to trigger package rebuilds if any of the files (static |
| # assets, shared libraries, etc.) included by the package have changed. |
| depfile = _depfile |
| |
| args = [ |
| rebase_path("//"), |
| rebase_path(root_out_dir), |
| pkg.package_name, |
| pkg.binary, |
| rebase_path(pkg.sandbox_policy), |
| rebase_path(_runtime_deps_file), |
| rebase_path(_depfile), |
| rebase_path(dist_libroot) + "," + rebase_path("${sysroot}/dist"), |
| rebase_path(_manifest_file), |
| ] |
| |
| write_runtime_deps = _runtime_deps_file |
| } |
| |
| # Generates a signing key to use for building the package. |
| action(_generate_key_target) { |
| forward_variables_from(invoker, [ "testonly" ]) |
| |
| script = "//build/gn_run_binary.py" |
| |
| outputs = [ |
| _key_file, |
| ] |
| |
| args = [ |
| rebase_path(_pm_tool_path, root_build_dir), |
| "-k", |
| rebase_path(_key_file), |
| "genkey", |
| ] |
| } |
| |
| # Creates a signed Fuchsia metadata package. |
| action(_package_target) { |
| forward_variables_from(invoker, [ "testonly" ]) |
| |
| script = "//build/gn_run_binary.py" |
| |
| deps = [ |
| ":$_generate_key_target", |
| ":$_write_manifest_target", |
| ] |
| |
| inputs = [ |
| _key_file, |
| ] |
| |
| outputs = [ |
| _meta_far_file, |
| ] |
| |
| args = [ |
| rebase_path(_pm_tool_path, root_build_dir), |
| "-o", |
| rebase_path(_pkg_out_dir), |
| "-k", |
| rebase_path(_key_file), |
| "-m", |
| rebase_path(_manifest_file), |
| "build", |
| ] |
| } |
| |
| # Creates a package containing the metadata archive and blob data. |
| action(_bundle_target) { |
| forward_variables_from(invoker, [ "testonly" ]) |
| |
| script = "//build/gn_run_binary.py" |
| |
| deps = [ |
| ":$_package_target", |
| ":$_write_manifest_target", |
| ] |
| |
| inputs = [ |
| _meta_far_file, |
| _manifest_file, |
| ] |
| |
| outputs = [ |
| _combined_far_file, |
| ] |
| |
| args = [ |
| rebase_path(_pm_tool_path, root_build_dir), |
| "-o", |
| rebase_path(_pkg_out_dir), |
| "-m", |
| rebase_path(_manifest_file), |
| "archive", |
| ] |
| } |
| |
| # Copies the archive to a well-known path. |
| # TODO(kmarshall): Use a 'pm' output flag to write directly to the desired |
| # file path instead. |
| copy(target_name) { |
| forward_variables_from(invoker, [ "testonly" ]) |
| |
| deps = [ |
| ":$_bundle_target", |
| ] |
| |
| data = [ |
| _final_far_file, |
| ] |
| |
| sources = [ |
| _combined_far_file, |
| ] |
| outputs = [ |
| _final_far_file, |
| ] |
| } |
| } |