| # Copyright (c) 2016, 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("../../sdk_args.gni") | 
 | import("../../utils/compile_platform.gni") | 
 | import("../application_snapshot.gni") | 
 | import("../create_timestamp.gni") | 
 |  | 
 | declare_args() { | 
 |   # Enables DDC canary features during compilation to JavaScript. | 
 |   ddc_canary = false | 
 | } | 
 |  | 
 | patched_sdk_dir = "$target_gen_dir/patched_sdk" | 
 | sdk_summary = "$target_gen_dir/ddc_sdk.sum" | 
 |  | 
 | sdk_outline_sound_dill = "$root_out_dir/ddc_outline.dill" | 
 | sdk_full_sound_dill = "$root_out_dir/ddc_platform.dill" | 
 | sdk_outline_unsound_dill = "$root_out_dir/ddc_outline_unsound.dill" | 
 | sdk_full_unsound_dill = "$root_out_dir/ddc_platform_unsound.dill" | 
 |  | 
 | application_snapshot("dartdevc") { | 
 |   main_dart = "../../pkg/dev_compiler/bin/dartdevc.dart" | 
 |  | 
 |   training_args = [ | 
 |     "--dart-sdk-summary", | 
 |     rebase_path(sdk_outline_sound_dill), | 
 |     "-o", | 
 |     "dartdevc.js", | 
 |     rebase_path("../../pkg/dev_compiler/bin/dartdevc.dart"), | 
 |   ] | 
 |  | 
 |   if (ddc_canary) { | 
 |     training_args += [ "--canary" ] | 
 |   } | 
 |  | 
 |   deps = [ ":dartdevc_platform_sound" ] | 
 |   inputs = [ sdk_outline_sound_dill ] | 
 | } | 
 |  | 
 | sdk_root = "../../sdk" | 
 |  | 
 | 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", | 
 |              "../compiler:compile_dart2js_platform_unsound", | 
 |            ] | 
 |  | 
 |     inputs = [ | 
 |       "$root_out_dir/dart2js_platform.dill", | 
 |       "$root_out_dir/dart2js_platform_unsound.dill", | 
 |       "$root_out_dir/dart2js_outline.dill", | 
 |       "$root_out_dir/dart2js_outline_unsound.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 = [ ":dartdevc_files_stamp" ] | 
 | } | 
 |  | 
 | # Builds everything needed to run dartdevc tests using test.dart. | 
 | group("dartdevc_test") { | 
 |   deps = [ | 
 |     ":dartdevc", | 
 |     ":dartdevc_kernel_sdk", | 
 |     ":dartdevc_sound_sdk", | 
 |     ":dartdevc_test_kernel_pkg", | 
 |     "../..:create_sdk", | 
 |   ] | 
 | } | 
 |  | 
 | # Builds everything needed to run dartdevc tests locally using test.dart without | 
 | # --use-sdk. This is the same as dartdevc_test, but skips things rely on | 
 | # building the Dart VM and create_sdk. | 
 | group("dartdevc_test_local") { | 
 |   deps = [ | 
 |     ":dartdevc_kernel_sdk", | 
 |     ":dartdevc_test_kernel_pkg", | 
 |   ] | 
 | } | 
 |  | 
 | create_timestamp_file("dartdevc_files_stamp") { | 
 |   path = rebase_path("../../pkg/dev_compiler/lib") | 
 |   output = "$target_gen_dir/dartdevc_files.stamp" | 
 | } | 
 |  | 
 | create_timestamp_file("dartdevc_sdk_patch_stamp") { | 
 |   path = rebase_path("$sdk_root/lib/_internal/js_dev_runtime") | 
 |   output = "$target_gen_dir/dartdevc_sdk_patch_stamp.stamp" | 
 | } | 
 |  | 
 | # Compiles to JavaScript any package used from 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("dartdevc_test_kernel_pkg") { | 
 |   deps = [ | 
 |     ":async_helper_js", | 
 |     ":async_helper_sound_js", | 
 |     ":expect_js", | 
 |     ":expect_sound_js", | 
 |     ":js_js", | 
 |     ":js_sound_js", | 
 |     ":meta_js", | 
 |     ":meta_sound_js", | 
 |   ] | 
 | } | 
 |  | 
 | template("dartdevc_kernel_compile") { | 
 |   assert(defined(invoker.package), | 
 |          "Need 'package' in $target_name (the name of the package)") | 
 |   assert(defined(invoker.sound_null_safety), | 
 |          "Need 'sound_null_safety' in $target_name.") | 
 |  | 
 |   if (invoker.sound_null_safety) { | 
 |     platform_dep = ":dartdevc_platform_sound" | 
 |     sdk_outline = sdk_outline_sound_dill | 
 |     js_gen_dir = "$target_gen_dir/pkg_sound" | 
 |   } else { | 
 |     platform_dep = ":dartdevc_platform_unsound" | 
 |     sdk_outline = sdk_outline_unsound_dill | 
 |     js_gen_dir = "$target_gen_dir/pkg_kernel" | 
 |   } | 
 |  | 
 |   # 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 `dartdevc_kernel_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" | 
 |     module = invoker.package | 
 |     out_dir = rebase_path("$js_gen_dir") | 
 |     sdk_path = rebase_path(sdk_outline) | 
 |  | 
 |     deps = [ | 
 |       ":dartdevc_files_stamp", | 
 |       platform_dep, | 
 |     ] | 
 |  | 
 |     inputs = [ | 
 |       sdk_outline, | 
 |       "$target_gen_dir/dartdevc_files.stamp", | 
 |     ] | 
 |  | 
 |     outputs = [ | 
 |       "$js_gen_dir/$module.dill", | 
 |       "$js_gen_dir/$module.js", | 
 |     ] | 
 |  | 
 |     vm_args = [ "-Dsdk_hash=$sdk_hash" ] | 
 |  | 
 |     args = [ | 
 |       "--dart-sdk-summary=$sdk_path", | 
 |       "-o$out_dir/$module.js", | 
 |       "package:$module/$module.dart", | 
 |     ] | 
 |  | 
 |     if (ddc_canary) { | 
 |       args += [ "--canary" ] | 
 |     } | 
 |  | 
 |     if (defined(invoker.extra_libraries)) { | 
 |       foreach(lib, invoker.extra_libraries) { | 
 |         args += [ "package:$module/$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.sound_null_safety) { | 
 |       args += [ "--sound-null-safety" ] | 
 |     } else { | 
 |       args += [ "--no-sound-null-safety" ] | 
 |     } | 
 |   } | 
 | } | 
 |  | 
 | dartdevc_kernel_compile("async_helper_js") { | 
 |   package = "async_helper" | 
 |   sound_null_safety = false | 
 | } | 
 |  | 
 | dartdevc_kernel_compile("async_helper_sound_js") { | 
 |   package = "async_helper" | 
 |   sound_null_safety = true | 
 | } | 
 |  | 
 | dartdevc_kernel_compile("expect_js") { | 
 |   package = "expect" | 
 |   extra_libraries = [ "minitest" ] | 
 |   sound_null_safety = false | 
 | } | 
 |  | 
 | dartdevc_kernel_compile("expect_sound_js") { | 
 |   package = "expect" | 
 |   extra_libraries = [ "minitest" ] | 
 |   sound_null_safety = true | 
 | } | 
 |  | 
 | dartdevc_kernel_compile("js_js") { | 
 |   package = "js" | 
 |   extra_libraries = [ "js_util" ] | 
 |   sound_null_safety = false | 
 | } | 
 |  | 
 | dartdevc_kernel_compile("js_sound_js") { | 
 |   package = "js" | 
 |   extra_libraries = [ "js_util" ] | 
 |   sound_null_safety = true | 
 | } | 
 |  | 
 | dartdevc_kernel_compile("meta_js") { | 
 |   package = "meta" | 
 |   sound_null_safety = false | 
 | } | 
 |  | 
 | dartdevc_kernel_compile("meta_sound_js") { | 
 |   package = "meta" | 
 |   sound_null_safety = true | 
 | } | 
 |  | 
 | template("compile_dartdevc_platform") { | 
 |   assert(defined(invoker.sound_null_safety), | 
 |          "Need 'sound_null_safety' in $target_name.") | 
 |  | 
 |   compile_platform(target_name) { | 
 |     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", | 
 |     ] | 
 |  | 
 |     if (invoker.sound_null_safety) { | 
 |       args += [ "--nnbd-strong" ] | 
 |  | 
 |       outputs = [ | 
 |         sdk_full_sound_dill, | 
 |         sdk_outline_sound_dill, | 
 |       ] | 
 |     } else { | 
 |       args += [ "--nnbd-weak" ] | 
 |  | 
 |       outputs = [ | 
 |         sdk_full_unsound_dill, | 
 |         sdk_outline_unsound_dill, | 
 |       ] | 
 |     } | 
 |   } | 
 | } | 
 |  | 
 | compile_dartdevc_platform("dartdevc_platform_unsound") { | 
 |   sound_null_safety = false | 
 | } | 
 |  | 
 | compile_dartdevc_platform("dartdevc_platform_sound") { | 
 |   sound_null_safety = true | 
 | } | 
 |  | 
 | # Compiles the DDC SDK's JS code from the platform .dill. | 
 | template("dartdevc_sdk_js") { | 
 |   assert(defined(invoker.sound_null_safety), | 
 |          "Need 'sound_null_safety' in $target_name.") | 
 |  | 
 |   if (invoker.sound_null_safety) { | 
 |     platform_dep = ":dartdevc_platform_sound" | 
 |     platform_input = sdk_full_sound_dill | 
 |     js_gen_dir = "$target_gen_dir/sound" | 
 |   } else { | 
 |     platform_dep = ":dartdevc_platform_unsound" | 
 |     platform_input = sdk_full_unsound_dill | 
 |     js_gen_dir = "$target_gen_dir/kernel" | 
 |   } | 
 |  | 
 |   prebuilt_dart_action(target_name) { | 
 |     deps = [ | 
 |       ":dartdevc_files_stamp", | 
 |       platform_dep, | 
 |     ] | 
 |  | 
 |     inputs = [ platform_input ] | 
 |  | 
 |     outputs = [ | 
 |       "$js_gen_dir/amd/dart_sdk.js", | 
 |       "$js_gen_dir/amd/dart_sdk.js.map", | 
 |       "$js_gen_dir/common/dart_sdk.js", | 
 |       "$js_gen_dir/common/dart_sdk.js.map", | 
 |       "$js_gen_dir/es6/dart_sdk.js", | 
 |       "$js_gen_dir/es6/dart_sdk.js.map", | 
 |       "$js_gen_dir/legacy/dart_sdk.js", | 
 |       "$js_gen_dir/legacy/dart_sdk.js.map", | 
 |     ] | 
 |  | 
 |     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"), | 
 |       "--modules", | 
 |       "amd", | 
 |       "-o", | 
 |       rebase_path("$js_gen_dir/amd/dart_sdk.js"), | 
 |       "--modules", | 
 |       "common", | 
 |       "-o", | 
 |       rebase_path("$js_gen_dir/common/dart_sdk.js"), | 
 |       "--modules", | 
 |       "es6", | 
 |       "-o", | 
 |       rebase_path("$js_gen_dir/es6/dart_sdk.js"), | 
 |       "--modules", | 
 |       "legacy", | 
 |       "-o", | 
 |       rebase_path("$js_gen_dir/legacy/dart_sdk.js"), | 
 |       rebase_path("$platform_input"), | 
 |     ] | 
 |  | 
 |     if (invoker.sound_null_safety) { | 
 |       args += [ "--sound-null-safety" ] | 
 |     } else { | 
 |       args += [ "--no-sound-null-safety" ] | 
 |     } | 
 |  | 
 |     if (ddc_canary) { | 
 |       args += [ "--canary" ] | 
 |     } | 
 |   } | 
 | } | 
 |  | 
 | dartdevc_sdk_js("dartdevc_kernel_sdk") { | 
 |   sound_null_safety = false | 
 | } | 
 |  | 
 | dartdevc_sdk_js("dartdevc_sound_sdk") { | 
 |   sound_null_safety = true | 
 | } |