blob: 5c2f1f47cf485cd7ee1818ef499be2dd5ca2275e [file] [log] [blame]
# 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/dart/dart_library.gni")
import("//build/dart/toolchain.gni")
_compiler_label = "//topaz/runtime/dart:kernel_compiler($host_toolchain)"
_compiler_path = get_label_info(_compiler_label, "root_out_dir") +
"/dart-tools/kernel_compiler"
# Generates dill files for a Dart application
#
# Parameters
#
# platform_deps (required)
# Dependent targets that populate `platform_path` with the platform dill
# files.
#
# sources_required (optional)
# Whether complete source files are required by the rule. If true, all
# files under the source_dir must be included in sources.
# Defaults to false.
#
# platform_path (required)
# Path to the build output directory containing the platform dill files.
#
# platform_name (required)
# The name of the platform, either "flutter_runner" or "dart_runner".
#
# main_dart (required)
# Path to Dart source file containing main().
#
# package_name (optional)
# The name of the dart package. If not provided it will be inferred from the
# target name.
#
# sources (optional)
# A list of the application's Dart source files.
#
# manifest (optional)
# Path to an output manifest file containing the list of partial dill files.
#
# args (optional)
# A list of additional arguments to the compiler.dart program in this
# directory that generates the kernel files.
#
# gen_bytecode (optional)
# Whether the kernel compiler should generate bytecode. Defaults to false.
#
# Forwarded to dart_library:
# deps, disable_analysis, non_dart_deps, source_dir.
template("dart_kernel") {
assert(defined(invoker.platform_deps), "dart_kernel() requires platform_deps")
assert(defined(invoker.platform_path), "dart_kernel() requires platform_path")
assert(defined(invoker.platform_name), "dart_kernel() requires platform_name")
assert(defined(invoker.main_dart), "dart_kernel() requires main_dart")
dart_library_target_name = "${target_name}_dart_library"
dart_library(dart_library_target_name) {
forward_variables_from(invoker,
[
"deps",
"package_root",
"disable_analysis",
"non_dart_deps",
"source_dir",
])
if (defined(invoker.package_name)) {
package_name = invoker.package_name
} else {
infer_package_name = true
}
if (defined(invoker.sources_required)) {
sources_required = invoker.sources_required
}
sources = []
if (defined(invoker.sources)) {
sources += invoker.sources
}
extra_sources = [ invoker.main_dart ]
}
# TODO(tvolkert): Name this ${target_name}
action("${target_name}_kernel") {
pool = "//build/dart:dart_pool($dart_toolchain)"
forward_variables_from(invoker,
[
"testonly",
"visibility",
])
kernel_path = "$target_gen_dir/${target_name}.dil"
depfile = "${kernel_path}.d"
deps = invoker.platform_deps + [
":$dart_library_target_name",
_compiler_label,
]
outputs = [
kernel_path,
]
if (defined(invoker.manifest)) {
outputs += [
# Explicit output when using --manifest.
invoker.manifest,
# Implicit output when using --manifest; see createManifest in compiler.dart.
invoker.manifest + ".dilplist",
invoker.manifest + ".frameworkversion",
]
}
dart_target_gen_dir =
get_label_info(":bogus($dart_toolchain)", "target_gen_dir")
rebased_packages_path =
rebase_path("$dart_target_gen_dir/$dart_library_target_name.packages",
"//")
multi_root_scheme = "fuchsia-source"
script = _compiler_path
args = invoker.args + [
"--target",
invoker.platform_name,
"--platform",
rebase_path("${invoker.platform_path}/platform_strong.dill"),
"--filesystem-scheme",
multi_root_scheme,
"--filesystem-root",
rebase_path("//"),
"--packages",
"$multi_root_scheme:///$rebased_packages_path",
"--depfile",
rebase_path(depfile, root_build_dir),
"--output",
rebase_path(kernel_path, root_build_dir),
"--no-link-platform",
]
if (defined(invoker.manifest)) {
args += [
"--split-output-by-packages",
"--manifest",
rebase_path(invoker.manifest),
]
}
if (is_debug) {
args += [ "--embed-sources" ]
} else {
args += [ "--no-embed-sources" ]
}
if (defined(invoker.gen_bytecode) && invoker.gen_bytecode) {
args += [ "--gen-bytecode", "--drop-ast" ]
}
rebased_main_dart = rebase_path(invoker.main_dart, "//")
args += [ "$multi_root_scheme:///$rebased_main_dart" ]
}
}