From b3494b0860c4418a2ef9d1e8a7a6e20603ed2132 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Deuc=D0=B5?= <shurd@sasktel.net>
Date: Thu, 10 Oct 2024 13:21:09 -0400
Subject: [PATCH] Make CMake able to cross-build Win32 binaries on FreeBSD

---
 src/conio/CMakeLists.txt        | 17 ++++++++++++++---
 src/syncterm/CMakeLists.txt     |  5 ++++-
 src/syncterm/COMPILING          |  5 +++++
 src/syncterm/FBSD-mingw64.cmake | 22 ++++++++++++++++++++++
 src/xpdev/CMakeLists.txt        | 16 ++++++++++++++--
 src/xpdev/genwrap.h             |  4 +++-
 6 files changed, 62 insertions(+), 7 deletions(-)
 create mode 100644 src/syncterm/FBSD-mingw64.cmake

diff --git a/src/conio/CMakeLists.txt b/src/conio/CMakeLists.txt
index f6078010d3..d54b902b04 100644
--- a/src/conio/CMakeLists.txt
+++ b/src/conio/CMakeLists.txt
@@ -23,7 +23,12 @@ find_package(Curses)
 
 find_package(PkgConfig)
 if(NOT WITHOUT_SDL)
-	find_package(SDL2 CONFIG PATHS /Library/Frameworks)
+	if(WIN32)
+		set(SDL2_FOUND ON)
+		set(SDL2_INCLUDE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/../../3rdp/win32.release/sdl2/include)
+	else()
+		find_package(SDL2 CONFIG PATHS /Library/Frameworks)
+	endif()
 endif()
 if(NOT WITHOUT_X11)
 	if(NOT WITHOUT_XRENDER)
@@ -61,8 +66,14 @@ set(HEADER
 
 if(WIN32)
 	if(NOT WITHOUT_GDI)
-		list(APPEND SOURCE win32cio.c)
+		list(APPEND SOURCE win32gdi.c)
+		if(WITHOUT_SDL)
+			list(APPEND SOURCE SDL_win32_main.c)
+		endif()
+		set(NEED_BITMAP TRUE)
+		set(NEED_SCALE TRUE)
 	endif()
+	list(APPEND SOURCE win32cio.c)
 	list(APPEND SOURCE ciolib.rc)
 endif()
 
@@ -80,7 +91,7 @@ else()
 	endif()
 endif()
 
-if(NOT WITHOUT_X1!)
+if(NOT WITHOUT_X11)
 	if(X11_FOUND)
 		list(APPEND SOURCE x_events.c x_cio.c)
 		set(NEED_BITMAP TRUE)
diff --git a/src/syncterm/CMakeLists.txt b/src/syncterm/CMakeLists.txt
index cbd4324aa1..7f415bb6e5 100644
--- a/src/syncterm/CMakeLists.txt
+++ b/src/syncterm/CMakeLists.txt
@@ -45,7 +45,9 @@ set(SOURCE
 	../sbbs3/xmodem.c
 )
 
-if(NOT WIN32)
+if(WIN32)
+	set(3RDP_CRYPTLIB_LIB ${CMAKE_CURRENT_SOURCE_DIR}/../../3rdp/win32.release/cryptlib/bin/cl32.lib)
+else()
 	find_program(3RDP_GNU_MAKE
 		NAMES gmake make
 	)
@@ -101,6 +103,7 @@ if(CMAKE_SYSTEM_NAME STREQUAL "Darwin")
 	set_source_files_properties(SyncTERM.icns PROPERTIES MACOSX_PACKAGE_LOCATION "Resources")
 endif()
 require_libs(syncterm ciolib comio encode hash sftp uifc xpdev)
+target_compile_definitions(syncterm PRIVATE TELNET_NO_DLL)
 if(WITHOUT_OOII)
 	target_compile_definitions(syncterm PRIVATE WITHOUT_OOII=1)
 endif()
diff --git a/src/syncterm/COMPILING b/src/syncterm/COMPILING
index bf17868c85..d4b13afe6b 100644
--- a/src/syncterm/COMPILING
+++ b/src/syncterm/COMPILING
@@ -51,6 +51,11 @@ gmake CC=mingw32-gcc VERBOSE=please AR=mingw32-ar AS=mingw32-as RANLIB=mingw32-r
 32-bit Release builds for Win32 using MinGW-w64 use the following command line:
 gmake AR=i686-w64-mingw32-ar AS=i686-w64-mingw32-as CC=i686-w64-mingw32-gcc CXX=i686-w64-mingw32-g++ RANLIB=i686-w64-mingw32-ranlib WINDRES=i686-w64-mingw32-windres RELEASE=1 VERBOSE=1
 
+32-bit CMake builds for Win32 using MinGW-w64 on my system uses:
+cmake -DWITHOUT_ALSA=ON -DWITHOUT_PULSEAUDIO=ON -DCMAKE_TOOLCHAIN_FILE=/synchronet/src/sbbs/src/syncterm/FBSD-mingw64.cmake ..
+cmake --build . -j4
+This does not rebuild cryptlib, so is suspect.
+
 64-bit Release builds for Win32 using MinGW-w64 use the following command line:
 gmake AR=x86_64-w64-mingw32-ar AS=x86_64-w64-mingw32-as CC=x86_64-w64-mingw32-gcc CXX=x86_64-w64-mingw32-g++ RANLIB=x86_64-w64-mingw32-ranlib WINDRES=x86_64-w64-mingw32-windres RELEASE=1 VERBOSE=1
 
diff --git a/src/syncterm/FBSD-mingw64.cmake b/src/syncterm/FBSD-mingw64.cmake
new file mode 100644
index 0000000000..e1ae91751e
--- /dev/null
+++ b/src/syncterm/FBSD-mingw64.cmake
@@ -0,0 +1,22 @@
+# the name of the target operating system
+set(CMAKE_SYSTEM_NAME Windows)
+
+# Add search path
+list(APPEND CMAKE_PROGRAM_PATH /home/admin/mingw-w32/bin)
+
+# which compilers to use for C and C++
+set(CMAKE_C_COMPILER   /home/admin/mingw-w32/bin/i686-w64-mingw32-gcc)
+set(CMAKE_CXX_COMPILER /home/admin/mingw-w32/bin/i686-w64-mingw32-g++)
+set(CMAKE_AR           /home/admin/mingw-w32/bin/i686-w64-mingw32-ar)
+
+# where is the target environment located
+set(CMAKE_FIND_ROOT_PATH /home/admin/mingw-w32)
+
+# adjust the default behavior of the FIND_XXX() commands:
+# search programs in the host environment
+set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
+
+# search headers and libraries in the target environment
+set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
+set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
+
diff --git a/src/xpdev/CMakeLists.txt b/src/xpdev/CMakeLists.txt
index 159a974727..7eb99c552f 100644
--- a/src/xpdev/CMakeLists.txt
+++ b/src/xpdev/CMakeLists.txt
@@ -12,7 +12,12 @@ include(CheckSymbolExists)
 include(CheckIncludeFiles)
 find_package(Threads)
 if(NOT WITHOUT_SDL_AUDIO)
-	find_package(SDL2 CONFIG PATHS /Library/Frameworks)
+	if(WIN32)
+		set(SDL2_FOUND ON)
+		set(SDL2_INCLUDE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/../../3rdp/win32.release/sdl2/include)
+	else()
+		find_package(SDL2 CONFIG PATHS /Library/Frameworks)
+	endif()
 endif()
 if(NOT WITHOUT_PULSEAUDIO)
 	find_package(PulseAudio CONFIG PATHS /usr/local)
@@ -101,7 +106,9 @@ if(NOT WITHOUT_SDL_AUDIO)
 	if(SDL2_FOUND)
 		list(APPEND SOURCE sdlfuncs.c)
 		if(WIN32)
-			list(APPEND SOURCE SDL_win32_main.c)
+			if(WITHOUT_SDL)
+				list(APPEND SOURCE SDL_win32_main.c)
+			endif()
 		endif()
 	endif()
 endif()
@@ -109,6 +116,7 @@ endif()
 check_symbol_exists(strlcpy string.h HAS_STRLCPY)
 check_symbol_exists(random stdlib.h HAS_RANDOM_FUNC) 
 check_symbol_exists(srandomdev stdlib.h HAS_SRANDOMDEV_FUNC)
+check_symbol_exists(mkstemp stdlib.h HAS_MKSTEMP_FUNC)
 
 check_include_files(inttypes.h HAS_INTTYPES_H)
 check_include_files(stdint.h HAS_STDINT_H)
@@ -206,6 +214,10 @@ if(HAS_SRANDOMDEV_FUNC)
 	target_compile_definitions(xpdev PRIVATE HAS_SRANDOMDEV_FUNC)
 endif()
 
+if(HAS_MKSTEMP_FUNC)
+	target_compile_definitions(xpdev PRIVATE DISABLE_MKSTEMP_DEFINE)
+endif()
+
 if(NOT WITHOUT_SDL_AUDIO)
 	if(SDL2_FOUND)
 		if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
diff --git a/src/xpdev/genwrap.h b/src/xpdev/genwrap.h
index d07d869627..d8dd96cfe9 100644
--- a/src/xpdev/genwrap.h
+++ b/src/xpdev/genwrap.h
@@ -233,7 +233,9 @@ extern "C" {
 	#define snprintf		_snprintf
 #endif
 	#define vsnprintf		_vsnprintf
-	#define NEEDS_STRLCPY
+	#ifndef NEEDS_STRLCPY
+		#define NEEDS_STRLCPY
+	#endif
 #endif
 
 #if defined(__WATCOMC__)
-- 
GitLab