| author | |
| committer | |
| log | 1af31baf0ba447b6ea5a1456df5ba2d82dc26e56 |
| tree | a03fbbd5250b28d63188bbeae7e83e0b0487d81d |
| parent | 287f640cc94d7f1cddb30e9ef57a8c921621a5b9 |
Previously you had to recompile if you wanted to change the log scopes
that get printed. Now, log scopes can be set at runtime, and -Dlog
controls whether all logging is available at runtime.
Purpose here is a nicer development experience. Most likely stage2
developers will always want -Dlog enabled and then pass --debug-log
scopes when debugging particular issues.4 files changed, 22 insertions(+), 6 deletions(-)
build.zig+2-2| ... | ... | @@ -134,7 +134,7 @@ pub fn build(b: *Builder) !void { |
| 134 | 134 | test_stage2.linkLibC(); |
| 135 | 135 | } |
| 136 | 136 | |
| 137 | const log_scopes = b.option([]const []const u8, "log", "Which log scopes to enable") orelse &[0][]const u8{}; | |
| 137 | const enable_logging = b.option(bool, "log", "Whether to enable logging") orelse false; | |
| 138 | 138 | |
| 139 | 139 | const opt_version_string = b.option([]const u8, "version-string", "Override Zig version string. Default is to find out with git."); |
| 140 | 140 | const version = if (opt_version_string) |version| version else v: { |
| ... | ... | @@ -190,7 +190,7 @@ pub fn build(b: *Builder) !void { |
| 190 | 190 | const semver = try std.SemanticVersion.parse(version); |
| 191 | 191 | exe.addBuildOption(std.SemanticVersion, "semver", semver); |
| 192 | 192 | |
| 193 | exe.addBuildOption([]const []const u8, "log_scopes", log_scopes); | |
| 193 | exe.addBuildOption(bool, "enable_logging", enable_logging); | |
| 194 | 194 | exe.addBuildOption(bool, "enable_tracy", tracy != null); |
| 195 | 195 | exe.addBuildOption(bool, "is_stage1", is_stage1); |
| 196 | 196 | exe.addBuildOption(bool, "omit_stage2", false); |
src/Compilation.zig+3| ... | ... | @@ -1560,6 +1560,9 @@ pub fn performAllTheWork(self: *Compilation) error{ TimerUnsupported, OutOfMemor |
| 1560 | 1560 | } |
| 1561 | 1561 | } |
| 1562 | 1562 | |
| 1563 | log.debug("calling updateDecl on '{s}', type={}", .{ | |
| 1564 | decl.name, decl.typed_value.most_recent.typed_value.ty, | |
| 1565 | }); | |
| 1563 | 1566 | assert(decl.typed_value.most_recent.typed_value.ty.hasCodeGenBits()); |
| 1564 | 1567 | |
| 1565 | 1568 | self.bin_file.updateDecl(module, decl) catch |err| switch (err) { |
src/config.zig.in+1-1| ... | ... | @@ -1,7 +1,7 @@ |
| 1 | 1 | pub const have_llvm = true; |
| 2 | 2 | pub const version: [:0]const u8 = "@ZIG_VERSION@"; |
| 3 | 3 | pub const semver = try @import("std").SemanticVersion.parse(version); |
| 4 | pub const log_scopes: []const []const u8 = &[_][]const u8{}; | |
| 4 | pub const enable_logging: bool = false; | |
| 5 | 5 | pub const enable_tracy = false; |
| 6 | 6 | pub const is_stage1 = true; |
| 7 | 7 | pub const skip_non_native = false; |
src/main.zig+16-3| ... | ... | @@ -70,20 +70,26 @@ pub const log_level: std.log.Level = switch (std.builtin.mode) { |
| 70 | 70 | .ReleaseSmall => .crit, |
| 71 | 71 | }; |
| 72 | 72 | |
| 73 | var log_scopes: std.ArrayListUnmanaged([]const u8) = .{}; | |
| 74 | ||
| 73 | 75 | pub fn log( |
| 74 | 76 | comptime level: std.log.Level, |
| 75 | 77 | comptime scope: @TypeOf(.EnumLiteral), |
| 76 | 78 | comptime format: []const u8, |
| 77 | 79 | args: anytype, |
| 78 | 80 | ) void { |
| 79 | // Hide debug messages unless added with `-Dlog=foo`. | |
| 81 | // Hide debug messages unless: | |
| 82 | // * logging enabled with `-Dlog`. | |
| 83 | // * the --debug-log arg for the scope has been provided | |
| 80 | 84 | if (@enumToInt(level) > @enumToInt(std.log.level) or |
| 81 | 85 | @enumToInt(level) > @enumToInt(std.log.Level.info)) |
| 82 | 86 | { |
| 87 | if (!build_options.enable_logging) return; | |
| 88 | ||
| 83 | 89 | const scope_name = @tagName(scope); |
| 84 | const ok = comptime for (build_options.log_scopes) |log_scope| { | |
| 90 | for (log_scopes.items) |log_scope| { | |
| 85 | 91 | if (mem.eql(u8, log_scope, scope_name)) |
| 86 | break true; | |
| 92 | break; | |
| 87 | 93 | } else return; |
| 88 | 94 | } |
| 89 | 95 | |
| ... | ... | @@ -156,6 +162,8 @@ pub fn mainArgs(gpa: *Allocator, arena: *Allocator, args: []const []const u8) !v |
| 156 | 162 | } |
| 157 | 163 | } |
| 158 | 164 | |
| 165 | defer log_scopes.deinit(gpa); | |
| 166 | ||
| 159 | 167 | const cmd = args[1]; |
| 160 | 168 | const cmd_args = args[2..]; |
| 161 | 169 | if (mem.eql(u8, cmd, "build-exe")) { |
| ... | ... | @@ -358,6 +366,7 @@ const usage_build_generic = |
| 358 | 366 | \\ --verbose-llvm-ir Enable compiler debug output for LLVM IR |
| 359 | 367 | \\ --verbose-cimport Enable compiler debug output for C imports |
| 360 | 368 | \\ --verbose-llvm-cpu-features Enable compiler debug output for LLVM CPU features |
| 369 | \\ --debug-log [scope] Enable printing debug/info log messages for scope | |
| 361 | 370 | \\ |
| 362 | 371 | ; |
| 363 | 372 | |
| ... | ... | @@ -811,6 +820,10 @@ fn buildOutputType( |
| 811 | 820 | if (i + 1 >= args.len) fatal("expected parameter after {s}", .{arg}); |
| 812 | 821 | i += 1; |
| 813 | 822 | override_lib_dir = args[i]; |
| 823 | } else if (mem.eql(u8, arg, "--debug-log")) { | |
| 824 | if (i + 1 >= args.len) fatal("expected parameter after {s}", .{arg}); | |
| 825 | i += 1; | |
| 826 | try log_scopes.append(gpa, args[i]); | |
| 814 | 827 | } else if (mem.eql(u8, arg, "-fcompiler-rt")) { |
| 815 | 828 | want_compiler_rt = true; |
| 816 | 829 | } else if (mem.eql(u8, arg, "-fno-compiler-rt")) { |