Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit 7a1be8b

Browse files
Build Web SDK in wasm build tree (#36520)
1 parent 453a60f commit 7a1be8b

File tree

11 files changed

+336
-522
lines changed

11 files changed

+336
-522
lines changed

BUILD.gn

Lines changed: 3 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ import("//third_party/dart/build/dart/copy_tree.gni")
1212

1313
# Whether to build the dartdevc sdk, libraries, and source files
1414
# required for the flutter web sdk.
15+
# TODO(jacksongardner): remove this poorly named argument once the recipes stop
16+
# using it.
1517
declare_args() {
1618
full_dart_sdk = false
1719
}
@@ -44,30 +46,6 @@ config("export_dynamic_symbols") {
4446
}
4547
}
4648

47-
if (flutter_prebuilt_dart_sdk) {
48-
copy_trees("_copy_trees") {
49-
sources = [
50-
{
51-
target = "copy_dart_sdk"
52-
visibility = [ ":dart_sdk" ]
53-
source = prebuilt_dart_sdk
54-
dest = "$root_out_dir/dart-sdk"
55-
ignore_patterns = "{}"
56-
},
57-
]
58-
}
59-
}
60-
61-
group("dart_sdk") {
62-
if (build_engine_artifacts) {
63-
if (flutter_prebuilt_dart_sdk) {
64-
public_deps = [ ":copy_dart_sdk" ]
65-
} else {
66-
public_deps = [ "//third_party/dart:create_sdk" ]
67-
}
68-
}
69-
}
70-
7149
group("flutter") {
7250
testonly = true
7351

@@ -96,7 +74,7 @@ group("flutter") {
9674

9775
if (build_engine_artifacts) {
9876
public_deps += [
99-
":dart_sdk",
77+
"//flutter/dart_sdk",
10078
"//flutter/flutter_frontend_server:frontend_server",
10179

10280
# This must be listed explicitly for desktop cross-builds since

build/archives/BUILD.gn

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -220,13 +220,6 @@ if (build_engine_artifacts && !flutter_prebuilt_dart_sdk) {
220220
}
221221
}
222222

223-
# Archives Flutter Web SDK
224-
if (!is_fuchsia) {
225-
group("flutter_web_sdk") {
226-
deps = [ "//flutter/web_sdk:flutter_web_sdk_archive" ]
227-
}
228-
}
229-
230223
# Archives Flutter Windows Artifacts
231224
if (host_os == "win") {
232225
zip_bundle("windows_flutter") {

ci/builders/linux_host_engine.json

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@
6464
"flutter/build/archives:embedder",
6565
"flutter/build/archives:flutter_patched_sdk",
6666
"flutter/build/archives:dart_sdk_archive",
67-
"flutter/build/archives:flutter_web_sdk",
67+
"flutter/web_sdk",
6868
"flutter/tools/font-subset",
6969
"flutter/shell/platform/linux:flutter_gtk"
7070
]
@@ -151,8 +151,7 @@
151151
"targets": [
152152
"flutter:unittests",
153153
"flutter/build/archives:flutter_patched_sdk",
154-
"flutter/shell/platform/linux:flutter_gtk",
155-
"flutter/build/archives:flutter_web_sdk"
154+
"flutter/shell/platform/linux:flutter_gtk"
156155
]
157156
},
158157
"tests": [

common/config.gni

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@ declare_args() {
2222

2323
# Whether to use a prebuilt Dart SDK instead of building one.
2424
flutter_prebuilt_dart_sdk = false
25+
26+
build_flutter_web_sdk = false
2527
}
2628

2729
# feature_defines_list ---------------------------------------------------------
@@ -114,7 +116,7 @@ if (flutter_prebuilt_dart_sdk) {
114116
# There is no prebuilt Dart SDK targeting Fuchsia, but we also don't need
115117
# one, so even when the build is targeting Fuchsia, use the prebuilt
116118
# Dart SDK for the host.
117-
if (current_toolchain == host_toolchain || is_fuchsia) {
119+
if (current_toolchain == host_toolchain || is_fuchsia || is_wasm) {
118120
prebuilt_dart_sdk = host_prebuilt_dart_sdk
119121
prebuilt_dart_sdk_config = _host_prebuilt_dart_sdk_config
120122
} else {

dart_sdk/BUILD.gn

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import("//flutter/common/config.gni")
2+
import("//third_party/dart/build/dart/copy_tree.gni")
3+
4+
if (flutter_prebuilt_dart_sdk) {
5+
copy_trees("_copy_trees") {
6+
sources = [
7+
{
8+
target = "copy_dart_sdk"
9+
visibility = [ ":dart_sdk" ]
10+
source = prebuilt_dart_sdk
11+
dest = "$root_out_dir/dart-sdk"
12+
ignore_patterns = "{}"
13+
},
14+
]
15+
}
16+
}
17+
18+
group("dart_sdk") {
19+
if (flutter_prebuilt_dart_sdk) {
20+
public_deps = [ ":copy_dart_sdk" ]
21+
} else {
22+
public_deps = [ "//third_party/dart:create_sdk" ]
23+
}
24+
}

lib/web_ui/dev/build.dart

Lines changed: 13 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
// found in the LICENSE file.
44

55
import 'dart:async';
6-
import 'dart:io' show Directory, Platform;
6+
import 'dart:io' show Directory;
77

88
import 'package:args/command_runner.dart';
99
import 'package:path/path.dart' as path;
@@ -25,6 +25,7 @@ class BuildCommand extends Command<bool> with ArgUtils<bool> {
2525
'build-canvaskit',
2626
help: 'Build CanvasKit locally instead of getting it from CIPD. Disabled '
2727
'by default.',
28+
defaultsTo: true
2829
);
2930
}
3031

@@ -42,15 +43,9 @@ class BuildCommand extends Command<bool> with ArgUtils<bool> {
4243
FutureOr<bool> run() async {
4344
final FilePath libPath = FilePath.fromWebUi('lib');
4445
final List<PipelineStep> steps = <PipelineStep>[
45-
GnPipelineStep(),
46-
NinjaPipelineStep(target: environment.engineBuildDir),
46+
GnPipelineStep(buildCanvasKit: buildCanvasKit),
47+
NinjaPipelineStep(target: environment.wasmReleaseOutDir),
4748
];
48-
if (buildCanvasKit) {
49-
steps.addAll(<PipelineStep>[
50-
GnPipelineStep(target: 'canvaskit'),
51-
NinjaPipelineStep(target: environment.wasmReleaseOutDir),
52-
]);
53-
}
5449
final Pipeline buildPipeline = Pipeline(steps: steps);
5550
await buildPipeline.run();
5651

@@ -73,39 +68,24 @@ class BuildCommand extends Command<bool> with ArgUtils<bool> {
7368
/// Not safe to interrupt as it may leave the `out/` directory in a corrupted
7469
/// state. GN is pretty quick though, so it's OK to not support interruption.
7570
class GnPipelineStep extends ProcessStep {
76-
GnPipelineStep({this.target = 'engine'})
77-
: assert(target == 'engine' || target == 'canvaskit');
71+
GnPipelineStep({required this.buildCanvasKit});
72+
73+
final bool buildCanvasKit;
7874

7975
@override
8076
String get description => 'gn';
8177

8278
@override
8379
bool get isSafeToInterrupt => false;
8480

85-
/// The target to build with gn.
86-
///
87-
/// Acceptable values: engine, canvaskit
88-
final String target;
89-
9081
@override
9182
Future<ProcessManager> createProcess() {
92-
print('Running gn for $target...');
93-
final List<String> gnArgs = <String>[];
94-
if (target == 'engine') {
95-
gnArgs.addAll(<String>[
96-
'--unopt',
97-
if (Platform.isMacOS) '--xcode-symlinks',
98-
'--full-dart-sdk',
99-
if (environment.isMacosArm) '--mac-cpu=arm64',
100-
]);
101-
} else if (target == 'canvaskit') {
102-
gnArgs.addAll(<String>[
103-
'--wasm',
104-
'--runtime-mode=release',
105-
]);
106-
} else {
107-
throw StateError('Target was not engine or canvaskit: $target');
108-
}
83+
print('Running gn...');
84+
final List<String> gnArgs = <String>[
85+
'--web',
86+
'--runtime-mode=release',
87+
if (buildCanvasKit) '--build-canvaskit',
88+
];
10989
return startProcess(
11090
path.join(environment.flutterDirectory.path, 'tools', 'gn'),
11191
gnArgs,

lib/web_ui/dev/environment.dart

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -20,21 +20,17 @@ Environment? _environment;
2020
class Environment {
2121
factory Environment() {
2222
final bool isMacosArm = ffi.Abi.current() == ffi.Abi.macosArm64;
23+
final io.File dartExecutable = io.File(io.Platform.resolvedExecutable);
2324
final io.File self = io.File.fromUri(io.Platform.script);
25+
2426
final io.Directory engineSrcDir = self.parent.parent.parent.parent.parent;
2527
final io.Directory engineToolsDir =
2628
io.Directory(pathlib.join(engineSrcDir.path, 'flutter', 'tools'));
2729
final io.Directory outDir =
2830
io.Directory(pathlib.join(engineSrcDir.path, 'out'));
29-
final io.Directory engineBuildDir =
30-
io.Directory(pathlib.join(
31-
outDir.path,
32-
isMacosArm ? 'host_debug_unopt_arm64' : 'host_debug_unopt'
33-
));
3431
final io.Directory wasmReleaseOutDir =
3532
io.Directory(pathlib.join(outDir.path, 'wasm_release'));
36-
final io.Directory dartSdkDir =
37-
io.Directory(pathlib.join(engineBuildDir.path, 'dart-sdk'));
33+
final io.Directory dartSdkDir = dartExecutable.parent.parent;
3834
final io.Directory webUiRootDir = io.Directory(
3935
pathlib.join(engineSrcDir.path, 'flutter', 'lib', 'web_ui'));
4036

@@ -55,7 +51,6 @@ class Environment {
5551
engineSrcDir: engineSrcDir,
5652
engineToolsDir: engineToolsDir,
5753
outDir: outDir,
58-
engineBuildDir: engineBuildDir,
5954
wasmReleaseOutDir: wasmReleaseOutDir,
6055
dartSdkDir: dartSdkDir,
6156
);
@@ -68,7 +63,6 @@ class Environment {
6863
required this.engineSrcDir,
6964
required this.engineToolsDir,
7065
required this.outDir,
71-
required this.engineBuildDir,
7266
required this.wasmReleaseOutDir,
7367
required this.dartSdkDir,
7468
});
@@ -93,9 +87,6 @@ class Environment {
9387
/// This is where you'll find the ninja output, such as the Dart SDK.
9488
final io.Directory outDir;
9589

96-
/// The output directory for the host_debug_unopt build.
97-
final io.Directory engineBuildDir;
98-
9990
/// The output directory for the wasm_release build.
10091
///
10192
/// We build CanvasKit in release mode to reduce code size.

tools/gn

Lines changed: 47 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ SRC_ROOT = os.path.dirname(
2121
def get_out_dir(args):
2222
if args.target_os is not None:
2323
target_dir = [args.target_os]
24+
elif args.web:
25+
target_dir = ['wasm']
2426
else:
2527
target_dir = ['host']
2628

@@ -251,10 +253,15 @@ def to_gn_args(args):
251253

252254
# If building for WASM, set the GN args using 'to_gn_wasm_args' as most
253255
# of the Flutter SDK specific arguments are unused.
254-
if args.target_os == 'wasm':
256+
if args.target_os == 'wasm' or args.web:
255257
to_gn_wasm_args(args, gn_args)
256258
return gn_args
257259

260+
gn_args['build_flutter_web_sdk'] = args.build_web_sdk
261+
gn_args['full_dart_sdk'] = args.full_dart_sdk
262+
if args.build_web_sdk or args.full_dart_sdk:
263+
gn_args['build_canvaskit'] = args.build_canvaskit
264+
258265
if args.enable_unittests:
259266
gn_args['enable_unittests'] = args.enable_unittests
260267

@@ -359,7 +366,6 @@ def to_gn_args(args):
359366
gn_args['embedder_for_target'] = args.embedder_for_target
360367
gn_args['dart_lib_export_symbols'] = False
361368
gn_args['flutter_runtime_mode'] = runtime_mode
362-
gn_args['full_dart_sdk'] = args.full_dart_sdk
363369
gn_args['dart_version_git_info'] = not args.no_dart_version_git_info
364370

365371
gn_args['dart_lib_export_symbols'] = False
@@ -627,6 +633,12 @@ def to_gn_wasm_args(args, gn_args):
627633
gn_args['skia_canvaskit_enable_webgpu'] = False
628634
is_profile_build = args.runtime_mode == 'profile' or args.runtime_mode == 'debug'
629635
gn_args['skia_canvaskit_profile_build'] = is_profile_build
636+
gn_args['flutter_prebuilt_dart_sdk'] = True
637+
638+
# TODO(jacksongardner): Make this based off of the input argument rather
639+
# than forced to true, once the recipes are updated.
640+
gn_args['build_canvaskit'] = True
641+
gn_args['build_flutter_web_sdk'] = True
630642

631643

632644
def parse_args(args):
@@ -702,6 +714,7 @@ def parse_args(args):
702714
parser.add_argument(
703715
'--wasm', dest='target_os', action='store_const', const='wasm'
704716
)
717+
parser.add_argument('--web', action='store_true', default=False)
705718
parser.add_argument(
706719
'--windows', dest='target_os', action='store_const', const='win'
707720
)
@@ -825,6 +838,27 @@ def parse_args(args):
825838
'--no-full-dart-sdk', dest='full_dart_sdk', action='store_false'
826839
)
827840

841+
parser.add_argument(
842+
'--build-web-sdk',
843+
default=False,
844+
action='store_true',
845+
help='build the flutter web sdk'
846+
)
847+
parser.add_argument(
848+
'--no-build-web-sdk', dest='build_web_sdk', action='store_false'
849+
)
850+
851+
parser.add_argument(
852+
'--build-canvaskit',
853+
default=False,
854+
action='store_true',
855+
help='build canvaskit from source'
856+
)
857+
858+
parser.add_argument(
859+
'--no-build-canvaskit', dest='build_canvaskit', action='store_false'
860+
)
861+
828862
parser.add_argument(
829863
'--ide',
830864
default='',
@@ -968,16 +1002,17 @@ def main(argv):
9681002
'--export-compile-commands',
9691003
]
9701004

971-
if args.ide != '':
972-
command.append('--ide=%s' % args.ide)
973-
elif sys.platform == 'darwin':
974-
# On the Mac, generate an Xcode project by default.
975-
command.append('--ide=xcode')
976-
command.append('--xcode-project=flutter_engine')
977-
command.append('--xcode-build-system=new')
978-
elif sys.platform.startswith('win'):
979-
# On Windows, generate a Visual Studio project.
980-
command.append('--ide=vs')
1005+
if args.target_os != 'wasm':
1006+
if args.ide != '':
1007+
command.append('--ide=%s' % args.ide)
1008+
elif sys.platform == 'darwin':
1009+
# On the Mac, generate an Xcode project by default.
1010+
command.append('--ide=xcode')
1011+
command.append('--xcode-project=flutter_engine')
1012+
command.append('--xcode-build-system=new')
1013+
elif sys.platform.startswith('win'):
1014+
# On Windows, generate a Visual Studio project.
1015+
command.append('--ide=vs')
9811016

9821017
command.append('--export-compile-commands=default')
9831018

wasm/BUILD.gn

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,11 @@
66
# //flutter/BUILD.gn pulls in Flutter SDK dependencies which will crash
77
# when the target CPU is WASM.
88

9+
import("//flutter/common/config.gni")
10+
911
# This is the default target when building when the target CPU is WASM.
1012
group("wasm") {
11-
deps = [ "//third_party/skia/modules/canvaskit" ]
13+
if (build_flutter_web_sdk) {
14+
deps = [ "//flutter/web_sdk" ]
15+
}
1216
}

0 commit comments

Comments
 (0)