diff --git a/BUILD.gn b/BUILD.gn index 06f388fa4e994..23de5f02a861d 100644 --- a/BUILD.gn +++ b/BUILD.gn @@ -12,8 +12,6 @@ import("//third_party/dart/build/dart/copy_tree.gni") # Whether to build the dartdevc sdk, libraries, and source files # required for the flutter web sdk. -# TODO(jacksongardner): remove this poorly named argument once the recipes stop -# using it. declare_args() { full_dart_sdk = false } @@ -46,6 +44,30 @@ config("export_dynamic_symbols") { } } +if (flutter_prebuilt_dart_sdk) { + copy_trees("_copy_trees") { + sources = [ + { + target = "copy_dart_sdk" + visibility = [ ":dart_sdk" ] + source = prebuilt_dart_sdk + dest = "$root_out_dir/dart-sdk" + ignore_patterns = "{}" + }, + ] + } +} + +group("dart_sdk") { + if (build_engine_artifacts) { + if (flutter_prebuilt_dart_sdk) { + public_deps = [ ":copy_dart_sdk" ] + } else { + public_deps = [ "//third_party/dart:create_sdk" ] + } + } +} + group("flutter") { testonly = true @@ -74,7 +96,7 @@ group("flutter") { if (build_engine_artifacts) { public_deps += [ - "//flutter/dart_sdk", + ":dart_sdk", "//flutter/flutter_frontend_server:frontend_server", # This must be listed explicitly for desktop cross-builds since diff --git a/build/archives/BUILD.gn b/build/archives/BUILD.gn index d9b785b9bd536..dbe31d4af91b6 100644 --- a/build/archives/BUILD.gn +++ b/build/archives/BUILD.gn @@ -220,6 +220,13 @@ if (build_engine_artifacts && !flutter_prebuilt_dart_sdk) { } } +# Archives Flutter Web SDK +if (!is_fuchsia) { + group("flutter_web_sdk") { + deps = [ "//flutter/web_sdk:flutter_web_sdk_archive" ] + } +} + # Archives Flutter Windows Artifacts if (host_os == "win") { zip_bundle("windows_flutter") { diff --git a/ci/builders/linux_host_engine.json b/ci/builders/linux_host_engine.json index 1c1f621464363..adc349d77e1fb 100644 --- a/ci/builders/linux_host_engine.json +++ b/ci/builders/linux_host_engine.json @@ -64,7 +64,7 @@ "flutter/build/archives:embedder", "flutter/build/archives:flutter_patched_sdk", "flutter/build/archives:dart_sdk_archive", - "flutter/web_sdk", + "flutter/build/archives:flutter_web_sdk", "flutter/tools/font-subset", "flutter/shell/platform/linux:flutter_gtk" ] @@ -151,7 +151,8 @@ "targets": [ "flutter:unittests", "flutter/build/archives:flutter_patched_sdk", - "flutter/shell/platform/linux:flutter_gtk" + "flutter/shell/platform/linux:flutter_gtk", + "flutter/build/archives:flutter_web_sdk" ] }, "tests": [ diff --git a/common/config.gni b/common/config.gni index 614658760c15d..9354bfb784ad5 100644 --- a/common/config.gni +++ b/common/config.gni @@ -22,8 +22,6 @@ declare_args() { # Whether to use a prebuilt Dart SDK instead of building one. flutter_prebuilt_dart_sdk = false - - build_flutter_web_sdk = false } # feature_defines_list --------------------------------------------------------- @@ -116,7 +114,7 @@ if (flutter_prebuilt_dart_sdk) { # There is no prebuilt Dart SDK targeting Fuchsia, but we also don't need # one, so even when the build is targeting Fuchsia, use the prebuilt # Dart SDK for the host. - if (current_toolchain == host_toolchain || is_fuchsia || is_wasm) { + if (current_toolchain == host_toolchain || is_fuchsia) { prebuilt_dart_sdk = host_prebuilt_dart_sdk prebuilt_dart_sdk_config = _host_prebuilt_dart_sdk_config } else { diff --git a/dart_sdk/BUILD.gn b/dart_sdk/BUILD.gn deleted file mode 100644 index c4c3d528f79ff..0000000000000 --- a/dart_sdk/BUILD.gn +++ /dev/null @@ -1,24 +0,0 @@ -import("//flutter/common/config.gni") -import("//third_party/dart/build/dart/copy_tree.gni") - -if (flutter_prebuilt_dart_sdk) { - copy_trees("_copy_trees") { - sources = [ - { - target = "copy_dart_sdk" - visibility = [ ":dart_sdk" ] - source = prebuilt_dart_sdk - dest = "$root_out_dir/dart-sdk" - ignore_patterns = "{}" - }, - ] - } -} - -group("dart_sdk") { - if (flutter_prebuilt_dart_sdk) { - public_deps = [ ":copy_dart_sdk" ] - } else { - public_deps = [ "//third_party/dart:create_sdk" ] - } -} diff --git a/lib/web_ui/dev/build.dart b/lib/web_ui/dev/build.dart index 8f656e286314c..e5334fe17630b 100644 --- a/lib/web_ui/dev/build.dart +++ b/lib/web_ui/dev/build.dart @@ -3,7 +3,7 @@ // found in the LICENSE file. import 'dart:async'; -import 'dart:io' show Directory; +import 'dart:io' show Directory, Platform; import 'package:args/command_runner.dart'; import 'package:path/path.dart' as path; @@ -25,7 +25,6 @@ class BuildCommand extends Command with ArgUtils { 'build-canvaskit', help: 'Build CanvasKit locally instead of getting it from CIPD. Disabled ' 'by default.', - defaultsTo: true ); } @@ -43,9 +42,15 @@ class BuildCommand extends Command with ArgUtils { FutureOr run() async { final FilePath libPath = FilePath.fromWebUi('lib'); final List steps = [ - GnPipelineStep(buildCanvasKit: buildCanvasKit), - NinjaPipelineStep(target: environment.wasmReleaseOutDir), + GnPipelineStep(), + NinjaPipelineStep(target: environment.engineBuildDir), ]; + if (buildCanvasKit) { + steps.addAll([ + GnPipelineStep(target: 'canvaskit'), + NinjaPipelineStep(target: environment.wasmReleaseOutDir), + ]); + } final Pipeline buildPipeline = Pipeline(steps: steps); await buildPipeline.run(); @@ -68,9 +73,8 @@ class BuildCommand extends Command with ArgUtils { /// Not safe to interrupt as it may leave the `out/` directory in a corrupted /// state. GN is pretty quick though, so it's OK to not support interruption. class GnPipelineStep extends ProcessStep { - GnPipelineStep({required this.buildCanvasKit}); - - final bool buildCanvasKit; + GnPipelineStep({this.target = 'engine'}) + : assert(target == 'engine' || target == 'canvaskit'); @override String get description => 'gn'; @@ -78,14 +82,30 @@ class GnPipelineStep extends ProcessStep { @override bool get isSafeToInterrupt => false; + /// The target to build with gn. + /// + /// Acceptable values: engine, canvaskit + final String target; + @override Future createProcess() { - print('Running gn...'); - final List gnArgs = [ - '--web', - '--runtime-mode=release', - if (buildCanvasKit) '--build-canvaskit', - ]; + print('Running gn for $target...'); + final List gnArgs = []; + if (target == 'engine') { + gnArgs.addAll([ + '--unopt', + if (Platform.isMacOS) '--xcode-symlinks', + '--full-dart-sdk', + if (environment.isMacosArm) '--mac-cpu=arm64', + ]); + } else if (target == 'canvaskit') { + gnArgs.addAll([ + '--wasm', + '--runtime-mode=release', + ]); + } else { + throw StateError('Target was not engine or canvaskit: $target'); + } return startProcess( path.join(environment.flutterDirectory.path, 'tools', 'gn'), gnArgs, diff --git a/lib/web_ui/dev/environment.dart b/lib/web_ui/dev/environment.dart index 6c964dd3f3640..8cdac3e6598a7 100644 --- a/lib/web_ui/dev/environment.dart +++ b/lib/web_ui/dev/environment.dart @@ -20,17 +20,21 @@ Environment? _environment; class Environment { factory Environment() { final bool isMacosArm = ffi.Abi.current() == ffi.Abi.macosArm64; - final io.File dartExecutable = io.File(io.Platform.resolvedExecutable); final io.File self = io.File.fromUri(io.Platform.script); - final io.Directory engineSrcDir = self.parent.parent.parent.parent.parent; final io.Directory engineToolsDir = io.Directory(pathlib.join(engineSrcDir.path, 'flutter', 'tools')); final io.Directory outDir = io.Directory(pathlib.join(engineSrcDir.path, 'out')); + final io.Directory engineBuildDir = + io.Directory(pathlib.join( + outDir.path, + isMacosArm ? 'host_debug_unopt_arm64' : 'host_debug_unopt' + )); final io.Directory wasmReleaseOutDir = io.Directory(pathlib.join(outDir.path, 'wasm_release')); - final io.Directory dartSdkDir = dartExecutable.parent.parent; + final io.Directory dartSdkDir = + io.Directory(pathlib.join(engineBuildDir.path, 'dart-sdk')); final io.Directory webUiRootDir = io.Directory( pathlib.join(engineSrcDir.path, 'flutter', 'lib', 'web_ui')); @@ -51,6 +55,7 @@ class Environment { engineSrcDir: engineSrcDir, engineToolsDir: engineToolsDir, outDir: outDir, + engineBuildDir: engineBuildDir, wasmReleaseOutDir: wasmReleaseOutDir, dartSdkDir: dartSdkDir, ); @@ -63,6 +68,7 @@ class Environment { required this.engineSrcDir, required this.engineToolsDir, required this.outDir, + required this.engineBuildDir, required this.wasmReleaseOutDir, required this.dartSdkDir, }); @@ -87,6 +93,9 @@ class Environment { /// This is where you'll find the ninja output, such as the Dart SDK. final io.Directory outDir; + /// The output directory for the host_debug_unopt build. + final io.Directory engineBuildDir; + /// The output directory for the wasm_release build. /// /// We build CanvasKit in release mode to reduce code size. diff --git a/tools/gn b/tools/gn index b107abc9c1518..b7db850015ae9 100755 --- a/tools/gn +++ b/tools/gn @@ -21,8 +21,6 @@ SRC_ROOT = os.path.dirname( def get_out_dir(args): if args.target_os is not None: target_dir = [args.target_os] - elif args.web: - target_dir = ['wasm'] else: target_dir = ['host'] @@ -253,15 +251,10 @@ def to_gn_args(args): # If building for WASM, set the GN args using 'to_gn_wasm_args' as most # of the Flutter SDK specific arguments are unused. - if args.target_os == 'wasm' or args.web: + if args.target_os == 'wasm': to_gn_wasm_args(args, gn_args) return gn_args - gn_args['build_flutter_web_sdk'] = args.build_web_sdk - gn_args['full_dart_sdk'] = args.full_dart_sdk - if args.build_web_sdk or args.full_dart_sdk: - gn_args['build_canvaskit'] = args.build_canvaskit - if args.enable_unittests: gn_args['enable_unittests'] = args.enable_unittests @@ -366,6 +359,7 @@ def to_gn_args(args): gn_args['embedder_for_target'] = args.embedder_for_target gn_args['dart_lib_export_symbols'] = False gn_args['flutter_runtime_mode'] = runtime_mode + gn_args['full_dart_sdk'] = args.full_dart_sdk gn_args['dart_version_git_info'] = not args.no_dart_version_git_info gn_args['dart_lib_export_symbols'] = False @@ -633,12 +627,6 @@ def to_gn_wasm_args(args, gn_args): gn_args['skia_canvaskit_enable_webgpu'] = False is_profile_build = args.runtime_mode == 'profile' or args.runtime_mode == 'debug' gn_args['skia_canvaskit_profile_build'] = is_profile_build - gn_args['flutter_prebuilt_dart_sdk'] = True - - # TODO(jacksongardner): Make this based off of the input argument rather - # than forced to true, once the recipes are updated. - gn_args['build_canvaskit'] = True - gn_args['build_flutter_web_sdk'] = True def parse_args(args): @@ -714,7 +702,6 @@ def parse_args(args): parser.add_argument( '--wasm', dest='target_os', action='store_const', const='wasm' ) - parser.add_argument('--web', action='store_true', default=False) parser.add_argument( '--windows', dest='target_os', action='store_const', const='win' ) @@ -838,27 +825,6 @@ def parse_args(args): '--no-full-dart-sdk', dest='full_dart_sdk', action='store_false' ) - parser.add_argument( - '--build-web-sdk', - default=False, - action='store_true', - help='build the flutter web sdk' - ) - parser.add_argument( - '--no-build-web-sdk', dest='build_web_sdk', action='store_false' - ) - - parser.add_argument( - '--build-canvaskit', - default=False, - action='store_true', - help='build canvaskit from source' - ) - - parser.add_argument( - '--no-build-canvaskit', dest='build_canvaskit', action='store_false' - ) - parser.add_argument( '--ide', default='', @@ -1002,17 +968,16 @@ def main(argv): '--export-compile-commands', ] - if args.target_os != 'wasm': - if args.ide != '': - command.append('--ide=%s' % args.ide) - elif sys.platform == 'darwin': - # On the Mac, generate an Xcode project by default. - command.append('--ide=xcode') - command.append('--xcode-project=flutter_engine') - command.append('--xcode-build-system=new') - elif sys.platform.startswith('win'): - # On Windows, generate a Visual Studio project. - command.append('--ide=vs') + if args.ide != '': + command.append('--ide=%s' % args.ide) + elif sys.platform == 'darwin': + # On the Mac, generate an Xcode project by default. + command.append('--ide=xcode') + command.append('--xcode-project=flutter_engine') + command.append('--xcode-build-system=new') + elif sys.platform.startswith('win'): + # On Windows, generate a Visual Studio project. + command.append('--ide=vs') command.append('--export-compile-commands=default') diff --git a/wasm/BUILD.gn b/wasm/BUILD.gn index df71a47d53a5e..7d799fe9186c9 100644 --- a/wasm/BUILD.gn +++ b/wasm/BUILD.gn @@ -6,11 +6,7 @@ # //flutter/BUILD.gn pulls in Flutter SDK dependencies which will crash # when the target CPU is WASM. -import("//flutter/common/config.gni") - # This is the default target when building when the target CPU is WASM. group("wasm") { - if (build_flutter_web_sdk) { - deps = [ "//flutter/web_sdk" ] - } + deps = [ "//third_party/skia/modules/canvaskit" ] } diff --git a/web_sdk/BUILD.gn b/web_sdk/BUILD.gn index e5136043b2159..1c653d5b91db1 100644 --- a/web_sdk/BUILD.gn +++ b/web_sdk/BUILD.gn @@ -6,14 +6,9 @@ import("//flutter/build/zip_bundle.gni") import("//flutter/common/config.gni") import("//third_party/dart/build/dart/dart_action.gni") -declare_args() { - build_canvaskit = false - archive_flutter_web_sdk = true -} - -kernel_out_dir = "$root_out_dir/flutter_web_sdk/kernel" -sdk_dill = "$kernel_out_dir/flutter_ddc_sdk.dill" -sdk_dill_sound = "$kernel_out_dir/flutter_ddc_sdk_sound.dill" +sdk_dill = "$root_out_dir/flutter_web_sdk/kernel/flutter_ddc_sdk.dill" +sdk_dill_sound = + "$root_out_dir/flutter_web_sdk/kernel/flutter_ddc_sdk_sound.dill" dart_sdk_package_config = "//third_party/dart/.dart_tool/package_config.json" @@ -35,10 +30,6 @@ group("web_sdk") { ":flutter_dartdevc_kernel_sdk_outline_sound", ":flutter_dartdevc_kernel_sdk_sound", ] - - if (archive_flutter_web_sdk && !is_fuchsia) { - deps += [ ":flutter_web_sdk_archive" ] - } } template("sdk_rewriter") { @@ -153,35 +144,56 @@ copy("web_ui_library") { # # args (required): The arguments to pass to dartdevc template("_dartdevc") { - assert(flutter_prebuilt_dart_sdk, - "Cannot build web sdk without prebuilt dart sdk") - action(target_name) { - not_needed(invoker, [ "packages" ]) - deps = [ - ":skwasm_impl_library", - ":skwasm_stub_library", - ":web_engine_library", - ":web_ui_library", - ":web_ui_library_sources", - ] - script = "//build/gn_run_binary.py" - - inputs = invoker.inputs - outputs = invoker.outputs + if (flutter_prebuilt_dart_sdk) { + action(target_name) { + not_needed(invoker, [ "packages" ]) + deps = [ + ":skwasm_impl_library", + ":skwasm_stub_library", + ":web_engine_library", + ":web_ui_library", + ":web_ui_library_sources", + "//flutter:dart_sdk", + ] + script = "//build/gn_run_binary.py" + + inputs = invoker.inputs + outputs = invoker.outputs + + pool = "//flutter/build/dart:dart_pool" + + ext = "" + if (is_win) { + ext = ".exe" + } + dart = rebase_path("$host_prebuilt_dart_sdk/bin/dart$ext", root_out_dir) + dartdevc = rebase_path( + "$host_prebuilt_dart_sdk/bin/snapshots/dartdevc.dart.snapshot") + args = [ + dart, + dartdevc, + ] + invoker.args + } + } else { + prebuilt_dart_action(target_name) { + forward_variables_from(invoker, "*") + + deps = [ + ":skwasm_impl_library", + ":skwasm_stub_library", + ":web_engine_library", + ":web_ui_library", + ":web_ui_library_sources", + "//flutter:dart_sdk", + "//third_party/dart/pkg:pkg_files_stamp", + "//third_party/dart/utils/dartdevc:dartdevc_files_stamp", + "//third_party/dart/utils/dartdevc:dartdevc_sdk_patch_stamp", + ] - pool = "//flutter/build/dart:dart_pool" + script = "//third_party/dart/pkg/dev_compiler/bin/dartdevc.dart" - ext = "" - if (is_win) { - ext = ".exe" + pool = "//flutter/build/dart:dart_pool" } - dart = rebase_path("$host_prebuilt_dart_sdk/bin/dart$ext", root_out_dir) - dartdevc = rebase_path( - "$host_prebuilt_dart_sdk/bin/snapshots/dartdevc.dart.snapshot") - args = [ - dart, - dartdevc, - ] + invoker.args } } @@ -195,226 +207,412 @@ template("_dartdevc") { # # args (required): The arguments to pass to the kernel_worker template("_kernel_worker") { - assert(flutter_prebuilt_dart_sdk, - "Cannot build web sdk without prebuilt dart sdk") - action(target_name) { - deps = [ - ":skwasm_impl_library", - ":skwasm_stub_library", - ":web_engine_library", - ":web_ui_library", - ":web_ui_library_sources", - ] - script = "//build/gn_run_binary.py" - - inputs = invoker.inputs - outputs = invoker.outputs - - pool = "//flutter/build/dart:dart_pool" + if (flutter_prebuilt_dart_sdk) { + action(target_name) { + deps = [ + ":skwasm_impl_library", + ":skwasm_stub_library", + ":web_engine_library", + ":web_ui_library", + ":web_ui_library_sources", + "//flutter:dart_sdk", + ] + script = "//build/gn_run_binary.py" - ext = "" - if (is_win) { - ext = ".exe" - } - dart = rebase_path("$host_prebuilt_dart_sdk/bin/dart$ext", root_out_dir) - kernel_worker = rebase_path( - "$host_prebuilt_dart_sdk/bin/snapshots/kernel_worker.dart.snapshot") + inputs = invoker.inputs + outputs = invoker.outputs - args = [ - dart, - kernel_worker, - ] + invoker.args - } -} + pool = "//flutter/build/dart:dart_pool" -template("_compile_outline") { - assert(defined(invoker.sound_null_safety), - "sound_null_safety must be defined for $target_name") - assert(defined(invoker.output_dill), - "output_dill must be defined for $target_name") + ext = "" + if (is_win) { + ext = ".exe" + } + dart = rebase_path("$host_prebuilt_dart_sdk/bin/dart$ext", root_out_dir) + kernel_worker = rebase_path( + "$host_prebuilt_dart_sdk/bin/snapshots/kernel_worker.dart.snapshot") - _kernel_worker(target_name) { - inputs = [ "sdk_rewriter.dart" ] + web_ui_sources + args = [ + dart, + kernel_worker, + ] + invoker.args + } + } else { + prebuilt_dart_action(target_name) { + forward_variables_from(invoker, "*") + + deps = [ + ":skwasm_impl_library", + ":skwasm_stub_library", + ":web_engine_library", + ":web_ui_library", + ":web_ui_library_sources", + "//flutter:dart_sdk", + "//third_party/dart/pkg:pkg_files_stamp", + "//third_party/dart/utils/dartdevc:dartdevc_files_stamp", + "//third_party/dart/utils/dartdevc:dartdevc_sdk_patch_stamp", + ] - outputs = [ invoker.output_dill ] + script = "//third_party/dart/utils/bazel/kernel_worker.dart" - if (invoker.sound_null_safety) { - args = [ "--sound-null-safety" ] - } else { - args = [ "--no-sound-null-safety" ] + pool = "//flutter/build/dart:dart_pool" } - args += [ - "--summary-only", - "--target", - "ddc", - "--packages-file", - "file:///" + rebase_path(dart_sdk_package_config), - "--multi-root-scheme", - "org-dartlang-sdk", - "--multi-root", - "file:///" + rebase_path("$root_out_dir"), - "--multi-root", - "file:///" + rebase_path("$host_prebuilt_dart_sdk/.."), - "--libraries-file", - "org-dartlang-sdk:///flutter_web_sdk/libraries.json", - "--output", - rebase_path(invoker.output_dill), - "--source", - "dart:core", - - # Additional Flutter web dart libraries - "--source", - "dart:ui", - "--source", - "dart:_engine", - "--source", - "dart:_skwasm_stub", - ] } } # Compile the unsound DDC SDK's summary. -_compile_outline("flutter_dartdevc_kernel_sdk_outline") { - sound_null_safety = false - output_dill = sdk_dill -} - -# Compile the sound DDC SDK's summary. -_compile_outline("flutter_dartdevc_kernel_sdk_outline_sound") { - sound_null_safety = true - output_dill = sdk_dill_sound +_kernel_worker("flutter_dartdevc_kernel_sdk_outline") { + inputs = [ "sdk_rewriter.dart" ] + web_ui_sources + + outputs = [ sdk_dill ] + + args = [ + "--no-sound-null-safety", + "--summary-only", + "--target", + "ddc", + "--packages-file", + "file:///" + rebase_path(dart_sdk_package_config), + "--multi-root-scheme", + "org-dartlang-sdk", + "--multi-root", + "file:///" + rebase_path("$root_out_dir"), + "--libraries-file", + "org-dartlang-sdk:///flutter_web_sdk/libraries.json", + "--output", + rebase_path(sdk_dill), + "--source", + "dart:core", + + # Additional Flutter web dart libraries + "--source", + "dart:ui", + "--source", + "dart:_engine", + ] } -template("_compile_ddc_modules") { - assert(defined(invoker.sound_null_safety), - "sound_null_safety must be defined for $target_name") - assert(defined(invoker.use_skia), - "use_skia must be defined for $target_name") - assert(defined(invoker.auto_detect), - "auto_detect must be defined for $target_name") +# Compiles the unsound html only renderer. +_dartdevc("flutter_dartdevc_kernel_sdk") { + inputs = [ "sdk_rewriter.dart" ] + web_ui_sources - _dartdevc(target_name) { - inputs = [ "sdk_rewriter.dart" ] + web_ui_sources + packages = dart_sdk_package_config - packages = dart_sdk_package_config + outputs = [ + "$root_out_dir/flutter_web_sdk/kernel/amd/dart_sdk.js", + "$root_out_dir/flutter_web_sdk/kernel/amd/dart_sdk.js.map", + "$root_out_dir/flutter_web_sdk/kernel/legacy/dart_sdk.js", + "$root_out_dir/flutter_web_sdk/kernel/legacy/dart_sdk.js.map", + ] - name_suffix = "" - if (invoker.use_skia) { - name_suffix += "-canvaskit" - } - if (invoker.auto_detect) { - name_suffix += "-html" - } - if (invoker.sound_null_safety) { - name_suffix += "-sound" - } + args = [ + "--no-sound-null-safety", + "--compile-sdk", + "dart:core", + + # Additional Flutter web dart libraries + "dart:ui", + "dart:_engine", + "--no-summarize", + "--packages", + "file:///" + rebase_path(dart_sdk_package_config), + "--multi-root-scheme", + "org-dartlang-sdk", + "--multi-root", + "file:///" + rebase_path("$root_out_dir"), + "--multi-root-output-path", + rebase_path("$root_out_dir/"), + "--libraries-file", + "org-dartlang-sdk:///flutter_web_sdk/libraries.json", + "--inline-source-map", + "-DFLUTTER_WEB_USE_SKIA=false", + "-DFLUTTER_WEB_AUTO_DETECT=false", + "--modules", + "amd", + "-o", + rebase_path("$root_out_dir/flutter_web_sdk/kernel/amd/dart_sdk.js"), + "--modules", + "legacy", + "-o", + rebase_path("$root_out_dir/flutter_web_sdk/kernel/legacy/dart_sdk.js"), + ] +} - amd_js_path = - "$root_out_dir/flutter_web_sdk/kernel/amd${name_suffix}/dart_sdk.js" - legacy_js_path = - "$root_out_dir/flutter_web_sdk/kernel/legacy${name_suffix}/dart_sdk.js" +# Compiles the unsound canvaskit only renderer. +_dartdevc("flutter_dartdevc_canvaskit_kernel_sdk") { + inputs = [ "sdk_rewriter.dart" ] + web_ui_sources - outputs = [ - amd_js_path, - amd_js_path + ".map", - legacy_js_path, - legacy_js_path + ".map", - ] + packages = dart_sdk_package_config - if (invoker.sound_null_safety) { - args = [ "--sound-null-safety" ] - } else { - args = [ "--no-sound-null-safety" ] - } + outputs = [ + "$root_out_dir/flutter_web_sdk/kernel/amd-canvaskit/dart_sdk.js", + "$root_out_dir/flutter_web_sdk/kernel/amd-canvaskit/dart_sdk.js.map", + "$root_out_dir/flutter_web_sdk/kernel/legacy-canvaskit/dart_sdk.js", + "$root_out_dir/flutter_web_sdk/kernel/legacy-canvaskit/dart_sdk.js.map", + ] - args += [ - "--compile-sdk", - "dart:core", - - # Additional Flutter web dart libraries - "dart:ui", - "dart:_engine", - "dart:_skwasm_stub", - "--no-summarize", - "--packages", - "file:///" + rebase_path(dart_sdk_package_config), - "--multi-root-scheme", - "org-dartlang-sdk", - "--multi-root", - "file:///" + rebase_path("$root_out_dir"), - "--multi-root", - "file:///" + rebase_path("$host_prebuilt_dart_sdk/.."), - "--multi-root-output-path", - rebase_path("$root_out_dir/"), - "--libraries-file", - "org-dartlang-sdk:///flutter_web_sdk/libraries.json", - "--inline-source-map", - "-DFLUTTER_WEB_USE_SKIA=${invoker.use_skia}", - "-DFLUTTER_WEB_AUTO_DETECT=${invoker.auto_detect}", - "--modules", - "amd", - "-o", - rebase_path(amd_js_path), - "--modules", - "legacy", - "-o", - rebase_path(legacy_js_path), - ] - } + args = [ + "--no-sound-null-safety", + "--compile-sdk", + "dart:core", + + # Additional Flutter web dart libraries + "dart:ui", + "dart:_engine", + "--no-summarize", + "--packages", + "file:///" + rebase_path(dart_sdk_package_config), + "--multi-root-scheme", + "org-dartlang-sdk", + "--multi-root", + "file:///" + rebase_path("$root_out_dir"), + "--multi-root-output-path", + rebase_path("$root_out_dir/"), + "--libraries-file", + "org-dartlang-sdk:///flutter_web_sdk/libraries.json", + "--inline-source-map", + "-DFLUTTER_WEB_USE_SKIA=true", + "-DFLUTTER_WEB_AUTO_DETECT=false", + "--modules", + "amd", + "-o", + rebase_path( + "$root_out_dir/flutter_web_sdk/kernel/amd-canvaskit/dart_sdk.js"), + "--modules", + "legacy", + "-o", + rebase_path( + "$root_out_dir/flutter_web_sdk/kernel/legacy-canvaskit/dart_sdk.js"), + ] } -# Compiles the unsound html only renderer. -_compile_ddc_modules("flutter_dartdevc_kernel_sdk") { - sound_null_safety = false - use_skia = false - auto_detect = false -} +# Compiles the unsound autodetect renderer. +_dartdevc("flutter_dartdevc_canvaskit_html_kernel_sdk") { + inputs = [ "sdk_rewriter.dart" ] + web_ui_sources -# Compiles the unsound canvaskit only renderer. -_compile_ddc_modules("flutter_dartdevc_canvaskit_kernel_sdk") { - sound_null_safety = false - use_skia = true - auto_detect = false -} + packages = dart_sdk_package_config -# Compiles the unsound autodetect renderer. -_compile_ddc_modules("flutter_dartdevc_canvaskit_html_kernel_sdk") { - sound_null_safety = false - use_skia = true - auto_detect = true + outputs = [ + "$root_out_dir/flutter_web_sdk/kernel/amd-canvaskit-html/dart_sdk.js", + "$root_out_dir/flutter_web_sdk/kernel/amd-canvaskit-html/dart_sdk.js.map", + "$root_out_dir/flutter_web_sdk/kernel/legacy-canvaskit-html/dart_sdk.js", + "$root_out_dir/flutter_web_sdk/kernel/legacy-canvaskit-html/dart_sdk.js.map", + ] + + args = [ + "--no-sound-null-safety", + "--compile-sdk", + "dart:core", + + # Additional Flutter web dart libraries + "dart:ui", + "dart:_engine", + "--no-summarize", + "--packages", + "file:///" + rebase_path(dart_sdk_package_config), + "--multi-root-scheme", + "org-dartlang-sdk", + "--multi-root", + "file:///" + rebase_path("$root_out_dir"), + "--multi-root-output-path", + rebase_path("$root_out_dir/"), + "--libraries-file", + "org-dartlang-sdk:///flutter_web_sdk/libraries.json", + "--inline-source-map", + "-DFLUTTER_WEB_USE_SKIA=true", + "-DFLUTTER_WEB_AUTO_DETECT=true", + "--modules", + "amd", + "-o", + rebase_path( + "$root_out_dir/flutter_web_sdk/kernel/amd-canvaskit-html/dart_sdk.js"), + "--modules", + "legacy", + "-o", + rebase_path( + "$root_out_dir/flutter_web_sdk/kernel/legacy-canvaskit-html/dart_sdk.js"), + ] } # Compiles the sound html only renderer. -_compile_ddc_modules("flutter_dartdevc_kernel_sdk_sound") { - sound_null_safety = true - use_skia = false - auto_detect = false +_dartdevc("flutter_dartdevc_kernel_sdk_sound") { + inputs = [ "sdk_rewriter.dart" ] + web_ui_sources + + packages = dart_sdk_package_config + + outputs = [ + "$root_out_dir/flutter_web_sdk/kernel/amd-sound/dart_sdk.js", + "$root_out_dir/flutter_web_sdk/kernel/amd-sound/dart_sdk.js.map", + "$root_out_dir/flutter_web_sdk/kernel/legacy-sound/dart_sdk.js", + "$root_out_dir/flutter_web_sdk/kernel/legacy-sound/dart_sdk.js.map", + ] + + args = [ + "--sound-null-safety", + "--compile-sdk", + "dart:core", + + # Additional Flutter web dart libraries + "dart:ui", + "dart:_engine", + "--no-summarize", + "--packages", + "file:///" + rebase_path(dart_sdk_package_config), + "--multi-root-scheme", + "org-dartlang-sdk", + "--multi-root", + "file:///" + rebase_path("$root_out_dir"), + "--multi-root-output-path", + rebase_path("$root_out_dir/"), + "--libraries-file", + "org-dartlang-sdk:///flutter_web_sdk/libraries.json", + "--inline-source-map", + "-DFLUTTER_WEB_USE_SKIA=false", + "-DFLUTTER_WEB_AUTO_DETECT=false", + "--modules", + "amd", + "-o", + rebase_path("$root_out_dir/flutter_web_sdk/kernel/amd-sound/dart_sdk.js"), + "--modules", + "legacy", + "-o", + rebase_path( + "$root_out_dir/flutter_web_sdk/kernel/legacy-sound/dart_sdk.js"), + ] } # Compiles the sound canvaskit only renderer. -_compile_ddc_modules("flutter_dartdevc_canvaskit_kernel_sdk_sound") { - sound_null_safety = true - use_skia = true - auto_detect = false +_dartdevc("flutter_dartdevc_canvaskit_kernel_sdk_sound") { + inputs = [ "sdk_rewriter.dart" ] + web_ui_sources + + packages = dart_sdk_package_config + + outputs = [ + "$root_out_dir/flutter_web_sdk/kernel/amd-canvaskit-sound/dart_sdk.js", + "$root_out_dir/flutter_web_sdk/kernel/amd-canvaskit-sound/dart_sdk.js.map", + "$root_out_dir/flutter_web_sdk/kernel/legacy-canvaskit-sound/dart_sdk.js", + "$root_out_dir/flutter_web_sdk/kernel/legacy-canvaskit-sound/dart_sdk.js.map", + ] + + args = [ + "--sound-null-safety", + "--compile-sdk", + "dart:core", + + # Additional Flutter web dart libraries + "dart:ui", + "dart:_engine", + "--no-summarize", + "--packages", + "file:///" + rebase_path(dart_sdk_package_config), + "--multi-root-scheme", + "org-dartlang-sdk", + "--multi-root", + "file:///" + rebase_path("$root_out_dir"), + "--multi-root-output-path", + rebase_path("$root_out_dir/"), + "--libraries-file", + "org-dartlang-sdk:///flutter_web_sdk/libraries.json", + "--inline-source-map", + "-DFLUTTER_WEB_USE_SKIA=true", + "-DFLUTTER_WEB_AUTO_DETECT=false", + "--modules", + "amd", + "-o", + rebase_path( + "$root_out_dir/flutter_web_sdk/kernel/amd-canvaskit-sound/dart_sdk.js"), + "--modules", + "legacy", + "-o", + rebase_path( + "$root_out_dir/flutter_web_sdk/kernel/legacy-canvaskit-sound/dart_sdk.js"), + ] } # Compiles the sound autodetect renderer. -_compile_ddc_modules("flutter_dartdevc_canvaskit_html_kernel_sdk_sound") { - sound_null_safety = true - use_skia = true - auto_detect = true +_dartdevc("flutter_dartdevc_canvaskit_html_kernel_sdk_sound") { + inputs = [ "sdk_rewriter.dart" ] + web_ui_sources + + packages = dart_sdk_package_config + + outputs = [ + "$root_out_dir/flutter_web_sdk/kernel/amd-canvaskit-html-sound/dart_sdk.js", + "$root_out_dir/flutter_web_sdk/kernel/amd-canvaskit-html-sound/dart_sdk.js.map", + "$root_out_dir/flutter_web_sdk/kernel/legacy-canvaskit-html-sound/dart_sdk.js", + "$root_out_dir/flutter_web_sdk/kernel/legacy-canvaskit-html-sound/dart_sdk.js.map", + ] + + args = [ + "--sound-null-safety", + "--compile-sdk", + "dart:core", + + # Additional Flutter web dart libraries + "dart:ui", + "dart:_engine", + "--no-summarize", + "--packages", + "file:///" + rebase_path(dart_sdk_package_config), + "--multi-root-scheme", + "org-dartlang-sdk", + "--multi-root", + "file:///" + rebase_path("$root_out_dir"), + "--multi-root-output-path", + rebase_path("$root_out_dir/"), + "--libraries-file", + "org-dartlang-sdk:///flutter_web_sdk/libraries.json", + "--inline-source-map", + "-DFLUTTER_WEB_USE_SKIA=false", + "-DFLUTTER_WEB_AUTO_DETECT=true", + "--modules", + "amd", + "-o", + rebase_path( + "$root_out_dir/flutter_web_sdk/kernel/amd-canvaskit-html-sound/dart_sdk.js"), + "--modules", + "legacy", + "-o", + rebase_path( + "$root_out_dir/flutter_web_sdk/kernel/legacy-canvaskit-html-sound/dart_sdk.js"), + ] +} + +# Compile the sound DDC SDK's summary. +_kernel_worker("flutter_dartdevc_kernel_sdk_outline_sound") { + inputs = [ "sdk_rewriter.dart" ] + web_ui_sources + + outputs = [ sdk_dill_sound ] + + args = [ + "--sound-null-safety", + "--summary-only", + "--target", + "ddc", + "--packages-file", + "file:///" + rebase_path(dart_sdk_package_config), + "--multi-root-scheme", + "org-dartlang-sdk", + "--multi-root", + "file:///" + rebase_path("$root_out_dir"), + "--libraries-file", + "org-dartlang-sdk:///flutter_web_sdk/libraries.json", + "--output", + rebase_path(sdk_dill_sound), + "--source", + "dart:core", + + # Additional Flutter web dart libraries + "--source", + "dart:ui", + "--source", + "dart:_engine", + ] } # Archives Flutter Web SDK if (!is_fuchsia) { zip_bundle_from_file("flutter_web_sdk_archive") { - if (target_os == "wasm") { - output = "flutter-web-sdk.zip" - } else { - # TODO(jacksongardner): remove this once we stop making platform-specific - # flutter_web_sdk archives. - output = "flutter-web-sdk-${full_platform_name}.zip" - } + output = "flutter-web-sdk-${full_platform_name}.zip" deps = [ ":flutter_dartdevc_canvaskit_html_kernel_sdk", ":flutter_dartdevc_canvaskit_html_kernel_sdk_sound", @@ -430,10 +628,6 @@ if (!is_fuchsia) { ":web_ui_library", ":web_ui_library_sources", ] - - if (build_canvaskit) { - deps += [ "//third_party/skia/modules/canvaskit" ] - } sources = get_target_outputs(":flutter_dartdevc_canvaskit_html_kernel_sdk") sources += get_target_outputs(":flutter_dartdevc_canvaskit_html_kernel_sdk_sound") @@ -458,18 +652,6 @@ if (!is_fuchsia) { }, ] } - if (build_canvaskit) { - tmp_files += [ - { - source = rebase_path("$root_out_dir/canvaskit.js") - destination = "canvaskit/canvaskit.js" - }, - { - source = rebase_path("$root_out_dir/canvaskit.wasm") - destination = "canvaskit/canvaskit.wasm" - }, - ] - } files = tmp_files } } diff --git a/web_sdk/web_test_utils/lib/environment.dart b/web_sdk/web_test_utils/lib/environment.dart index 96702b210acba..fb3df30ea7ba5 100644 --- a/web_sdk/web_test_utils/lib/environment.dart +++ b/web_sdk/web_test_utils/lib/environment.dart @@ -41,17 +41,21 @@ class Environment { required this.webUiRootDir, required this.engineSrcDir, required this.engineToolsDir, + required this.outDir, }); static Environment _prepareEnvironmentFromEngineDir( io.File self, io.Directory engineSrcDir) { final io.Directory engineToolsDir = io.Directory(pathlib.join(engineSrcDir.path, 'flutter', 'tools')); + final io.Directory outDir = + io.Directory(pathlib.join(engineSrcDir.path, 'out')); final io.Directory webUiRootDir = io.Directory( pathlib.join(engineSrcDir.path, 'flutter', 'lib', 'web_ui')); for (final io.Directory expectedDirectory in [ engineSrcDir, + outDir, webUiRootDir ]) { if (!expectedDirectory.existsSync()) { @@ -64,6 +68,7 @@ class Environment { webUiRootDir: webUiRootDir, engineSrcDir: engineSrcDir, engineToolsDir: engineToolsDir, + outDir: outDir, ); } @@ -79,6 +84,11 @@ class Environment { /// Path to the engine's "tools" directory. final io.Directory engineToolsDir; + /// Path to the engine's "out" directory. + /// + /// This is where you'll find the ninja output, such as the Dart SDK. + final io.Directory outDir; + /// Path to where github.com/flutter/engine is checked out inside the engine workspace. io.Directory get flutterDirectory => io.Directory(pathlib.join(engineSrcDir.path, 'flutter'));