Skip to content

Commit 1045c3d

Browse files
authored
flutter_tool: add and use WebCompilerConfig (#124183)
flutter_tool: add and use WebCompilerConfig
1 parent 98f35be commit 1045c3d

File tree

7 files changed

+179
-99
lines changed

7 files changed

+179
-99
lines changed

packages/flutter_tools/lib/src/build_system/targets/web.dart

Lines changed: 3 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -34,37 +34,12 @@ import 'shader_compiler.dart';
3434
/// Whether the application has web plugins.
3535
const String kHasWebPlugins = 'HasWebPlugins';
3636

37-
/// An override for the dart2js build mode.
38-
///
39-
/// Valid values are O1 (lowest, profile default) to O4 (highest, release default).
40-
const String kDart2jsOptimization = 'Dart2jsOptimization';
41-
42-
/// The default optimization level for dart2js.
43-
///
44-
/// Maps to [kDart2jsOptimization].
45-
const String kDart2jsDefaultOptimizationLevel = 'O4';
46-
47-
/// If `--dump-info` should be passed to dart2js.
48-
const String kDart2jsDumpInfo = 'Dart2jsDumpInfo';
49-
50-
// If `--no-frequency-based-minification` should be based to dart2js
51-
const String kDart2jsNoFrequencyBasedMinification = 'Dart2jsNoFrequencyBasedMinification';
52-
53-
/// Whether to disable dynamic generation code to satisfy csp policies.
54-
const String kCspMode = 'cspMode';
55-
5637
/// Base href to set in index.html in flutter build command
5738
const String kBaseHref = 'baseHref';
5839

5940
/// The caching strategy to use for service worker generation.
6041
const String kServiceWorkerStrategy = 'ServiceWorkerStrategy';
6142

62-
/// Whether the dart2js build should output source maps.
63-
const String kSourceMapsEnabled = 'SourceMaps';
64-
65-
/// Whether the dart2js native null assertions are enabled.
66-
const String kNativeNullAssertions = 'NativeNullAssertions';
67-
6843
const String kOfflineFirst = 'offline-first';
6944
const String kNoneWorker = 'none';
7045

@@ -201,8 +176,7 @@ class Dart2JSTarget extends Dart2WebTarget {
201176
throw MissingDefineException(kBuildMode, name);
202177
}
203178
final BuildMode buildMode = getBuildModeForName(buildModeEnvironment);
204-
final bool sourceMapsEnabled = environment.defines[kSourceMapsEnabled] == 'true';
205-
final bool nativeNullAssertions = environment.defines[kNativeNullAssertions] == 'true';
179+
final JsCompilerConfig compilerConfig = JsCompilerConfig.fromBuildSystemEnvironment(environment.defines);
206180
final Artifacts artifacts = globals.artifacts!;
207181
final String platformBinariesPath = getWebPlatformBinariesDirectory(artifacts, webRenderer).path;
208182
final List<String> sharedCommandOptions = <String>[
@@ -212,20 +186,17 @@ class Dart2JSTarget extends Dart2WebTarget {
212186
'--platform-binaries=$platformBinariesPath',
213187
...decodeCommaSeparated(environment.defines, kExtraFrontEndOptions),
214188
'--invoker=flutter_tool',
215-
if (nativeNullAssertions)
216-
'--native-null-assertions',
217189
if (buildMode == BuildMode.profile)
218190
'-Ddart.vm.profile=true'
219191
else
220192
'-Ddart.vm.product=true',
221193
for (final String dartDefine in decodeDartDefines(environment.defines, kDartDefines))
222194
'-D$dartDefine',
223-
if (!sourceMapsEnabled)
224-
'--no-source-maps',
225195
];
226196

227197
final List<String> compilationArgs = <String>[
228198
...sharedCommandOptions,
199+
...compilerConfig.toSharedCommandOptions(),
229200
'-o',
230201
environment.buildDir.childFile('app.dill').path,
231202
'--packages=.dart_tool/package_config.json',
@@ -241,19 +212,12 @@ class Dart2JSTarget extends Dart2WebTarget {
241212
throw Exception(_collectOutput(kernelResult));
242213
}
243214

244-
final String dart2jsOptimization = environment.defines[kDart2jsOptimization] ?? kDart2jsDefaultOptimizationLevel;
245-
final bool dumpInfo = environment.defines[kDart2jsDumpInfo] == 'true';
246-
final bool noFrequencyBasedMinification = environment.defines[kDart2jsNoFrequencyBasedMinification] == 'true';
247215
final File outputJSFile = environment.buildDir.childFile('main.dart.js');
248-
final bool csp = environment.defines[kCspMode] == 'true';
249216

250217
final ProcessResult javaScriptResult = await environment.processManager.run(<String>[
251218
...sharedCommandOptions,
252-
'-$dart2jsOptimization',
253219
if (buildMode == BuildMode.profile) '--no-minify',
254-
if (dumpInfo) '--dump-info',
255-
if (noFrequencyBasedMinification) '--no-frequency-based-minification',
256-
if (csp) '--csp',
220+
...compilerConfig.toCommandOptions(),
257221
'-o',
258222
outputJSFile.path,
259223
environment.buildDir.childFile('app.dill').path, // dartfile

packages/flutter_tools/lib/src/commands/build_web.dart

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ class BuildWebCommand extends BuildSubCommand {
8181
argParser.addOption('dart2js-optimization',
8282
help: 'Sets the optimization level used for Dart compilation to JavaScript. '
8383
'Valid values range from O0 to O4.',
84-
defaultsTo: kDart2jsDefaultOptimizationLevel
84+
defaultsTo: JsCompilerConfig.kDart2jsDefaultOptimizationLevel
8585
);
8686
argParser.addFlag('dump-info', negatable: false,
8787
help: 'Passes "--dump-info" to the Javascript compiler which generates '
@@ -134,9 +134,21 @@ class BuildWebCommand extends BuildSubCommand {
134134
throwToolExit('"build web" is not currently supported. To enable, run "flutter config --enable-web".');
135135
}
136136

137-
final bool wasmRequested = boolArg(FlutterOptions.kWebWasmFlag);
138-
if (wasmRequested && !featureFlags.isFlutterWebWasmEnabled) {
139-
throwToolExit('Compiling to WebAssembly (wasm) is only available on the master channel.');
137+
final WebCompilerConfig compilerConfig;
138+
if (boolArg('wasm')) {
139+
if (!featureFlags.isFlutterWebWasmEnabled) {
140+
throwToolExit('Compiling to WebAssembly (wasm) is only available on the master channel.');
141+
}
142+
compilerConfig = const WasmCompilerConfig();
143+
} else {
144+
compilerConfig = JsCompilerConfig(
145+
csp: boolArg('csp'),
146+
optimizationLevel: stringArg('dart2js-optimization') ?? JsCompilerConfig.kDart2jsDefaultOptimizationLevel,
147+
dumpInfo: boolArg('dump-info'),
148+
nativeNullAssertions: boolArg('native-null-assertions'),
149+
noFrequencyBasedMinification: boolArg('no-frequency-based-minification'),
150+
sourceMaps: boolArg('source-maps'),
151+
);
140152
}
141153

142154
final FlutterProject flutterProject = FlutterProject.current();
@@ -180,16 +192,10 @@ class BuildWebCommand extends BuildSubCommand {
180192
flutterProject,
181193
target,
182194
buildInfo,
183-
boolArg('csp'),
184195
stringArg('pwa-strategy')!,
185-
boolArg('source-maps'),
186-
boolArg('native-null-assertions'),
187-
wasmRequested,
196+
compilerConfig: compilerConfig,
188197
baseHref: baseHref,
189-
dart2jsOptimization: stringArg('dart2js-optimization') ?? kDart2jsDefaultOptimizationLevel,
190198
outputDirectoryPath: outputDirectoryPath,
191-
dumpInfo: boolArg('dump-info'),
192-
noFrequencyBasedMinification: boolArg('no-frequency-based-minification'),
193199
);
194200
return FlutterCommandResult.success();
195201
}

packages/flutter_tools/lib/src/isolated/resident_web_runner.dart

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -325,11 +325,8 @@ Please provide a valid TCP port (an integer between 0 and 65535, inclusive).
325325
flutterProject,
326326
target,
327327
debuggingOptions.buildInfo,
328-
false,
329328
kNoneWorker,
330-
true,
331-
debuggingOptions.nativeNullAssertions,
332-
false,
329+
compilerConfig: JsCompilerConfig.run(nativeNullAssertions: debuggingOptions.nativeNullAssertions)
333330
);
334331
}
335332
await device!.device!.startApp(
@@ -405,11 +402,8 @@ Please provide a valid TCP port (an integer between 0 and 65535, inclusive).
405402
flutterProject,
406403
target,
407404
debuggingOptions.buildInfo,
408-
false,
409405
kNoneWorker,
410-
true,
411-
debuggingOptions.nativeNullAssertions,
412-
false,
406+
compilerConfig: JsCompilerConfig.run(nativeNullAssertions: debuggingOptions.nativeNullAssertions),
413407
);
414408
} on ToolExit {
415409
return OperationResult(1, 'Failed to recompile application.');

packages/flutter_tools/lib/src/web/compile.dart

Lines changed: 8 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,10 @@ import '../plugins.dart';
1818
import '../project.dart';
1919
import '../reporting/reporting.dart';
2020
import '../version.dart';
21+
import 'compiler_config.dart';
2122
import 'migrations/scrub_generated_plugin_registrant.dart';
2223

23-
export '../build_system/targets/web.dart' show kDart2jsDefaultOptimizationLevel;
24+
export 'compiler_config.dart';
2425

2526
class WebBuilder {
2627
WebBuilder({
@@ -45,18 +46,12 @@ class WebBuilder {
4546
FlutterProject flutterProject,
4647
String target,
4748
BuildInfo buildInfo,
48-
bool csp,
49-
String serviceWorkerStrategy,
50-
bool sourceMaps,
51-
bool nativeNullAssertions,
52-
bool isWasm, {
53-
String dart2jsOptimization = kDart2jsDefaultOptimizationLevel,
49+
String serviceWorkerStrategy, {
50+
required WebCompilerConfig compilerConfig,
5451
String? baseHref,
55-
bool dumpInfo = false,
56-
bool noFrequencyBasedMinification = false,
5752
String? outputDirectoryPath,
5853
}) async {
59-
if (isWasm) {
54+
if (compilerConfig.isWasm) {
6055
globals.logger.printBox(
6156
title: 'Experimental feature',
6257
'''
@@ -68,7 +63,7 @@ class WebBuilder {
6863
final bool hasWebPlugins =
6964
(await findPlugins(flutterProject)).any((Plugin p) => p.platforms.containsKey(WebPlugin.kConfigKey));
7065
final Directory outputDirectory = outputDirectoryPath == null
71-
? _fileSystem.directory(getWebBuildDirectory(isWasm))
66+
? _fileSystem.directory(getWebBuildDirectory(compilerConfig.isWasm))
7267
: _fileSystem.directory(outputDirectoryPath);
7368
outputDirectory.createSync(recursive: true);
7469

@@ -84,22 +79,17 @@ class WebBuilder {
8479
final Stopwatch sw = Stopwatch()..start();
8580
try {
8681
final BuildResult result = await _buildSystem.build(
87-
WebServiceWorker(_fileSystem, buildInfo.webRenderer, isWasm: isWasm),
82+
WebServiceWorker(_fileSystem, buildInfo.webRenderer, isWasm: compilerConfig.isWasm),
8883
Environment(
8984
projectDir: _fileSystem.currentDirectory,
9085
outputDir: outputDirectory,
9186
buildDir: flutterProject.directory.childDirectory('.dart_tool').childDirectory('flutter_build'),
9287
defines: <String, String>{
9388
kTargetFile: target,
9489
kHasWebPlugins: hasWebPlugins.toString(),
95-
kCspMode: csp.toString(),
9690
if (baseHref != null) kBaseHref: baseHref,
97-
kSourceMapsEnabled: sourceMaps.toString(),
98-
kNativeNullAssertions: nativeNullAssertions.toString(),
9991
kServiceWorkerStrategy: serviceWorkerStrategy,
100-
kDart2jsOptimization: dart2jsOptimization,
101-
kDart2jsDumpInfo: dumpInfo.toString(),
102-
kDart2jsNoFrequencyBasedMinification: noFrequencyBasedMinification.toString(),
92+
...compilerConfig.toBuildSystemEnvironment(),
10393
...buildInfo.toBuildSystemEnvironment(),
10494
},
10595
artifacts: globals.artifacts!,
Lines changed: 138 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,138 @@
1+
// Copyright 2014 The Flutter Authors. All rights reserved.
2+
// Use of this source code is governed by a BSD-style license that can be
3+
// found in the LICENSE file.
4+
5+
abstract class WebCompilerConfig {
6+
const WebCompilerConfig();
7+
8+
/// Returns `true` if `this` represents configuration for the Wasm compiler.
9+
///
10+
/// Otherwise, `false`–represents the JavaScript compiler.
11+
bool get isWasm;
12+
13+
Map<String, String> toBuildSystemEnvironment();
14+
}
15+
16+
/// Configuration for the Dart-to-Javascript compiler (dart2js).
17+
class JsCompilerConfig extends WebCompilerConfig {
18+
const JsCompilerConfig({
19+
required this.csp,
20+
required this.dumpInfo,
21+
required this.nativeNullAssertions,
22+
required this.optimizationLevel,
23+
required this.noFrequencyBasedMinification,
24+
required this.sourceMaps,
25+
});
26+
27+
/// Instantiates [JsCompilerConfig] suitable for the `flutter run` command.
28+
const JsCompilerConfig.run({required bool nativeNullAssertions})
29+
: this(
30+
csp: false,
31+
dumpInfo: false,
32+
nativeNullAssertions: nativeNullAssertions,
33+
noFrequencyBasedMinification: false,
34+
optimizationLevel: kDart2jsDefaultOptimizationLevel,
35+
sourceMaps: true,
36+
);
37+
38+
/// Creates a new [JsCompilerConfig] from build system environment values.
39+
///
40+
/// Should correspond exactly with [toBuildSystemEnvironment].
41+
factory JsCompilerConfig.fromBuildSystemEnvironment(
42+
Map<String, String> defines) =>
43+
JsCompilerConfig(
44+
csp: defines[kCspMode] == 'true',
45+
dumpInfo: defines[kDart2jsDumpInfo] == 'true',
46+
nativeNullAssertions: defines[kNativeNullAssertions] == 'true',
47+
optimizationLevel: defines[kDart2jsOptimization] ?? kDart2jsDefaultOptimizationLevel,
48+
noFrequencyBasedMinification: defines[kDart2jsNoFrequencyBasedMinification] == 'true',
49+
sourceMaps: defines[kSourceMapsEnabled] == 'true',
50+
);
51+
52+
/// The default optimization level for dart2js.
53+
///
54+
/// Maps to [kDart2jsOptimization].
55+
static const String kDart2jsDefaultOptimizationLevel = 'O4';
56+
57+
/// Build environment flag for [optimizationLevel].
58+
static const String kDart2jsOptimization = 'Dart2jsOptimization';
59+
60+
/// Build environment flag for [dumpInfo].
61+
static const String kDart2jsDumpInfo = 'Dart2jsDumpInfo';
62+
63+
/// Build environment flag for [noFrequencyBasedMinification].
64+
static const String kDart2jsNoFrequencyBasedMinification =
65+
'Dart2jsNoFrequencyBasedMinification';
66+
67+
/// Build environment flag for [csp].
68+
static const String kCspMode = 'cspMode';
69+
70+
/// Build environment flag for [sourceMaps].
71+
static const String kSourceMapsEnabled = 'SourceMaps';
72+
73+
/// Build environment flag for [nativeNullAssertions].
74+
static const String kNativeNullAssertions = 'NativeNullAssertions';
75+
76+
/// Whether to disable dynamic generation code to satisfy CSP policies.
77+
final bool csp;
78+
79+
/// If `--dump-info` should be passed to the compiler.
80+
final bool dumpInfo;
81+
82+
/// Whether native null assertions are enabled.
83+
final bool nativeNullAssertions;
84+
85+
// If `--no-frequency-based-minification` should be passed to dart2js
86+
// TODO(kevmoo): consider renaming this to be "positive". Double negatives are confusing.
87+
final bool noFrequencyBasedMinification;
88+
89+
/// The compiler optimization level.
90+
///
91+
/// Valid values are O1 (lowest, profile default) to O4 (highest, release default).
92+
// TODO(kevmoo): consider storing this as an [int] and validating it!
93+
final String optimizationLevel;
94+
95+
/// `true` if the JavaScript compiler build should output source maps.
96+
final bool sourceMaps;
97+
98+
@override
99+
bool get isWasm => false;
100+
101+
@override
102+
Map<String, String> toBuildSystemEnvironment() => <String, String>{
103+
kCspMode: csp.toString(),
104+
kDart2jsDumpInfo: dumpInfo.toString(),
105+
kNativeNullAssertions: nativeNullAssertions.toString(),
106+
kDart2jsNoFrequencyBasedMinification: noFrequencyBasedMinification.toString(),
107+
kDart2jsOptimization: optimizationLevel,
108+
kSourceMapsEnabled: sourceMaps.toString(),
109+
};
110+
111+
/// Arguments to use in both phases: full JS compile and CFE-only.
112+
List<String> toSharedCommandOptions() => <String>[
113+
if (nativeNullAssertions) '--native-null-assertions',
114+
if (!sourceMaps) '--no-source-maps',
115+
];
116+
117+
/// Arguments to use in the full JS compile, but not CFE-only.
118+
///
119+
/// Includes the contents of [toSharedCommandOptions].
120+
List<String> toCommandOptions() => <String>[
121+
...toSharedCommandOptions(),
122+
'-$optimizationLevel',
123+
if (dumpInfo) '--dump-info',
124+
if (noFrequencyBasedMinification) '--no-frequency-based-minification',
125+
if (csp) '--csp',
126+
];
127+
}
128+
129+
/// Configuration for the Wasm compiler.
130+
class WasmCompilerConfig extends WebCompilerConfig {
131+
const WasmCompilerConfig();
132+
133+
@override
134+
bool get isWasm => true;
135+
136+
@override
137+
Map<String, String> toBuildSystemEnvironment() => const <String, String>{};
138+
}

0 commit comments

Comments
 (0)