11const std = @import ("std" );
2+ const zemscripten = @import ("zemscripten" );
23
3- fn emsdk (b : * std.Build , sub_path : []const u8 ) []const u8 {
4- return b .dependency ("emsdk" , .{}).path (sub_path ).getPath (b );
5- }
6-
7- fn activateEmsdk (b : * std.Build ) void {
8- const version = b .option ([]const u8 , "version" , "emsdk version to activate" ) orelse "4.0.15" ;
9-
10- const install = b .addSystemCommand (&.{ emsdk (b , "emsdk" ), "install" , version });
11- const activate = b .addSystemCommand (&.{ emsdk (b , "emsdk" ), "activate" , version });
12-
13- activate .step .dependOn (& install .step );
14-
15- const step = b .step ("activate" , "Activate emsdk" );
16- step .dependOn (& activate .step );
17- }
18-
19- pub fn build (b : * std.Build ) void {
20- activateEmsdk (b );
4+ pub fn build (b : * std.Build ) ! void {
5+ const activateEmsdk = zemscripten .activateEmsdkStep (b );
6+ const activate = b .step ("activate" , "Activate emsdk" );
7+ activate .dependOn (activateEmsdk );
218
229 const target = b .standardTargetOptions (.{
2310 .default_target = .{
@@ -42,38 +29,43 @@ pub fn build(b: *std.Build) void {
4229 lib .rdynamic = true ;
4330 lib .linkLibC ();
4431
45- const emcc = b .addSystemCommand (&.{
46- std .fs .path .join (b .allocator , &.{
47- emsdk (b , "upstream" ),
48- "emscripten" ,
49- "emcc" ,
50- }) catch unreachable ,
51- "-mtail-call" ,
52- "-pthread" ,
53- "-sPROXY_TO_PTHREAD" ,
54- "-sEXPORTED_FUNCTIONS=_malloc,_main" ,
55- "--js-library=node_modules/xterm-pty/emscripten-pty.js" ,
32+ var emcc_flags = zemscripten .emccDefaultFlags (b .allocator , .{
33+ .optimize = optimize ,
34+ .fsanitize = false ,
5635 });
57- const out_file = emcc .addPrefixedOutputFileArg ("-o" , "zorth.mjs" );
58- emcc .addArtifactArg (lib );
59-
60- const install = b .addInstallDirectory (.{
61- .source_dir = out_file .dirname (),
36+ try emcc_flags .put ("-mtail-call" , {});
37+ try emcc_flags .put ("-pthread" , {});
38+
39+ var emcc_settings : zemscripten.EmccSettings = .init (b .allocator );
40+ try emcc_settings .put ("PROXY_TO_PTHREAD" , "1" );
41+ try emcc_settings .put ("EXPORTED_FUNCTIONS" , "_malloc,_main" );
42+
43+ const emcc_step = zemscripten .emccStep (b , lib , .{
44+ .optimize = optimize ,
45+ .flags = emcc_flags ,
46+ .settings = emcc_settings ,
47+ .out_file_name = "zorth.mjs" ,
6248 .install_dir = .prefix ,
63- .install_subdir = "" ,
6449 });
65- install .step .dependOn (& emcc .step );
66-
67- const index = b .addInstallFile (b .path ("demo/index.html" ), "index.html" );
68- install .step .dependOn (& index .step );
69-
70- const service = b .addInstallFile (b .path ("node_modules/coi-serviceworker/coi-serviceworker.min.js" ), "coi-serviceworker.min.js" );
71- install .step .dependOn (& service .step );
72-
73- const bootstrap = b .addInstallFile (b .path ("jonesforth/jonesforth.f" ), "jonesforth.f" );
74- install .step .dependOn (& bootstrap .step );
7550
76- b .getInstallStep ().dependOn (& install .step );
51+ var emcc : * std.Build.Step.Run = @fieldParentPtr ("step" , emcc_step .dependencies .getLast ());
52+ const js_library_path = b .path ("node_modules/xterm-pty/emscripten-pty.js" );
53+ emcc .addArg ("--js-library" );
54+ emcc .addFileArg (js_library_path );
55+ emcc .addFileInput (js_library_path );
56+
57+ inline for (.{
58+ "demo/index.html" ,
59+ "node_modules/coi-serviceworker/coi-serviceworker.min.js" ,
60+ "jonesforth/jonesforth.f" ,
61+ }) | sub_path | {
62+ const file = b .addInstallFile (
63+ b .path (sub_path ),
64+ std .fs .path .basename (sub_path ),
65+ );
66+ emcc_step .dependOn (& file .step );
67+ }
68+ b .getInstallStep ().dependOn (emcc_step );
7769
7870 const test_step = b .step ("test" , "Run unit tests" );
7971
0 commit comments