diff options
| author | Andrew Kelley <andrew@ziglang.org> | 2022-11-10 13:50:44 -0700 |
|---|---|---|
| committer | Andrew Kelley <andrew@ziglang.org> | 2022-12-06 12:15:04 -0700 |
| commit | d5312d53a066092ba9efd687e25b29a87eb6290c (patch) | |
| tree | b94a89b89f333cf381046982afe6a86c72c8122e /src/introspect.zig | |
| parent | 0a2fdfbdb934faae7fcf63e9b3ab760c00f47918 (diff) | |
| download | zig-d5312d53a066092ba9efd687e25b29a87eb6290c.tar.gz zig-d5312d53a066092ba9efd687e25b29a87eb6290c.zip | |
WASI: remove absolute path emulation from std lib
Instead of checking for absolute paths and current working directories
in various file system operations, there is one simple solution: allow
overriding `std.fs.cwd` on WASI.
os.realpath is back to causing a compile error when used on WASI. This
caused a compile error in the Sema handling of `@src()`. The compiler
should never call realpath, so the commit that made this change is
reverted (95ab942184427e7c9b840d71f4d093931e3e48fb). If this breaks
debug info, a different strategy is needed to solve it other than using
realpath.
I also removed the preopens code and replaced it with something much
simpler. There is no longer any global state in the standard library.
Additionally-
* os.openat no longer does an unnecessary fstat on WASI when O.WRONLY
is not provided.
* os.chdir is back to causing a compile error on WASI.
Diffstat (limited to 'src/introspect.zig')
| -rw-r--r-- | src/introspect.zig | 44 |
1 files changed, 5 insertions, 39 deletions
diff --git a/src/introspect.zig b/src/introspect.zig index 27925ab667..2eeae956ec 100644 --- a/src/introspect.zig +++ b/src/introspect.zig @@ -37,34 +37,7 @@ fn testZigInstallPrefix(base_dir: fs.Dir) ?Compilation.Directory { /// based on a hard-coded Preopen directory ("/zig") pub fn findZigExePath(allocator: mem.Allocator) ![]u8 { if (builtin.os.tag == .wasi) { - var args = try std.process.argsWithAllocator(allocator); - defer args.deinit(); - // On WASI, argv[0] is always just the basename of the current executable - const argv0 = args.next() orelse return error.FileNotFound; - - // Check these paths: - // 1. "/zig/{exe_name}" - // 2. "/zig/bin/{exe_name}" - const base_paths_to_check = &[_][]const u8{ "/zig", "/zig/bin" }; - const exe_names_to_check = &[_][]const u8{ fs.path.basename(argv0), "zig.wasm" }; - - for (base_paths_to_check) |base_path| { - for (exe_names_to_check) |exe_name| { - const test_path = fs.path.join(allocator, &.{ base_path, exe_name }) catch continue; - defer allocator.free(test_path); - - // Make sure it's a file we're pointing to - const file = os.fstatat(os.wasi.AT.FDCWD, test_path, 0) catch continue; - if (file.filetype != .REGULAR_FILE) continue; - - // Path seems to be valid, let's try to turn it into an absolute path - var real_path_buf: [fs.MAX_PATH_BYTES]u8 = undefined; - if (os.realpath(test_path, &real_path_buf)) |real_path| { - return allocator.dupe(u8, real_path); // Success: return absolute path - } else |_| continue; - } - } - return error.FileNotFound; + @compileError("this function is unsupported on WASI"); } return fs.selfExePathAlloc(allocator); @@ -107,6 +80,9 @@ pub fn findZigLibDirFromSelfExe( /// Caller owns returned memory. pub fn resolveGlobalCacheDir(allocator: mem.Allocator) ![]u8 { + if (builtin.os.tag == .wasi) { + @compileError("on WASI the global cache dir must be resolved with preopens"); + } if (std.process.getEnvVarOwned(allocator, "ZIG_GLOBAL_CACHE_DIR")) |value| { if (value.len > 0) { return value; @@ -125,17 +101,7 @@ pub fn resolveGlobalCacheDir(allocator: mem.Allocator) ![]u8 { } } - if (builtin.os.tag == .wasi) { - // On WASI, we have no way to get an App data dir, so we try to use a fixed - // Preopen path "/cache" as a last resort - const path = "/cache"; - - const file = os.fstatat(os.wasi.AT.FDCWD, path, 0) catch return error.CacheDirUnavailable; - if (file.filetype != .DIRECTORY) return error.CacheDirUnavailable; - return allocator.dupe(u8, path); - } else { - return fs.getAppDataDir(allocator, appname); - } + return fs.getAppDataDir(allocator, appname); } /// Similar to std.fs.path.resolve, with a few important differences: |
