From 0471eea0e2cac49946449efe4698d5ac18c0dc0d Mon Sep 17 00:00:00 2001 From: kcbanner Date: Tue, 8 Nov 2022 02:14:39 -0500 Subject: [PATCH] build: first pass on geting stage3 building under x64_64-windows-msvc --- CMakeLists.txt | 17 ++++++++++++----- build.zig | 23 ++++++++++++++++++++--- cmake/Findclang.cmake | 5 +++++ src/Compilation.zig | 4 ++-- src/link/Coff/lld.zig | 6 ++++++ stage1/config.h.in | 1 + 6 files changed, 46 insertions(+), 10 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 89620a4977..7340572bdc 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -91,6 +91,7 @@ set(ZIG_STATIC off CACHE BOOL "Attempt to build a static zig executable (not com set(ZIG_SHARED_LLVM off CACHE BOOL "Prefer linking against shared LLVM libraries") set(ZIG_STATIC_LLVM off CACHE BOOL "Prefer linking against static LLVM libraries") set(ZIG_STATIC_ZLIB off CACHE BOOL "Prefer linking against static zlib") +set(ZIG_ENABLE_ZSTD on CACHE BOOL "Enable linking zstd") set(ZIG_STATIC_ZSTD off CACHE BOOL "Prefer linking against static zstd") set(ZIG_USE_CCACHE off CACHE BOOL "Use ccache") @@ -138,19 +139,24 @@ find_package(clang 15) find_package(lld 15) if(ZIG_STATIC_ZLIB) - list(REMOVE_ITEM LLVM_LIBRARIES "-lz") + if (MSVC) + list(REMOVE_ITEM LLVM_SYSTEM_LIBRARIES "z.lib") + else() + list(REMOVE_ITEM LLVM_SYSTEM_LIBRARIES "-lz") + endif() + find_library(ZLIB NAMES libz.a libzlibstatic.a z zlib libz NAMES_PER_DIR) list(APPEND LLVM_LIBRARIES "${ZLIB}") endif() -if(ZIG_STATIC_ZSTD) - list(REMOVE_ITEM LLVM_LIBRARIES "-lzstd") +if(ZIG_STATIC_ZSTD AND ZIG_ENABLE_ZSTD) + list(REMOVE_ITEM LLVM_SYSTEM_LIBRARIES "-lzstd") find_library(ZSTD NAMES libzstd.a libzstdstatic.a zstd NAMES_PER_DIR) list(APPEND LLVM_LIBRARIES "${ZSTD}") endif() if(APPLE AND ZIG_STATIC) - list(REMOVE_ITEM LLVM_LIBRARIES "-lcurses") + list(REMOVE_ITEM LLVM_SYSTEM_LIBRARIES "-lcurses") find_library(CURSES NAMES libcurses.a libncurses.a NAMES_PER_DIR PATHS /usr/local/opt/ncurses/lib @@ -706,6 +712,7 @@ target_link_libraries(zigcpp LINK_PUBLIC ${CLANG_LIBRARIES} ${LLD_LIBRARIES} ${LLVM_LIBRARIES} + ${LLVM_SYSTEM_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT} ) @@ -839,7 +846,7 @@ if(ZIG_SINGLE_THREADED) else() set(ZIG_SINGLE_THREADED_ARG "") endif() -if(ZIG_STATIC) +if(ZIG_STATIC AND NOT MSVC) set(ZIG_STATIC_ARG "-Duse-zig-libcxx") else() set(ZIG_STATIC_ARG "") diff --git a/build.zig b/build.zig index 61b2a08b09..b33596ae52 100644 --- a/build.zig +++ b/build.zig @@ -552,6 +552,7 @@ fn addCmakeCfgOptionsToExe( addCMakeLibraryList(exe, cfg.clang_libraries); addCMakeLibraryList(exe, cfg.lld_libraries); addCMakeLibraryList(exe, cfg.llvm_libraries); + addCMakeSystemLibraryList(exe, cfg.clang_system_libraries); addCMakeSystemLibraryList(exe, cfg.llvm_system_libraries); if (use_zig_libcxx) { @@ -627,10 +628,20 @@ fn addStaticLlvmOptionsToExe(exe: *std.build.LibExeObjStep) !void { } exe.linkSystemLibrary("z"); - exe.linkSystemLibrary("zstd"); - // This means we rely on clang-or-zig-built LLVM, Clang, LLD libraries. - exe.linkSystemLibrary("c++"); + if (exe.target.getOs().tag != .windows and exe.target.getAbi() != .msvc) { + // TODO: Support this on msvc + exe.linkSystemLibrary("zstd"); + + // This means we rely on clang-or-zig-built LLVM, Clang, LLD libraries. + exe.linkSystemLibrary("c++"); + } + + if (exe.target.getOs().tag == .windows) { + exe.linkSystemLibrary("version"); + exe.linkSystemLibrary("uuid"); + exe.linkSystemLibrary("ole32"); + } } fn addCxxKnownPath( @@ -707,6 +718,7 @@ const CMakeConfig = struct { lld_include_dir: []const u8, lld_libraries: []const u8, clang_libraries: []const u8, + clang_system_libraries: []const u8, llvm_lib_dir: []const u8, llvm_include_dir: []const u8, llvm_libraries: []const u8, @@ -773,6 +785,7 @@ fn parseConfigH(b: *Builder, config_h_text: []const u8) ?CMakeConfig { .lld_include_dir = undefined, .lld_libraries = undefined, .clang_libraries = undefined, + .clang_system_libraries = undefined, .llvm_lib_dir = undefined, .llvm_include_dir = undefined, .llvm_libraries = undefined, @@ -813,6 +826,10 @@ fn parseConfigH(b: *Builder, config_h_text: []const u8) ?CMakeConfig { .prefix = "#define ZIG_CLANG_LIBRARIES ", .field = "clang_libraries", }, + .{ + .prefix = "#define ZIG_CLANG_SYSTEM_LIBRARIES ", + .field = "clang_system_libraries", + }, .{ .prefix = "#define ZIG_LLVM_LIBRARIES ", .field = "llvm_libraries", diff --git a/cmake/Findclang.cmake b/cmake/Findclang.cmake index 0949552cac..ba1abbcb64 100644 --- a/cmake/Findclang.cmake +++ b/cmake/Findclang.cmake @@ -5,6 +5,7 @@ # CLANG_FOUND # CLANG_INCLUDE_DIRS # CLANG_LIBRARIES +# CLANG_SYSTEM_LIBRARIES # CLANG_LIBDIRS find_path(CLANG_INCLUDE_DIRS NAMES clang/Frontend/ASTUnit.h @@ -68,6 +69,10 @@ else() FIND_AND_ADD_CLANG_LIB(clangSupport) endif() +if (MSVC) + set(CLANG_SYSTEM_LIBRARIES "version.lib") +endif() + include(FindPackageHandleStandardArgs) find_package_handle_standard_args(clang DEFAULT_MSG CLANG_LIBRARIES CLANG_INCLUDE_DIRS) diff --git a/src/Compilation.zig b/src/Compilation.zig index e365d1dab2..eeecf58751 100644 --- a/src/Compilation.zig +++ b/src/Compilation.zig @@ -3297,8 +3297,8 @@ fn processOneJob(comp: *Compilation, job: Job) !void { // TODO Surface more error details. comp.lockAndSetMiscFailure( .windows_import_lib, - "unable to generate DLL import .lib file: {s}", - .{@errorName(err)}, + "unable to generate DLL import .lib file for {s}: {s}", + .{link_lib, @errorName(err)}, ); }; }, diff --git a/src/link/Coff/lld.zig b/src/link/Coff/lld.zig index 46b0130542..dfa56527bf 100644 --- a/src/link/Coff/lld.zig +++ b/src/link/Coff/lld.zig @@ -486,6 +486,12 @@ pub fn linkWithLLD(self: *Coff, comp: *Compilation, prog_node: *std.Progress.Nod continue; } } + if (target.abi == .msvc) { // TODO: Do this at the top, if we detect we're using the native libc? + log.warn("adding system lib {s}", .{ lib_basename }); + argv.appendAssumeCapacity(lib_basename); + continue; + } + log.err("DLL import library for -l{s} not found", .{key}); return error.DllImportLibraryNotFound; } diff --git a/stage1/config.h.in b/stage1/config.h.in index 4ec1aa1fa6..2f4ed02fdc 100644 --- a/stage1/config.h.in +++ b/stage1/config.h.in @@ -16,6 +16,7 @@ // Used by build.zig for communicating build information to self hosted build. #define ZIG_CLANG_LIBRARIES "@CLANG_LIBRARIES@" +#define ZIG_CLANG_SYSTEM_LIBRARIES "@CLANG_SYSTEM_LIBRARIES@" #define ZIG_CMAKE_BINARY_DIR "@CMAKE_BINARY_DIR@" #define ZIG_CMAKE_PREFIX_PATH "@ZIG_CMAKE_PREFIX_PATH@" #define ZIG_CMAKE_STATIC_LIBRARY_PREFIX "@CMAKE_STATIC_LIBRARY_PREFIX@"