zig
zig copied to clipboard
zig build: FileNotFound when lib.ofmt = .c
Zig Version
0.11.0-dev.12+ebf9ffd34
Steps to Reproduce and Observed Behavior
In build.zig:
// ...
const lib = b.addStaticLibrary("scanner", "scanner.zig");
lib.ofmt = .c;
// ...
Then run zig build.
Output
error: FileNotFound
/home/hryx/bin/zig-git/lib/zig/std/os.zig:1741:23: 0x2cb3c8 in openatZ (build)
.NOENT => return error.FileNotFound,
^
/home/hryx/bin/zig-git/lib/zig/std/fs.zig:1175:13: 0x2b7b26 in openFileZ (build)
try os.openatZ(self.fd, sub_path, os_flags, 0);
^
/home/hryx/bin/zig-git/lib/zig/std/fs.zig:1102:9: 0x29be28 in openFile (build)
return self.openFileZ(&path_c, flags);
^
/home/hryx/bin/zig-git/lib/zig/std/fs.zig:2532:24: 0x30171a in updateFile (build)
var src_file = try source_dir.openFile(source_path, .{});
^
/home/hryx/bin/zig-git/lib/zig/std/build.zig:1089:29: 0x30b517 in updateFile (build)
const prev_status = try fs.Dir.updateFile(cwd, source_path, cwd, dest_path, .{});
^
/home/hryx/bin/zig-git/lib/zig/std/build.zig:3416:9: 0x2f5e74 in make (build)
try builder.updateFile(self.artifact.getOutputSource().getPath(builder), full_dest_path);
^
/home/hryx/bin/zig-git/lib/zig/std/build.zig:3648:9: 0x28b377 in make (build)
try self.makeFn(self);
^
/home/hryx/bin/zig-git/lib/zig/std/build.zig:509:9: 0x279114 in makeOneStep (build)
try s.make();
^
/home/hryx/bin/zig-git/lib/zig/std/build.zig:503:17: 0x279082 in makeOneStep (build)
return err;
^
/home/hryx/bin/zig-git/lib/zig/std/build.zig:464:13: 0x278de2 in make (build)
try self.makeOneStep(s);
^
/home/hryx/bin/zig-git/lib/zig/build_runner.zig:223:21: 0x27bd4a in main (build)
else => return err,
^
The generated C file is correctly placed, but zig.h is not.
Expected Behavior
No error trace, and zig.h is next to the generated C file
If I understand, it's trying to copy $PREFIX/lib/zig/include/zig.h to the output directory from the wrong location. Manually copying the file is a workaround.
Related: https://github.com/ziglang/zig/issues/12965 (duplicate?), https://github.com/ziglang/zig/pull/12968 (does not fix), https://github.com/ziglang/zig/issues/11643
Workaround: Edit your target, setting target.ofmt = .c; before calling setTarget. (Thanks to @jacobly0 for finding this workaround in #13389)
Can this be closed now that #13389 is merged, and lib.ofmt no longer exists?
After changing lib.ofmt = .c to lib.target.ofmt = .c and running zig build with the latest nightly, I don't get the error anymore. But zig.h is still not getting copied to the output dir. I could make a separate issue if you like, and if so, this can be closed.
It also should not set the executable bit on the .c file
But zig.h is still not getting copied to the output dir.
Covered by #13528