Skip to content

Commit ec5d407

Browse files
authored
[CP Stable] Emit source maps for wasm in flutter build web --wasm (#151643) (#153310)
Cherry-pick request: flutter/flutter#153308 Original CL: This will make * `flutter run` have source maps enabled by default * `flutter build` have source maps disabled by default which mirrors what happens already today with the js compilers. For local development this works quite well - even better than with dart2js (see dart2js issues in [0]). We do have some follow-up items for source maps in dart2wasm compiler, see [1] [0] [flutter/flutter/issues/151641](flutter/flutter#151641) [1] [dart-lang/sdk/issues/56232](dart-lang/sdk#56232)
1 parent cb28dec commit ec5d407

File tree

4 files changed

+74
-60
lines changed

4 files changed

+74
-60
lines changed

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -363,13 +363,15 @@ class Dart2WasmTarget extends Dart2WebTarget {
363363
.whereType<File>()
364364
.where((File file) => switch (file.basename) {
365365
'main.dart.wasm' || 'main.dart.mjs' => true,
366+
'main.dart.wasm.map' => compilerConfig.sourceMaps,
366367
_ => false,
367368
});
368369

369370
@override
370-
Iterable<String> get buildPatternStems => const <String>[
371+
Iterable<String> get buildPatternStems => <String>[
371372
'main.dart.wasm',
372373
'main.dart.mjs',
374+
if (compilerConfig.sourceMaps) 'main.dart.wasm.map',
373375
];
374376
}
375377

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

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,8 @@ class BuildWebCommand extends BuildSubCommand {
146146
? null
147147
: WebRendererMode.values.byName(webRendererString);
148148

149+
final bool sourceMaps = boolArg('source-maps');
150+
149151
final List<WebCompilerConfig> compilerConfigs;
150152
if (boolArg(FlutterOptions.kWebWasmFlag)) {
151153
if (webRenderer != null) {
@@ -162,14 +164,15 @@ class BuildWebCommand extends BuildSubCommand {
162164
WasmCompilerConfig(
163165
optimizationLevel: optimizationLevel,
164166
stripWasm: boolArg('strip-wasm'),
167+
sourceMaps: sourceMaps,
165168
),
166169
JsCompilerConfig(
167170
csp: boolArg('csp'),
168171
optimizationLevel: jsOptimizationLevel,
169172
dumpInfo: boolArg('dump-info'),
170173
nativeNullAssertions: boolArg('native-null-assertions'),
171174
noFrequencyBasedMinification: boolArg('no-frequency-based-minification'),
172-
sourceMaps: boolArg('source-maps'),
175+
sourceMaps: sourceMaps,
173176
)];
174177
} else {
175178
compilerConfigs = <WebCompilerConfig>[JsCompilerConfig(
@@ -178,7 +181,7 @@ class BuildWebCommand extends BuildSubCommand {
178181
dumpInfo: boolArg('dump-info'),
179182
nativeNullAssertions: boolArg('native-null-assertions'),
180183
noFrequencyBasedMinification: boolArg('no-frequency-based-minification'),
181-
sourceMaps: boolArg('source-maps'),
184+
sourceMaps: sourceMaps,
182185
renderer: webRenderer ?? WebRendererMode.defaultForJs,
183186
)];
184187
}

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

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,19 +12,27 @@ enum CompileTarget {
1212
}
1313

1414
sealed class WebCompilerConfig {
15-
const WebCompilerConfig({required this.renderer, required this.optimizationLevel});
15+
const WebCompilerConfig({required this.renderer,
16+
required this.optimizationLevel,
17+
required this.sourceMaps});
1618

1719
/// The default optimization level for dart2js/dart2wasm.
1820
static const int kDefaultOptimizationLevel = 4;
1921

2022
/// Build environment flag for [optimizationLevel].
2123
static const String kOptimizationLevel = 'OptimizationLevel';
2224

25+
/// Build environment flag for [sourceMaps].
26+
static const String kSourceMapsEnabled = 'SourceMaps';
27+
2328
/// The compiler optimization level.
2429
///
2530
/// Valid values are O0 (lowest, debug default) to O4 (highest, release default).
2631
final int optimizationLevel;
2732

33+
/// `true` if the compiler build should output source maps.
34+
final bool sourceMaps;
35+
2836
/// Returns which target this compiler outputs (js or wasm)
2937
CompileTarget get compileTarget;
3038
final WebRendererMode renderer;
@@ -50,7 +58,7 @@ class JsCompilerConfig extends WebCompilerConfig {
5058
this.nativeNullAssertions = false,
5159
super.optimizationLevel = WebCompilerConfig.kDefaultOptimizationLevel,
5260
this.noFrequencyBasedMinification = false,
53-
this.sourceMaps = true,
61+
super.sourceMaps = true,
5462
super.renderer = WebRendererMode.defaultForJs,
5563
});
5664

@@ -74,9 +82,6 @@ class JsCompilerConfig extends WebCompilerConfig {
7482
/// Build environment flag for [csp].
7583
static const String kCspMode = 'cspMode';
7684

77-
/// Build environment flag for [sourceMaps].
78-
static const String kSourceMapsEnabled = 'SourceMaps';
79-
8085
/// Build environment flag for [nativeNullAssertions].
8186
static const String kNativeNullAssertions = 'NativeNullAssertions';
8287

@@ -93,9 +98,6 @@ class JsCompilerConfig extends WebCompilerConfig {
9398
// TODO(kevmoo): consider renaming this to be "positive". Double negatives are confusing.
9499
final bool noFrequencyBasedMinification;
95100

96-
/// `true` if the JavaScript compiler build should output source maps.
97-
final bool sourceMaps;
98-
99101
@override
100102
CompileTarget get compileTarget => CompileTarget.js;
101103

@@ -136,6 +138,7 @@ class WasmCompilerConfig extends WebCompilerConfig {
136138
const WasmCompilerConfig({
137139
super.optimizationLevel = WebCompilerConfig.kDefaultOptimizationLevel,
138140
this.stripWasm = true,
141+
super.sourceMaps = true,
139142
super.renderer = WebRendererMode.defaultForWasm,
140143
});
141144

@@ -153,6 +156,7 @@ class WasmCompilerConfig extends WebCompilerConfig {
153156
return <String>[
154157
'-O$optimizationLevel',
155158
'--${stripSymbols ? '' : 'no-'}strip-wasm',
159+
if (!sourceMaps) '--extra-compiler-option=--no-source-maps',
156160
];
157161
}
158162

@@ -161,6 +165,7 @@ class WasmCompilerConfig extends WebCompilerConfig {
161165
final Map<String, dynamic> settings = <String, dynamic>{
162166
...super._buildKeyMap,
163167
'stripWasm': stripWasm,
168+
'sourceMaps': sourceMaps,
164169
};
165170
return jsonEncode(settings);
166171
}

packages/flutter_tools/test/general.shard/build_system/targets/web_test.dart

Lines changed: 53 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -784,7 +784,7 @@ void main() {
784784

785785
test('Dart2JSTarget can enable source maps', () => testbed.run(() async {
786786
environment.defines[kBuildMode] = 'release';
787-
environment.defines[JsCompilerConfig.kSourceMapsEnabled] = 'true';
787+
environment.defines[WebCompilerConfig.kSourceMapsEnabled] = 'true';
788788
processManager.addCommand(FakeCommand(
789789
command: <String>[
790790
..._kDart2jsLinuxArgs,
@@ -963,55 +963,59 @@ void main() {
963963
for (final bool strip in <bool>[true, false]) {
964964
for (final List<String> defines in const <List<String>>[<String>[], <String>['FOO=bar', 'BAZ=qux']]) {
965965
for (final String buildMode in const <String>['profile', 'release']) {
966-
test('Dart2WasmTarget invokes dart2wasm with renderer=$renderer, -O$level, stripping=$strip, defines=$defines, modeMode=$buildMode', () => testbed.run(() async {
967-
environment.defines[kBuildMode] = buildMode;
968-
environment.defines[kDartDefines] = encodeDartDefines(defines);
969-
970-
final File depFile = environment.buildDir.childFile('dart2wasm.d');
971-
972-
final File outputJsFile = environment.buildDir.childFile('main.dart.mjs');
973-
processManager.addCommand(FakeCommand(
974-
command: <String>[
975-
..._kDart2WasmLinuxArgs,
976-
if (renderer == WebRendererMode.skwasm) ...<String>[
977-
'--extra-compiler-option=--import-shared-memory',
978-
'--extra-compiler-option=--shared-memory-max-pages=32768',
966+
for (final bool sourceMaps in const <bool>[true, false]) {
967+
test('Dart2WasmTarget invokes dart2wasm with renderer=$renderer, -O$level, stripping=$strip, defines=$defines, modeMode=$buildMode sourceMaps=$sourceMaps', () => testbed.run(() async {
968+
environment.defines[kBuildMode] = buildMode;
969+
environment.defines[kDartDefines] = encodeDartDefines(defines);
970+
971+
final File depFile = environment.buildDir.childFile('dart2wasm.d');
972+
973+
final File outputJsFile = environment.buildDir.childFile('main.dart.mjs');
974+
processManager.addCommand(FakeCommand(
975+
command: <String>[
976+
..._kDart2WasmLinuxArgs,
977+
if (renderer == WebRendererMode.skwasm) ...<String>[
978+
'--extra-compiler-option=--import-shared-memory',
979+
'--extra-compiler-option=--shared-memory-max-pages=32768',
980+
],
981+
'-Ddart.vm.${buildMode == 'release' ? 'product' : 'profile' }=true',
982+
...defines.map((String define) => '-D$define'),
983+
if (renderer == WebRendererMode.skwasm) ...<String>[
984+
'-DFLUTTER_WEB_AUTO_DETECT=false',
985+
'-DFLUTTER_WEB_USE_SKIA=false',
986+
'-DFLUTTER_WEB_USE_SKWASM=true',
987+
],
988+
if (renderer == WebRendererMode.canvaskit) ...<String>[
989+
'-DFLUTTER_WEB_AUTO_DETECT=false',
990+
'-DFLUTTER_WEB_USE_SKIA=true',
991+
],
992+
'-DFLUTTER_WEB_CANVASKIT_URL=https://www.gstatic.com/flutter-canvaskit/abcdefghijklmnopqrstuvwxyz/',
993+
'--extra-compiler-option=--depfile=${depFile.absolute.path}',
994+
'-O$level',
995+
if (strip && buildMode == 'release') '--strip-wasm' else '--no-strip-wasm',
996+
if (!sourceMaps) '--extra-compiler-option=--no-source-maps',
997+
'-o',
998+
environment.buildDir.childFile('main.dart.wasm').absolute.path,
999+
environment.buildDir.childFile('main.dart').absolute.path,
9791000
],
980-
'-Ddart.vm.${buildMode == 'release' ? 'product' : 'profile' }=true',
981-
...defines.map((String define) => '-D$define'),
982-
if (renderer == WebRendererMode.skwasm) ...<String>[
983-
'-DFLUTTER_WEB_AUTO_DETECT=false',
984-
'-DFLUTTER_WEB_USE_SKIA=false',
985-
'-DFLUTTER_WEB_USE_SKWASM=true',
986-
],
987-
if (renderer == WebRendererMode.canvaskit) ...<String>[
988-
'-DFLUTTER_WEB_AUTO_DETECT=false',
989-
'-DFLUTTER_WEB_USE_SKIA=true',
990-
],
991-
'-DFLUTTER_WEB_CANVASKIT_URL=https://www.gstatic.com/flutter-canvaskit/abcdefghijklmnopqrstuvwxyz/',
992-
'--extra-compiler-option=--depfile=${depFile.absolute.path}',
993-
'-O$level',
994-
if (strip && buildMode == 'release') '--strip-wasm' else '--no-strip-wasm',
995-
'-o',
996-
environment.buildDir.childFile('main.dart.wasm').absolute.path,
997-
environment.buildDir.childFile('main.dart').absolute.path,
998-
],
999-
onRun: (_) => outputJsFile..createSync()..writeAsStringSync('foo'))
1000-
);
1001-
1002-
await Dart2WasmTarget(
1003-
WasmCompilerConfig(
1004-
optimizationLevel: level,
1005-
stripWasm: strip,
1006-
renderer: renderer,
1007-
)
1008-
).build(environment);
1009-
1010-
expect(outputJsFile.existsSync(), isTrue);
1011-
}, overrides: <Type, Generator>{
1012-
ProcessManager: () => processManager,
1013-
}));
1014-
}
1001+
onRun: (_) => outputJsFile..createSync()..writeAsStringSync('foo'))
1002+
);
1003+
1004+
await Dart2WasmTarget(
1005+
WasmCompilerConfig(
1006+
optimizationLevel: level,
1007+
stripWasm: strip,
1008+
renderer: renderer,
1009+
sourceMaps: sourceMaps,
1010+
)
1011+
).build(environment);
1012+
1013+
expect(outputJsFile.existsSync(), isTrue);
1014+
}, overrides: <Type, Generator>{
1015+
ProcessManager: () => processManager,
1016+
}));
1017+
}
1018+
}
10151019
}
10161020
}
10171021
}

0 commit comments

Comments
 (0)