|  | # Copyright (c) 2023, the Dart project authors.  Please see the AUTHORS file | 
|  | # for details. 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_action.gni") | 
|  | import("../../runtime/runtime_args.gni") | 
|  | import("../../sdk_args.gni") | 
|  | import("../../utils/compile_platform.gni") | 
|  | import("../aot_snapshot.gni") | 
|  | import("../application_snapshot.gni") | 
|  | import("../create_timestamp.gni") | 
|  |  | 
|  | sdk_outline_dill = "$root_out_dir/ddc_outline.dill" | 
|  | sdk_full_dill = "$root_out_dir/ddc_platform.dill" | 
|  |  | 
|  | sdk_root = "../../sdk" | 
|  | pkg_root = "../../pkg" | 
|  |  | 
|  | aot_snapshot("dartdevc_aot") { | 
|  | main_dart = "../../pkg/dev_compiler/bin/dartdevc.dart" | 
|  | name = "dartdevc_aot" | 
|  | output = "$root_gen_dir/dartdevc_aot.dart.snapshot" | 
|  | } | 
|  |  | 
|  | aot_snapshot("dartdevc_aot_product") { | 
|  | main_dart = "../../pkg/dev_compiler/bin/dartdevc.dart" | 
|  | name = "dartdevc_aot_product" | 
|  | output = "$root_gen_dir/dartdevc_aot_product.dart.snapshot" | 
|  |  | 
|  | # dartaotruntime in the dart sdk has dart_product_config applied to it, | 
|  | # so it is built in product mode in both release and | 
|  | # product builds, and is only built in debug mode in debug | 
|  | # builds. The following line ensures that the dartaotruntime | 
|  | # and dartdevc_aot snapshot in an SDK build are | 
|  | # always compatible with each other. | 
|  | force_product_mode = !dart_debug | 
|  | } | 
|  |  | 
|  | application_snapshot("dartdevc") { | 
|  | main_dart = "../../pkg/dev_compiler/bin/dartdevc.dart" | 
|  |  | 
|  | training_args = [ | 
|  | "--dart-sdk-summary", | 
|  | rebase_path(sdk_outline_dill), | 
|  | "-o", | 
|  | "dartdevc.js", | 
|  | rebase_path("../../pkg/dev_compiler/bin/dartdevc.dart"), | 
|  | ] | 
|  |  | 
|  | training_deps = [ ":ddc_platform" ] | 
|  | training_inputs = [ sdk_outline_dill ] | 
|  | } | 
|  |  | 
|  | template("dart2js_compile") { | 
|  | assert(defined(invoker.main), "Must specify the main file") | 
|  | main = invoker.main | 
|  | assert(defined(invoker.out), "Must specify the out file") | 
|  | out = invoker.out | 
|  | abs_main = rebase_path(main) | 
|  | abs_output = rebase_path(out) | 
|  |  | 
|  | prebuilt_dart_action(target_name) { | 
|  | deps = invoker.deps + [ "../compiler:compile_dart2js_platform" ] | 
|  |  | 
|  | inputs = [ | 
|  | "$root_out_dir/dart2js_platform.dill", | 
|  | "$root_out_dir/dart2js_outline.dill", | 
|  | ] | 
|  | outputs = [ out ] | 
|  |  | 
|  | script = "../../pkg/compiler/lib/src/dart2js.dart" | 
|  |  | 
|  | packages = "../../.dart_tool/package_config.json" | 
|  |  | 
|  | vm_args = [ "-Dsdk_hash=$sdk_hash" ] | 
|  |  | 
|  | args = [ | 
|  | "$abs_main", | 
|  | "-m", | 
|  | "--invoker=gn_build", | 
|  | "-o$abs_output", | 
|  | "--no-source-maps", | 
|  | "--platform-binaries=" + rebase_path("$root_out_dir"), | 
|  | ] | 
|  | } | 
|  | } | 
|  |  | 
|  | dart2js_compile("stack_trace_mapper") { | 
|  | main = rebase_path("../../pkg/dev_compiler/web/stack_trace_mapper.dart") | 
|  | out = "$root_out_dir/dev_compiler/build/web/dart_stack_trace_mapper.js" | 
|  | deps = [ ":ddc_files_stamp" ] | 
|  | } | 
|  |  | 
|  | # Builds everything needed to run tests with DDC (stable) using test.dart. | 
|  | group("ddc_stable_test") { | 
|  | deps = [ | 
|  | ":dartdevc", | 
|  | ":ddc_stable_test_local", | 
|  | "../..:create_sdk", | 
|  | ] | 
|  | } | 
|  |  | 
|  | # Builds everything needed to run tests with DDC (canary) using test.dart. | 
|  | group("ddc_canary_test") { | 
|  | deps = [ | 
|  | ":dartdevc", | 
|  | ":ddc_canary_test_local", | 
|  | "../..:create_sdk", | 
|  | ] | 
|  | } | 
|  |  | 
|  | # Builds everything needed to run tests with DDC (stable) locally using | 
|  | # test.dart without --use-sdk. | 
|  | # | 
|  | # This is the same as ddc_stable_test, but skips the targets that depend on | 
|  | # building the Dart VM and create_sdk. | 
|  | group("ddc_stable_test_local") { | 
|  | deps = [ | 
|  | ":ddc_stable_sdk", | 
|  | ":ddc_stable_test_pkg", | 
|  | ] | 
|  | } | 
|  |  | 
|  | # Builds everything needed to run tests with DDC (stable) locally using | 
|  | # test.dart without --use-sdk. | 
|  | # | 
|  | # This is the same as ddc_stable_test,but skips the targets that depend on | 
|  | # building the Dart VM and create_sdk. | 
|  | group("ddc_canary_test_local") { | 
|  | deps = [ | 
|  | ":ddc_canary_sdk", | 
|  | ":ddc_canary_sdk_ddc_module", | 
|  | ":ddc_canary_test_pkg", | 
|  | ] | 
|  | } | 
|  |  | 
|  | create_timestamp_file("ddc_files_stamp") { | 
|  | path = rebase_path("../../pkg/dev_compiler/lib") | 
|  | output = "$target_gen_dir/ddc_files.stamp" | 
|  | } | 
|  |  | 
|  | create_timestamp_file("ddc_sdk_patch_stamp") { | 
|  | path = rebase_path("$sdk_root/lib/_internal/js_dev_runtime") | 
|  | output = "$target_gen_dir/ddc_sdk_patch_stamp.stamp" | 
|  | } | 
|  |  | 
|  | # Compiles to JavaScript using DDC (stable) all packages imported in tests. | 
|  | # TODO(sigmund): generate a js bundle or a module that load these indirectly so | 
|  | # we can stop referring to this list of packages explicitly in the test_runner. | 
|  | group("ddc_stable_test_pkg") { | 
|  | deps = [ | 
|  | ":ddc_test_pkg_outline", | 
|  | ":expect_stable_js", | 
|  | ":js_stable_js", | 
|  | ":meta_stable_js", | 
|  | ] | 
|  | } | 
|  |  | 
|  | # Compiles to JavaScript using DDC (canary) all packages imported in tests. | 
|  | group("ddc_canary_test_pkg") { | 
|  | deps = [ | 
|  | ":ddc_test_pkg_outline", | 
|  | ":expect_canary_ddc_js", | 
|  | ":expect_canary_js", | 
|  | ":js_canary_ddc_js", | 
|  | ":js_canary_js", | 
|  | ":meta_canary_ddc_js", | 
|  | ":meta_canary_js", | 
|  | ] | 
|  | } | 
|  |  | 
|  | group("ddc_test_pkg_outline") { | 
|  | deps = [ | 
|  | ":expect_outline", | 
|  | ":js_outline", | 
|  | ":meta_outline", | 
|  | ] | 
|  | } | 
|  |  | 
|  | template("ddc_compile") { | 
|  | assert(defined(invoker.package), | 
|  | "Need 'package' in $target_name (the name of the package)") | 
|  | assert(defined(invoker.canary), "Need 'canary' in $target_name.") | 
|  | assert(defined(invoker.modules), "Need 'modules' in $target_name.") | 
|  |  | 
|  | if (invoker.canary) { | 
|  | js_gen_dir = "$target_gen_dir/canary/pkg" | 
|  | } else { | 
|  | js_gen_dir = "$target_gen_dir/stable/pkg" | 
|  | } | 
|  |  | 
|  | # Other optional invoker parameters: | 
|  | #   * extra_libraries: entrypoints to include in the module as | 
|  | #     "package:package_name/library_name.dart" (the rule implicitly adds | 
|  | #     the default import "package:package_name/package_name.dart"). | 
|  | #   * package_dependencies: the name of other packages this package depends | 
|  | #     on. When providing `name`, a separate `ddc_compile` target | 
|  | #     named `${name}_js` must exist. | 
|  | #   * args: additional args to pass to dartdevc | 
|  |  | 
|  | prebuilt_dart_action(target_name) { | 
|  | script = "../../pkg/dev_compiler/bin/dartdevc.dart" | 
|  | package_name = invoker.package | 
|  | out_dir = rebase_path("$js_gen_dir") | 
|  | sdk_path = rebase_path(sdk_outline_dill) | 
|  | pkg_root = rebase_path("$root_build_dir/../../pkg") | 
|  |  | 
|  | deps = [ | 
|  | ":ddc_files_stamp", | 
|  | ":ddc_platform", | 
|  | ] | 
|  |  | 
|  | inputs = [ | 
|  | sdk_outline_dill, | 
|  | "$target_gen_dir/ddc_files.stamp", | 
|  | ] | 
|  |  | 
|  | outputs = [] | 
|  | args = [] | 
|  | foreach(module, invoker.modules) { | 
|  | outputs += [ | 
|  | "$js_gen_dir/$module/$package_name.js", | 
|  | "$js_gen_dir/$module/$package_name.js.map", | 
|  | ] | 
|  |  | 
|  | args += [ | 
|  | "--modules=$module", | 
|  | "-o$out_dir/$module/$package_name.js", | 
|  | ] | 
|  | } | 
|  |  | 
|  | vm_args = [ "-Dsdk_hash=$sdk_hash" ] | 
|  |  | 
|  | args += [ | 
|  | "--no-summarize", | 
|  | "--multi-root-output-path=$pkg_root", | 
|  | "--dart-sdk-summary=$sdk_path", | 
|  | "package:$package_name/$package_name.dart", | 
|  | ] | 
|  |  | 
|  | if (defined(invoker.extra_libraries)) { | 
|  | foreach(lib, invoker.extra_libraries) { | 
|  | args += [ "package:$package_name/$lib.dart" ] | 
|  | } | 
|  | } | 
|  |  | 
|  | if (defined(invoker.package_dependencies)) { | 
|  | foreach(dep, invoker.package_dependencies) { | 
|  | deps += [ ":${dep}_js" ] | 
|  | args += [ "-s$out_dir/$dep.dill" ] | 
|  | } | 
|  | } | 
|  |  | 
|  | if (defined(invoker.args)) { | 
|  | args += invoker.args | 
|  | } | 
|  |  | 
|  | if (invoker.canary) { | 
|  | args += [ "--canary" ] | 
|  | } | 
|  | } | 
|  | } | 
|  |  | 
|  | # Compiles a package to outline .dill file with the "dartdevc" target option. | 
|  | template("package_kernel_outline") { | 
|  | assert(defined(invoker.package), | 
|  | "Need 'package' in $target_name (the name of the package)") | 
|  |  | 
|  | module = invoker.package | 
|  | output = "$target_gen_dir/${module}_outline" | 
|  | sdk_outline = rebase_path(sdk_outline_dill) | 
|  |  | 
|  | package_config = | 
|  | rebase_path("$root_out_dir/../../.dart_tool/package_config.json") | 
|  |  | 
|  | prebuilt_dart_action(target_name) { | 
|  | deps = [ | 
|  | ":ddc_platform", | 
|  | "../bazel:kernel_worker_files_stamp", | 
|  | ] | 
|  | script = "../bazel/kernel_worker.dart" | 
|  | outputs = [ output ] | 
|  | args = [ | 
|  | "--packages-file", | 
|  | "file:///$package_config", | 
|  | "--summary-only", | 
|  | "--target", | 
|  | "ddc", | 
|  | "--dart-sdk-summary", | 
|  | "file:///$sdk_outline", | 
|  | "--source", | 
|  | "package:$module/$module.dart", | 
|  | "--output", | 
|  | rebase_path("$output.dill"), | 
|  | ] | 
|  | if (defined(invoker.extra_libraries)) { | 
|  | foreach(lib, invoker.extra_libraries) { | 
|  | args += [ | 
|  | "--source", | 
|  | "package:$module/$lib.dart", | 
|  | ] | 
|  | } | 
|  | } | 
|  | } | 
|  | } | 
|  |  | 
|  | package_kernel_outline("expect_outline") { | 
|  | package = "expect" | 
|  | extra_libraries = [ | 
|  | "async_helper", | 
|  | "legacy/minitest", | 
|  | "legacy/async_minitest", | 
|  | ] | 
|  | } | 
|  |  | 
|  | ddc_compile("expect_stable_js") { | 
|  | package = "expect" | 
|  | extra_libraries = [ | 
|  | "async_helper", | 
|  | "legacy/minitest", | 
|  | "legacy/async_minitest", | 
|  | ] | 
|  | canary = false | 
|  | modules = [ | 
|  | "amd", | 
|  | "ddc", | 
|  | ] | 
|  | } | 
|  |  | 
|  | ddc_compile("expect_canary_js") { | 
|  | package = "expect" | 
|  | extra_libraries = [ | 
|  | "async_helper", | 
|  | "legacy/minitest", | 
|  | "legacy/async_minitest", | 
|  | ] | 
|  | canary = true | 
|  | modules = [ "amd" ] | 
|  | } | 
|  |  | 
|  | ddc_compile("expect_canary_ddc_js") { | 
|  | package = "expect" | 
|  | extra_libraries = [ | 
|  | "async_helper", | 
|  | "legacy/minitest", | 
|  | "legacy/async_minitest", | 
|  | ] | 
|  | canary = true | 
|  | modules = [ "ddc" ] | 
|  | } | 
|  |  | 
|  | package_kernel_outline("js_outline") { | 
|  | package = "js" | 
|  | extra_libraries = [ "js_util" ] | 
|  | } | 
|  |  | 
|  | ddc_compile("js_stable_js") { | 
|  | package = "js" | 
|  | extra_libraries = [ "js_util" ] | 
|  | canary = false | 
|  | modules = [ | 
|  | "amd", | 
|  | "ddc", | 
|  | ] | 
|  | } | 
|  |  | 
|  | ddc_compile("js_canary_js") { | 
|  | package = "js" | 
|  | extra_libraries = [ "js_util" ] | 
|  | canary = true | 
|  | modules = [ "amd" ] | 
|  | } | 
|  |  | 
|  | ddc_compile("js_canary_ddc_js") { | 
|  | package = "js" | 
|  | extra_libraries = [ "js_util" ] | 
|  | canary = true | 
|  | modules = [ "ddc" ] | 
|  | } | 
|  |  | 
|  | package_kernel_outline("meta_outline") { | 
|  | package = "meta" | 
|  | } | 
|  |  | 
|  | ddc_compile("meta_stable_js") { | 
|  | package = "meta" | 
|  | canary = false | 
|  | modules = [ | 
|  | "amd", | 
|  | "ddc", | 
|  | ] | 
|  | } | 
|  |  | 
|  | ddc_compile("meta_canary_js") { | 
|  | package = "meta" | 
|  | canary = true | 
|  | modules = [ "amd" ] | 
|  | } | 
|  |  | 
|  | ddc_compile("meta_canary_ddc_js") { | 
|  | package = "meta" | 
|  | canary = true | 
|  | modules = [ "ddc" ] | 
|  | } | 
|  |  | 
|  | compile_platform("ddc_platform") { | 
|  | single_root_scheme = "org-dartlang-sdk" | 
|  | single_root_base = rebase_path("$sdk_root/") | 
|  | libraries_specification_uri = "org-dartlang-sdk:///lib/libraries.json" | 
|  |  | 
|  | args = [ | 
|  | "--target=dartdevc", | 
|  | "dart:core", | 
|  | ] | 
|  |  | 
|  | outputs = [ | 
|  | sdk_full_dill, | 
|  | sdk_outline_dill, | 
|  | ] | 
|  | } | 
|  |  | 
|  | # Compiles the DDC SDK JavaScript modules from the platform .dill file. | 
|  | template("ddc_compile_sdk") { | 
|  | assert(defined(invoker.canary), "Need 'canary' in $target_name.") | 
|  | assert(defined(invoker.modules), "Need 'modules' in $target_name.") | 
|  |  | 
|  | # Determine one of two possible directories for the JavaScript output to be | 
|  | # generated: | 
|  | # | 
|  | # out/gen/ddc | 
|  | #          |- canary/sdk | 
|  | #          |- stable/sdk | 
|  | if (invoker.canary) { | 
|  | js_gen_dir = "$target_gen_dir/canary/sdk" | 
|  | } else { | 
|  | js_gen_dir = "$target_gen_dir/stable/sdk" | 
|  | } | 
|  |  | 
|  | prebuilt_dart_action(target_name) { | 
|  | deps = [ | 
|  | ":ddc_files_stamp", | 
|  | ":ddc_platform", | 
|  | ] | 
|  |  | 
|  | inputs = [ sdk_full_dill ] | 
|  |  | 
|  | outputs = [] | 
|  | args = [] | 
|  |  | 
|  | foreach(module, invoker.modules) { | 
|  | outputs += [ | 
|  | "$js_gen_dir/$module/dart_sdk.js", | 
|  | "$js_gen_dir/$module/dart_sdk.js.map", | 
|  | ] | 
|  |  | 
|  | args += [ | 
|  | "--modules", | 
|  | "$module", | 
|  | "-o", | 
|  | rebase_path("$js_gen_dir/$module/dart_sdk.js"), | 
|  | ] | 
|  | } | 
|  |  | 
|  | vm_args = [ "-Dsdk_hash=$sdk_hash" ] | 
|  |  | 
|  | script = "../../pkg/dev_compiler/bin/dartdevc.dart" | 
|  |  | 
|  | args += [ | 
|  | "--multi-root-scheme", | 
|  | "org-dartlang-sdk", | 
|  | "--multi-root-output-path", | 
|  |  | 
|  | # This path is intended to point to a version of source files used to | 
|  | # generate the SDK JavaScript modules. | 
|  | # The intention is that the source map locations can be linked to the | 
|  | # orignal source files while running SDK test suites. | 
|  | # These JavaScript files and source maps are no longer packaged into the | 
|  | # released SDK. | 
|  | rebase_path("$target_gen_dir/../../../dart-sdk"), | 
|  | rebase_path("$sdk_full_dill"), | 
|  | ] | 
|  |  | 
|  | if (invoker.canary) { | 
|  | args += [ "--canary" ] | 
|  | } | 
|  | } | 
|  | } | 
|  |  | 
|  | ddc_compile_sdk("ddc_stable_sdk") { | 
|  | canary = false | 
|  | modules = [ | 
|  | "amd", | 
|  | "common", | 
|  | "es6", | 
|  | "ddc", | 
|  | ] | 
|  | } | 
|  |  | 
|  | ddc_compile_sdk("ddc_canary_sdk") { | 
|  | canary = true | 
|  | modules = [ | 
|  | "amd", | 
|  | "common", | 
|  | "es6", | 
|  | ] | 
|  | } | 
|  |  | 
|  | # Compiles the DDC SDK JavaScript modules from the platform .dill file in the | 
|  | # "ddc" module format only. | 
|  | # | 
|  | # This allows for them to be built individually (only passing one `--modules` | 
|  | # flag value) so that when also passing the `--canary` flag it will trigger | 
|  | # DDC to enable the option for the new library bundle format. | 
|  | ddc_compile_sdk("ddc_canary_sdk_ddc_module") { | 
|  | canary = true | 
|  | modules = [ "ddc" ] | 
|  | } |