mirror of
https://github.com/ziglang/zig.git
synced 2024-11-27 07:32:44 +00:00
Merge pull request #12814 from ziglang/native-libc-integration
stage2: no condition on system libs to link native libc
This commit is contained in:
commit
349df40d14
@ -508,7 +508,7 @@ pub const ChildProcess = struct {
|
||||
// it, that's the error code returned by the child process.
|
||||
_ = std.os.poll(&fd, 0) catch unreachable;
|
||||
|
||||
// According to eventfd(2) the descriptro is readable if the counter
|
||||
// According to eventfd(2) the descriptor is readable if the counter
|
||||
// has a value greater than 0
|
||||
if ((fd[0].revents & std.os.POLL.IN) != 0) {
|
||||
const err_int = try readIntFd(err_pipe[0]);
|
||||
|
@ -1238,7 +1238,6 @@ pub fn create(gpa: Allocator, options: InitOptions) !*Compilation {
|
||||
options.target,
|
||||
options.is_native_abi,
|
||||
link_libc,
|
||||
options.system_lib_names.len != 0 or options.frameworks.count() != 0,
|
||||
options.libc_installation,
|
||||
options.native_darwin_sdk != null,
|
||||
);
|
||||
@ -4522,7 +4521,6 @@ fn detectLibCIncludeDirs(
|
||||
target: Target,
|
||||
is_native_abi: bool,
|
||||
link_libc: bool,
|
||||
link_system_libs: bool,
|
||||
libc_installation: ?*const LibCInstallation,
|
||||
has_macos_sdk: bool,
|
||||
) !LibCDirs {
|
||||
@ -4539,7 +4537,7 @@ fn detectLibCIncludeDirs(
|
||||
|
||||
// If linking system libraries and targeting the native abi, default to
|
||||
// using the system libc installation.
|
||||
if (link_system_libs and is_native_abi and !target.isMinGW()) {
|
||||
if (is_native_abi and !target.isMinGW()) {
|
||||
if (target.isDarwin()) {
|
||||
return if (has_macos_sdk)
|
||||
// For Darwin/macOS, we are all set with getDarwinSDK found earlier.
|
||||
@ -4551,13 +4549,93 @@ fn detectLibCIncludeDirs(
|
||||
getZigShippedLibCIncludeDirsDarwin(arena, zig_lib_dir, target);
|
||||
}
|
||||
const libc = try arena.create(LibCInstallation);
|
||||
libc.* = try LibCInstallation.findNative(.{ .allocator = arena, .verbose = true });
|
||||
libc.* = LibCInstallation.findNative(.{ .allocator = arena }) catch |err| switch (err) {
|
||||
error.CCompilerExitCode,
|
||||
error.CCompilerCrashed,
|
||||
error.CCompilerCannotFindHeaders,
|
||||
error.UnableToSpawnCCompiler,
|
||||
=> |e| {
|
||||
// We tried to integrate with the native system C compiler,
|
||||
// however, it is not installed. So we must rely on our bundled
|
||||
// libc files.
|
||||
if (target_util.canBuildLibC(target)) {
|
||||
return detectLibCFromBuilding(arena, zig_lib_dir, target, has_macos_sdk);
|
||||
}
|
||||
return e;
|
||||
},
|
||||
else => |e| return e,
|
||||
};
|
||||
return detectLibCFromLibCInstallation(arena, target, libc);
|
||||
}
|
||||
|
||||
// If not linking system libraries, build and provide our own libc by
|
||||
// default if possible.
|
||||
if (target_util.canBuildLibC(target)) {
|
||||
return detectLibCFromBuilding(arena, zig_lib_dir, target, has_macos_sdk);
|
||||
}
|
||||
|
||||
// If zig can't build the libc for the target and we are targeting the
|
||||
// native abi, fall back to using the system libc installation.
|
||||
// On windows, instead of the native (mingw) abi, we want to check
|
||||
// for the MSVC abi as a fallback.
|
||||
const use_system_abi = if (builtin.target.os.tag == .windows)
|
||||
target.abi == .msvc
|
||||
else
|
||||
is_native_abi;
|
||||
|
||||
if (use_system_abi) {
|
||||
const libc = try arena.create(LibCInstallation);
|
||||
libc.* = try LibCInstallation.findNative(.{ .allocator = arena, .verbose = true });
|
||||
return detectLibCFromLibCInstallation(arena, target, libc);
|
||||
}
|
||||
|
||||
return LibCDirs{
|
||||
.libc_include_dir_list = &[0][]u8{},
|
||||
.libc_installation = null,
|
||||
};
|
||||
}
|
||||
|
||||
fn detectLibCFromLibCInstallation(arena: Allocator, target: Target, lci: *const LibCInstallation) !LibCDirs {
|
||||
var list = try std.ArrayList([]const u8).initCapacity(arena, 5);
|
||||
|
||||
list.appendAssumeCapacity(lci.include_dir.?);
|
||||
|
||||
const is_redundant = mem.eql(u8, lci.sys_include_dir.?, lci.include_dir.?);
|
||||
if (!is_redundant) list.appendAssumeCapacity(lci.sys_include_dir.?);
|
||||
|
||||
if (target.os.tag == .windows) {
|
||||
if (std.fs.path.dirname(lci.include_dir.?)) |include_dir_parent| {
|
||||
const um_dir = try std.fs.path.join(arena, &[_][]const u8{ include_dir_parent, "um" });
|
||||
list.appendAssumeCapacity(um_dir);
|
||||
|
||||
const shared_dir = try std.fs.path.join(arena, &[_][]const u8{ include_dir_parent, "shared" });
|
||||
list.appendAssumeCapacity(shared_dir);
|
||||
}
|
||||
}
|
||||
if (target.os.tag == .haiku) {
|
||||
const include_dir_path = lci.include_dir orelse return error.LibCInstallationNotAvailable;
|
||||
const os_dir = try std.fs.path.join(arena, &[_][]const u8{ include_dir_path, "os" });
|
||||
list.appendAssumeCapacity(os_dir);
|
||||
// Errors.h
|
||||
const os_support_dir = try std.fs.path.join(arena, &[_][]const u8{ include_dir_path, "os/support" });
|
||||
list.appendAssumeCapacity(os_support_dir);
|
||||
|
||||
const config_dir = try std.fs.path.join(arena, &[_][]const u8{ include_dir_path, "config" });
|
||||
list.appendAssumeCapacity(config_dir);
|
||||
}
|
||||
|
||||
return LibCDirs{
|
||||
.libc_include_dir_list = list.items,
|
||||
.libc_installation = lci,
|
||||
};
|
||||
}
|
||||
|
||||
fn detectLibCFromBuilding(
|
||||
arena: Allocator,
|
||||
zig_lib_dir: []const u8,
|
||||
target: std.Target,
|
||||
has_macos_sdk: bool,
|
||||
) !LibCDirs {
|
||||
switch (target.os.tag) {
|
||||
.macos => return if (has_macos_sdk)
|
||||
// For Darwin/macOS, we are all set with getDarwinSDK found earlier.
|
||||
@ -4621,62 +4699,6 @@ fn detectLibCIncludeDirs(
|
||||
}
|
||||
}
|
||||
|
||||
// If zig can't build the libc for the target and we are targeting the
|
||||
// native abi, fall back to using the system libc installation.
|
||||
// On windows, instead of the native (mingw) abi, we want to check
|
||||
// for the MSVC abi as a fallback.
|
||||
const use_system_abi = if (builtin.target.os.tag == .windows)
|
||||
target.abi == .msvc
|
||||
else
|
||||
is_native_abi;
|
||||
|
||||
if (use_system_abi) {
|
||||
const libc = try arena.create(LibCInstallation);
|
||||
libc.* = try LibCInstallation.findNative(.{ .allocator = arena, .verbose = true });
|
||||
return detectLibCFromLibCInstallation(arena, target, libc);
|
||||
}
|
||||
|
||||
return LibCDirs{
|
||||
.libc_include_dir_list = &[0][]u8{},
|
||||
.libc_installation = null,
|
||||
};
|
||||
}
|
||||
|
||||
fn detectLibCFromLibCInstallation(arena: Allocator, target: Target, lci: *const LibCInstallation) !LibCDirs {
|
||||
var list = try std.ArrayList([]const u8).initCapacity(arena, 5);
|
||||
|
||||
list.appendAssumeCapacity(lci.include_dir.?);
|
||||
|
||||
const is_redundant = mem.eql(u8, lci.sys_include_dir.?, lci.include_dir.?);
|
||||
if (!is_redundant) list.appendAssumeCapacity(lci.sys_include_dir.?);
|
||||
|
||||
if (target.os.tag == .windows) {
|
||||
if (std.fs.path.dirname(lci.include_dir.?)) |include_dir_parent| {
|
||||
const um_dir = try std.fs.path.join(arena, &[_][]const u8{ include_dir_parent, "um" });
|
||||
list.appendAssumeCapacity(um_dir);
|
||||
|
||||
const shared_dir = try std.fs.path.join(arena, &[_][]const u8{ include_dir_parent, "shared" });
|
||||
list.appendAssumeCapacity(shared_dir);
|
||||
}
|
||||
}
|
||||
if (target.os.tag == .haiku) {
|
||||
const include_dir_path = lci.include_dir orelse return error.LibCInstallationNotAvailable;
|
||||
const os_dir = try std.fs.path.join(arena, &[_][]const u8{ include_dir_path, "os" });
|
||||
list.appendAssumeCapacity(os_dir);
|
||||
// Errors.h
|
||||
const os_support_dir = try std.fs.path.join(arena, &[_][]const u8{ include_dir_path, "os/support" });
|
||||
list.appendAssumeCapacity(os_support_dir);
|
||||
|
||||
const config_dir = try std.fs.path.join(arena, &[_][]const u8{ include_dir_path, "config" });
|
||||
list.appendAssumeCapacity(config_dir);
|
||||
}
|
||||
|
||||
return LibCDirs{
|
||||
.libc_include_dir_list = list.items,
|
||||
.libc_installation = lci,
|
||||
};
|
||||
}
|
||||
|
||||
pub fn get_libc_crt_file(comp: *Compilation, arena: Allocator, basename: []const u8) ![]const u8 {
|
||||
if (comp.wantBuildGLibCFromSource() or
|
||||
comp.wantBuildMuslFromSource() or
|
||||
|
@ -719,17 +719,16 @@ pub fn buildSharedObjects(comp: *Compilation) !void {
|
||||
.lt => continue,
|
||||
.gt => {
|
||||
// TODO Expose via compile error mechanism instead of log.
|
||||
log.err("invalid target glibc version: {}", .{target_version});
|
||||
log.warn("invalid target glibc version: {}", .{target_version});
|
||||
return error.InvalidTargetGLibCVersion;
|
||||
},
|
||||
}
|
||||
} else {
|
||||
} else blk: {
|
||||
const latest_index = metadata.all_versions.len - 1;
|
||||
// TODO Expose via compile error mechanism instead of log.
|
||||
log.err("zig does not yet provide glibc version {}, the max provided version is {}", .{
|
||||
log.warn("zig cannot build new glibc version {}; providing instead {}", .{
|
||||
target_version, metadata.all_versions[latest_index],
|
||||
});
|
||||
return error.InvalidTargetGLibCVersion;
|
||||
break :blk latest_index;
|
||||
};
|
||||
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user