Right now, the --libc [file] command line argument isn't really well exposed in std.Build.Step.Compile:
|
libc_file: ?LazyPath = null, |
This implementation doesn't really give us the options to pass down ad-hoc compiled libcs like Foundation libc or newlib inside build.zig.
The fields available in a libc.txt file are these:
# The directory that contains `stdlib.h`.
# On POSIX-like systems, include directories be found with: `cc -E -Wp,-v -xc /dev/null`
include_dir=/nix/store/i58yz1rxjxpha40l17hgg7cz62jck9q3-glibc-2.38-77-dev/include
# The system-specific include directory. May be the same as `include_dir`.
# On Windows it's the directory that includes `vcruntime.h`.
# On POSIX it's the directory that includes `sys/errno.h`.
sys_include_dir=/nix/store/i58yz1rxjxpha40l17hgg7cz62jck9q3-glibc-2.38-77-dev/include
# The directory that contains `crt1.o` or `crt2.o`.
# On POSIX, can be found with `cc -print-file-name=crt1.o`.
# Not needed when targeting MacOS.
crt_dir=/nix/store/j0by58xwyc66f884x0q8rpzvgpwvjmf2-glibc-2.38-77/lib
# The directory that contains `vcruntime.lib`.
# Only needed when targeting MSVC on Windows.
msvc_lib_dir=
# The directory that contains `kernel32.lib`.
# Only needed when targeting MSVC on Windows.
kernel32_lib_dir=
# The directory that contains `crtbeginS.o` and `crtendS.o`
# Only needed when targeting Haiku.
gcc_dir=
These options could be exposed inside a struct std.Build.LibC:
pub const LibC = struct {
/// The directory that contains `stdlib.h`.
/// On POSIX-like systems, include directories be found with: `cc -E -Wp,-v -xc /dev/null`
include_dirs: []const LazyPath,
/// A list of additional object files or static libraries that might be linked with the final executable.
/// These objects are required when using custom libc files.
link_objects: []const LazyPath = &.{},
/// The system-specific include directory. May be the same as `include_dir`.
/// On Windows it's the directory that includes `vcruntime.h`.
/// On POSIX it's the directory that includes `sys/errno.h`.
sys_include_dirs: []const LazyPath = &.{},
/// The directory that contains `crt1.o` or `crt2.o`.
/// On POSIX, can be found with `cc -print-file-name=crt1.o`.
/// Not needed when targeting MacOS.
crt_dir: ?LazyPath = null,
/// The directory that contains `vcruntime.lib`.
/// Only needed when targeting MSVC on Windows.
msvc_lib_dir: ?LazyPath = null,
/// The directory that contains `kernel32.lib`.
/// Only needed when targeting MSVC on Windows.
kernel32_lib_dir: ?LazyPath = null,
/// The directory that contains `crtbeginS.o` and `crtendS.o`
/// Only needed when targeting Haiku.
gcc_dir: ?LazyPath = null,
};
which could be used like this then:
- libc_file: ?LazyPath = null,
+ libc: ?std.Build.LibC = null,
Pre-defined libc:
pub fn build(b: *std.Build) void {
// Emulate "--libc custom.txt":
const libc = b.parseLibCFile(p.path("custom.txt"));
const exe = b.addExecutable(.{
.libc = libc,
…
});
}
Custom libc:
pub fn build(b: *std.Build) void {
const foundation_libc = foundation_mod.artifact("foundation");
const libc = std.Build.LibC {
.include_dirs = &.{
foundation_libc.getEmittedIncludeTree(),
},
.link_objects = &.{
foundation_libc.getEmittedBin(),
},
};
const exe = b.addExecutable(.{
.libc = libc,
…
});
}
Right now, the
--libc [file]command line argument isn't really well exposed instd.Build.Step.Compile:zig/lib/std/Build/Step/Compile.zig
Line 87 in 4558996
This implementation doesn't really give us the options to pass down ad-hoc compiled libcs like Foundation libc or newlib inside build.zig.
The fields available in a
libc.txtfile are these:These options could be exposed inside a struct
std.Build.LibC:which could be used like this then:
Pre-defined libc:
Custom libc: