| author | |
| committer | |
| log | d08c57741ae190c587c42861e71b0e361903733e |
| tree | ee79c77ec4a568d90ae1cfaefa6fd786cc788926 |
| parent | 78b753af9dd9818b9dc848f590330c61b2ca7c3f |
See #3027 files changed, 62 insertions(+), 15 deletions(-)
CMakeLists.txt+1| ... | ... | @@ -587,6 +587,7 @@ install(FILES "${CMAKE_SOURCE_DIR}/std/os/windows/util.zig" DESTINATION "${ZIG_S |
| 587 | 587 | install(FILES "${CMAKE_SOURCE_DIR}/std/rand.zig" DESTINATION "${ZIG_STD_DEST}") |
| 588 | 588 | install(FILES "${CMAKE_SOURCE_DIR}/std/sort.zig" DESTINATION "${ZIG_STD_DEST}") |
| 589 | 589 | install(FILES "${CMAKE_SOURCE_DIR}/std/special/bootstrap.zig" DESTINATION "${ZIG_STD_DEST}/special") |
| 590 | install(FILES "${CMAKE_SOURCE_DIR}/std/special/bootstrap_lib.zig" DESTINATION "${ZIG_STD_DEST}/special") | |
| 590 | 591 | install(FILES "${CMAKE_SOURCE_DIR}/std/special/build_file_template.zig" DESTINATION "${ZIG_STD_DEST}/special") |
| 591 | 592 | install(FILES "${CMAKE_SOURCE_DIR}/std/special/build_runner.zig" DESTINATION "${ZIG_STD_DEST}/special") |
| 592 | 593 | install(FILES "${CMAKE_SOURCE_DIR}/std/special/builtin.zig" DESTINATION "${ZIG_STD_DEST}/special") |
src/all_types.hpp+1| ... | ... | @@ -1456,6 +1456,7 @@ struct CodeGen { |
| 1456 | 1456 | bool have_c_main; |
| 1457 | 1457 | bool have_winmain; |
| 1458 | 1458 | bool have_winmain_crt_startup; |
| 1459 | bool have_dllmain_crt_startup; | |
| 1459 | 1460 | bool have_pub_panic; |
| 1460 | 1461 | Buf *libc_lib_dir; |
| 1461 | 1462 | Buf *libc_static_lib_dir; |
src/analyze.cpp+4| ... | ... | @@ -3200,6 +3200,10 @@ ImportTableEntry *add_source_file(CodeGen *g, PackageTableEntry *package, Buf *a |
| 3200 | 3200 | buf_eql_str(proto_name, "WinMainCRTStartup") && g->zig_target.os == ZigLLVM_Win32) |
| 3201 | 3201 | { |
| 3202 | 3202 | g->have_winmain_crt_startup = true; |
| 3203 | } else if (proto_node->data.fn_proto.visib_mod == VisibModExport && | |
| 3204 | buf_eql_str(proto_name, "DllMainCRTStartup") && g->zig_target.os == ZigLLVM_Win32) | |
| 3205 | { | |
| 3206 | g->have_dllmain_crt_startup = true; | |
| 3203 | 3207 | } |
| 3204 | 3208 | |
| 3205 | 3209 | } |
src/codegen.cpp+3| ... | ... | @@ -5228,6 +5228,9 @@ static void gen_root_source(CodeGen *g) { |
| 5228 | 5228 | { |
| 5229 | 5229 | g->bootstrap_import = add_special_code(g, create_bootstrap_pkg(g, g->root_package), "bootstrap.zig"); |
| 5230 | 5230 | } |
| 5231 | if (g->zig_target.os == ZigLLVM_Win32 && !g->have_dllmain_crt_startup && g->out_type == OutTypeLib) { | |
| 5232 | g->bootstrap_import = add_special_code(g, create_bootstrap_pkg(g, g->root_package), "bootstrap_lib.zig"); | |
| 5233 | } | |
| 5231 | 5234 | ImportTableEntry *import_with_panic; |
| 5232 | 5235 | if (g->have_pub_panic) { |
| 5233 | 5236 | import_with_panic = g->root_import; |
src/link.cpp+11-4| ... | ... | @@ -372,6 +372,7 @@ static void construct_linker_job_coff(LinkJob *lj) { |
| 372 | 372 | // how to handle --target-environ gnu |
| 373 | 373 | // These comments are a clue |
| 374 | 374 | |
| 375 | bool is_library = g->out_type == OutTypeLib; | |
| 375 | 376 | //bool dll = g->out_type == OutTypeLib; |
| 376 | 377 | //bool shared = !g->is_static && dll; |
| 377 | 378 | //if (g->is_static) { |
| ... | ... | @@ -422,13 +423,19 @@ static void construct_linker_job_coff(LinkJob *lj) { |
| 422 | 423 | //lj->args.append(get_libc_static_file(g, "crtbegin.o")); |
| 423 | 424 | } else { |
| 424 | 425 | lj->args.append("-NODEFAULTLIB"); |
| 425 | if (g->have_winmain) { | |
| 426 | lj->args.append("-ENTRY:WinMain"); | |
| 427 | } else { | |
| 428 | lj->args.append("-ENTRY:WinMainCRTStartup"); | |
| 426 | if (!is_library) { | |
| 427 | if (g->have_winmain) { | |
| 428 | lj->args.append("-ENTRY:WinMain"); | |
| 429 | } else { | |
| 430 | lj->args.append("-ENTRY:WinMainCRTStartup"); | |
| 431 | } | |
| 429 | 432 | } |
| 430 | 433 | } |
| 431 | 434 | |
| 435 | if (is_library && !g->is_static) { | |
| 436 | lj->args.append("-DLL"); | |
| 437 | } | |
| 438 | ||
| 432 | 439 | for (size_t i = 0; i < g->lib_dirs.length; i += 1) { |
| 433 | 440 | const char *lib_dir = g->lib_dirs.at(i); |
| 434 | 441 | lj->args.append(buf_ptr(buf_sprintf("-LIBPATH:%s", lib_dir))); |
std/build.zig+33-11| ... | ... | @@ -636,6 +636,20 @@ pub const Builder = struct { |
| 636 | 636 | pub fn fmt(self: &Builder, comptime format: []const u8, args: ...) -> []u8 { |
| 637 | 637 | return %%fmt_lib.allocPrint(self.allocator, format, args); |
| 638 | 638 | } |
| 639 | ||
| 640 | fn getCCExe(self: &Builder) -> []const u8 { | |
| 641 | if (builtin.environ == builtin.Environ.msvc) { | |
| 642 | return "cl.exe"; | |
| 643 | } else { | |
| 644 | return os.getEnvVarOwned(self.builder.allocator, "CC") %% |err| { | |
| 645 | if (err == error.EnvironmentVariableNotFound) { | |
| 646 | ([]const u8)("cc") | |
| 647 | } else { | |
| 648 | return err | |
| 649 | } | |
| 650 | }; | |
| 651 | } | |
| 652 | } | |
| 639 | 653 | }; |
| 640 | 654 | |
| 641 | 655 | const Version = struct { |
| ... | ... | @@ -685,6 +699,17 @@ const Target = enum { |
| 685 | 699 | else => false, |
| 686 | 700 | }; |
| 687 | 701 | } |
| 702 | ||
| 703 | pub fn isWindows(self: &const Target) -> bool { | |
| 704 | return switch (self.getOs()) { | |
| 705 | builtin.Os.windows => true, | |
| 706 | else => false, | |
| 707 | }; | |
| 708 | } | |
| 709 | ||
| 710 | pub fn wantSharedLibSymLinks(self: &const Target) -> bool { | |
| 711 | return !self.isWindows(); | |
| 712 | } | |
| 688 | 713 | }; |
| 689 | 714 | |
| 690 | 715 | pub const LibExeObjStep = struct { |
| ... | ... | @@ -885,7 +910,7 @@ pub const LibExeObjStep = struct { |
| 885 | 910 | self.name_only_filename = self.builder.fmt("lib{}.dylib", self.name); |
| 886 | 911 | }, |
| 887 | 912 | builtin.Os.windows => { |
| 888 | self.out_filename = self.builder.fmt("lib{}.dll", self.name); | |
| 913 | self.out_filename = self.builder.fmt("{}.dll", self.name); | |
| 889 | 914 | }, |
| 890 | 915 | else => { |
| 891 | 916 | self.out_filename = self.builder.fmt("lib{}.so.{d}.{d}.{d}", |
| ... | ... | @@ -1200,7 +1225,7 @@ pub const LibExeObjStep = struct { |
| 1200 | 1225 | |
| 1201 | 1226 | %return builder.spawnChild(zig_args.toSliceConst()); |
| 1202 | 1227 | |
| 1203 | if (self.kind == Kind.Lib and !self.static) { | |
| 1228 | if (self.kind == Kind.Lib and !self.static and self.target.wantSharedLibSymLinks()) { | |
| 1204 | 1229 | %return doAtomicSymLinks(builder.allocator, output_path, self.major_only_filename, |
| 1205 | 1230 | self.name_only_filename); |
| 1206 | 1231 | } |
| ... | ... | @@ -1252,15 +1277,10 @@ pub const LibExeObjStep = struct { |
| 1252 | 1277 | } |
| 1253 | 1278 | |
| 1254 | 1279 | fn makeC(self: &LibExeObjStep) -> %void { |
| 1255 | const cc = os.getEnvVarOwned(self.builder.allocator, "CC") %% |err| { | |
| 1256 | if (err == error.EnvironmentVariableNotFound) { | |
| 1257 | ([]const u8)("cc") | |
| 1258 | } else { | |
| 1259 | return err | |
| 1260 | } | |
| 1261 | }; | |
| 1262 | 1280 | const builder = self.builder; |
| 1263 | 1281 | |
| 1282 | const cc = builder.getCCExe(); | |
| 1283 | ||
| 1264 | 1284 | assert(!self.is_zig); |
| 1265 | 1285 | |
| 1266 | 1286 | var cc_args = ArrayList([]const u8).init(builder.allocator); |
| ... | ... | @@ -1390,8 +1410,10 @@ pub const LibExeObjStep = struct { |
| 1390 | 1410 | |
| 1391 | 1411 | %return builder.spawnChild(cc_args.toSliceConst()); |
| 1392 | 1412 | |
| 1393 | %return doAtomicSymLinks(builder.allocator, output_path, self.major_only_filename, | |
| 1394 | self.name_only_filename); | |
| 1413 | if (self.target.wantSharedLibSymLinks()) { | |
| 1414 | %return doAtomicSymLinks(builder.allocator, output_path, self.major_only_filename, | |
| 1415 | self.name_only_filename); | |
| 1416 | } | |
| 1395 | 1417 | } |
| 1396 | 1418 | }, |
| 1397 | 1419 | Kind.Exe => { |
std/special/bootstrap_lib.zig created+9| ... | ... | @@ -0,0 +1,9 @@ |
| 1 | // This file is included in the compilation unit when exporting a library on windows. | |
| 2 | ||
| 3 | const std = @import("std"); | |
| 4 | ||
| 5 | export stdcallcc fn _DllMainCRTStartup(hinstDLL: std.os.windows.HINSTANCE, fdwReason: std.os.windows.DWORD, | |
| 6 | lpReserved: std.os.windows.LPVOID) -> std.os.windows.BOOL | |
| 7 | { | |
| 8 | return std.os.windows.TRUE; | |
| 9 | } |