authorgravatar for emekankurumeh@outlook.comemekoi <emekankurumeh@outlook.com> 2018-09-17 23:13:17-05:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2018-09-18 00:13:17-04:00
log68c1d059178a36add751e97e11cee004cfdf612e
tree4edc229327766abca7b530258977be4b4a51d948
parent13645585fe2904f38d13df12e571ecac5bf9e8e6

compiling on mingw is now supported (#1542)

* compiles on mingw-w64 * fixed error in os_file_overwrite on windows * fixed windows hello_world example

4 files changed, 24 insertions(+), 6 deletions(-)

CMakeLists.txt+3
...@@ -796,6 +796,9 @@ if(MSVC)...@@ -796,6 +796,9 @@ if(MSVC)
796 set(EXE_CFLAGS "${EXE_CFLAGS}")796 set(EXE_CFLAGS "${EXE_CFLAGS}")
797else()797else()
798 set(EXE_CFLAGS "${EXE_CFLAGS} -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -D_GNU_SOURCE -fno-exceptions -fno-rtti -Werror=strict-prototypes -Werror=old-style-definition -Werror=type-limits -Wno-missing-braces")798 set(EXE_CFLAGS "${EXE_CFLAGS} -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -D_GNU_SOURCE -fno-exceptions -fno-rtti -Werror=strict-prototypes -Werror=old-style-definition -Werror=type-limits -Wno-missing-braces")
799 if(MINGW)
800 set(EXE_CFLAGS "${EXE_CFLAGS} -D__USE_MINGW_ANSI_STDIO -Wno-pedantic-ms-format")
801 endif()
799endif()802endif()
800803
801set(BLAKE_CFLAGS "-std=c99")804set(BLAKE_CFLAGS "-std=c99")
example/hello_world/hello_windows.zig+2
...@@ -1,5 +1,7 @@...@@ -1,5 +1,7 @@
1use @import("std").os.windows;1use @import("std").os.windows;
22
3extern "user32" stdcallcc fn MessageBoxA(hWnd: ?HANDLE, lpText: ?LPCTSTR, lpCaption: ?LPCTSTR, uType: UINT) c_int;
4
3export fn WinMain(hInstance: HINSTANCE, hPrevInstance: HINSTANCE, lpCmdLine: PWSTR, nCmdShow: INT) INT {5export fn WinMain(hInstance: HINSTANCE, hPrevInstance: HINSTANCE, lpCmdLine: PWSTR, nCmdShow: INT) INT {
4 _ = MessageBoxA(null, c"hello", c"title", 0);6 _ = MessageBoxA(null, c"hello", c"title", 0);
5 return 0;7 return 0;
src/os.cpp+16-6
...@@ -23,6 +23,14 @@...@@ -23,6 +23,14 @@
23#define WIN32_LEAN_AND_MEAN23#define WIN32_LEAN_AND_MEAN
24#endif24#endif
2525
26#if !defined(_WIN32_WINNT)
27#define _WIN32_WINNT 0x600
28#endif
29
30#if !defined(NTDDI_VERSION)
31#define NTDDI_VERSION 0x06000000
32#endif
33
26#include <windows.h>34#include <windows.h>
27#include <shlobj.h>35#include <shlobj.h>
28#include <io.h>36#include <io.h>
...@@ -1634,16 +1642,16 @@ static Optional<uint32_t> Utf16LeIterator_nextCodepoint(Utf16LeIterator *it) {...@@ -1634,16 +1642,16 @@ static Optional<uint32_t> Utf16LeIterator_nextCodepoint(Utf16LeIterator *it) {
1634 if (it->bytes[it->i] == 0 && it->bytes[it->i + 1] == 0)1642 if (it->bytes[it->i] == 0 && it->bytes[it->i + 1] == 0)
1635 return {};1643 return {};
1636 uint32_t c0 = ((uint32_t)it->bytes[it->i]) | (((uint32_t)it->bytes[it->i + 1]) << 8);1644 uint32_t c0 = ((uint32_t)it->bytes[it->i]) | (((uint32_t)it->bytes[it->i + 1]) << 8);
1637 if (c0 & ~((uint32_t)0x03ff) == 0xd800) {1645 if ((c0 & ~((uint32_t)0x03ff)) == 0xd800) {
1638 // surrogate pair1646 // surrogate pair
1639 it->i += 2;1647 it->i += 2;
1640 assert(it->bytes[it->i] != 0 || it->bytes[it->i + 1] != 0);1648 assert(it->bytes[it->i] != 0 || it->bytes[it->i + 1] != 0);
1641 uint32_t c1 = ((uint32_t)it->bytes[it->i]) | (((uint32_t)it->bytes[it->i + 1]) << 8);1649 uint32_t c1 = ((uint32_t)it->bytes[it->i]) | (((uint32_t)it->bytes[it->i + 1]) << 8);
1642 assert(c1 & ~((uint32_t)0x03ff) == 0xdc00);1650 assert((c1 & ~((uint32_t)0x03ff)) == 0xdc00);
1643 it->i += 2;1651 it->i += 2;
1644 return Optional<uint32_t>::some(0x10000 + (((c0 & 0x03ff) << 10) | (c1 & 0x03ff)));1652 return Optional<uint32_t>::some(0x10000 + (((c0 & 0x03ff) << 10) | (c1 & 0x03ff)));
1645 } else {1653 } else {
1646 assert(c0 & ~((uint32_t)0x03ff) != 0xdc00);1654 assert((c0 & ~((uint32_t)0x03ff)) != 0xdc00);
1647 it->i += 2;1655 it->i += 2;
1648 return Optional<uint32_t>::some(c0);1656 return Optional<uint32_t>::some(c0);
1649 }1657 }
...@@ -1714,7 +1722,7 @@ static void utf16le_ptr_to_utf8(Buf *out, WCHAR *utf16le) {...@@ -1714,7 +1722,7 @@ static void utf16le_ptr_to_utf8(Buf *out, WCHAR *utf16le) {
1714// Ported from std.os.getAppDataDir1722// Ported from std.os.getAppDataDir
1715Error os_get_app_data_dir(Buf *out_path, const char *appname) {1723Error os_get_app_data_dir(Buf *out_path, const char *appname) {
1716#if defined(ZIG_OS_WINDOWS)1724#if defined(ZIG_OS_WINDOWS)
1717 Error err;1725 // Error err;
1718 WCHAR *dir_path_ptr;1726 WCHAR *dir_path_ptr;
1719 switch (SHGetKnownFolderPath(FOLDERID_LocalAppData, KF_FLAG_CREATE, nullptr, &dir_path_ptr)) {1727 switch (SHGetKnownFolderPath(FOLDERID_LocalAppData, KF_FLAG_CREATE, nullptr, &dir_path_ptr)) {
1720 case S_OK:1728 case S_OK:
...@@ -1928,7 +1936,8 @@ Error os_file_mtime(OsFile file, OsTimeStamp *mtime) {...@@ -1928,7 +1936,8 @@ Error os_file_mtime(OsFile file, OsTimeStamp *mtime) {
1928 FILETIME last_write_time;1936 FILETIME last_write_time;
1929 if (!GetFileTime(file, nullptr, nullptr, &last_write_time))1937 if (!GetFileTime(file, nullptr, nullptr, &last_write_time))
1930 return ErrorUnexpected;1938 return ErrorUnexpected;
1931 mtime->sec = last_write_time.dwLowDateTime | (last_write_time.dwHighDateTime << 32);1939 // mtime->sec = last_write_time.dwLowDateTime | (last_write_time.dwHighDateTime << 32);
1940 mtime->sec = (((ULONGLONG) last_write_time.dwHighDateTime) << 32) + last_write_time.dwLowDateTime;
1932 mtime->nsec = 0;1941 mtime->nsec = 0;
1933 return ErrorNone;1942 return ErrorNone;
1934#elif defined(ZIG_OS_LINUX)1943#elif defined(ZIG_OS_LINUX)
...@@ -2007,11 +2016,12 @@ Error os_file_read_all(OsFile file, Buf *contents) {...@@ -2007,11 +2016,12 @@ Error os_file_read_all(OsFile file, Buf *contents) {
20072016
2008Error os_file_overwrite(OsFile file, Buf *contents) {2017Error os_file_overwrite(OsFile file, Buf *contents) {
2009#if defined(ZIG_OS_WINDOWS)2018#if defined(ZIG_OS_WINDOWS)
2019 DWORD bytes_written;
2010 if (SetFilePointer(file, 0, nullptr, FILE_BEGIN) == INVALID_SET_FILE_POINTER)2020 if (SetFilePointer(file, 0, nullptr, FILE_BEGIN) == INVALID_SET_FILE_POINTER)
2011 return ErrorFileSystem;2021 return ErrorFileSystem;
2012 if (!SetEndOfFile(file))2022 if (!SetEndOfFile(file))
2013 return ErrorFileSystem;2023 return ErrorFileSystem;
2014 if (!WriteFile(file, buf_ptr(contents), buf_len(contents), nullptr, nullptr))2024 if (!WriteFile(file, buf_ptr(contents), buf_len(contents), &bytes_written, nullptr))
2015 return ErrorFileSystem;2025 return ErrorFileSystem;
2016 return ErrorNone;2026 return ErrorNone;
2017#else2027#else
src/windows_com.hpp+3
...@@ -28,6 +28,9 @@...@@ -28,6 +28,9 @@
28#include <io.h> 28#include <io.h>
29#include <shellapi.h> 29#include <shellapi.h>
30 30
31// Standard headers
32#include <stdio.h>
33
31// COM support header files 34// COM support header files
32#include <comdef.h> 35#include <comdef.h>
33 36