From 459502e48ccb6607e531112e7ae89f62b75023c8 Mon Sep 17 00:00:00 2001
From: darkf <lw9k123@gmail.com>
Date: Fri, 28 Nov 2014 21:38:20 -0800
Subject: [PATCH 1/3] Fix MinGW build

---
 src/citra/CMakeLists.txt                      |  5 +++-
 src/common/common.h                           |  4 +++-
 src/common/common_funcs.h                     |  8 +++----
 src/common/log.h                              |  8 +++----
 src/common/msg_handler.h                      |  2 +-
 src/common/platform.h                         |  4 ++++
 src/common/string_util.cpp                    |  6 ++---
 src/common/thread.cpp                         | 23 ++++++++++++-------
 .../arm/dyncom/arm_dyncom_interpreter.cpp     |  4 ++++
 9 files changed, 42 insertions(+), 22 deletions(-)

diff --git a/src/citra/CMakeLists.txt b/src/citra/CMakeLists.txt
index f2add394fb..c4cbf9feab 100644
--- a/src/citra/CMakeLists.txt
+++ b/src/citra/CMakeLists.txt
@@ -19,12 +19,15 @@ endif()
 
 add_executable(citra ${SRCS} ${HEADERS})
 target_link_libraries(citra core common video_core)
-target_link_libraries(citra ${OPENGL_gl_LIBRARY} ${GLFW_LIBRARIES} inih)
+target_link_libraries(citra ${GLFW_LIBRARIES} ${OPENGL_gl_LIBRARY} inih)
 
 if (APPLE)
     target_link_libraries(citra iconv pthread ${COREFOUNDATION_LIBRARY})
 elseif (WIN32)
     target_link_libraries(citra winmm)
+    if (MINGW)
+        target_link_libraries(citra iconv)
+    endif()    
 else() # Unix
     target_link_libraries(citra pthread rt)
     target_link_libraries(citra ${X11_X11_LIB} ${X11_Xi_LIB} ${X11_Xcursor_LIB} ${X11_Xrandr_LIB} ${X11_xv86vmode_LIB})
diff --git a/src/common/common.h b/src/common/common.h
index 9f3016d347..0d79346225 100644
--- a/src/common/common.h
+++ b/src/common/common.h
@@ -50,11 +50,13 @@ private:
 #elif defined _WIN32
 
 // Check MSC ver
-    #if !defined _MSC_VER || _MSC_VER <= 1000
+    #if defined _MSC_VER && _MSC_VER <= 1000
         #error needs at least version 1000 of MSC
     #endif
 
+    #ifndef NOMINMAX
     #define NOMINMAX
+    #endif
 
 // Memory leak checks
     #define CHECK_HEAP_INTEGRITY()
diff --git a/src/common/common_funcs.h b/src/common/common_funcs.h
index d84ec4c42d..ddf3958cce 100644
--- a/src/common/common_funcs.h
+++ b/src/common/common_funcs.h
@@ -28,7 +28,7 @@ template<> struct CompileTimeAssert<true> {};
 
 #define ARRAY_SIZE(a) (sizeof(a) / sizeof(a[0]))
 
-#ifndef _WIN32
+#ifndef _MSC_VER
 
 #include <errno.h>
 #ifdef __linux__
@@ -72,7 +72,7 @@ inline u64 _rotr64(u64 x, unsigned int shift){
     return (x >> n) | (x << (64 - n));
 }
 
-#else // WIN32
+#else // _MSC_VER
 // Function Cross-Compatibility
     #define strcasecmp _stricmp
     #define strncasecmp _strnicmp
@@ -135,7 +135,7 @@ extern "C" {
 }
         #define Crash() {DebugBreak();}
     #endif // M_IX86
-#endif // WIN32 ndef
+#endif // _MSC_VER ndef
 
 // Dolphin's min and max functions
 #undef min
@@ -163,7 +163,7 @@ inline u32 swap24(const u8* _data) {return (_data[0] << 16) | (_data[1] << 8) |
 #undef swap64
 #endif
 
-#ifdef _WIN32
+#ifdef _MSC_VER
 inline u16 swap16(u16 _data) {return _byteswap_ushort(_data);}
 inline u32 swap32(u32 _data) {return _byteswap_ulong (_data);}
 inline u64 swap64(u64 _data) {return _byteswap_uint64(_data);}
diff --git a/src/common/log.h b/src/common/log.h
index 14ad98c08c..4c96ef0a63 100644
--- a/src/common/log.h
+++ b/src/common/log.h
@@ -104,7 +104,7 @@ void GenericLog(LOGTYPES_LEVELS level, LOGTYPES_TYPE type, const char*file, int
 #endif // loglevel
 #endif // logging
 
-#ifdef _WIN32
+#ifdef MSVC_VER
 #ifndef __func__
 #define __func__ __FUNCTION__
 #endif
@@ -149,17 +149,17 @@ void GenericLog(LOGTYPES_LEVELS level, LOGTYPES_TYPE type, const char*file, int
 #define _assert_(_a_) _dbg_assert_(MASTER_LOG, _a_)
 
 #ifndef GEKKO
-#ifdef _WIN32
+#ifdef MSVC_VER
 #define _assert_msg_(_t_, _a_, _fmt_, ...)        \
     if (!(_a_)) {\
         if (!PanicYesNo(_fmt_, __VA_ARGS__)) {Crash();} \
     }
-#else // not win32
+#else // not msvc
 #define _assert_msg_(_t_, _a_, _fmt_, ...)        \
     if (!(_a_)) {\
         if (!PanicYesNo(_fmt_, ##__VA_ARGS__)) {Crash();} \
     }
-#endif // WIN32
+#endif // MSVC_VER
 #else // GEKKO
 #define _assert_msg_(_t_, _a_, _fmt_, ...)
 #endif
diff --git a/src/common/msg_handler.h b/src/common/msg_handler.h
index 9bfdf950e3..a1db89aa32 100644
--- a/src/common/msg_handler.h
+++ b/src/common/msg_handler.h
@@ -30,7 +30,7 @@ extern bool MsgAlert(bool yes_no, int Style, const char* format, ...)
 void SetEnableAlert(bool enable);
 
 #ifndef GEKKO
-#ifdef _WIN32
+#ifdef MSVC_VER
     #define SuccessAlert(format, ...) MsgAlert(false, INFORMATION, format, __VA_ARGS__)
     #define PanicAlert(format, ...) MsgAlert(false, WARNING, format, __VA_ARGS__)
     #define PanicYesNo(format, ...) MsgAlert(true, WARNING, format, __VA_ARGS__)
diff --git a/src/common/platform.h b/src/common/platform.h
index d9f095433c..7d123caa03 100644
--- a/src/common/platform.h
+++ b/src/common/platform.h
@@ -71,14 +71,18 @@
 
 #include <time.h>
 
+#ifndef NOMINMAX
 #define NOMINMAX
+#endif
 #define EMU_FASTCALL __fastcall
 
+#ifdef _MSVC_VER
 inline struct tm* localtime_r(const time_t *clock, struct tm *result) {
     if (localtime_s(result, clock) == 0)
         return result;
     return NULL;
 }
+#endif
 
 #else
 
diff --git a/src/common/string_util.cpp b/src/common/string_util.cpp
index dcec9275f0..1ca2dfb39d 100644
--- a/src/common/string_util.cpp
+++ b/src/common/string_util.cpp
@@ -7,7 +7,7 @@
 #include "common/common.h"
 #include "common/string_util.h"
 
-#ifdef _WIN32
+#ifdef MSVC_VER
     #include <Windows.h>
     #include <codecvt>
 #else
@@ -45,7 +45,7 @@ bool CharArrayFromFormatV(char* out, int outsize, const char* format, va_list ar
 {
     int writtenCount;
 
-#ifdef _WIN32
+#ifdef MSVC_VER
     // You would think *printf are simple, right? Iterate on each character,
     // if it's a format specifier handle it properly, etc.
     //
@@ -410,7 +410,7 @@ std::string UriEncode(const std::string & sSrc)
     return sResult;
 }
 
-#ifdef _WIN32
+#ifdef MSVC_VER
 
 std::string UTF16ToUTF8(const std::u16string& input)
 {
diff --git a/src/common/thread.cpp b/src/common/thread.cpp
index dc153ba718..6eeda08287 100644
--- a/src/common/thread.cpp
+++ b/src/common/thread.cpp
@@ -17,7 +17,7 @@ namespace Common
 
 int CurrentThreadId()
 {
-#ifdef _WIN32
+#ifdef MSVC_VER
     return GetCurrentThreadId();
 #elif defined __APPLE__
     return mach_thread_self();
@@ -27,6 +27,14 @@ int CurrentThreadId()
 }
 
 #ifdef _WIN32
+// Supporting functions
+void SleepCurrentThread(int ms)
+{
+    Sleep(ms);
+}
+#endif
+
+#ifdef MSVC_VER
 
 void SetThreadAffinity(std::thread::native_handle_type thread, u32 mask)
 {
@@ -38,12 +46,6 @@ void SetCurrentThreadAffinity(u32 mask)
     SetThreadAffinityMask(GetCurrentThread(), mask);
 }
 
-// Supporting functions
-void SleepCurrentThread(int ms)
-{
-    Sleep(ms);
-}
-
 void SwitchCurrentThread()
 {
     SwitchToThread();
@@ -82,7 +84,7 @@ void SetCurrentThreadName(const char* szThreadName)
     {}
 }
 
-#else // !WIN32, so must be POSIX threads
+#else // !MSVC_VER, so must be POSIX threads
 
 void SetThreadAffinity(std::thread::native_handle_type thread, u32 mask)
 {
@@ -106,6 +108,7 @@ void SetCurrentThreadAffinity(u32 mask)
     SetThreadAffinity(pthread_self(), mask);
 }
 
+#ifndef _WIN32
 void SleepCurrentThread(int ms)
 {
     usleep(1000 * ms);
@@ -115,7 +118,10 @@ void SwitchCurrentThread()
 {
     usleep(1000 * 1);
 }
+#endif
 
+// MinGW with the POSIX threading model does not support pthread_setname_np
+#if !defined(_WIN32) || defined(MSVC_VER)
 void SetCurrentThreadName(const char* szThreadName)
 {
 #ifdef __APPLE__
@@ -126,6 +132,7 @@ void SetCurrentThreadName(const char* szThreadName)
     pthread_setname_np(pthread_self(), szThreadName);
 #endif
 }
+#endif
 
 #endif
 
diff --git a/src/core/arm/dyncom/arm_dyncom_interpreter.cpp b/src/core/arm/dyncom/arm_dyncom_interpreter.cpp
index f899e2e8a3..0a5c7ee6e5 100644
--- a/src/core/arm/dyncom/arm_dyncom_interpreter.cpp
+++ b/src/core/arm/dyncom/arm_dyncom_interpreter.cpp
@@ -34,6 +34,10 @@
 
 using namespace std;
 
+#ifdef _WIN32
+#undef __WIN32__
+#endif
+
 #include "core/arm/skyeye_common/armdefs.h"
 #include "core/arm/skyeye_common/armmmu.h"
 #include "arm_dyncom_thumb.h"

From a19354acedbfeafd28219c48a1ec32f76dd17a54 Mon Sep 17 00:00:00 2001
From: darkf <lw9k123@gmail.com>
Date: Fri, 28 Nov 2014 21:50:50 -0800
Subject: [PATCH 2/3] Add comment regarding __WIN32__ in SkyEye code

---
 src/core/arm/dyncom/arm_dyncom_interpreter.cpp | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/src/core/arm/dyncom/arm_dyncom_interpreter.cpp b/src/core/arm/dyncom/arm_dyncom_interpreter.cpp
index 0a5c7ee6e5..37925e8a85 100644
--- a/src/core/arm/dyncom/arm_dyncom_interpreter.cpp
+++ b/src/core/arm/dyncom/arm_dyncom_interpreter.cpp
@@ -34,6 +34,10 @@
 
 using namespace std;
 
+// __WIN32__ was never defined on MSVC, but it is on MinGW,
+// so we need to remove it.
+// #ifdefs to __WIN32__ are dead code and will not even compile
+// anymore, due to bank_defs.h missing.
 #ifdef _WIN32
 #undef __WIN32__
 #endif

From 5d10b212ecebb15fb1463edc08c725d8e29fa44a Mon Sep 17 00:00:00 2001
From: darkf <lw9k123@gmail.com>
Date: Mon, 29 Dec 2014 19:59:14 -0800
Subject: [PATCH 3/3] Fix MSVC-related #defines and add CMakeLists comment

---
 src/citra/CMakeLists.txt   | 2 +-
 src/common/log.h           | 4 ++--
 src/common/msg_handler.h   | 2 +-
 src/common/platform.h      | 2 +-
 src/common/string_util.cpp | 6 +++---
 src/common/thread.cpp      | 6 +++---
 6 files changed, 11 insertions(+), 11 deletions(-)

diff --git a/src/citra/CMakeLists.txt b/src/citra/CMakeLists.txt
index 0e03212d7f..dc5e04bfc1 100644
--- a/src/citra/CMakeLists.txt
+++ b/src/citra/CMakeLists.txt
@@ -24,7 +24,7 @@ if (APPLE)
     target_link_libraries(citra iconv ${COREFOUNDATION_LIBRARY})
 elseif (WIN32)
     target_link_libraries(citra winmm)
-    if (MINGW)
+    if (MINGW) # GCC does not support codecvt, so use iconv instead
         target_link_libraries(citra iconv)
     endif()    
 else() # Unix
diff --git a/src/common/log.h b/src/common/log.h
index c6a0235520..667f2fbb94 100644
--- a/src/common/log.h
+++ b/src/common/log.h
@@ -8,7 +8,7 @@
 #include "common/msg_handler.h"
 #include "common/logging/log.h"
 
-#ifdef MSVC_VER
+#ifdef _MSC_VER
 #ifndef __func__
 #define __func__ __FUNCTION__
 #endif
@@ -40,7 +40,7 @@
 #define _assert_(_a_) _dbg_assert_(MASTER_LOG, _a_)
 
 #ifndef GEKKO
-#ifdef _WIN32
+#ifdef _MSC_VER
 #define _assert_msg_(_t_, _a_, _fmt_, ...)        \
     if (!(_a_)) {\
         if (!PanicYesNo(_fmt_, __VA_ARGS__)) {Crash();} \
diff --git a/src/common/msg_handler.h b/src/common/msg_handler.h
index b4f3807826..5a483ddb41 100644
--- a/src/common/msg_handler.h
+++ b/src/common/msg_handler.h
@@ -30,7 +30,7 @@ extern bool MsgAlert(bool yes_no, int Style, const char* format, ...)
 void SetEnableAlert(bool enable);
 
 #ifndef GEKKO
-#ifdef MSVC_VER
+#ifdef _MSC_VER
     #define SuccessAlert(format, ...) MsgAlert(false, INFORMATION, format, __VA_ARGS__)
     #define PanicAlert(format, ...) MsgAlert(false, WARNING, format, __VA_ARGS__)
     #define PanicYesNo(format, ...) MsgAlert(true, WARNING, format, __VA_ARGS__)
diff --git a/src/common/platform.h b/src/common/platform.h
index ce5550520f..ce9cfd4a2b 100644
--- a/src/common/platform.h
+++ b/src/common/platform.h
@@ -76,7 +76,7 @@
 #endif
 #define EMU_FASTCALL __fastcall
 
-#ifdef _MSVC_VER
+#ifdef _MSC_VER
 inline struct tm* localtime_r(const time_t *clock, struct tm *result) {
     if (localtime_s(result, clock) == 0)
         return result;
diff --git a/src/common/string_util.cpp b/src/common/string_util.cpp
index 0dd2d2349c..b3b772bd9b 100644
--- a/src/common/string_util.cpp
+++ b/src/common/string_util.cpp
@@ -7,7 +7,7 @@
 #include "common/common.h"
 #include "common/string_util.h"
 
-#ifdef MSVC_VER
+#ifdef _MSC_VER
     #include <Windows.h>
     #include <codecvt>
 #else
@@ -45,7 +45,7 @@ bool CharArrayFromFormatV(char* out, int outsize, const char* format, va_list ar
 {
     int writtenCount;
 
-#ifdef MSVC_VER
+#ifdef _MSC_VER
     // You would think *printf are simple, right? Iterate on each character,
     // if it's a format specifier handle it properly, etc.
     //
@@ -410,7 +410,7 @@ std::string UriEncode(const std::string & sSrc)
     return sResult;
 }
 
-#ifdef MSVC_VER
+#ifdef _MSC_VER
 
 std::string UTF16ToUTF8(const std::u16string& input)
 {
diff --git a/src/common/thread.cpp b/src/common/thread.cpp
index 04e33101b6..8bf0058574 100644
--- a/src/common/thread.cpp
+++ b/src/common/thread.cpp
@@ -17,7 +17,7 @@ namespace Common
 
 int CurrentThreadId()
 {
-#ifdef MSVC_VER
+#ifdef _MSC_VER
     return GetCurrentThreadId();
 #elif defined __APPLE__
     return mach_thread_self();
@@ -34,7 +34,7 @@ void SleepCurrentThread(int ms)
 }
 #endif
 
-#ifdef MSVC_VER
+#ifdef _MSC_VER
 
 void SetThreadAffinity(std::thread::native_handle_type thread, u32 mask)
 {
@@ -121,7 +121,7 @@ void SwitchCurrentThread()
 #endif
 
 // MinGW with the POSIX threading model does not support pthread_setname_np
-#if !defined(_WIN32) || defined(MSVC_VER)
+#if !defined(_WIN32) || defined(_MSC_VER)
 void SetCurrentThreadName(const char* szThreadName)
 {
 #ifdef __APPLE__