From 31c717f9e8269f73fb4cd59682bba3177032f98f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Deuc=D0=B5?= <shurd@sasktel.net>
Date: Sat, 20 Mar 2021 15:38:52 -0400
Subject: [PATCH] Add support for MinGW-w64

MinGW32 is getting long in the tooth and is missing a lot of modern
Windows features as well as having broken headers.  Most people will
be using MinGW-w64 at this point, so add support for it.  Once I
ensure SyncTERM works properly with it, MinGW32 support will be
discontinued.

I suspect this will impact exactly zero people since the reason this
exists is to build the Win32 versions of SyncTERM on FreeBSD.

Changes:
- Explicitly request 32-bit Windows output
- Detect the string "mingw32" anywhere in the hardware description
- Explicitly link with libuuid
- Add a terrible hack to syncterm.c to block wincrypt.h
---
 3rdp/build/GNUmakefile            |  5 +++--
 3rdp/build/cl-mingw-add-m32.patch | 17 +++++++++++++++++
 src/build/Common.gmake            |  6 ++++--
 src/conio/GNUmakefile             |  2 +-
 src/syncterm/GNUmakefile          |  4 ++++
 src/syncterm/syncterm.c           |  7 ++++++-
 6 files changed, 35 insertions(+), 6 deletions(-)
 create mode 100644 3rdp/build/cl-mingw-add-m32.patch

diff --git a/3rdp/build/GNUmakefile b/3rdp/build/GNUmakefile
index 8f21d156b1..4b8537726c 100644
--- a/3rdp/build/GNUmakefile
+++ b/3rdp/build/GNUmakefile
@@ -81,7 +81,7 @@ $(CRYPT_SRC): | $(3RDPSRCDIR)
 $(CRYPT_IDIR): | $(3RDPODIR)
 	$(QUIET)$(IFNOTEXIST) mkdir $(CRYPT_IDIR)
 
-$(CRYPTLIB_BUILD): $(3RDP_ROOT)$(DIRSEP)dist/cryptlib.zip $(3RDP_ROOT)$(DIRSEP)build/terminal-params.patch $(3RDP_ROOT)$(DIRSEP)build/cl-mingw32-static.patch $(3RDP_ROOT)$(DIRSEP)build/cl-ranlib.patch $(3RDP_ROOT)$(DIRSEP)build/cl-win32-noasm.patch $(3RDP_ROOT)$(DIRSEP)build/cl-zz-country.patch $(3RDP_ROOT)$(DIRSEP)build/cl-algorithms.patch $(3RDP_ROOT)$(DIRSEP)build/cl-allow-duplicate-ext.patch $(3RDP_ROOT)$(DIRSEP)build/cl-macosx-minver.patch $(3RDP_ROOT)$(DIRSEP)build/cl-endian.patch $(3RDP_ROOT)$(DIRSEP)build/cl-cryptodev.patch $(3RDP_ROOT)$(DIRSEP)build/cl-posix-me-gently.patch $(3RDP_ROOT)$(DIRSEP)build/cl-tpm-linux.patch $(3RDP_ROOT)$(DIRSEP)build/cl-PAM-noprompts.patch $(3RDP_ROOT)$(DIRSEP)build/cl-zlib.patch $(3RDP_ROOT)$(DIRSEP)build/Dynamic-linked-static-lib.patch $(3RDP_ROOT)$(DIRSEP)build/SSL-fix.patch $(3RDP_ROOT)$(DIRSEP)build/cl-bigger-maxattribute.patch $(3RDP_ROOT)$(DIRSEP)build/cl-vcxproj.patch $(3RDP_ROOT)$(DIRSEP)build/cl-mingw-vcver.patch $(3RDP_ROOT)$(DIRSEP)build/cl-win32-build-fix.patch $(3RDP_ROOT)$(DIRSEP)build/cl-gcc-non-const-time-val.patch $(3RDP_ROOT)$(DIRSEP)build/cl-no-odbc.patch $(3RDP_ROOT)$(DIRSEP)build/cl-noasm-defines.patch $(3RDP_ROOT)$(DIRSEP)build/cl-bn-noasm64-fix.patch $(3RDP_ROOT)$(DIRSEP)build/cl-no-RSA-suites.patch $(3RDP_ROOT)$(DIRSEP)build/cl-fix-ECC-RSA.patch $(3RDP_ROOT)$(DIRSEP)build/cl-prefer-ECC.patch $(3RDP_ROOT)$(DIRSEP)build/cl-prefer-ECC-harder.patch $(3RDP_ROOT)$(DIRSEP)build/cl-more-RSA-ECC-fixes.patch $(3RDP_ROOT)$(DIRSEP)build/cl-DH-key-init.patch $(3RDP_ROOT)$(DIRSEP)build/cl-clear-GCM-flag.patch $(3RDP_ROOT)$(DIRSEP)build/cl-use-ssh-ctr.patch $(3RDP_ROOT)$(DIRSEP)build/cl-ssh-list-ctr-modes.patch $(3RDP_ROOT)$(DIRSEP)build/cl-ssh-incCtr.patch $(3RDP_ROOT)$(DIRSEP)build/cl-ssl-suite-blocksizes.patch $(3RDP_ROOT)$(DIRSEP)build/cl-no-tpm.patch $(3RDP_ROOT)$(DIRSEP)build/cl-no-via-aes.patch $(3RDP_ROOT)$(DIRSEP)build/cl-fix-ssh-ecc-ephemeral.patch $(3RDP_ROOT)$(DIRSEP)/build/cl-just-use-cc.patch $(3RDP_ROOT)$(DIRSEP)/build/cl-learn-numbers.patch $(3RDP_ROOT)$(DIRSEP)/build/cl-no-safe-stack.patch $(3RDP_ROOT)$(DIRSEP)/build/cl-allow-pkcs12.patch $(3RDP_ROOT)$(DIRSEP)/build/cl-uint64_t-redefine.patch $(3RDP_ROOT)$(DIRSEP)/build/cl-random-openbsd.patch $(3RDP_ROOT)$(DIRSEP)/build/cl-openbsd-threads.patch $(3RDP_ROOT)$(DIRSEP)/build/cl-allow-none-auth.patch | $(CRYPT_SRC) $(CRYPT_IDIR)
+$(CRYPTLIB_BUILD): $(3RDP_ROOT)$(DIRSEP)dist/cryptlib.zip $(3RDP_ROOT)$(DIRSEP)build/terminal-params.patch $(3RDP_ROOT)$(DIRSEP)build/cl-mingw32-static.patch $(3RDP_ROOT)$(DIRSEP)build/cl-ranlib.patch $(3RDP_ROOT)$(DIRSEP)build/cl-win32-noasm.patch $(3RDP_ROOT)$(DIRSEP)build/cl-zz-country.patch $(3RDP_ROOT)$(DIRSEP)build/cl-algorithms.patch $(3RDP_ROOT)$(DIRSEP)build/cl-allow-duplicate-ext.patch $(3RDP_ROOT)$(DIRSEP)build/cl-macosx-minver.patch $(3RDP_ROOT)$(DIRSEP)build/cl-endian.patch $(3RDP_ROOT)$(DIRSEP)build/cl-cryptodev.patch $(3RDP_ROOT)$(DIRSEP)build/cl-posix-me-gently.patch $(3RDP_ROOT)$(DIRSEP)build/cl-tpm-linux.patch $(3RDP_ROOT)$(DIRSEP)build/cl-PAM-noprompts.patch $(3RDP_ROOT)$(DIRSEP)build/cl-zlib.patch $(3RDP_ROOT)$(DIRSEP)build/Dynamic-linked-static-lib.patch $(3RDP_ROOT)$(DIRSEP)build/SSL-fix.patch $(3RDP_ROOT)$(DIRSEP)build/cl-bigger-maxattribute.patch $(3RDP_ROOT)$(DIRSEP)build/cl-vcxproj.patch $(3RDP_ROOT)$(DIRSEP)build/cl-mingw-vcver.patch $(3RDP_ROOT)$(DIRSEP)build/cl-win32-build-fix.patch $(3RDP_ROOT)$(DIRSEP)build/cl-gcc-non-const-time-val.patch $(3RDP_ROOT)$(DIRSEP)build/cl-no-odbc.patch $(3RDP_ROOT)$(DIRSEP)build/cl-noasm-defines.patch $(3RDP_ROOT)$(DIRSEP)build/cl-bn-noasm64-fix.patch $(3RDP_ROOT)$(DIRSEP)build/cl-no-RSA-suites.patch $(3RDP_ROOT)$(DIRSEP)build/cl-fix-ECC-RSA.patch $(3RDP_ROOT)$(DIRSEP)build/cl-prefer-ECC.patch $(3RDP_ROOT)$(DIRSEP)build/cl-prefer-ECC-harder.patch $(3RDP_ROOT)$(DIRSEP)build/cl-more-RSA-ECC-fixes.patch $(3RDP_ROOT)$(DIRSEP)build/cl-DH-key-init.patch $(3RDP_ROOT)$(DIRSEP)build/cl-clear-GCM-flag.patch $(3RDP_ROOT)$(DIRSEP)build/cl-use-ssh-ctr.patch $(3RDP_ROOT)$(DIRSEP)build/cl-ssh-list-ctr-modes.patch $(3RDP_ROOT)$(DIRSEP)build/cl-ssh-incCtr.patch $(3RDP_ROOT)$(DIRSEP)build/cl-ssl-suite-blocksizes.patch $(3RDP_ROOT)$(DIRSEP)build/cl-no-tpm.patch $(3RDP_ROOT)$(DIRSEP)build/cl-no-via-aes.patch $(3RDP_ROOT)$(DIRSEP)build/cl-fix-ssh-ecc-ephemeral.patch $(3RDP_ROOT)$(DIRSEP)/build/cl-just-use-cc.patch $(3RDP_ROOT)$(DIRSEP)/build/cl-learn-numbers.patch $(3RDP_ROOT)$(DIRSEP)/build/cl-no-safe-stack.patch $(3RDP_ROOT)$(DIRSEP)/build/cl-allow-pkcs12.patch $(3RDP_ROOT)$(DIRSEP)/build/cl-uint64_t-redefine.patch $(3RDP_ROOT)$(DIRSEP)/build/cl-random-openbsd.patch $(3RDP_ROOT)$(DIRSEP)/build/cl-openbsd-threads.patch $(3RDP_ROOT)$(DIRSEP)/build/cl-allow-none-auth.patch $(3RDP_ROOT)$(DIRSEP)/build/cl-mingw-add-m32.patch | $(CRYPT_SRC) $(CRYPT_IDIR)
 	@echo Creating $@ ...
 	$(QUIET)-rm -rf $(CRYPT_SRC)/*
 	$(QUIET)unzip -oa $(3RDPDISTDIR)$(DIRSEP)cryptlib.zip -d $(CRYPT_SRC)
@@ -132,7 +132,8 @@ $(CRYPTLIB_BUILD): $(3RDP_ROOT)$(DIRSEP)dist/cryptlib.zip $(3RDP_ROOT)$(DIRSEP)b
 	$(QUIET)patch -b -p0 -d $(CRYPT_SRC) < cl-random-openbsd.patch
 	$(QUIET)patch -b -p0 -d $(CRYPT_SRC) < cl-openbsd-threads.patch
 	$(QUIET)patch -b -p0 -d $(CRYPT_SRC) < cl-allow-none-auth.patch
-ifeq ($(CC),mingw32-gcc)
+	$(QUIET)patch -b -p0 -d $(CRYPT_SRC) < cl-mingw-add-m32.patch
+ifeq ($(os),win32)
 	$(QUIET)cd $(CRYPT_SRC) && env - PATH="$(PATH)" CC="$(CC)" AR="$(AR)" RANLIB="$(RANLIB)" make directories
 	$(QUIET)cd $(CRYPT_SRC) && env - PATH="$(PATH)" CC="$(CC)" AR="$(AR)" RANLIB="$(RANLIB)" make toolscripts
 	$(QUIET)cd $(CRYPT_SRC) && env - PATH="$(PATH)" CC="$(CC)" AR="$(AR)" RANLIB="$(RANLIB)" make MINGW32_NT-6.1 OSNAME=win32
diff --git a/3rdp/build/cl-mingw-add-m32.patch b/3rdp/build/cl-mingw-add-m32.patch
new file mode 100644
index 0000000000..f5689b7a78
--- /dev/null
+++ b/3rdp/build/cl-mingw-add-m32.patch
@@ -0,0 +1,17 @@
+--- makefile.orig	2021-03-20 14:58:39.488459000 -0400
++++ makefile	2021-03-20 14:58:52.381979000 -0400
+@@ -1963,12 +1963,12 @@
+ 
+ MINGW32_NT-5.1:
+ 	$(MAKE) OSNAME=win32 target-init
+-	$(MAKE) $(DEFINES) CFLAGS="$(XCFLAGS) -O2"
++	$(MAKE) $(DEFINES) CFLAGS="$(XCFLAGS) -O2 -m32"
+ 
+ MINGW32_NT-6.1:
+ 	$(MAKE) OSNAME=win32 target-init
+ 	$(MAKE) OSNAME=win32 $(DEFINES) EXTRAOBJS="$(WIN32ASMOBJS)" \
+-		CFLAGS="$(XCFLAGS) -O2 -Wl,--subsystem,windows,--output-def,cl32.def -DSTATIC_LIB"
++		CFLAGS="$(XCFLAGS) -O2 -m32 -Wl,--subsystem,windows,--output-def,cl32.def -DSTATIC_LIB"
+ 
+ # NCR MP-RAS: Use the NCR cc.  The "-DNCR_UST" is needed to enable threading
+ #			  (User-Space Threads).
diff --git a/src/build/Common.gmake b/src/build/Common.gmake
index b03a107506..f477d9d787 100644
--- a/src/build/Common.gmake
+++ b/src/build/Common.gmake
@@ -200,10 +200,12 @@ else
 endif
 BUILDPATH	?=	$(BUILD)
 
-gcc_machine		:= $(shell ${CC} -dumpmachine)
+gcc_machine		:= $(findstring mingw32,$(shell ${CC} -dumpmachine))
 ifeq ($(gcc_machine),mingw32)
  os		:= Win32
- CFLAGS	+=	-DMSVCRT_VERSION=0x0800
+ CFLAGS	+=	-DMSVCRT_VERSION=0x0800 -m32
+ LDFLAGS+=	-m32
+ WINDRESFLAGS+=	-Fpe-i386
 endif
 
 # Get OS
diff --git a/src/conio/GNUmakefile b/src/conio/GNUmakefile
index 63e4398d11..52aece4de9 100644
--- a/src/conio/GNUmakefile
+++ b/src/conio/GNUmakefile
@@ -56,5 +56,5 @@ dl-mtlib: $(MTOBJODIR)$(DIRSEP)ciolib_res${OFILE}
 
 $(MTOBJODIR)$(DIRSEP)ciolib_res${OFILE}: ciolib.rc syncicon64.ico
 	@echo Creating $< ...
-	$(QUIET)${WINDRES} -O coff -i ciolib.rc -o $@
+	$(QUIET)${WINDRES} $(WINDRESFLAGS) -O coff -i ciolib.rc -o $@
 endif
diff --git a/src/syncterm/GNUmakefile b/src/syncterm/GNUmakefile
index d54866fbd1..07a4816f7f 100644
--- a/src/syncterm/GNUmakefile
+++ b/src/syncterm/GNUmakefile
@@ -97,6 +97,10 @@ ifndef bcc
  endif
 endif
 
+ifeq ($(os),win32)
+ EXTRA_LIBS += -luuid
+endif
+
 $(MTOBJODIR)$(DIRSEP)ciolib_res$(OFILE):
 	cd ${MTOBJODIR} && $(AR) -x ../${CIOLIB-MT} ciolib_res$(OFILE)
 
diff --git a/src/syncterm/syncterm.c b/src/syncterm/syncterm.c
index 761dab8f86..f7ee2e6b55 100644
--- a/src/syncterm/syncterm.c
+++ b/src/syncterm/syncterm.c
@@ -8,6 +8,11 @@
 
 #define NOCRYPT		/* Stop windows.h from loading wincrypt.h */
 					/* Is windows.h REALLY necessary?!?! */
+#define __WINCRYPT_H__	/* Really REALLY stop wincrypt.h har har
+			 * This is to workaround an issue in MinGW-w64 headers where
+			 * shlobj.h (which we need to include) unconditionally
+			 * includes wincrypt.h (which we need to not be included).
+			 */
 #define WIN32_LEAN_AND_MEAN
 #include <sys/stat.h>
 #ifdef _WIN32
@@ -22,10 +27,10 @@ static const KNOWNFOLDERID FOLDERID_InternetCache =		{0x352481E8,0x33BE,0x4251,{
 // Shared
 static const KNOWNFOLDERID FOLDERID_PublicDownloads =	{0x3D644C9B,0x1FB8,0x4f30,{0x9B,0x45,0xF6,0x70,0x23,0x5F,0x79,0xC0}};
 static const KNOWNFOLDERID FOLDERID_ProgramData =		{0x62AB5D82,0xFDC1,0x4DC3,{0xA9,0xDD,0x07,0x0D,0x1D,0x49,0x5D,0x97}};
+#endif
 #ifndef KF_FLAG_CREATE
 #define KF_FLAG_CREATE	0x00008000
 #endif
-#endif
 #include <xp_dl.h>	/* xp_dlopen() and friends */
 #endif
 
-- 
GitLab