mirror of
https://github.com/ziglang/zig.git
synced 2026-01-20 22:35:24 +00:00
zig cc: improve linker args parsing
Handle linker args joined with a = like -Wl,-rpath=foo Update existing args --major-os-version, --minor-os-version, --major-subsystem-version and --minor-subsytem-version to work with the new parsing. Also handle -Wl,--script in addition to -Wl,-T
This commit is contained in:
parent
e18ef71d98
commit
6f0cfdb820
42
src/main.zig
42
src/main.zig
@ -1179,6 +1179,16 @@ fn buildOutputType(
|
||||
.wl => {
|
||||
var split_it = mem.split(it.only_arg, ",");
|
||||
while (split_it.next()) |linker_arg| {
|
||||
// Handle nested-joined args like `-Wl,-rpath=foo`.
|
||||
// Must be prefixed with 1 or 2 dashes.
|
||||
if (linker_arg.len >= 3 and linker_arg[0] == '-' and linker_arg[2] != '-') {
|
||||
if (mem.indexOfScalar(u8, linker_arg, '=')) |equals_pos| {
|
||||
try linker_args.append(linker_arg[0..equals_pos]);
|
||||
try linker_args.append(linker_arg[equals_pos + 1 ..]);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
try linker_args.append(linker_arg);
|
||||
}
|
||||
},
|
||||
@ -1394,7 +1404,7 @@ fn buildOutputType(
|
||||
image_base_override = std.fmt.parseUnsigned(u64, linker_args.items[i], 0) catch |err| {
|
||||
fatal("unable to parse '{s}': {s}", .{ arg, @errorName(err) });
|
||||
};
|
||||
} else if (mem.eql(u8, arg, "-T")) {
|
||||
} else if (mem.eql(u8, arg, "-T") or mem.eql(u8, arg, "--script")) {
|
||||
i += 1;
|
||||
if (i >= linker_args.items.len) {
|
||||
fatal("expected linker arg after '{s}'", .{arg});
|
||||
@ -1420,30 +1430,40 @@ fn buildOutputType(
|
||||
// We don't need to care about these because these args are
|
||||
// for resolving circular dependencies but our linker takes
|
||||
// care of this without explicit args.
|
||||
} else if (mem.startsWith(u8, arg, "--major-os-version") or
|
||||
mem.startsWith(u8, arg, "--minor-os-version"))
|
||||
} else if (mem.eql(u8, arg, "--major-os-version") or
|
||||
mem.eql(u8, arg, "--minor-os-version"))
|
||||
{
|
||||
i += 1;
|
||||
if (i >= linker_args.items.len) {
|
||||
fatal("expected linker arg after '{s}'", .{arg});
|
||||
}
|
||||
// This option does not do anything.
|
||||
} else if (mem.startsWith(u8, arg, "--major-subsystem-version=")) {
|
||||
} else if (mem.eql(u8, arg, "--major-subsystem-version")) {
|
||||
i += 1;
|
||||
if (i >= linker_args.items.len) {
|
||||
fatal("expected linker arg after '{s}'", .{arg});
|
||||
}
|
||||
|
||||
major_subsystem_version = std.fmt.parseUnsigned(
|
||||
u32,
|
||||
arg["--major-subsystem-version=".len..],
|
||||
linker_args.items[i],
|
||||
10,
|
||||
) catch |err| {
|
||||
fatal("unable to parse '{s}': {s}", .{ arg, @errorName(err) });
|
||||
};
|
||||
} else if (mem.startsWith(u8, arg, "--minor-subsystem-version=")) {
|
||||
} else if (mem.eql(u8, arg, "--minor-subsystem-version")) {
|
||||
i += 1;
|
||||
if (i >= linker_args.items.len) {
|
||||
fatal("expected linker arg after '{s}'", .{arg});
|
||||
}
|
||||
|
||||
minor_subsystem_version = std.fmt.parseUnsigned(
|
||||
u32,
|
||||
arg["--minor-subsystem-version=".len..],
|
||||
linker_args.items[i],
|
||||
10,
|
||||
) catch |err| {
|
||||
fatal("unable to parse '{s}': {s}", .{ arg, @errorName(err) });
|
||||
};
|
||||
} else if (mem.startsWith(u8, arg, "--major-os-version=") or
|
||||
mem.startsWith(u8, arg, "--minor-os-version="))
|
||||
{
|
||||
// These args do nothing.
|
||||
} else {
|
||||
warn("unsupported linker arg: {s}", .{arg});
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user