Obtain a target query from a string, reporting diagnostics to stderr if the
parsing failed.
Asserts that the diagnostics field of options is null. This use case
is handled instead by calling std.Target.Query.parse directly.
pub fn parseTargetQuery(options: std.Target.Query.ParseOptions) error
pub fn parseTargetQuery(options: std.Target.Query.ParseOptions) error{ParseFailed}!std.Target.Query {
assert(options.diagnostics == null);
var diags: Target.Query.ParseOptions.Diagnostics = .{};
var opts_copy = options;
opts_copy.diagnostics = &diags;
return std.Target.Query.parse(opts_copy) catch |err| switch (err) {
error.UnknownCpuModel => {
std.debug.print("unknown CPU: {q}\navailable CPUs for architecture {t}:\n", .{
diags.cpu_name.?, diags.arch.?,
});
for (diags.arch.?.allCpuModels()) |cpu| {
std.debug.print(" {s}\n", .{cpu.name});
}
return error.ParseFailed;
},
error.UnknownCpuFeature => {
std.debug.print(
\\unknown CPU feature: {q}
\\available CPU features for architecture '{t}':
\\
, .{
diags.unknown_feature_name.?, diags.arch.?,
});
for (diags.arch.?.allFeaturesList()) |feature| {
std.debug.print(" {s}: {s}\n", .{ feature.name, feature.description });
}
return error.ParseFailed;
},
error.UnknownOperatingSystem => {
std.debug.print(
\\unknown OS: {q}
\\available operating systems:
\\
, .{diags.os_name.?});
inline for (comptime std.meta.fieldNames(Target.Os.Tag)) |field_name| {
std.debug.print(" {s}\n", .{field_name});
}
return error.ParseFailed;
},
else => |e| {
std.debug.print("unable to parse target {q}: {t}\n", .{ options.arch_os_abi, e });
return error.ParseFailed;
},
};
}