diff --git a/CMake/FindSDL2.cmake b/CMake/FindSDL2.cmake index 1bb419f7f..acde1a993 100644 --- a/CMake/FindSDL2.cmake +++ b/CMake/FindSDL2.cmake @@ -214,6 +214,8 @@ if(SDL2_FOUND) set(SDL2MAIN_LIBRARIES SDL2::SDL2main_real ${SDL2MAIN_LIBRARIES}) endif() if(MINGW) + # Bugfix + set(SDL2MAIN_LIBRARIES -Wl,--whole-archive ${SDL2MAIN_LIBRARIES} -Wl,--no-whole-archive) # MinGW requires some additional libraries to appear earlier in the link line. if(SDL2PC_LIBRARIES) # Use pkgconfig-suggested extra libraries if available. diff --git a/CMake/mingwcc.cmake b/CMake/mingwcc.cmake index c00643837..3e592e994 100644 --- a/CMake/mingwcc.cmake +++ b/CMake/mingwcc.cmake @@ -2,8 +2,14 @@ SET(CROSS_PREFIX "/usr" CACHE STRING "crosstool-NG prefix") SET(CMAKE_SYSTEM_NAME Windows) -SET(CMAKE_C_COMPILER "${CROSS_PREFIX}/i686-w64-mingw32/bin/i686-w64-mingw32-gcc") -SET(CMAKE_CXX_COMPILER "${CROSS_PREFIX}/i686-w64-mingw32/bin/i686-w64-mingw32-g++") +# workaround +list(APPEND CMAKE_CXX_IMPLICIT_INCLUDE_DIRECTORIES "${CROSS_PREFIX}/i686-w64-mingw32/include") + +set(ASAN OFF) +set(DIST ON) + +SET(CMAKE_C_COMPILER "i686-w64-mingw32-gcc") +SET(CMAKE_CXX_COMPILER "i686-w64-mingw32-g++") SET(CMAKE_FIND_ROOT_PATH "${CROSS_PREFIX}/i686-w64-mingw32" "${CROSS_PREFIX}/i686-w64-mingw32/i686-w64-mingw32") diff --git a/CMakeLists.txt b/CMakeLists.txt index 0d0a181a0..28a2cc4dc 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -217,6 +217,7 @@ endif() if(WIN32) target_link_libraries(devilutionx PRIVATE wsock32 ws2_32 wininet) + target_compile_options(devilution PUBLIC $<$:-gstabs>) endif() # Note: In Debug mode, GCC generates spurious memory references that upset Valgrind, diff --git a/README.md b/README.md index 5360d4fae..603d118cb 100644 --- a/README.md +++ b/README.md @@ -63,11 +63,12 @@ Install the dependencies using [Homebrew](https://brew.sh/): brew install cmake sdl2_mixer sdl2_ttf libsodium pkg-config ``` -### Cross-compiling using MinGW (work in progress, does not yet compile) -Use the following cmake invocation: +### Cross-compiling using MinGW (work in progress, currently crashes) +You `PATH` must contain `i686-w64-mingw32-gcc` and `i686-w64-mingw32-gcc`. Use the following cmake invocation: ``` -cmake -DCMAKE_TOOLCHAIN_FILE=../CMake/mingwcc.cmake -DCROSS_PREFIX=/path/to/crosstool-NG/prefix .. +cmake -DCMAKE_TOOLCHAIN_FILE=../CMake/mingwcc.cmake .. ``` +Use `-DCROSS_PREFIX=/path/to/prefix` if the `i686-w64-mingw32` directory is not in `/usr`. Now run the following commands: ``` diff --git a/SourceS/miniwin.h b/SourceS/miniwin.h index fa0157138..39d5f2d6e 100644 --- a/SourceS/miniwin.h +++ b/SourceS/miniwin.h @@ -1,7 +1,6 @@ #pragma once #include -#include #include // work around https://reviews.llvm.org/D51265 #ifdef __APPLE__ @@ -13,11 +12,11 @@ #include #include #include -#include #include -#include // For _rotr() +#ifdef DEVILUTION_ENGINE #include +#endif // Constants #define CONST const diff --git a/SourceS/miniwin_com.h b/SourceS/miniwin_com.h index 95e755397..b3611f3b8 100644 --- a/SourceS/miniwin_com.h +++ b/SourceS/miniwin_com.h @@ -12,6 +12,13 @@ namespace dvl { #pragma push_macro("THIS") #pragma push_macro("PURE") #pragma push_macro("REFIID") +#undef DECLARE_INTERFACE_ +#undef STDMETHOD +#undef STDMETHOD_ +#undef THIS_ +#undef THIS +#undef PURE +#undef REFIID #endif // diff --git a/SourceS/miniwin_macro.h b/SourceS/miniwin_macro.h index 12b2e7619..55e3b4e78 100644 --- a/SourceS/miniwin_macro.h +++ b/SourceS/miniwin_macro.h @@ -236,3 +236,5 @@ #define OF_EXIST 1 #define MAKEINTRESOURCE DVL_MAKEINTRESOURCE + +#define _finddata_t DVL_finddata_t diff --git a/SourceS/miniwin_misc.h b/SourceS/miniwin_misc.h index ffd5eac4f..013327ff5 100644 --- a/SourceS/miniwin_misc.h +++ b/SourceS/miniwin_misc.h @@ -195,7 +195,7 @@ typedef struct tagWNDCLASSEXA { typedef unsigned long _fsize_t; /* Could be 64 bits for Win32 */ -struct _finddata_t { +struct DVL_finddata_t { unsigned attrib; time_t time_create; /* -1 for FAT file systems */ time_t time_access; /* -1 for FAT file systems */ @@ -298,8 +298,8 @@ HGDIOBJ GetStockObject(int i); HCURSOR LoadCursorA(HINSTANCE hInstance, LPCSTR lpCursorName); BOOL GetUserNameA(LPSTR lpBuffer, LPDWORD pcbBuffer); void GetLocalTime(LPSYSTEMTIME lpSystemTime); -long __cdecl _findfirst(const char *, struct _finddata_t *); -int __cdecl _findnext(long, struct _finddata_t *); +long __cdecl _findfirst(const char *, struct DVL_finddata_t *); +int __cdecl _findnext(long, struct DVL_finddata_t *); HICON LoadIconA(HINSTANCE hInstance, LPCSTR lpIconName); HANDLE LoadImageA(HINSTANCE hInst, LPCSTR name, UINT type, int cx, int cy, UINT fuLoad); diff --git a/SourceX/dvlnet/udp_p2p.cpp b/SourceX/dvlnet/udp_p2p.cpp index a2971f580..74271042a 100644 --- a/SourceX/dvlnet/udp_p2p.cpp +++ b/SourceX/dvlnet/udp_p2p.cpp @@ -59,7 +59,7 @@ int udp_p2p::join(std::string addrstr, std::string passwd) recv(); if (plr_self != PLR_BROADCAST) break; // join successful - sleep(1); + SDL_Delay(1000); } } return (plr_self == PLR_BROADCAST ? 4 : plr_self); diff --git a/SourceX/miniwin.cpp b/SourceX/miniwin.cpp index 05483a6ec..639693b4f 100644 --- a/SourceX/miniwin.cpp +++ b/SourceX/miniwin.cpp @@ -3,6 +3,8 @@ #include #endif +#include + namespace dvl { DWORD last_error; @@ -69,7 +71,7 @@ DWORD GetTickCount() void Sleep(DWORD dwMilliseconds) { - usleep(dwMilliseconds * 1000); + SDL_Delay(dwMilliseconds); } HANDLE FindFirstFileA(LPCSTR lpFileName, LPWIN32_FIND_DATAA lpFindFileData) @@ -419,13 +421,13 @@ void GetLocalTime(LPSYSTEMTIME lpSystemTime) UNIMPLEMENTED(); } -long _findfirst(const char *, struct _finddata_t *) +long _findfirst(const char *, struct DVL_finddata_t *) { UNIMPLEMENTED(); return -1; } -int _findnext(long, struct _finddata_t *) +int _findnext(long, struct DVL_finddata_t *) { UNIMPLEMENTED(); return -1; diff --git a/SourceX/miniwin_io.cpp b/SourceX/miniwin_io.cpp index 1549bee2c..035160ce9 100644 --- a/SourceX/miniwin_io.cpp +++ b/SourceX/miniwin_io.cpp @@ -1,5 +1,9 @@ #include "pch.h" +#include +#include +#include + namespace dvl { extern "C" void TranslateFileName(char *dst, int dstLen, const char *src) diff --git a/SourceX/storm.cpp b/SourceX/storm.cpp index 130369a16..a4f1baee2 100644 --- a/SourceX/storm.cpp +++ b/SourceX/storm.cpp @@ -2,6 +2,8 @@ #include "../3rdParty/libsmacker/smacker.h" #include "pch.h" +#include + namespace dvl { extern "C" DWORD nLastError = 0;