authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2024-03-06 22:26:17-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2024-03-10 17:51:07-07:00
log261094ca857d27e1d4df9ca087b2a50868cd54e8
tree1eb275b762d887be10c60c9398bfc1aa3dd9df90
parent3efdfe612ec7aaf252f6391b4d29bbf46118eced

-femit-docs: create main.wasm artifact


1 files changed, 139 insertions(+), 11 deletions(-)

src/Compilation.zig+139-11
......@@ -734,6 +734,7 @@ pub const MiscTask = enum {
734734 zig_libc,
735735 analyze_mod,
736736 docs_copy,
737 docs_wasm,
737738
738739 @"musl crti.o",
739740 @"musl crtn.o",
......@@ -3322,6 +3323,9 @@ pub fn performAllTheWork(
33223323 var zir_prog_node = main_progress_node.start("AST Lowering", 0);
33233324 defer zir_prog_node.end();
33243325
3326 var wasm_prog_node = main_progress_node.start("Compile Autodocs", 0);
3327 defer wasm_prog_node.end();
3328
33253329 var c_obj_prog_node = main_progress_node.start("Compile C Objects", comp.c_source_files.len);
33263330 defer c_obj_prog_node.end();
33273331
......@@ -3334,7 +3338,7 @@ pub fn performAllTheWork(
33343338 if (!build_options.only_c and !build_options.only_core_functionality) {
33353339 if (comp.docs_emit != null) {
33363340 try taskDocsCopy(comp, &comp.work_queue_wait_group);
3337 try taskDocsWasm(comp, &comp.work_queue_wait_group);
3341 comp.work_queue_wait_group.spawnManager(workerDocsWasm, .{ comp, &wasm_prog_node });
33383342 }
33393343 }
33403344
......@@ -3758,12 +3762,6 @@ fn taskDocsCopy(comp: *Compilation, wg: *WaitGroup) !void {
37583762 try comp.thread_pool.spawn(workerDocsCopy, .{ comp, wg });
37593763}
37603764
3761fn taskDocsWasm(comp: *Compilation, wg: *WaitGroup) !void {
3762 wg.start();
3763 errdefer wg.finish();
3764 try comp.thread_pool.spawn(workerDocsWasm, .{ comp, wg });
3765}
3766
37673765fn workerDocsCopy(comp: *Compilation, wg: *WaitGroup) void {
37683766 defer wg.finish();
37693767 docsCopyFallible(comp) catch |err| {
......@@ -3869,11 +3867,141 @@ fn docsCopyFallible(comp: *Compilation) anyerror!void {
38693867 }
38703868}
38713869
3872fn workerDocsWasm(comp: *Compilation, wg: *WaitGroup) void {
3873 defer wg.finish();
3870fn workerDocsWasm(comp: *Compilation, prog_node: *std.Progress.Node) void {
3871 workerDocsWasmFallible(comp, prog_node) catch |err| {
3872 comp.lockAndSetMiscFailure(.docs_wasm, "unable to build autodocs: {s}", .{
3873 @errorName(err),
3874 });
3875 };
3876}
3877
3878fn workerDocsWasmFallible(comp: *Compilation, prog_node: *std.Progress.Node) anyerror!void {
3879 const gpa = comp.gpa;
3880
3881 var arena_allocator = std.heap.ArenaAllocator.init(gpa);
3882 defer arena_allocator.deinit();
3883 const arena = arena_allocator.allocator();
3884
3885 const optimize_mode = std.builtin.OptimizeMode.ReleaseSmall;
3886 const output_mode = std.builtin.OutputMode.Exe;
3887 const resolved_target: Package.Module.ResolvedTarget = .{
3888 .result = std.zig.system.resolveTargetQuery(.{
3889 .cpu_arch = .wasm32,
3890 .os_tag = .freestanding,
3891 .cpu_features_add = std.Target.wasm.featureSet(&.{
3892 .atomics,
3893 .bulk_memory,
3894 // .extended_const, not supported by Safari
3895 .multivalue,
3896 .mutable_globals,
3897 .nontrapping_fptoint,
3898 .reference_types,
3899 //.relaxed_simd, not supported by Firefox or Safari
3900 .sign_ext,
3901 // observed to cause Error occured during wast conversion :
3902 // Unknown operator: 0xfd058 in Firefox 117
3903 //.simd128,
3904 // .tail_call, not supported by Safari
3905 }),
3906 }) catch unreachable,
3907
3908 .is_native_os = false,
3909 .is_native_abi = false,
3910 };
3911
3912 const config = try Config.resolve(.{
3913 .output_mode = output_mode,
3914 .resolved_target = resolved_target,
3915 .is_test = false,
3916 .have_zcu = true,
3917 .emit_bin = true,
3918 .root_optimize_mode = optimize_mode,
3919 .link_libc = false,
3920 .rdynamic = true,
3921 });
3922
3923 const src_basename = "main.zig";
3924 const root_name = std.fs.path.stem(src_basename);
3925
3926 const root_mod = try Package.Module.create(arena, .{
3927 .global_cache_directory = comp.global_cache_directory,
3928 .paths = .{
3929 .root = .{
3930 .root_dir = comp.zig_lib_directory,
3931 .sub_path = "docs/wasm",
3932 },
3933 .root_src_path = src_basename,
3934 },
3935 .fully_qualified_name = root_name,
3936 .inherited = .{
3937 .resolved_target = resolved_target,
3938 .optimize_mode = optimize_mode,
3939 },
3940 .global = config,
3941 .cc_argv = &.{},
3942 .parent = null,
3943 .builtin_mod = null,
3944 });
3945 const bin_basename = try std.zig.binNameAlloc(arena, .{
3946 .root_name = root_name,
3947 .target = resolved_target.result,
3948 .output_mode = output_mode,
3949 });
3950
3951 const sub_compilation = try Compilation.create(gpa, arena, .{
3952 .global_cache_directory = comp.global_cache_directory,
3953 .local_cache_directory = comp.global_cache_directory,
3954 .zig_lib_directory = comp.zig_lib_directory,
3955 .self_exe_path = comp.self_exe_path,
3956 .config = config,
3957 .root_mod = root_mod,
3958 .entry = .disabled,
3959 .cache_mode = .whole,
3960 .root_name = root_name,
3961 .thread_pool = comp.thread_pool,
3962 .libc_installation = comp.libc_installation,
3963 .emit_bin = .{
3964 .directory = null, // Put it in the cache directory.
3965 .basename = bin_basename,
3966 },
3967 .verbose_cc = comp.verbose_cc,
3968 .verbose_link = comp.verbose_link,
3969 .verbose_air = comp.verbose_air,
3970 .verbose_intern_pool = comp.verbose_intern_pool,
3971 .verbose_generic_instances = comp.verbose_intern_pool,
3972 .verbose_llvm_ir = comp.verbose_llvm_ir,
3973 .verbose_llvm_bc = comp.verbose_llvm_bc,
3974 .verbose_cimport = comp.verbose_cimport,
3975 .verbose_llvm_cpu_features = comp.verbose_llvm_cpu_features,
3976 });
3977 defer sub_compilation.destroy();
3978
3979 try comp.updateSubCompilation(sub_compilation, .docs_wasm, prog_node);
3980
3981 const emit = comp.docs_emit.?;
3982 var out_dir = emit.directory.handle.makeOpenPath(emit.sub_path, .{}) catch |err| {
3983 return comp.lockAndSetMiscFailure(
3984 .docs_copy,
3985 "unable to create output directory '{}{s}': {s}",
3986 .{ emit.directory, emit.sub_path, @errorName(err) },
3987 );
3988 };
3989 defer out_dir.close();
38743990
3875 _ = comp;
3876 log.err("TODO workerDocsWasm", .{});
3991 sub_compilation.local_cache_directory.handle.copyFile(
3992 sub_compilation.cache_use.whole.bin_sub_path.?,
3993 out_dir,
3994 "main.wasm",
3995 .{},
3996 ) catch |err| {
3997 return comp.lockAndSetMiscFailure(.docs_copy, "unable to copy '{}{s}' to '{}{s}': {s}", .{
3998 sub_compilation.local_cache_directory,
3999 sub_compilation.cache_use.whole.bin_sub_path.?,
4000 emit.directory,
4001 emit.sub_path,
4002 @errorName(err),
4003 });
4004 };
38774005}
38784006
38794007const AstGenSrc = union(enum) {