build: avoid MSVC C++ runtime in no-libcxx builds

AI-assisted: Codex
This commit is contained in:
Riccardo Mazzarini
2026-07-25 16:35:50 +02:00
committed by Mitchell Hashimoto
parent 1fe1b2d23c
commit 84254a9d8c
5 changed files with 41 additions and 7 deletions

View File

@@ -99,6 +99,13 @@ pub fn build(b: *std.Build) !void {
"-fmath-errno",
"-fno-exceptions",
});
} else if (target.result.abi == .msvc) {
try flags.appendSlice(b.allocator, &.{
// -fno-autolink also drops UCRT's /alternatename fallback.
"-D_Avx2WmemEnabledWeakValue=_Avx2WmemEnabled",
"-fno-autolink",
"-fno-stack-protector",
});
}
lib.root_module.addCSourceFiles(.{ .flags = flags.items, .files = &.{

View File

@@ -50,10 +50,16 @@ pub fn build(b: *std.Build) !void {
if (no_libcxx) {
try flags.append(b.allocator, "-DSIMDUTF_NO_LIBCXX");
if (target.result.abi != .msvc) {
// Clang/GCC-only flags; MSVC doesn't accept these.
try flags.append(b.allocator, "-fno-exceptions");
try flags.append(b.allocator, "-fno-rtti");
try flags.append(b.allocator, "-fno-exceptions");
try flags.append(b.allocator, "-fno-rtti");
if (target.result.abi == .msvc) {
try flags.appendSlice(b.allocator, &.{
"-D_USE_STD_VECTOR_ALGORITHMS=0",
// -fno-autolink also drops UCRT's /alternatename fallback.
"-D_Avx2WmemEnabledWeakValue=_Avx2WmemEnabled",
"-fno-autolink",
"-fno-stack-protector",
});
}
lib.root_module.addCMacro("SIMDUTF_NO_LIBCXX", "1");

View File

@@ -249,9 +249,14 @@ fn initLib(
lib.bundle_ubsan_rt = false;
if (kind == .static) {
// compiler_rt expects ntdll to provide _fltused when libc is
// linked, and the Zig standard library uses other NT and kernel32
// symbols.
if (target.result.abi == .msvc) {
// Zig's compiler runtime doesn't provide MSVC's security
// cookie symbols when libc is linked. Disable stack-protector
// generation so static consumers don't need BufferOverflowU.
lib.root_module.stack_protector = false;
}
// The Zig standard library uses NT and kernel32 symbols.
lib.root_module.linkSystemLibrary("ntdll", .{});
lib.root_module.linkSystemLibrary("kernel32", .{});
}

View File

@@ -991,6 +991,11 @@ pub fn addSimd(
"-fno-sanitize=undefined",
"-fno-sanitize-trap=undefined",
});
if (target.result.abi == .msvc) try flags.appendSlice(b.allocator, &.{
// -fno-autolink also drops UCRT's /alternatename fallback.
"-D_Avx2WmemEnabledWeakValue=_Avx2WmemEnabled",
"-fno-autolink",
});
m.addCSourceFiles(.{
.files = &.{

View File

@@ -12,6 +12,8 @@ const lib = @This();
const std = @import("std");
const builtin = @import("builtin");
var msvc_fltused: c_int = 1;
// The public API below reproduces a lot of terminal/main.zig but
// is separate because (1) we need our root file to be in `src/`
// so we can access other directories and (2) we may want to withhold
@@ -145,6 +147,15 @@ comptime {
// If we're building the C library (vs. the Zig module) then
// we want to reference the C API so that it gets exported.
if (@import("root") == lib) {
// MSVC requires this marker whenever floating-point code is present.
// Zig's compiler_rt only provides it when libc is not linked.
if (builtin.os.tag == .windows and
builtin.abi == .msvc and
builtin.link_mode == .static)
{
@export(&msvc_fltused, .{ .name = "_fltused" });
}
// Force-reference our memset override so its export is
// emitted. This must stay inside the root guard so that
// downstream Zig module consumers don't get the override