blob: 5606565987a90050cc8db1668763aa162962fc60 [file] [log] [blame] [edit]
# Copyright 2013 The Flutter 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/fuchsia/config.gni")
import("//flutter/tools/fuchsia/fuchsia_debug_symbols.gni")
import("//flutter/tools/fuchsia/fuchsia_libs.gni")
import("//flutter/tools/fuchsia/gn-sdk/config/config.gni")
# Compiles a CML file for a V2 component.
#
# manifest (required):
# The path to the .cml file for the component. Should include the file extension.
# output (optional):
# The path for the output .cm file. Should include the file extension.
template("_compile_cml") {
assert(defined(invoker.manifest), "_compile_cml must define manifest")
action(target_name) {
forward_variables_from(invoker,
[
"deps",
"testonly",
"visibility",
])
script = "//flutter/tools/fuchsia/compile_cml.py"
inputs = [ "$fuchsia_tool_dir/cmc" ]
sources = [ invoker.manifest ]
args = [
"--cmc-bin",
rebase_path("$fuchsia_tool_dir/cmc"),
"--manifest-file",
rebase_path(invoker.manifest),
"--output",
rebase_path(invoker.output, root_build_dir),
"--includepath",
rebase_path("$fuchsia_sdk/pkg/", root_build_dir),
"--includepath",
get_path_info(invoker.manifest, "dir"),
"--includepath",
rebase_path("//"),
]
outputs = [ invoker.output ]
}
}
# Creates a Fuchsia archive (.far) file using PM from the Fuchsia SDK.
#
# binary (required):
# The ELF binary for the archive's program.
# cmx_file (optional):
# The path to the V1 component manifest (.cmx file) for the archive's component.
# Should include the file extension.
# cml_file (optional):
# The path to the V2 component manifest (.cml file) for the archive's component.
# Should include the file extension.
# deps (optional):
# The code dependencies for the archive.
# inputs (optional):
# When these files are changed, the package should be regenerated.
# libraries (optional):
# Paths to .so libraries that should be dynamically linked to the binary.
# resources (optional):
# Files that should be placed into the `data/` directory of the archive.
# testonly (optional):
# Set this to true for archives that are only used for tests.
template("_fuchsia_archive") {
assert(defined(invoker.binary), "package must define binary")
pkg_testonly = defined(invoker.testonly) && invoker.testonly
pkg_target_name = target_name
pkg = {
package_version = "0" # placeholder
forward_variables_from(invoker,
[
"binary",
"deps",
"resources",
"libraries",
])
if (!defined(package_name)) {
package_name = pkg_target_name
}
if (!defined(deps)) {
deps = []
}
if (!defined(resources)) {
resources = []
}
if (!defined(libraries)) {
libraries = []
}
}
far_base_dir = "$root_out_dir/${pkg_target_name}_far"
copy_sources = [ "$root_out_dir/${invoker.binary}" ]
copy_outputs = [ "$far_base_dir/bin/app" ]
foreach(res, pkg.resources) {
copy_sources += [ res.path ]
copy_outputs += [ "$far_base_dir/data/${res.dest}" ]
}
foreach(lib, pkg.libraries) {
output_path = ""
if (defined(lib.output_path)) {
output_path = lib.output_path
}
copy_sources += [ "${lib.path}/${lib.name}" ]
copy_outputs += [ "$far_base_dir/lib/${output_path}${lib.name}" ]
}
pkg_dir_deps = pkg.deps
if (defined(invoker.cmx_file)) {
# cmx files are used for v1 components, only copy it if it is defined
cmx_file = invoker.cmx_file
cmx_target = "$pkg_target_name.copy_cmx"
copy("$cmx_target") {
sources = [ "$cmx_file" ]
outputs = [ "$far_base_dir/meta/${pkg_target_name}.cmx" ]
}
pkg_dir_deps += [ ":$cmx_target" ]
}
write_file("${far_base_dir}/meta/package",
{
name = pkg.package_name
version = pkg.package_version
},
"json")
_dbg_symbols_target = "${target_name}_dbg_symbols"
fuchsia_debug_symbols(_dbg_symbols_target) {
deps = pkg.deps
testonly = pkg_testonly
binary = invoker.binary
}
action("${target_name}_dir") {
script = "//flutter/tools/fuchsia/copy_path.py"
sources = copy_sources
response_file_contents = rebase_path(copy_sources + copy_outputs)
deps = pkg_dir_deps
args = [ "--file-list={{response_file_name}}" ]
outputs = copy_outputs
testonly = pkg_testonly
}
manifest_json_file = "${root_out_dir}/${target_name}_package_manifest.json"
action(target_name) {
script = "//flutter/tools/fuchsia/gen_package.py"
deps = pkg_dir_deps + [
":${target_name}_dir",
":${_dbg_symbols_target}",
]
sources = copy_outputs
inputs = []
if (defined(invoker.inputs)) {
inputs += invoker.inputs
}
args = [
"--pm-bin",
rebase_path("$fuchsia_tool_dir/pm"),
"--package-dir",
rebase_path(far_base_dir),
"--far-name",
target_name,
"--manifest-json-file",
rebase_path(manifest_json_file, root_build_dir),
]
assert(fuchsia_target_api_level != -1,
"Must set a target api level when creating an archive")
if (fuchsia_target_api_level != -1) {
args += [
"--api-level",
"${fuchsia_target_api_level}",
]
}
outputs = [
manifest_json_file,
"${far_base_dir}.manifest",
"$root_out_dir/${target_name}-0.far",
]
testonly = pkg_testonly
}
}
# Creates a Fuchsia archive.
#
# An archive combines an ELF binary and a component manifest to create
# a packaged Fuchsia program that can be deployed to a Fuchsia device.
#
# binary (required):
# The ELF binary for the archive's program.
# cmx_file (required if cml_file is not set):
# The V1 component manifest for the Fuchsia component.
# cml_file (required if cmx_file is not set):
# The V2 component manifest for the Fuchsia component.
# deps (optional):
# The code dependencies for the archive.
# inputs (optional):
# When these files are changed, the package should be regenerated.
# libraries (optional):
# Paths to .so libraries that should be dynamically linked to the binary.
# resources (optional):
# Files that should be placed into the `data/` directory of the archive.
# testonly (optional):
# Set this to true for archives that are only used for tests.
template("fuchsia_archive") {
assert(defined(invoker.cmx_file) || defined(invoker.cml_file),
"must specify either a cmx file, cml file or both")
_deps = []
if (defined(invoker.deps)) {
_deps += invoker.deps
}
if (defined(invoker.cml_file)) {
_far_base_dir = "$root_out_dir/${target_name}_far"
_cml_file_name = get_path_info(invoker.cml_file, "name")
_compile_cml_target = "${target_name}_${_cml_file_name}_compile_cml"
_compile_cml(_compile_cml_target) {
forward_variables_from(invoker, [ "testonly" ])
manifest = invoker.cml_file
output = "$_far_base_dir/meta/${_cml_file_name}.cm"
}
_deps += [ ":$_compile_cml_target" ]
}
_fuchsia_archive(target_name) {
deps = _deps
forward_variables_from(invoker,
[
"binary",
"cmx_file",
"inputs",
"libraries",
"resources",
"testonly",
])
}
}
# Creates a Fuchsia archive (.far) file containing a generated test root
# component and test driver component, using PM from the Fuchsia SDK.
#
# binary (required):
# The binary for the test.
# deps (required):
# Dependencies for the test archive.
# cmx_file (optional):
# A path to the .cmx file for the test archive.
# If not defined, a generated .cml file for the test archive will be used instead.
# cml_file (optional):
# The path to the V2 component manifest (.cml file) for the test archive's component.
# Should include the file extension.
# If not defined, a generated .cml file for the test archive will be used instead.
# libraries (optional):
# Paths to .so libraries that should be dynamically linked to the binary.
# resources (optional):
# Files that should be placed into the `data/` directory of the archive.
template("fuchsia_test_archive") {
assert(defined(invoker.deps), "package must define deps")
_deps = []
if (defined(invoker.deps)) {
_deps += invoker.deps
}
if (defined(invoker.cml_file)) {
_far_base_dir = "$root_out_dir/${target_name}_far"
_cml_file_name = get_path_info(invoker.cml_file, "name")
_compile_cml_target = "${target_name}_${_cml_file_name}_compile_cml"
_compile_cml(_compile_cml_target) {
forward_variables_from(invoker, [ "testonly" ])
manifest = invoker.cml_file
output = "$_far_base_dir/meta/${_cml_file_name}.cm"
}
_deps += [ ":$_compile_cml_target" ]
} else {
# Interpolate test_suite.cml template with the test suite's name.
test_suite = target_name
interpolate_cml_target = "${test_suite}_interpolate_cml"
generated_cml_file = "$root_out_dir/$test_suite.cml"
action(interpolate_cml_target) {
testonly = true
script = "//flutter/tools/fuchsia/interpolate_test_suite.py"
sources = [ "//flutter/testing/fuchsia/meta/test_suite.cml" ]
args = [
"--input",
rebase_path("//flutter/testing/fuchsia/meta/test_suite.cml"),
"--test-suite",
test_suite,
"--output",
rebase_path(generated_cml_file),
]
outputs = [ generated_cml_file ]
}
far_base_dir = "$root_out_dir/${target_name}_far"
# Compile the resulting interpolated test suite's cml.
compile_test_suite_cml_target = "${test_suite}_test_suite_compile_cml"
_compile_cml(compile_test_suite_cml_target) {
testonly = true
deps = [ ":$interpolate_cml_target" ]
manifest = generated_cml_file
output = "$far_base_dir/meta/${test_suite}.cm"
}
_deps += [ ":$compile_test_suite_cml_target" ]
}
_fuchsia_archive(target_name) {
testonly = true
forward_variables_from(invoker,
[
"binary",
"resources",
])
libraries = common_libs
if (defined(invoker.libraries)) {
libraries += invoker.libraries
}
deps = _deps
}
}