mirror of
https://github.com/ziglang/zig.git
synced 2025-12-23 22:53:06 +00:00
* implement --debug-cc and --debug-link
* implement C source files having extra flags
- TODO a way to pass them on the CLI
* introduce the Directory abstraction which contains both an open file
descriptor and a file path name. The former is preferred but the
latter is needed when communicating paths over a command line (e.g.
to Clang or LLD).
* use the cache hash to choose an artifact directory
- TODO: use separate cache hash instances for the zig module and
each C object
* Module: introduce the crt_files table for keeping track of built libc
artifacts for linking.
* Add the ability to build 4/6 of the glibc static CRT lib files.
* The zig-cache directory is now passed as a parameter to Module.
* Implement the CLI logic of -femit-bin and -femit-h
- TODO: respect -fno-emit-bin
- TODO: the emit .h feature
* Add the -fvalgrind, -fstack-check, and --single-threaded CLI options.
* Implement the logic for auto detecting whether to enable PIC,
sanitize-C, stack-check, valgrind, and single-threaded.
* Properly add PIC args (or not) to clang argv.
* Implement renaming clang-compiled object files into their proper
place within the cache artifact directory.
- TODO: std lib needs a proper higher level abstraction for
std.os.renameat.
* Package is cleaned up to use the "Unmanaged" StringHashMap and use the
new Directory abstraction.
* Clean up zig lib directory detection to make proper use of directory
handles.
* Linker code invokes LLD.
- TODO properly deal with the stdout and stderr that we get from it
and expose diagnostics from the Module API that match the expected
error message format.
* Delete the bitrotted LLVM C ABI bindings. We'll resurrect just the
functions we need as we introduce dependencies on them. So far it
only has ZigLLDLink in it.
* Remove dead timer code.
* `zig env` now prints the path to the zig executable as well.
162 lines
4.9 KiB
Zig
162 lines
4.9 KiB
Zig
const std = @import("std");
|
|
const fs = std.fs;
|
|
const io = std.io;
|
|
const mem = std.mem;
|
|
const Allocator = mem.Allocator;
|
|
const Target = std.Target;
|
|
const target = @import("target.zig");
|
|
const assert = std.debug.assert;
|
|
const glibc = @import("glibc.zig");
|
|
const introspect = @import("introspect.zig");
|
|
const fatal = @import("main.zig").fatal;
|
|
|
|
pub fn cmdTargets(
|
|
allocator: *Allocator,
|
|
args: []const []const u8,
|
|
/// Output stream
|
|
stdout: anytype,
|
|
native_target: Target,
|
|
) !void {
|
|
var zig_lib_directory = introspect.findZigLibDir(allocator) catch |err| {
|
|
fatal("unable to find zig installation directory: {}\n", .{@errorName(err)});
|
|
};
|
|
defer zig_lib_directory.handle.close();
|
|
defer allocator.free(zig_lib_directory.path.?);
|
|
|
|
const glibc_abi = try glibc.loadMetaData(allocator, zig_lib_directory.handle);
|
|
defer glibc_abi.destroy(allocator);
|
|
|
|
var bos = io.bufferedOutStream(stdout);
|
|
const bos_stream = bos.outStream();
|
|
var jws = std.json.WriteStream(@TypeOf(bos_stream), 6).init(bos_stream);
|
|
|
|
try jws.beginObject();
|
|
|
|
try jws.objectField("arch");
|
|
try jws.beginArray();
|
|
{
|
|
inline for (@typeInfo(Target.Cpu.Arch).Enum.fields) |field| {
|
|
try jws.arrayElem();
|
|
try jws.emitString(field.name);
|
|
}
|
|
}
|
|
try jws.endArray();
|
|
|
|
try jws.objectField("os");
|
|
try jws.beginArray();
|
|
inline for (@typeInfo(Target.Os.Tag).Enum.fields) |field| {
|
|
try jws.arrayElem();
|
|
try jws.emitString(field.name);
|
|
}
|
|
try jws.endArray();
|
|
|
|
try jws.objectField("abi");
|
|
try jws.beginArray();
|
|
inline for (@typeInfo(Target.Abi).Enum.fields) |field| {
|
|
try jws.arrayElem();
|
|
try jws.emitString(field.name);
|
|
}
|
|
try jws.endArray();
|
|
|
|
try jws.objectField("libc");
|
|
try jws.beginArray();
|
|
for (target.available_libcs) |libc| {
|
|
const tmp = try std.fmt.allocPrint(allocator, "{}-{}-{}", .{
|
|
@tagName(libc.arch), @tagName(libc.os), @tagName(libc.abi),
|
|
});
|
|
defer allocator.free(tmp);
|
|
try jws.arrayElem();
|
|
try jws.emitString(tmp);
|
|
}
|
|
try jws.endArray();
|
|
|
|
try jws.objectField("glibc");
|
|
try jws.beginArray();
|
|
for (glibc_abi.all_versions) |ver| {
|
|
try jws.arrayElem();
|
|
|
|
const tmp = try std.fmt.allocPrint(allocator, "{}", .{ver});
|
|
defer allocator.free(tmp);
|
|
try jws.emitString(tmp);
|
|
}
|
|
try jws.endArray();
|
|
|
|
try jws.objectField("cpus");
|
|
try jws.beginObject();
|
|
inline for (@typeInfo(Target.Cpu.Arch).Enum.fields) |field| {
|
|
try jws.objectField(field.name);
|
|
try jws.beginObject();
|
|
const arch = @field(Target.Cpu.Arch, field.name);
|
|
for (arch.allCpuModels()) |model| {
|
|
try jws.objectField(model.name);
|
|
try jws.beginArray();
|
|
for (arch.allFeaturesList()) |feature, i| {
|
|
if (model.features.isEnabled(@intCast(u8, i))) {
|
|
try jws.arrayElem();
|
|
try jws.emitString(feature.name);
|
|
}
|
|
}
|
|
try jws.endArray();
|
|
}
|
|
try jws.endObject();
|
|
}
|
|
try jws.endObject();
|
|
|
|
try jws.objectField("cpuFeatures");
|
|
try jws.beginObject();
|
|
inline for (@typeInfo(Target.Cpu.Arch).Enum.fields) |field| {
|
|
try jws.objectField(field.name);
|
|
try jws.beginArray();
|
|
const arch = @field(Target.Cpu.Arch, field.name);
|
|
for (arch.allFeaturesList()) |feature| {
|
|
try jws.arrayElem();
|
|
try jws.emitString(feature.name);
|
|
}
|
|
try jws.endArray();
|
|
}
|
|
try jws.endObject();
|
|
|
|
try jws.objectField("native");
|
|
try jws.beginObject();
|
|
{
|
|
const triple = try native_target.zigTriple(allocator);
|
|
defer allocator.free(triple);
|
|
try jws.objectField("triple");
|
|
try jws.emitString(triple);
|
|
}
|
|
{
|
|
try jws.objectField("cpu");
|
|
try jws.beginObject();
|
|
try jws.objectField("arch");
|
|
try jws.emitString(@tagName(native_target.cpu.arch));
|
|
|
|
try jws.objectField("name");
|
|
const cpu = native_target.cpu;
|
|
try jws.emitString(cpu.model.name);
|
|
|
|
{
|
|
try jws.objectField("features");
|
|
try jws.beginArray();
|
|
for (native_target.cpu.arch.allFeaturesList()) |feature, i_usize| {
|
|
const index = @intCast(Target.Cpu.Feature.Set.Index, i_usize);
|
|
if (cpu.features.isEnabled(index)) {
|
|
try jws.arrayElem();
|
|
try jws.emitString(feature.name);
|
|
}
|
|
}
|
|
try jws.endArray();
|
|
}
|
|
try jws.endObject();
|
|
}
|
|
try jws.objectField("os");
|
|
try jws.emitString(@tagName(native_target.os.tag));
|
|
try jws.objectField("abi");
|
|
try jws.emitString(@tagName(native_target.abi));
|
|
try jws.endObject();
|
|
|
|
try jws.endObject();
|
|
|
|
try bos_stream.writeByte('\n');
|
|
return bos.flush();
|
|
}
|