diff options
Diffstat (limited to 'lib/std/zig.zig')
| -rw-r--r-- | lib/std/zig.zig | 132 |
1 files changed, 119 insertions, 13 deletions
diff --git a/lib/std/zig.zig b/lib/std/zig.zig index 1437fee2e6..46fb562310 100644 --- a/lib/std/zig.zig +++ b/lib/std/zig.zig @@ -14,6 +14,10 @@ pub const system = @import("zig/system.zig"); pub const CrossTarget = std.Target.Query; pub const BuiltinFn = @import("zig/BuiltinFn.zig"); pub const AstRlAnnotate = @import("zig/AstRlAnnotate.zig"); +pub const LibCInstallation = @import("zig/LibCInstallation.zig"); +pub const WindowsSdk = @import("zig/WindowsSdk.zig"); +pub const LibCDirs = @import("zig/LibCDirs.zig"); +pub const target = @import("zig/target.zig"); // Character literal parsing pub const ParsedCharLiteral = string_literal.ParsedCharLiteral; @@ -142,10 +146,10 @@ pub const BinNameOptions = struct { /// Returns the standard file system basename of a binary generated by the Zig compiler. pub fn binNameAlloc(allocator: Allocator, options: BinNameOptions) error{OutOfMemory}![]u8 { const root_name = options.root_name; - const target = options.target; - switch (target.ofmt) { + const t = options.target; + switch (t.ofmt) { .coff => switch (options.output_mode) { - .Exe => return std.fmt.allocPrint(allocator, "{s}{s}", .{ root_name, target.exeFileExt() }), + .Exe => return std.fmt.allocPrint(allocator, "{s}{s}", .{ root_name, t.exeFileExt() }), .Lib => { const suffix = switch (options.link_mode orelse .Static) { .Static => ".lib", @@ -160,16 +164,16 @@ pub fn binNameAlloc(allocator: Allocator, options: BinNameOptions) error{OutOfMe .Lib => { switch (options.link_mode orelse .Static) { .Static => return std.fmt.allocPrint(allocator, "{s}{s}.a", .{ - target.libPrefix(), root_name, + t.libPrefix(), root_name, }), .Dynamic => { if (options.version) |ver| { return std.fmt.allocPrint(allocator, "{s}{s}.so.{d}.{d}.{d}", .{ - target.libPrefix(), root_name, ver.major, ver.minor, ver.patch, + t.libPrefix(), root_name, ver.major, ver.minor, ver.patch, }); } else { return std.fmt.allocPrint(allocator, "{s}{s}.so", .{ - target.libPrefix(), root_name, + t.libPrefix(), root_name, }); } }, @@ -182,16 +186,16 @@ pub fn binNameAlloc(allocator: Allocator, options: BinNameOptions) error{OutOfMe .Lib => { switch (options.link_mode orelse .Static) { .Static => return std.fmt.allocPrint(allocator, "{s}{s}.a", .{ - target.libPrefix(), root_name, + t.libPrefix(), root_name, }), .Dynamic => { if (options.version) |ver| { return std.fmt.allocPrint(allocator, "{s}{s}.{d}.{d}.{d}.dylib", .{ - target.libPrefix(), root_name, ver.major, ver.minor, ver.patch, + t.libPrefix(), root_name, ver.major, ver.minor, ver.patch, }); } else { return std.fmt.allocPrint(allocator, "{s}{s}.dylib", .{ - target.libPrefix(), root_name, + t.libPrefix(), root_name, }); } }, @@ -200,11 +204,11 @@ pub fn binNameAlloc(allocator: Allocator, options: BinNameOptions) error{OutOfMe .Obj => return std.fmt.allocPrint(allocator, "{s}.o", .{root_name}), }, .wasm => switch (options.output_mode) { - .Exe => return std.fmt.allocPrint(allocator, "{s}{s}", .{ root_name, target.exeFileExt() }), + .Exe => return std.fmt.allocPrint(allocator, "{s}{s}", .{ root_name, t.exeFileExt() }), .Lib => { switch (options.link_mode orelse .Static) { .Static => return std.fmt.allocPrint(allocator, "{s}{s}.a", .{ - target.libPrefix(), root_name, + t.libPrefix(), root_name, }), .Dynamic => return std.fmt.allocPrint(allocator, "{s}.wasm", .{root_name}), } @@ -218,10 +222,10 @@ pub fn binNameAlloc(allocator: Allocator, options: BinNameOptions) error{OutOfMe .plan9 => switch (options.output_mode) { .Exe => return allocator.dupe(u8, root_name), .Obj => return std.fmt.allocPrint(allocator, "{s}{s}", .{ - root_name, target.ofmt.fileExt(target.cpu.arch), + root_name, t.ofmt.fileExt(t.cpu.arch), }), .Lib => return std.fmt.allocPrint(allocator, "{s}{s}.a", .{ - target.libPrefix(), root_name, + t.libPrefix(), root_name, }), }, .nvptx => return std.fmt.allocPrint(allocator, "{s}.ptx", .{root_name}), @@ -900,15 +904,117 @@ pub fn putAstErrorsIntoBundle( try wip_errors.addZirErrorMessages(zir, tree, tree.source, path); } +pub fn resolveTargetQueryOrFatal(target_query: std.Target.Query) std.Target { + return std.zig.system.resolveTargetQuery(target_query) catch |err| + fatal("unable to resolve target: {s}", .{@errorName(err)}); +} + +pub fn parseTargetQueryOrReportFatalError( + allocator: Allocator, + opts: std.Target.Query.ParseOptions, +) std.Target.Query { + var opts_with_diags = opts; + var diags: std.Target.Query.ParseOptions.Diagnostics = .{}; + if (opts_with_diags.diagnostics == null) { + opts_with_diags.diagnostics = &diags; + } + return std.Target.Query.parse(opts_with_diags) catch |err| switch (err) { + error.UnknownCpuModel => { + help: { + var help_text = std.ArrayList(u8).init(allocator); + defer help_text.deinit(); + for (diags.arch.?.allCpuModels()) |cpu| { + help_text.writer().print(" {s}\n", .{cpu.name}) catch break :help; + } + std.log.info("available CPUs for architecture '{s}':\n{s}", .{ + @tagName(diags.arch.?), help_text.items, + }); + } + fatal("unknown CPU: '{s}'", .{diags.cpu_name.?}); + }, + error.UnknownCpuFeature => { + help: { + var help_text = std.ArrayList(u8).init(allocator); + defer help_text.deinit(); + for (diags.arch.?.allFeaturesList()) |feature| { + help_text.writer().print(" {s}: {s}\n", .{ feature.name, feature.description }) catch break :help; + } + std.log.info("available CPU features for architecture '{s}':\n{s}", .{ + @tagName(diags.arch.?), help_text.items, + }); + } + fatal("unknown CPU feature: '{s}'", .{diags.unknown_feature_name.?}); + }, + error.UnknownObjectFormat => { + help: { + var help_text = std.ArrayList(u8).init(allocator); + defer help_text.deinit(); + inline for (@typeInfo(std.Target.ObjectFormat).Enum.fields) |field| { + help_text.writer().print(" {s}\n", .{field.name}) catch break :help; + } + std.log.info("available object formats:\n{s}", .{help_text.items}); + } + fatal("unknown object format: '{s}'", .{opts.object_format.?}); + }, + else => |e| fatal("unable to parse target query '{s}': {s}", .{ + opts.arch_os_abi, @errorName(e), + }), + }; +} + +pub fn fatal(comptime format: []const u8, args: anytype) noreturn { + std.log.err(format, args); + std.process.exit(1); +} + +/// Collects all the environment variables that Zig could possibly inspect, so +/// that we can do reflection on this and print them with `zig env`. +pub const EnvVar = enum { + ZIG_GLOBAL_CACHE_DIR, + ZIG_LOCAL_CACHE_DIR, + ZIG_LIB_DIR, + ZIG_LIBC, + ZIG_BUILD_RUNNER, + ZIG_VERBOSE_LINK, + ZIG_VERBOSE_CC, + ZIG_BTRFS_WORKAROUND, + ZIG_DEBUG_CMD, + CC, + NO_COLOR, + XDG_CACHE_HOME, + HOME, + + pub fn isSet(comptime ev: EnvVar) bool { + return std.process.hasEnvVarConstant(@tagName(ev)); + } + + pub fn get(ev: EnvVar, arena: std.mem.Allocator) !?[]u8 { + if (std.process.getEnvVarOwned(arena, @tagName(ev))) |value| { + return value; + } else |err| switch (err) { + error.EnvironmentVariableNotFound => return null, + else => |e| return e, + } + } + + pub fn getPosix(comptime ev: EnvVar) ?[:0]const u8 { + return std.os.getenvZ(@tagName(ev)); + } +}; + test { _ = Ast; _ = AstRlAnnotate; _ = BuiltinFn; _ = Client; _ = ErrorBundle; + _ = LibCDirs; + _ = LibCInstallation; _ = Server; + _ = WindowsSdk; _ = number_literal; _ = primitives; _ = string_literal; _ = system; + _ = target; } |
