Skip to content

Commit 00ceed3

Browse files
authored
Adding custom sdk build options to support flutter embeddings and plugins.
These allow Jaspr to support flutter embedding and flutter plugins without needing to maintain a custom fork of this package (jaspr_web_compilers). No custom logic is needed beyond configuration options. See #4299
1 parent 9b94a5a commit 00ceed3

15 files changed

+391
-44
lines changed

build_web_compilers/CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
## 4.4.6
2+
3+
- Add build options to customize the SDK used for compiling to js and wasm.
4+
15
## 4.4.5
26

37
- Updating DDC's bootstrapper to be consistent with the rest of the ecosystem.

build_web_compilers/README.md

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,33 @@ targets:
164164

165165
In this case, you need to use another builder or a predefined loader instead.
166166

167+
### Advanced SDK Customization
168+
169+
The following options allow you to customize the Dart SDK used for compiling to
170+
js and wasm. They are intended for advanced use cases and should be used with
171+
caution.
172+
173+
<details>
174+
<summary>Expand to see configuration options.</summary>
175+
176+
```yaml
177+
global_options:
178+
build_web_compilers:ddc:
179+
options:
180+
use-ui-libraries: false
181+
platform-sdk: /path/to/platform_sdk/
182+
ddc-kernel-path: relative/path/to/kernel_summary
183+
libraries-path: /path/to/libraries.json
184+
build_web_compilers:entrypoint:
185+
options:
186+
use-ui-libraries: false
187+
libraries-path: /path/to/libraries.json
188+
build_web_compilers:sdk_js:
189+
options:
190+
use-prebuilt-sdk-from-path: /path/to/prebuilt/sdk_js/
191+
```
192+
</details>
193+
167194
### Configuring -D environment variables
168195

169196
dartdevc is a modular compiler, so in order to ensure consistent builds

build_web_compilers/lib/build_web_compilers.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,6 @@ export 'src/common.dart'
1313
symbolsExtension;
1414
export 'src/dev_compiler_builder.dart' show DevCompilerBuilder;
1515
export 'src/platforms.dart'
16-
show dart2jsPlatform, dart2wasmPlatform, ddcPlatform;
16+
show dart2jsPlatform, dart2wasmPlatform, ddcPlatform, initializePlatforms;
1717
export 'src/web_entrypoint_builder.dart'
1818
show WebCompiler, WebEntrypointBuilder, ddcBootstrapExtension;

build_web_compilers/lib/builders.dart

Lines changed: 94 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,13 @@ import 'src/web_entrypoint_marker_builder.dart';
1515

1616
// Shared entrypoint builder
1717
Builder webEntrypointBuilder(BuilderOptions options) {
18+
_ensureSamePlatformOptions(options);
1819
_ensureSameDdcHotReloadOptions(options);
1920
return WebEntrypointBuilder.fromOptions(options);
2021
}
2122

2223
Builder webEntrypointMarkerBuilder(BuilderOptions options) {
24+
_ensureSamePlatformOptions(options);
2325
_ensureSameDdcHotReloadOptions(options);
2426
return WebEntrypointMarkerBuilder(
2527
usesWebHotReload: _readWebHotReloadOption(options),
@@ -28,16 +30,19 @@ Builder webEntrypointMarkerBuilder(BuilderOptions options) {
2830

2931
// DDC related builders
3032
Builder ddcMetaModuleBuilder(BuilderOptions options) {
33+
_ensureSamePlatformOptions(options);
3134
_ensureSameDdcHotReloadOptions(options);
3235
return MetaModuleBuilder.forOptions(ddcPlatform, options);
3336
}
3437

3538
Builder ddcMetaModuleCleanBuilder(BuilderOptions options) {
39+
_ensureSamePlatformOptions(options);
3640
_ensureSameDdcHotReloadOptions(options);
3741
return MetaModuleCleanBuilder(ddcPlatform);
3842
}
3943

4044
Builder ddcModuleBuilder(BuilderOptions options) {
45+
_ensureSamePlatformOptions(options);
4146
_ensureSameDdcHotReloadOptions(options);
4247
return ModuleBuilder(
4348
ddcPlatform,
@@ -47,6 +52,7 @@ Builder ddcModuleBuilder(BuilderOptions options) {
4752

4853
Builder ddcBuilder(BuilderOptions options) {
4954
validateOptions(options.config, _supportedOptions, 'build_web_compilers:ddc');
55+
_ensureSamePlatformOptions(options);
5056
_ensureSameDdcHotReloadOptions(options);
5157
_ensureSameDdcOptions(options);
5258

@@ -60,9 +66,11 @@ Builder ddcBuilder(BuilderOptions options) {
6066
emitDebugSymbols: _readEmitDebugSymbolsOption(options),
6167
canaryFeatures: _readCanaryOption(options),
6268
ddcModules: _readWebHotReloadOption(options),
63-
sdkKernelPath: sdkDdcKernelPath,
6469
trackUnusedInputs: _readTrackInputsCompilerOption(options),
6570
platform: ddcPlatform,
71+
sdkKernelPath: _readDdcKernelPathOption(options),
72+
librariesPath: _readLibrariesPathOption(options),
73+
platformSdk: _readPlatformSdkOption(options),
6674
environment: _readEnvironmentOption(options),
6775
);
6876
}
@@ -71,16 +79,19 @@ final ddcKernelExtension = '.ddc.dill';
7179

7280
Builder ddcKernelBuilder(BuilderOptions options) {
7381
validateOptions(options.config, _supportedOptions, 'build_web_compilers:ddc');
82+
_ensureSamePlatformOptions(options);
7483
_ensureSameDdcHotReloadOptions(options);
7584
_ensureSameDdcOptions(options);
7685

7786
return KernelBuilder(
7887
summaryOnly: true,
79-
sdkKernelPath: sdkDdcKernelPath,
88+
sdkKernelPath: _readDdcKernelPathOption(options),
8089
outputExtension: ddcKernelExtension,
8190
platform: ddcPlatform,
91+
librariesPath: _readLibrariesPathOption(options),
8292
useIncrementalCompiler: _readUseIncrementalCompilerOption(options),
8393
trackUnusedInputs: _readTrackInputsCompilerOption(options),
94+
platformSdk: _readPlatformSdkOption(options),
8495
);
8596
}
8697

@@ -93,26 +104,44 @@ Builder sdkJsCompile(BuilderOptions options) {
93104
canaryFeatures:
94105
_readWebHotReloadOption(options) || _readCanaryOption(options),
95106
usesWebHotReload: _readWebHotReloadOption(options),
107+
usePrebuiltSdkFromPath: _readUsePrebuiltSdkFromPathOption(options),
96108
);
97109
}
98110

99111
// Dart2js related builders
100-
Builder dart2jsMetaModuleBuilder(BuilderOptions options) =>
101-
MetaModuleBuilder.forOptions(dart2jsPlatform, options);
102-
Builder dart2jsMetaModuleCleanBuilder(BuilderOptions _) =>
103-
MetaModuleCleanBuilder(dart2jsPlatform);
104-
Builder dart2jsModuleBuilder(BuilderOptions _) =>
105-
ModuleBuilder(dart2jsPlatform);
112+
Builder dart2jsMetaModuleBuilder(BuilderOptions options) {
113+
_ensureSamePlatformOptions(options);
114+
return MetaModuleBuilder.forOptions(dart2jsPlatform, options);
115+
}
116+
117+
Builder dart2jsMetaModuleCleanBuilder(BuilderOptions options) {
118+
_ensureSamePlatformOptions(options);
119+
return MetaModuleCleanBuilder(dart2jsPlatform);
120+
}
121+
122+
Builder dart2jsModuleBuilder(BuilderOptions options) {
123+
_ensureSamePlatformOptions(options);
124+
return ModuleBuilder(dart2jsPlatform);
125+
}
126+
106127
PostProcessBuilder dart2jsArchiveExtractor(BuilderOptions options) =>
107128
Dart2JsArchiveExtractor.fromOptions(options);
108129

109130
// Dart2wasm related builders
110-
Builder dart2wasmMetaModuleBuilder(BuilderOptions options) =>
111-
MetaModuleBuilder.forOptions(dart2wasmPlatform, options);
112-
Builder dart2wasmMetaModuleCleanBuilder(BuilderOptions _) =>
113-
MetaModuleCleanBuilder(dart2wasmPlatform);
114-
Builder dart2wasmModuleBuilder(BuilderOptions _) =>
115-
ModuleBuilder(dart2wasmPlatform);
131+
Builder dart2wasmMetaModuleBuilder(BuilderOptions options) {
132+
_ensureSamePlatformOptions(options);
133+
return MetaModuleBuilder.forOptions(dart2wasmPlatform, options);
134+
}
135+
136+
Builder dart2wasmMetaModuleCleanBuilder(BuilderOptions options) {
137+
_ensureSamePlatformOptions(options);
138+
return MetaModuleCleanBuilder(dart2wasmPlatform);
139+
}
140+
141+
Builder dart2wasmModuleBuilder(BuilderOptions options) {
142+
_ensureSamePlatformOptions(options);
143+
return ModuleBuilder(dart2wasmPlatform);
144+
}
116145

117146
// General purpose builders
118147
PostProcessBuilder dartSourceCleanup(BuilderOptions options) =>
@@ -170,6 +199,27 @@ void _ensureSameDdcHotReloadOptions(BuilderOptions options) {
170199
}
171200
}
172201

202+
void _ensureSamePlatformOptions(BuilderOptions options) {
203+
final useUiLibraries = _readUseUiLibrariesOption(options);
204+
if (_lastUseUiLibrariesValue == null) {
205+
initializePlatforms(useUiLibraries);
206+
_lastUseUiLibrariesValue = useUiLibraries;
207+
} else if (_lastUseUiLibrariesValue != useUiLibraries) {
208+
throw ArgumentError(
209+
'`use-ui-libraries` must be configured the same across the '
210+
'following builders: build_web_compilers:ddc, '
211+
'build_web_compilers|entrypoint, '
212+
'build_web_compilers|entrypoint_marker, '
213+
'build_web_compilers|ddc, '
214+
'build_web_compilers|ddc_modules, '
215+
'build_web_compilers|dart2js_modules, '
216+
'build_web_compilers|dart2wasm_modules.'
217+
'\n\nPlease use the `global_options` section in '
218+
'`build.yaml` or the `--define` flag to set global options.',
219+
);
220+
}
221+
}
222+
173223
bool _readUseIncrementalCompilerOption(BuilderOptions options) {
174224
return options.config[_useIncrementalCompilerOption] as bool? ?? true;
175225
}
@@ -194,20 +244,46 @@ bool _readWebHotReloadOption(BuilderOptions options) {
194244
return options.config[_webHotReloadOption] as bool? ?? false;
195245
}
196246

247+
bool _readUseUiLibrariesOption(BuilderOptions options) {
248+
return options.config[_useUiLibrariesOption] as bool? ?? false;
249+
}
250+
251+
String _readDdcKernelPathOption(BuilderOptions options) {
252+
return options.config[_ddcKernelPathOption] as String? ?? sdkDdcKernelPath;
253+
}
254+
255+
String? _readLibrariesPathOption(BuilderOptions options) {
256+
return options.config[_librariesPathOption] as String?;
257+
}
258+
259+
String? _readPlatformSdkOption(BuilderOptions options) {
260+
return options.config[_platformSdkOption] as String?;
261+
}
262+
263+
String? _readUsePrebuiltSdkFromPathOption(BuilderOptions options) {
264+
return options.config[_usePrebuiltSdkFromPathOption] as String?;
265+
}
266+
197267
Map<String, String> _readEnvironmentOption(BuilderOptions options) {
198268
final environment = options.config[_environmentOption] as Map? ?? const {};
199269
return environment.map((key, value) => MapEntry('$key', '$value'));
200270
}
201271

202272
Map<String, dynamic>? _previousDdcConfig;
203273
bool? _lastWebHotReloadValue;
274+
bool? _lastUseUiLibrariesValue;
204275
const _useIncrementalCompilerOption = 'use-incremental-compiler';
205276
const _generateFullDillOption = 'generate-full-dill';
206277
const _emitDebugSymbolsOption = 'emit-debug-symbols';
207278
const _canaryOption = 'canary';
208279
const _trackUnusedInputsCompilerOption = 'track-unused-inputs';
209280
const _environmentOption = 'environment';
210281
const _webHotReloadOption = 'web-hot-reload';
282+
const _useUiLibrariesOption = 'use-ui-libraries';
283+
const _ddcKernelPathOption = 'ddc-kernel-path';
284+
const _librariesPathOption = 'libraries-path';
285+
const _platformSdkOption = 'platform-sdk';
286+
const _usePrebuiltSdkFromPathOption = 'use-prebuilt-sdk-from-path';
211287

212288
const _supportedOptions = [
213289
_environmentOption,
@@ -217,4 +293,8 @@ const _supportedOptions = [
217293
_canaryOption,
218294
_trackUnusedInputsCompilerOption,
219295
_webHotReloadOption,
296+
_useUiLibrariesOption,
297+
_ddcKernelPathOption,
298+
_librariesPathOption,
299+
_platformSdkOption,
220300
];

build_web_compilers/lib/src/dart2js_bootstrap.dart

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,13 +28,17 @@ Future<void> bootstrapDart2Js(
2828
required bool? nativeNullAssertions,
2929
required bool onlyCompiler,
3030
String entrypointExtension = jsEntrypointExtension,
31+
String? librariesPath,
32+
bool unsafeAllowUnsupportedModules = false,
3133
}) => _resourcePool.withResource(
3234
() => _bootstrapDart2Js(
3335
buildStep,
3436
dart2JsArgs,
3537
nativeNullAssertions: nativeNullAssertions,
3638
onlyCompiler: onlyCompiler,
3739
entrypointExtension: entrypointExtension,
40+
librariesPath: librariesPath,
41+
unsafeAllowUnsupportedModules: unsafeAllowUnsupportedModules,
3842
),
3943
);
4044

@@ -44,6 +48,8 @@ Future<void> _bootstrapDart2Js(
4448
required bool? nativeNullAssertions,
4549
required bool onlyCompiler,
4650
required String entrypointExtension,
51+
String? librariesPath,
52+
bool unsafeAllowUnsupportedModules = false,
4753
}) async {
4854
final dartEntrypointId = buildStep.inputId;
4955
final moduleId = dartEntrypointId.changeExtension(
@@ -59,7 +65,7 @@ Future<void> _bootstrapDart2Js(
5965
try {
6066
allDeps = (await module.computeTransitiveDependencies(
6167
buildStep,
62-
throwIfUnsupported: true,
68+
throwIfUnsupported: !unsafeAllowUnsupportedModules,
6369
))..add(module);
6470
} on UnsupportedModules catch (e) {
6571
final librariesString = (await e.exactLibraries(buildStep).toList())
@@ -97,7 +103,8 @@ $librariesString
97103
: dartUri.path.substring(1),
98104
) +
99105
entrypointExtension;
100-
final librariesSpec = p.joinAll([sdkDir, 'lib', 'libraries.json']);
106+
final librariesSpec =
107+
librariesPath ?? p.joinAll([sdkDir, 'lib', 'libraries.json']);
101108
_validateUserArgs(dart2JsArgs);
102109
args =
103110
dart2JsArgs.toList()..addAll([

build_web_compilers/lib/src/dart2wasm_bootstrap.dart

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -45,22 +45,25 @@ final class Dart2WasmBootstrapResult {
4545
Future<Dart2WasmBootstrapResult> bootstrapDart2Wasm(
4646
BuildStep buildStep,
4747
List<String> additionalArguments,
48-
String javaScriptModuleExtension,
49-
) async {
48+
String javaScriptModuleExtension, {
49+
bool unsafeAllowUnsupportedModules = false,
50+
}) async {
5051
return await _resourcePool.withResource(
5152
() => _bootstrapDart2Wasm(
5253
buildStep,
5354
additionalArguments,
5455
javaScriptModuleExtension,
56+
unsafeAllowUnsupportedModules: unsafeAllowUnsupportedModules,
5557
),
5658
);
5759
}
5860

5961
Future<Dart2WasmBootstrapResult> _bootstrapDart2Wasm(
6062
BuildStep buildStep,
6163
List<String> additionalArguments,
62-
String javaScriptModuleExtension,
63-
) async {
64+
String javaScriptModuleExtension, {
65+
bool unsafeAllowUnsupportedModules = false,
66+
}) async {
6467
final dartEntrypointId = buildStep.inputId;
6568
final moduleId = dartEntrypointId.changeExtension(
6669
moduleExtension(dart2wasmPlatform),
@@ -75,7 +78,7 @@ Future<Dart2WasmBootstrapResult> _bootstrapDart2Wasm(
7578
try {
7679
allDeps = (await module.computeTransitiveDependencies(
7780
buildStep,
78-
throwIfUnsupported: true,
81+
throwIfUnsupported: !unsafeAllowUnsupportedModules,
7982
))..add(module);
8083
} on UnsupportedModules catch (e) {
8184
final librariesString = (await e.exactLibraries(buildStep).toList())

build_web_compilers/lib/src/dev_compiler_bootstrap.dart

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,18 +33,19 @@ final stackTraceMapperPath =
3333
/// available to the app by making them inputs of this build action.
3434
Future<void> bootstrapDdc(
3535
BuildStep buildStep, {
36-
DartPlatform? platform,
3736
Iterable<AssetId> requiredAssets = const [],
3837
String entrypointExtension = jsEntrypointExtension,
3938
required bool? nativeNullAssertions,
4039
bool usesWebHotReload = false,
40+
bool unsafeAllowUnsupportedModules = false,
4141
}) async {
42-
platform = ddcPlatform;
4342
// Ensures that the sdk resources are built and available.
4443
await _ensureResources(buildStep, requiredAssets);
4544

4645
final dartEntrypointId = buildStep.inputId;
47-
final moduleId = buildStep.inputId.changeExtension(moduleExtension(platform));
46+
final moduleId = buildStep.inputId.changeExtension(
47+
moduleExtension(ddcPlatform),
48+
);
4849
final module = Module.fromJson(
4950
json.decode(await buildStep.readAsString(moduleId)) as Map<String, dynamic>,
5051
);
@@ -56,6 +57,7 @@ Future<void> bootstrapDdc(
5657
module,
5758
buildStep,
5859
computeStronglyConnectedComponents: !usesWebHotReload,
60+
throwIfUnsupported: !unsafeAllowUnsupportedModules,
5961
);
6062
} on UnsupportedModules catch (e) {
6163
final librariesString = (await e.exactLibraries(buildStep).toList())
@@ -251,11 +253,12 @@ Future<List<AssetId>> _ensureTransitiveJsModules(
251253
Module module,
252254
BuildStep buildStep, {
253255
bool computeStronglyConnectedComponents = true,
256+
bool throwIfUnsupported = true,
254257
}) async {
255258
// Collect all the modules this module depends on, plus this module.
256259
final transitiveDeps = await module.computeTransitiveDependencies(
257260
buildStep,
258-
throwIfUnsupported: true,
261+
throwIfUnsupported: throwIfUnsupported,
259262
computeStronglyConnectedComponents: computeStronglyConnectedComponents,
260263
);
261264

0 commit comments

Comments
 (0)