Skip to content

Commit f7abffb

Browse files
committed
Port custom wasm build example
1 parent 9034ca1 commit f7abffb

File tree

5 files changed

+89
-42
lines changed

5 files changed

+89
-42
lines changed

sqlite3/build.yaml

Lines changed: 4 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,46 +1,15 @@
1-
21
targets:
3-
# This setup exists so that the main entrypoint (web/main.dart) gets compiled
4-
# with dartdevc for debug builds while the worker is compiled with dart2js
5-
# (since workers don't support the JS moduled emitted by dartdevc).
6-
# In release builds (`--release` on the CLI), both entrypoints are compiled
7-
# with dart2js.
8-
#
9-
# If you're ok with compiling everything with dart2js, just use
10-
# `compiler: dartj2s` on the options of the default target and ignore the two
11-
# additional targets here.
12-
dart2js_archives:
13-
auto_apply_builders: false
14-
dependencies: [":$default", ":worker"]
15-
builders:
16-
build_web_compilers:dart2js_archive_extractor:
17-
enabled: true
18-
worker:
19-
auto_apply_builders: false
20-
dependencies: [":$default"]
21-
builders:
22-
build_web_compilers:entrypoint:
23-
enabled: true
24-
generate_for:
25-
- example/web/worker.dart
26-
options:
27-
compiler: dart2js
28-
build_web_compilers:dart2js_archive_extractor:
29-
enabled: false
30-
312
$default:
323
sources:
334
include:
345
- lib/**
356
- example/web/**
7+
- $package$
368
builders:
379
build_web_compilers:entrypoint:
10+
options:
11+
compilers:
12+
dart2js:
3813
generate_for:
3914
include:
4015
- "example/web/**"
41-
# This one is compiled in the other target
42-
exclude:
43-
- "example/web/worker.dart"
44-
# We have a designated target for this step.
45-
build_web_compilers:dart2js_archive_extractor:
46-
enabled: false

sqlite3/example/custom_wasm_build/README.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -40,13 +40,13 @@ To download and compile sqlite3 as well as the patched `sqlite3_os_init` functio
4040
for this example, run
4141

4242
```
43-
WASI_SYSROOT=/path/to/wasi/ CC=/path/to/clang cargo build --target wasm32-wasi
43+
WASI_SYSROOT=/path/to/wasi/ CC=/path/to/clang cargo build --target wasm32-unknown-unknown
4444
```
4545

4646
Or, to compile a release build optimized for size:
4747

4848
```
49-
WASI_SYSROOT=/path/to/wasi/ CC=/path/to/clang cargo build --target wasm32-wasi --release
49+
WASI_SYSROOT=/path/to/wasi/ CC=/path/to/clang cargo build --target wasm32-unknown-unknown --release
5050
```
5151

5252
Cargo compiles sqlite3 to WASM object files, the Rust part is compiled into a static
@@ -55,8 +55,8 @@ A Dart script (`link.dart`) can be used to link them together into a `sqlite3.wa
5555
file loadable by the `sqlite3` package:
5656

5757
```
58-
CC=/path/to/clang dart run link.dart target/wasm32-wasi/debug
59-
CC=/path/to/clang dart run link.dart target/wasm32-wasi/release
58+
CC=/path/to/clang dart run link.dart target/wasm32-unknown-unknown/debug
59+
CC=/path/to/clang dart run link.dart target/wasm32-unknown-unknown/release
6060
```
6161

6262
As an additional transformation step, running `wasm-opt -O4` on the resulting

sqlite3/example/custom_wasm_build/build.rs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ fn main() {
66
let sysroot =
77
env::var("WASI_SYSROOT").unwrap_or_else(|_| "/usr/share/wasi-sysroot".to_string());
88

9-
let cmake_dir = Config::new("../../assets/wasm/")
9+
let cmake_dir = Config::new("../../../sqlite3_wasm_build/src/")
1010
.define("wasi_sysroot", &sysroot)
1111
.define("CMAKE_C_COMPILER_WORKS", "1")
1212
.build_target("sqlite3_opt_lib")
@@ -18,13 +18,16 @@ fn main() {
1818
let objects = c_build
1919
.target("wasm32-unknown-wasi")
2020
.cargo_warnings(false)
21+
.std("c23")
2122
.flag("--sysroot")
2223
.flag(&sysroot)
2324
.file(sqlite3_src.join("sqlite3.c"))
24-
.file("../../assets/wasm/helpers.c")
25+
.file("../../../sqlite3_wasm_build/src/helpers.c")
2526
.flag("-flto=thin")
2627
.include(&sqlite3_src)
27-
.include("../../assets/wasm/")
28+
.include("../../../sqlite3_wasm_build/src/")
29+
.define("SQLITE_ENABLE_SESSION", None)
30+
.define("SQLITE_ENABLE_PREUPDATE_HOOK", None)
2831
.define("_HAVE_SQLITE_CONFIG_H", None)
2932
.define("SQLITE_API", "__attribute__((visibility(\"default\")))")
3033
// Ideally we should be able to compile this into a static library and use that one, but

sqlite3/pubspec.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,3 +52,4 @@ dev_dependencies:
5252
test_descriptor: ^2.0.0
5353
pub_semver: ^2.1.5
5454
convert: ^3.1.2
55+
package_config: ^2.2.0
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
import 'dart:io';
2+
import 'dart:isolate';
3+
4+
import 'package:build_daemon/client.dart';
5+
import 'package:build_daemon/constants.dart';
6+
import 'package:build_daemon/data/build_status.dart';
7+
import 'package:build_daemon/data/build_target.dart';
8+
import 'package:collection/collection.dart';
9+
import 'package:package_config/package_config.dart';
10+
import 'package:path/path.dart' as p;
11+
import 'package:shelf/shelf_io.dart';
12+
import 'package:shelf_proxy/shelf_proxy.dart';
13+
14+
/// Serves example/web under localhost.
15+
void main() async {
16+
await TestAssetServer.start();
17+
print('Serving on http://localhost:8080/');
18+
}
19+
20+
class TestAssetServer {
21+
final BuildDaemonClient buildRunner;
22+
late final HttpServer server;
23+
24+
TestAssetServer(this.buildRunner);
25+
26+
Future<void> close() async {
27+
await server.close(force: true);
28+
await buildRunner.close();
29+
}
30+
31+
static Future<TestAssetServer> start() async {
32+
final packageConfig = await loadPackageConfigUri(
33+
(await Isolate.packageConfig)!,
34+
);
35+
final ownPackage = packageConfig['sqlite3']!.root;
36+
var packageDir = ownPackage.toFilePath(windows: Platform.isWindows);
37+
if (packageDir.endsWith('/')) {
38+
packageDir = packageDir.substring(0, packageDir.length - 1);
39+
}
40+
41+
final buildRunner = await BuildDaemonClient.connect(packageDir, [
42+
Platform.executable, // dart
43+
'run',
44+
'build_runner',
45+
'daemon',
46+
], logHandler: (log) => print(log.message));
47+
48+
buildRunner
49+
..registerBuildTarget(DefaultBuildTarget((b) => b.target = 'example'))
50+
..startBuild();
51+
52+
// Wait for the build to complete, so that the server we return is ready to
53+
// go.
54+
await buildRunner.buildResults.firstWhere((b) {
55+
final buildResult = b.results.firstWhereOrNull(
56+
(r) => r.target == 'example',
57+
);
58+
return buildResult != null && buildResult.status != BuildStatus.started;
59+
});
60+
61+
final assetServerPortFile = File(
62+
p.join(daemonWorkspace(packageDir), '.asset_server_port'),
63+
);
64+
final assetServerPort = int.parse(await assetServerPortFile.readAsString());
65+
66+
final server = TestAssetServer(buildRunner);
67+
68+
final proxy = proxyHandler(
69+
'http://localhost:$assetServerPort/example/web/',
70+
);
71+
server.server = await serve(proxy, 'localhost', 8080);
72+
return server;
73+
}
74+
}

0 commit comments

Comments
 (0)