blob: 885f5caf308fb910890f9da3fde5d542413525d9 [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.
#
# product (optional)
# Whether this is a product build. Defaults to false.
#
# aot (optional)
# Whether this is an AOT build. Defaults to false.
#
# 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")
args = []
if (defined(invoker.args)) {
args += invoker.args
}
aot = false
if (defined(invoker.aot) && invoker.aot) {
aot = invoker.aot
}
product = false
if (defined(invoker.product) && invoker.product) {
product = invoker.product
}
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 += [
# TODO(https://github.com/dart-lang/sdk/issues/36639):
# Remove when new constant eval supports dilp files.
"--enable-experiment=no-constant-update-2018",
"--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 (aot) {
args += [
"--aot",
"--tfa",
]
}
if (product) {
# Setting this flag in a non-product release build for AOT (a "profile"
# build) causes the vm service isolate code to be tree-shaken from an app.
# See the pragma on the entrypoint here:
#
# https://github.com/dart-lang/sdk/blob/master/runtime/bin/vmservice/vmservice_io.dart#L240
#
# Also, this define excludes debugging and profiling code from Flutter.
args += [
"-Ddart.vm.product=true",
]
} else {
if (!is_debug) {
# The following define excludes debugging code from Flutter.
args += [
"-Ddart.vm.profile=true",
]
}
}
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" ]
}
}