build stage3: detect system libcxx

Detect system libcxx name with the CMake build system and convey that
information to build.zig via config.h so that the same system libcxx is
used for stage3.

This undoes the hacky search 901457d173 .

closes #17018
This commit is contained in:
Michael Dusan 2023-09-01 10:04:26 -04:00 committed by Jakub Konka
parent 1816bb4ab0
commit 3cf71580c4
3 changed files with 22 additions and 10 deletions

View File

@ -124,6 +124,13 @@ endif()
set(ZIG_PIE off CACHE BOOL "produce a position independent zig executable")
# Detect system libcxx name.
if ("c++" IN_LIST CMAKE_CXX_IMPLICIT_LINK_LIBRARIES)
set(ZIG_SYSTEM_LIBCXX "c++" CACHE STRING "system libcxx name for build.zig")
else()
set(ZIG_SYSTEM_LIBCXX "stdc++" CACHE STRING "system libcxx name for build.zig")
endif()
find_package(llvm 16)
find_package(clang 16)
find_package(lld 16)

View File

@ -632,16 +632,14 @@ fn addCmakeCfgOptionsToExe(
const lib_suffix = if (static) exe.target.staticLibSuffix()[1..] else exe.target.dynamicLibSuffix()[1..];
switch (exe.target.getOsTag()) {
.linux => {
// First we try to link against system libstdc++ or libc++.
// If that doesn't work, we fall to -lc++ and cross our fingers.
const found = for ([_][]const u8{ "stdc++", "c++" }) |name| {
addCxxKnownPath(b, cfg, exe, b.fmt("lib{s}.{s}", .{ name, lib_suffix }), "", need_cpp_includes) catch |err| switch (err) {
error.RequiredLibraryNotFound => continue,
else => |e| return e,
};
break true;
} else false;
if (!found) exe.linkLibCpp();
// First we try to link against the detected libcxx name. If that doesn't work, we fall
// back to -lc++ and cross our fingers.
addCxxKnownPath(b, cfg, exe, b.fmt("lib{s}.{s}", .{ cfg.system_libcxx, lib_suffix }), "", need_cpp_includes) catch |err| switch (err) {
error.RequiredLibraryNotFound => {
exe.linkLibCpp();
},
else => |e| return e,
};
exe.linkSystemLibrary("unwind");
},
.ios, .macos, .watchos, .tvos => {
@ -775,6 +773,7 @@ const CMakeConfig = struct {
llvm_include_dir: []const u8,
llvm_libraries: []const u8,
dia_guids_lib: []const u8,
system_libcxx: []const u8,
};
const max_config_h_bytes = 1 * 1024 * 1024;
@ -840,6 +839,7 @@ fn parseConfigH(b: *std.Build, config_h_text: []const u8) ?CMakeConfig {
.llvm_include_dir = undefined,
.llvm_libraries = undefined,
.dia_guids_lib = undefined,
.system_libcxx = undefined,
};
const mappings = [_]struct { prefix: []const u8, field: []const u8 }{
@ -891,6 +891,10 @@ fn parseConfigH(b: *std.Build, config_h_text: []const u8) ?CMakeConfig {
.prefix = "#define ZIG_LLVM_LIB_PATH ",
.field = "llvm_lib_dir",
},
.{
.prefix = "#define ZIG_SYSTEM_LIBCXX",
.field = "system_libcxx",
},
// .prefix = ZIG_LLVM_LINK_MODE parsed manually below
};

View File

@ -28,5 +28,6 @@
#define ZIG_LLVM_LIBRARIES "@LLVM_LIBRARIES@"
#define ZIG_LLVM_LIB_PATH "@LLVM_LIBDIRS@"
#define ZIG_LLVM_LINK_MODE "@LLVM_LINK_MODE@"
#define ZIG_SYSTEM_LIBCXX "@ZIG_SYSTEM_LIBCXX@"
#endif