From 41b588547cd49673ff632ed0fc3210c76ff48b42 Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Sat, 23 Sep 2017 18:46:03 -0400 Subject: [PATCH] improvements to windows support See #302 --- CMakeLists.txt | 7 +++++- cmake/Findllvm.cmake | 51 ++++++++++++++++++++++++++++++-------------- src/analyze.cpp | 4 ++++ src/os.hpp | 2 +- 4 files changed, 46 insertions(+), 18 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index af9529641..8e5a71e30 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -352,9 +352,14 @@ else() endif() set(EXE_LDFLAGS " ") +if(MINGW) + set(EXE_LDFLAGS "-static -static-libgcc -static-libstdc++") +else() + set(EXE_LDFLAGS " ") +endif() if(ZIG_TEST_COVERAGE) set(EXE_CFLAGS "${EXE_CFLAGS} -fprofile-arcs -ftest-coverage") - set(EXE_LDFLAGS "-fprofile-arcs -ftest-coverage") + set(EXE_LDFLAGS "${EXE_LDFLAGS} -fprofile-arcs -ftest-coverage") endif() add_executable(zig ${ZIG_SOURCES}) diff --git a/cmake/Findllvm.cmake b/cmake/Findllvm.cmake index f76735d3b..dc45a0925 100644 --- a/cmake/Findllvm.cmake +++ b/cmake/Findllvm.cmake @@ -80,32 +80,51 @@ else() "c:/msys64/mingw64/bin" "C:/Libraries/llvm-5.0.0/bin") - execute_process( - COMMAND ${LLVM_CONFIG_EXE} --libs - OUTPUT_VARIABLE LLVM_LIBRARIES - OUTPUT_STRIP_TRAILING_WHITESPACE) + if(NOT(CMAKE_BUILD_TYPE STREQUAL "Debug")) + execute_process( + COMMAND ${LLVM_CONFIG_EXE} --libfiles --link-static + OUTPUT_VARIABLE LLVM_LIBRARIES_SPACES + OUTPUT_STRIP_TRAILING_WHITESPACE) + string(REPLACE " " ";" LLVM_LIBRARIES "${LLVM_LIBRARIES_SPACES}") - execute_process( - COMMAND ${LLVM_CONFIG_EXE} --system-libs - OUTPUT_VARIABLE LLVM_SYSTEM_LIBS - OUTPUT_STRIP_TRAILING_WHITESPACE) + execute_process( + COMMAND ${LLVM_CONFIG_EXE} --system-libs --link-static + OUTPUT_VARIABLE LLVM_SYSTEM_LIBS_SPACES + OUTPUT_STRIP_TRAILING_WHITESPACE) + string(REPLACE " " ";" LLVM_SYSTEM_LIBS "${LLVM_SYSTEM_LIBS_SPACES}") - execute_process( - COMMAND ${LLVM_CONFIG_EXE} --libdir - OUTPUT_VARIABLE LLVM_LIBDIRS - OUTPUT_STRIP_TRAILING_WHITESPACE) + execute_process( + COMMAND ${LLVM_CONFIG_EXE} --libdir --link-static + OUTPUT_VARIABLE LLVM_LIBDIRS_SPACES + OUTPUT_STRIP_TRAILING_WHITESPACE) + string(REPLACE " " ";" LLVM_LIBDIRS "${LLVM_LIBDIRS_SPACES}") + endif() + if(NOT LLVM_LIBRARIES) + execute_process( + COMMAND ${LLVM_CONFIG_EXE} --libs + OUTPUT_VARIABLE LLVM_LIBRARIES + OUTPUT_STRIP_TRAILING_WHITESPACE) + + execute_process( + COMMAND ${LLVM_CONFIG_EXE} --system-libs + OUTPUT_VARIABLE LLVM_SYSTEM_LIBS + OUTPUT_STRIP_TRAILING_WHITESPACE) + + execute_process( + COMMAND ${LLVM_CONFIG_EXE} --libdir + OUTPUT_VARIABLE LLVM_LIBDIRS + OUTPUT_STRIP_TRAILING_WHITESPACE) + endif() execute_process( COMMAND ${LLVM_CONFIG_EXE} --includedir OUTPUT_VARIABLE LLVM_INCLUDE_DIRS OUTPUT_STRIP_TRAILING_WHITESPACE) - find_library(LLVM_LIBRARY NAMES LLVM) - set(LLVM_LIBRARIES ${LLVM_LIBRARIES} ${LLVM_SYSTEM_LIBS}) - if(LLVM_LIBRARY AND NOT LLVM_LIBRARIES) - set(LLVM_LIBRARIES ${LLVM_LIBRARY}) + if(NOT LLVM_LIBRARIES) + find_library(LLVM_LIBRARIES NAMES LLVM LLVM-5.0 LLVM-5) endif() link_directories("${CMAKE_PREFIX_PATH}/lib") diff --git a/src/analyze.cpp b/src/analyze.cpp index e0d34be28..b20b7b3bd 100644 --- a/src/analyze.cpp +++ b/src/analyze.cpp @@ -3189,6 +3189,8 @@ ImportTableEntry *add_source_file(CodeGen *g, PackageTableEntry *package, Buf *a if (is_pub) { if (buf_eql_str(proto_name, "main")) { g->have_pub_main = true; + g->windows_subsystem_windows = false; + g->windows_subsystem_console = true; } else if (buf_eql_str(proto_name, "panic")) { g->have_pub_panic = true; } @@ -3196,6 +3198,8 @@ ImportTableEntry *add_source_file(CodeGen *g, PackageTableEntry *package, Buf *a g->libc_link_lib != nullptr) { g->have_c_main = true; + g->windows_subsystem_windows = false; + g->windows_subsystem_console = true; } } diff --git a/src/os.hpp b/src/os.hpp index 2aefad4fa..0d4e8d3db 100644 --- a/src/os.hpp +++ b/src/os.hpp @@ -81,7 +81,7 @@ bool os_is_sep(uint8_t c); #endif #if defined(ZIG_OS_WINDOWS) -#define ZIG_PRI_usize "Iu" +#define ZIG_PRI_usize "I64u" #define ZIG_PRI_u64 "I64u" #define ZIG_PRI_llu "I64u" #define ZIG_PRI_x64 "I64x"