aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorkcbanner <kcbanner@gmail.com>2022-11-08 02:14:39 -0500
committerkcbanner <kcbanner@gmail.com>2023-01-04 21:45:05 -0500
commit0471eea0e2cac49946449efe4698d5ac18c0dc0d (patch)
treef1d6d3a29e16d952380c3b0ea498d9cc65cf0d07
parentc3945d9edeb304ccd9f3d44e9ab0bf94f5420694 (diff)
downloadzig-0471eea0e2cac49946449efe4698d5ac18c0dc0d.tar.gz
zig-0471eea0e2cac49946449efe4698d5ac18c0dc0d.zip
build: first pass on geting stage3 building under x64_64-windows-msvc
-rw-r--r--CMakeLists.txt17
-rw-r--r--build.zig23
-rw-r--r--cmake/Findclang.cmake5
-rw-r--r--src/Compilation.zig4
-rw-r--r--src/link/Coff/lld.zig6
-rw-r--r--stage1/config.h.in1
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,
@@ -814,6 +827,10 @@ fn parseConfigH(b: *Builder, config_h_text: []const u8) ?CMakeConfig {
.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@"