Commit 429a219f42
Changed files (3)
src/Compilation.zig
@@ -510,8 +510,19 @@ pub fn create(gpa: *Allocator, options: InitOptions) !*Compilation {
{
break :dl true;
}
- if (options.system_libs.len != 0) {
- // when creating a executable that links to system libraries,
+ const any_dyn_libs: bool = x: {
+ if (options.system_libs.len != 0)
+ break :x true;
+ for (options.link_objects) |obj| {
+ switch (classifyFileExt(obj)) {
+ .shared_library => break :x true,
+ else => continue,
+ }
+ }
+ break :x false;
+ };
+ if (any_dyn_libs) {
+ // When creating a executable that links to system libraries,
// we require dynamic linking, but we must not link static libraries
// or object files dynamically!
break :dl (options.output_mode == .Exe);
test/standalone/cat/main.zig
@@ -5,41 +5,38 @@ const fs = std.fs;
const mem = std.mem;
const warn = std.log.warn;
-var general_purpose_allocator = std.heap.GeneralPurposeAllocator(.{}){};
-const allocator = &general_purpose_allocator.allocator;
-
pub fn main() !void {
- defer _ = general_purpose_allocator.deinit();
+ var arena_instance = std.heap.ArenaAllocator.init(std.heap.page_allocator);
+ defer arena_instance.deinit();
+ const arena = &arena_instance.allocator;
+
+ const args = try process.argsAlloc(arena);
- var args_it = process.args();
- const exe = try unwrapArg(args_it.next(allocator).?);
- defer allocator.free(exe);
+ const exe = args[0];
var catted_anything = false;
const stdout_file = io.getStdOut();
const cwd = fs.cwd();
- while (args_it.next(allocator)) |arg_or_err| {
- const arg = try unwrapArg(arg_or_err);
- defer allocator.free(arg);
+ for (args[1..]) |arg| {
if (mem.eql(u8, arg, "-")) {
catted_anything = true;
- try cat_file(stdout_file, io.getStdIn());
- } else if (arg[0] == '-') {
+ try stdout_file.writeFileAll(io.getStdIn(), .{});
+ } else if (mem.startsWith(u8, arg, "-")) {
return usage(exe);
} else {
const file = cwd.openFile(arg, .{}) catch |err| {
- warn("Unable to open file: {}\n", .{@errorName(err)});
+ warn("Unable to open file: {s}\n", .{@errorName(err)});
return err;
};
defer file.close();
catted_anything = true;
- try cat_file(stdout_file, file);
+ try stdout_file.writeFileAll(file, .{});
}
}
if (!catted_anything) {
- try cat_file(stdout_file, io.getStdIn());
+ try stdout_file.writeFileAll(io.getStdIn(), .{});
}
}
@@ -47,20 +44,3 @@ fn usage(exe: []const u8) !void {
warn("Usage: {} [FILE]...\n", .{exe});
return error.Invalid;
}
-
-// TODO use copy_file_range
-fn cat_file(stdout: fs.File, file: fs.File) !void {
- var fifo = std.fifo.LinearFifo(u8, .{ .Static = 1024 * 4 }).init();
-
- fifo.pump(file.reader(), stdout.writer()) catch |err| {
- warn("Unable to read from stream or write to stdout: {}\n", .{@errorName(err)});
- return err;
- };
-}
-
-fn unwrapArg(arg: anyerror![]u8) ![]u8 {
- return arg catch |err| {
- warn("Unable to parse command line: {}\n", .{err});
- return err;
- };
-}