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