| author | |
| committer | |
| log | ec7d7a5b14540ea3b2bab9f11318630338467965 |
| tree | 857f6dea4affaa4858ef00ba543ab24e008c2efc |
| parent | 81c441f8855d4c58f0b2ff86d3d007cf0bf395d3 |
| parent | 59e2c87b4b89bf16321b499124d568ac5a19c300 |
| signature |
mingw improvements4 files changed, 40 insertions(+), 20 deletions(-)
src/os.cpp+15-15| ... | ... | @@ -1125,29 +1125,27 @@ Error os_get_cwd(Buf *out_cwd) { |
| 1125 | 1125 | #endif |
| 1126 | 1126 | } |
| 1127 | 1127 | |
| 1128 | #if defined(ZIG_OS_WINDOWS) | |
| 1129 | 1128 | #define is_wprefix(s, prefix) \ |
| 1130 | 1129 | (wcsncmp((s), (prefix), sizeof(prefix) / sizeof(WCHAR) - 1) == 0) |
| 1131 | static bool is_stderr_cyg_pty(void) { | |
| 1132 | HANDLE stderr_handle = GetStdHandle(STD_ERROR_HANDLE); | |
| 1133 | if (stderr_handle == INVALID_HANDLE_VALUE) | |
| 1130 | bool ATTRIBUTE_MUST_USE os_is_cygwin_pty(int fd) { | |
| 1131 | #if defined(ZIG_OS_WINDOWS) | |
| 1132 | HANDLE handle = (HANDLE)_get_osfhandle(fd); | |
| 1133 | ||
| 1134 | // Cygwin/msys's pty is a pipe. | |
| 1135 | if (handle == INVALID_HANDLE_VALUE || GetFileType(handle) != FILE_TYPE_PIPE) { | |
| 1134 | 1136 | return false; |
| 1137 | } | |
| 1135 | 1138 | |
| 1136 | 1139 | int size = sizeof(FILE_NAME_INFO) + sizeof(WCHAR) * MAX_PATH; |
| 1137 | FILE_NAME_INFO *nameinfo; | |
| 1138 | 1140 | WCHAR *p = NULL; |
| 1139 | 1141 | |
| 1140 | // Cygwin/msys's pty is a pipe. | |
| 1141 | if (GetFileType(stderr_handle) != FILE_TYPE_PIPE) { | |
| 1142 | return 0; | |
| 1143 | } | |
| 1144 | nameinfo = (FILE_NAME_INFO *)allocate<char>(size); | |
| 1142 | FILE_NAME_INFO *nameinfo = (FILE_NAME_INFO *)allocate<char>(size); | |
| 1145 | 1143 | if (nameinfo == NULL) { |
| 1146 | return 0; | |
| 1144 | return false; | |
| 1147 | 1145 | } |
| 1148 | 1146 | // Check the name of the pipe: |
| 1149 | 1147 | // '\{cygwin,msys}-XXXXXXXXXXXXXXXX-ptyN-{from,to}-master' |
| 1150 | if (GetFileInformationByHandleEx(stderr_handle, FileNameInfo, nameinfo, size)) { | |
| 1148 | if (GetFileInformationByHandleEx(handle, FileNameInfo, nameinfo, size)) { | |
| 1151 | 1149 | nameinfo->FileName[nameinfo->FileNameLength / sizeof(WCHAR)] = L'\0'; |
| 1152 | 1150 | p = nameinfo->FileName; |
| 1153 | 1151 | if (is_wprefix(p, L"\\cygwin-")) { /* Cygwin */ |
| ... | ... | @@ -1180,12 +1178,14 @@ static bool is_stderr_cyg_pty(void) { |
| 1180 | 1178 | } |
| 1181 | 1179 | free(nameinfo); |
| 1182 | 1180 | return (p != NULL); |
| 1183 | } | |
| 1181 | #else | |
| 1182 | return false; | |
| 1184 | 1183 | #endif |
| 1184 | } | |
| 1185 | 1185 | |
| 1186 | 1186 | bool os_stderr_tty(void) { |
| 1187 | 1187 | #if defined(ZIG_OS_WINDOWS) |
| 1188 | return _isatty(_fileno(stderr)) != 0 || is_stderr_cyg_pty(); | |
| 1188 | return _isatty(fileno(stderr)) != 0 || os_is_cygwin_pty(fileno(stderr)); | |
| 1189 | 1189 | #elif defined(ZIG_OS_POSIX) |
| 1190 | 1190 | return isatty(STDERR_FILENO) != 0; |
| 1191 | 1191 | #else |
| ... | ... | @@ -1486,7 +1486,7 @@ WORD original_console_attributes = FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BL |
| 1486 | 1486 | |
| 1487 | 1487 | void os_stderr_set_color(TermColor color) { |
| 1488 | 1488 | #if defined(ZIG_OS_WINDOWS) |
| 1489 | if (is_stderr_cyg_pty()) { | |
| 1489 | if (os_stderr_tty()) { | |
| 1490 | 1490 | set_color_posix(color); |
| 1491 | 1491 | return; |
| 1492 | 1492 | } |
src/os.hpp+8| ... | ... | @@ -11,6 +11,7 @@ |
| 11 | 11 | #include "list.hpp" |
| 12 | 12 | #include "buffer.hpp" |
| 13 | 13 | #include "error.hpp" |
| 14 | #include "target.hpp" | |
| 14 | 15 | #include "zig_llvm.h" |
| 15 | 16 | #include "windows_sdk.h" |
| 16 | 17 | |
| ... | ... | @@ -88,6 +89,11 @@ struct Termination { |
| 88 | 89 | #define OsFile int |
| 89 | 90 | #endif |
| 90 | 91 | |
| 92 | #if defined(ZIG_OS_WINDOWS) | |
| 93 | #undef fileno | |
| 94 | #define fileno _fileno | |
| 95 | #endif | |
| 96 | ||
| 91 | 97 | struct OsTimeStamp { |
| 92 | 98 | uint64_t sec; |
| 93 | 99 | uint64_t nsec; |
| ... | ... | @@ -152,6 +158,8 @@ Error ATTRIBUTE_MUST_USE os_get_win32_ucrt_include_path(ZigWindowsSDK *sdk, Buf |
| 152 | 158 | Error ATTRIBUTE_MUST_USE os_get_win32_ucrt_lib_path(ZigWindowsSDK *sdk, Buf *output_buf, ZigLLVM_ArchType platform_type); |
| 153 | 159 | Error ATTRIBUTE_MUST_USE os_get_win32_kern32_path(ZigWindowsSDK *sdk, Buf *output_buf, ZigLLVM_ArchType platform_type); |
| 154 | 160 | |
| 161 | bool ATTRIBUTE_MUST_USE os_is_cygwin_pty(int fd); | |
| 162 | ||
| 155 | 163 | Error ATTRIBUTE_MUST_USE os_self_exe_shared_libs(ZigList<Buf *> &paths); |
| 156 | 164 | |
| 157 | 165 | #endif |
src/target.cpp+14-1| ... | ... | @@ -491,6 +491,16 @@ Error target_parse_glibc_version(ZigGLibCVersion *glibc_ver, const char *text) { |
| 491 | 491 | return ErrorNone; |
| 492 | 492 | } |
| 493 | 493 | |
| 494 | static ZigLLVM_EnvironmentType target_get_win32_abi() { | |
| 495 | FILE* files[] = { stdin, stdout, stderr, nullptr }; | |
| 496 | for (int i = 0; files[i] != nullptr; i++) { | |
| 497 | if (os_is_cygwin_pty(fileno(files[i]))) { | |
| 498 | return ZigLLVM_GNU; | |
| 499 | } | |
| 500 | } | |
| 501 | return ZigLLVM_MSVC; | |
| 502 | } | |
| 503 | ||
| 494 | 504 | void get_native_target(ZigTarget *target) { |
| 495 | 505 | // first zero initialize |
| 496 | 506 | *target = {}; |
| ... | ... | @@ -505,6 +515,9 @@ void get_native_target(ZigTarget *target) { |
| 505 | 515 | &target->abi, |
| 506 | 516 | &oformat); |
| 507 | 517 | target->os = get_zig_os_type(os_type); |
| 518 | if (target->os == OsWindows) { | |
| 519 | target->abi = target_get_win32_abi(); | |
| 520 | } | |
| 508 | 521 | target->is_native = true; |
| 509 | 522 | if (target->abi == ZigLLVM_UnknownEnvironment) { |
| 510 | 523 | target->abi = target_default_abi(target->arch, target->os); |
| ... | ... | @@ -1601,7 +1614,7 @@ ZigLLVM_EnvironmentType target_default_abi(ZigLLVM_ArchType arch, Os os) { |
| 1601 | 1614 | return ZigLLVM_GNU; |
| 1602 | 1615 | case OsUefi: |
| 1603 | 1616 | case OsWindows: |
| 1604 | return ZigLLVM_MSVC; | |
| 1617 | return ZigLLVM_MSVC; | |
| 1605 | 1618 | case OsLinux: |
| 1606 | 1619 | case OsWASI: |
| 1607 | 1620 | return ZigLLVM_Musl; |
std/os/windows.zig+3-4| ... | ... | @@ -65,7 +65,7 @@ pub const CreateFileError = error{ |
| 65 | 65 | InvalidUtf8, |
| 66 | 66 | |
| 67 | 67 | /// On Windows, file paths cannot contain these characters: |
| 68 | /// '/', '*', '?', '"', '<', '>', '|' | |
| 68 | /// '*', '?', '"', '<', '>', '|', and '/' (when the ABI is not GNU) | |
| 69 | 69 | BadPathName, |
| 70 | 70 | |
| 71 | 71 | Unexpected, |
| ... | ... | @@ -836,11 +836,10 @@ pub fn sliceToPrefixedSuffixedFileW(s: []const u8, comptime suffix: []const u16) |
| 836 | 836 | // > converting the name to an NT-style name, except when using the "\\?\" |
| 837 | 837 | // > prefix as detailed in the following sections. |
| 838 | 838 | // from https://docs.microsoft.com/en-us/windows/desktop/FileIO/naming-a-file#maximum-path-length-limitation |
| 839 | // Because we want the larger maximum path length for absolute paths, we | |
| 840 | // disallow forward slashes in zig std lib file functions on Windows. | |
| 841 | 839 | for (s) |byte| { |
| 842 | 840 | switch (byte) { |
| 843 | '/', '*', '?', '"', '<', '>', '|' => return error.BadPathName, | |
| 841 | '*', '?', '"', '<', '>', '|' => return error.BadPathName, | |
| 842 | '/' => if (builtin.abi == .msvc) return error.BadPathName, | |
| 844 | 843 | else => {}, |
| 845 | 844 | } |
| 846 | 845 | } |