Skip to content

update zig env to respect ZIG_LIB_DIR and support wasi #24012

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 6 additions & 1 deletion src/main.zig
Original file line number Diff line number Diff line change
Expand Up @@ -351,7 +351,12 @@ fn mainArgs(gpa: Allocator, arena: Allocator, args: []const []const u8) !void {
} else if (mem.eql(u8, cmd, "env")) {
dev.check(.env_command);
verifyLibcxxCorrectlyLinked();
return @import("print_env.zig").cmdEnv(arena, cmd_args, io.getStdOut().writer());
return @import("print_env.zig").cmdEnv(
arena,
args,
if (native_os == .wasi) wasi_preopens,
io.getStdOut().writer(),
);
} else if (mem.eql(u8, cmd, "reduce")) {
return jitCmd(gpa, arena, cmd_args, .{
.cmd_name = "reduce",
Expand Down
45 changes: 33 additions & 12 deletions src/print_env.zig
Original file line number Diff line number Diff line change
@@ -1,22 +1,43 @@
const std = @import("std");
const builtin = @import("builtin");
const build_options = @import("build_options");
const introspect = @import("introspect.zig");
const Compilation = @import("Compilation.zig");
const Allocator = std.mem.Allocator;
const EnvVar = std.zig.EnvVar;
const fatal = std.process.fatal;

pub fn cmdEnv(arena: Allocator, args: []const []const u8, stdout: std.fs.File.Writer) !void {
_ = args;
const cwd_path = try introspect.getResolvedCwd(arena);
const self_exe_path = try std.fs.selfExePathAlloc(arena);

var zig_lib_directory = introspect.findZigLibDirFromSelfExe(arena, cwd_path, self_exe_path) catch |err| {
fatal("unable to find zig installation directory: {s}\n", .{@errorName(err)});
pub fn cmdEnv(
arena: Allocator,
args: []const []const u8,
wasi_preopens: switch (builtin.target.os.tag) {
.wasi => std.fs.wasi.Preopens,
else => void,
},
stdout: std.fs.File.Writer,
) !void {
const override_lib_dir: ?[]const u8 = try EnvVar.ZIG_LIB_DIR.get(arena);
const override_global_cache_dir: ?[]const u8 = try EnvVar.ZIG_GLOBAL_CACHE_DIR.get(arena);

const self_exe_path = switch (builtin.target.os.tag) {
.wasi => args[0],
else => std.fs.selfExePathAlloc(arena) catch |err| {
fatal("unable to find zig self exe path: {s}", .{@errorName(err)});
},
};
defer zig_lib_directory.handle.close();

const zig_std_dir = try std.fs.path.join(arena, &[_][]const u8{ zig_lib_directory.path.?, "std" });
var dirs: Compilation.Directories = .init(
arena,
override_lib_dir,
override_global_cache_dir,
.global,
if (builtin.target.os.tag == .wasi) wasi_preopens,
if (builtin.target.os.tag != .wasi) self_exe_path,
);
defer dirs.deinit();

const global_cache_dir = try introspect.resolveGlobalCacheDir(arena);
const zig_lib_dir = dirs.zig_lib.path orelse "";
const zig_std_dir = try dirs.zig_lib.join(arena, &.{"std"});
const global_cache_dir = dirs.global_cache.path orelse "";

const host = try std.zig.system.resolveTargetQuery(.{});
const triple = try host.zigTriple(arena);
Expand All @@ -32,7 +53,7 @@ pub fn cmdEnv(arena: Allocator, args: []const []const u8, stdout: std.fs.File.Wr
try jws.write(self_exe_path);

try jws.objectField("lib_dir");
try jws.write(zig_lib_directory.path.?);
try jws.write(zig_lib_dir);

try jws.objectField("std_dir");
try jws.write(zig_std_dir);
Expand Down
Loading