From a9082b4ec51debdbffc20b56e9b37cb82dd04750 Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Sat, 26 Sep 2020 22:37:19 -0700 Subject: [PATCH] stage2: add CLI support for --subsystem --- BRANCH_TODO | 1 - src/Compilation.zig | 8 +++++++- src/link.zig | 1 + src/main.zig | 36 ++++++++++++++++++++++++++++++++++++ 4 files changed, 44 insertions(+), 2 deletions(-) diff --git a/BRANCH_TODO b/BRANCH_TODO index 6eb9cbc34b..0bd4766207 100644 --- a/BRANCH_TODO +++ b/BRANCH_TODO @@ -1,4 +1,3 @@ - * subsystem * COFF LLD linking * mingw-w64 * MachO LLD linking diff --git a/src/Compilation.zig b/src/Compilation.zig index 10adfb8c45..f641f96832 100644 --- a/src/Compilation.zig +++ b/src/Compilation.zig @@ -377,6 +377,7 @@ pub const InitOptions = struct { color: @import("main.zig").Color = .Auto, test_filter: ?[]const u8 = null, test_name_prefix: ?[]const u8 = null, + subsystem: ?std.Target.SubSystem = null, }; pub fn create(gpa: *Allocator, options: InitOptions) !*Compilation { @@ -767,6 +768,7 @@ pub fn create(gpa: *Allocator, options: InitOptions) !*Compilation { .is_compiler_rt_or_libc = options.is_compiler_rt_or_libc, .each_lib_rpath = options.each_lib_rpath orelse false, .disable_lld_caching = options.disable_lld_caching, + .subsystem = options.subsystem, }); errdefer bin_file.destroy(); comp.* = .{ @@ -2557,6 +2559,10 @@ fn updateStage1Module(comp: *Compilation) !void { const stage1_pkg = try createStage1Pkg(arena, "root", mod.root_pkg, null); const test_filter = comp.test_filter orelse ""[0..0]; const test_name_prefix = comp.test_name_prefix orelse ""[0..0]; + const subsystem = if (comp.bin_file.options.subsystem) |s| + @intToEnum(stage1.TargetSubsystem, @enumToInt(s)) + else + stage1.TargetSubsystem.Auto; stage1_module.* = .{ .root_name_ptr = comp.bin_file.options.root_name.ptr, .root_name_len = comp.bin_file.options.root_name.len, @@ -2581,7 +2587,7 @@ fn updateStage1Module(comp: *Compilation) !void { .userdata = @ptrToInt(comp), .root_pkg = stage1_pkg, .code_model = @enumToInt(comp.bin_file.options.machine_code_model), - .subsystem = stage1.TargetSubsystem.Auto, + .subsystem = subsystem, .err_color = @enumToInt(comp.color), .pic = comp.bin_file.options.pic, .link_libc = comp.bin_file.options.link_libc, diff --git a/src/link.zig b/src/link.zig index b90dce9766..a0372da4a1 100644 --- a/src/link.zig +++ b/src/link.zig @@ -77,6 +77,7 @@ pub const Options = struct { disable_lld_caching: bool, gc_sections: ?bool = null, allow_shlib_undefined: ?bool = null, + subsystem: ?std.Target.SubSystem = null, linker_script: ?[]const u8 = null, version_script: ?[]const u8 = null, override_soname: ?[]const u8 = null, diff --git a/src/main.zig b/src/main.zig index 31eaf5d8ae..d96cfaf526 100644 --- a/src/main.zig +++ b/src/main.zig @@ -273,6 +273,7 @@ const usage_build_generic = \\ --eh-frame-hdr Enable C++ exception handling by passing --eh-frame-hdr to linker \\ -dynamic Force output to be dynamically linked \\ -static Force output to be statically linked + \\ --subsystem [subsystem] (windows) /SUBSYSTEM: to the linker\n" \\ \\Test Options: \\ --test-filter [text] Skip tests that do not match filter @@ -439,6 +440,7 @@ fn buildOutputType( var override_lib_dir: ?[]const u8 = null; var main_pkg_path: ?[]const u8 = null; var clang_preprocessor_mode: Compilation.ClangPreprocessorMode = .no; + var subsystem: ?std.Target.SubSystem = null; var system_libs = std.ArrayList([]const u8).init(gpa); defer system_libs.deinit(); @@ -575,6 +577,39 @@ fn buildOutputType( } else { fatal("expected [auto|on|off] after --color, found '{}'", .{next_arg}); } + } else if (mem.eql(u8, arg, "--subsystem")) { + if (i + 1 >= args.len) fatal("expected parameter after {}", .{arg}); + i += 1; + if (mem.eql(u8, args[i], "console")) { + subsystem = .Console; + } else if (mem.eql(u8, args[i], "windows")) { + subsystem = .Windows; + } else if (mem.eql(u8, args[i], "posix")) { + subsystem = .Posix; + } else if (mem.eql(u8, args[i], "native")) { + subsystem = .Native; + } else if (mem.eql(u8, args[i], "efi_application")) { + subsystem = .EfiApplication; + } else if (mem.eql(u8, args[i], "efi_boot_service_driver")) { + subsystem = .EfiBootServiceDriver; + } else if (mem.eql(u8, args[i], "efi_rom")) { + subsystem = .EfiRom; + } else if (mem.eql(u8, args[i], "efi_runtime_driver")) { + subsystem = .EfiRuntimeDriver; + } else { + fatal("invalid: --subsystem: '{s}'. Options are:\n{s}", .{ + args[i], + \\ console + \\ windows + \\ posix + \\ native + \\ efi_application + \\ efi_boot_service_driver + \\ efi_rom + \\ efi_runtime_driver + \\ + }); + } } else if (mem.eql(u8, arg, "-O")) { if (i + 1 >= args.len) fatal("expected parameter after {}", .{arg}); i += 1; @@ -1539,6 +1574,7 @@ fn buildOutputType( .test_filter = test_filter, .test_name_prefix = test_name_prefix, .disable_lld_caching = !have_enable_cache, + .subsystem = subsystem, }) catch |err| { fatal("unable to create compilation: {}", .{@errorName(err)}); };