From 10ebe6af1eb89d02e2cb7a04cda46e2065b731d3 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Deuc=D0=B5?= <shurd@sasktel.net>
Date: Wed, 20 Mar 2024 04:02:43 -0400
Subject: [PATCH] Enable ccache for Darwin.

This may or may not actually work, and will certainly need a few
runs to build up the cache first.
---
 .gitlab-ci.yml               |  1 +
 3rdp/build/GNUmakefile       |  3 +-
 3rdp/build/cl-quote-cc.patch | 90 ++++++++++++++++++++++++++++++++++++
 3 files changed, 93 insertions(+), 1 deletion(-)
 create mode 100644 3rdp/build/cl-quote-cc.patch

diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index ab18c1d34a..d9bfbc67f3 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -64,6 +64,7 @@ include:
       platform: 'x86'
       tagname: 'macOS'
       gnu_make: 'make'
+      build_flags: 'CC="ccache cc" CXX="ccache c++"'
 
 smoketest-jsexec-linux:
   tags: [Linux]
diff --git a/3rdp/build/GNUmakefile b/3rdp/build/GNUmakefile
index 8087f36247..adafc43247 100644
--- a/3rdp/build/GNUmakefile
+++ b/3rdp/build/GNUmakefile
@@ -92,7 +92,7 @@ $(CRYPT_SRC): | $(3RDPSRCDIR)
 $(CRYPT_IDIR): | $(3RDPODIR)
 	$(QUIET)$(IFNOTEXIST) mkdir $(CRYPT_IDIR)
 
-$(CRYPTLIB_BUILD): $(3RDP_ROOT)/dist/cryptlib.zip $(3RDP_ROOT)/build/cl-fix-test-select.patch $(3RDP_ROOT)/build/cl-terminal-params.patch $(3RDP_ROOT)/build/cl-mingw32-static.patch $(3RDP_ROOT)/build/cl-ranlib.patch $(3RDP_ROOT)/build/cl-win32-noasm.patch $(3RDP_ROOT)/build/cl-zz-country.patch $(3RDP_ROOT)/build/cl-algorithms.patch $(3RDP_ROOT)/build/cl-allow-duplicate-ext.patch $(3RDP_ROOT)/build/cl-macosx-minver.patch $(3RDP_ROOT)/build/cl-posix-me-gently.patch $(3RDP_ROOT)/build/cl-PAM-noprompts.patch $(3RDP_ROOT)/build/cl-zlib.patch $(3RDP_ROOT)/build/cl-Dynamic-linked-static-lib.patch $(3RDP_ROOT)/build/cl-SSL-fix.patch $(3RDP_ROOT)/build/cl-bigger-maxattribute.patch $(3RDP_ROOT)/build/cl-endian.patch $(3RDP_ROOT)/build/cl-vcxproj.patch $(3RDP_ROOT)/build/cl-mingw-vcver.patch $(3RDP_ROOT)/build/cl-win32-build-fix.patch $(3RDP_ROOT)/build/cl-no-odbc.patch $(3RDP_ROOT)/build/cl-noasm-defines.patch $(3RDP_ROOT)/build/cl-bn-noasm64-fix.patch $(3RDP_ROOT)/build/cl-prefer-ECC.patch $(3RDP_ROOT)/build/cl-prefer-ECC-harder.patch $(3RDP_ROOT)/build/cl-clear-GCM-flag.patch $(3RDP_ROOT)/build/cl-use-ssh-ctr.patch $(3RDP_ROOT)/build/cl-ssl-suite-blocksizes.patch $(3RDP_ROOT)/build/cl-no-tpm.patch $(3RDP_ROOT)/build/cl-no-via-aes.patch $(3RDP_ROOT)/build/cl-fix-ssh-ecc-ephemeral.patch $(3RDP_ROOT)/build/cl-just-use-cc.patch $(3RDP_ROOT)/build/cl-no-safe-stack.patch $(3RDP_ROOT)/build/cl-allow-pkcs12.patch $(3RDP_ROOT)/build/cl-openbsd-threads.patch $(3RDP_ROOT)/build/cl-allow-none-auth.patch $(3RDP_ROOT)/build/cl-mingw-add-m32.patch $(3RDP_ROOT)/build/cl-poll-not-select.patch $(3RDP_ROOT)/build/cl-good-sockets.patch $(3RDP_ROOT)/build/cl-moar-objects.patch $(3RDP_ROOT)/build/cl-server-term-support.patch $(3RDP_ROOT)/build/cl-add-pubkey-attribute.patch $(3RDP_ROOT)/build/cl-allow-ssh-auth-retries.patch $(3RDP_ROOT)/build/cl-fix-ssh-channel-close.patch $(3RDP_ROOT)/build/cl-vt-lt-2005-always-defined.patch $(3RDP_ROOT)/build/cl-no-pie.patch $(3RDP_ROOT)/build/cl-no-testobjs.patch $(3RDP_ROOT)/build/cl-win32-lean-and-mean.patch $(3RDP_ROOT)/build/cl-thats-not-asm.patch $(3RDP_ROOT)/build/cl-make-channels-work.patch $(3RDP_ROOT)/build/cl-allow-ssh-2.0-go.patch $(3RDP_ROOT)/build/cl-read-timeout-every-time.patch $(3RDP_ROOT)/build/cl-allow-servercheck-pubkeys.patch $(3RDP_ROOT)/build/cl-pass-after-pubkey.patch $(3RDP_ROOT)/build/cl-ssh-list-ctr-modes.patch $(3RDP_ROOT)/build/cl-double-delete-fine-on-close.patch $(3RDP_ROOT)/build/cl-handle-unsupported-pubkey.patch $(3RDP_ROOT)/build/cl-add-patches-info.patch $(3RDP_ROOT)/build/cl-netbsd-hmac-symbol.patch $(3RDP_ROOT)/build/cl-netbsd-no-getfsstat.patch GNUmakefile $(3RDP_ROOT)/build/cl-remove-march.patch $(3RDP_ROOT)/build/cl-fix-shell-exec-types.patch $(3RDP_ROOT)/build/cl-ssh-eof-half-close.patch $(3RDP_ROOT)/build/cl-add-win64.patch $(3RDP_ROOT)/build/cl-fix-mb-w-conv-warnings.patch $(3RDP_ROOT)/build/cl-fix-ssh-header-read.patch $(3RDP_ROOT)/build/cl-ssh-service-type-for-channel.patch $(3RDP_ROOT)/build/cl-ssh-sbbs-id-string.patch $(3RDP_ROOT)/build/cl-channel-select-both.patch $(3RDP_ROOT)/build/cl-allow-none-auth-svr.patch | $(CRYPT_SRC) $(CRYPT_IDIR)
+$(CRYPTLIB_BUILD): $(3RDP_ROOT)/dist/cryptlib.zip $(3RDP_ROOT)/build/cl-fix-test-select.patch $(3RDP_ROOT)/build/cl-terminal-params.patch $(3RDP_ROOT)/build/cl-mingw32-static.patch $(3RDP_ROOT)/build/cl-ranlib.patch $(3RDP_ROOT)/build/cl-win32-noasm.patch $(3RDP_ROOT)/build/cl-zz-country.patch $(3RDP_ROOT)/build/cl-algorithms.patch $(3RDP_ROOT)/build/cl-allow-duplicate-ext.patch $(3RDP_ROOT)/build/cl-macosx-minver.patch $(3RDP_ROOT)/build/cl-posix-me-gently.patch $(3RDP_ROOT)/build/cl-PAM-noprompts.patch $(3RDP_ROOT)/build/cl-zlib.patch $(3RDP_ROOT)/build/cl-Dynamic-linked-static-lib.patch $(3RDP_ROOT)/build/cl-SSL-fix.patch $(3RDP_ROOT)/build/cl-bigger-maxattribute.patch $(3RDP_ROOT)/build/cl-endian.patch $(3RDP_ROOT)/build/cl-vcxproj.patch $(3RDP_ROOT)/build/cl-mingw-vcver.patch $(3RDP_ROOT)/build/cl-win32-build-fix.patch $(3RDP_ROOT)/build/cl-no-odbc.patch $(3RDP_ROOT)/build/cl-noasm-defines.patch $(3RDP_ROOT)/build/cl-bn-noasm64-fix.patch $(3RDP_ROOT)/build/cl-prefer-ECC.patch $(3RDP_ROOT)/build/cl-prefer-ECC-harder.patch $(3RDP_ROOT)/build/cl-clear-GCM-flag.patch $(3RDP_ROOT)/build/cl-use-ssh-ctr.patch $(3RDP_ROOT)/build/cl-ssl-suite-blocksizes.patch $(3RDP_ROOT)/build/cl-no-tpm.patch $(3RDP_ROOT)/build/cl-no-via-aes.patch $(3RDP_ROOT)/build/cl-fix-ssh-ecc-ephemeral.patch $(3RDP_ROOT)/build/cl-just-use-cc.patch $(3RDP_ROOT)/build/cl-no-safe-stack.patch $(3RDP_ROOT)/build/cl-allow-pkcs12.patch $(3RDP_ROOT)/build/cl-openbsd-threads.patch $(3RDP_ROOT)/build/cl-allow-none-auth.patch $(3RDP_ROOT)/build/cl-mingw-add-m32.patch $(3RDP_ROOT)/build/cl-poll-not-select.patch $(3RDP_ROOT)/build/cl-good-sockets.patch $(3RDP_ROOT)/build/cl-moar-objects.patch $(3RDP_ROOT)/build/cl-server-term-support.patch $(3RDP_ROOT)/build/cl-add-pubkey-attribute.patch $(3RDP_ROOT)/build/cl-allow-ssh-auth-retries.patch $(3RDP_ROOT)/build/cl-fix-ssh-channel-close.patch $(3RDP_ROOT)/build/cl-vt-lt-2005-always-defined.patch $(3RDP_ROOT)/build/cl-no-pie.patch $(3RDP_ROOT)/build/cl-no-testobjs.patch $(3RDP_ROOT)/build/cl-win32-lean-and-mean.patch $(3RDP_ROOT)/build/cl-thats-not-asm.patch $(3RDP_ROOT)/build/cl-make-channels-work.patch $(3RDP_ROOT)/build/cl-allow-ssh-2.0-go.patch $(3RDP_ROOT)/build/cl-read-timeout-every-time.patch $(3RDP_ROOT)/build/cl-allow-servercheck-pubkeys.patch $(3RDP_ROOT)/build/cl-pass-after-pubkey.patch $(3RDP_ROOT)/build/cl-ssh-list-ctr-modes.patch $(3RDP_ROOT)/build/cl-double-delete-fine-on-close.patch $(3RDP_ROOT)/build/cl-handle-unsupported-pubkey.patch $(3RDP_ROOT)/build/cl-add-patches-info.patch $(3RDP_ROOT)/build/cl-netbsd-hmac-symbol.patch $(3RDP_ROOT)/build/cl-netbsd-no-getfsstat.patch GNUmakefile $(3RDP_ROOT)/build/cl-remove-march.patch $(3RDP_ROOT)/build/cl-fix-shell-exec-types.patch $(3RDP_ROOT)/build/cl-ssh-eof-half-close.patch $(3RDP_ROOT)/build/cl-add-win64.patch $(3RDP_ROOT)/build/cl-fix-mb-w-conv-warnings.patch $(3RDP_ROOT)/build/cl-fix-ssh-header-read.patch $(3RDP_ROOT)/build/cl-ssh-service-type-for-channel.patch $(3RDP_ROOT)/build/cl-ssh-sbbs-id-string.patch $(3RDP_ROOT)/build/cl-channel-select-both.patch $(3RDP_ROOT)/build/cl-allow-none-auth-svr.patch $(3RDP_ROOT)/build/cl-quote-cc.patch | $(CRYPT_SRC) $(CRYPT_IDIR)
 	@echo Creating $@ ...
 	$(QUIET)-rm -rf $(CRYPT_SRC)/*
 	$(QUIET)unzip -oa $(3RDPDISTDIR)/cryptlib.zip -d $(CRYPT_SRC)
@@ -166,6 +166,7 @@ $(CRYPTLIB_BUILD): $(3RDP_ROOT)/dist/cryptlib.zip $(3RDP_ROOT)/build/cl-fix-test
 	$(QUIET)patch -b -p0 -d $(CRYPT_SRC) < cl-ssh-sbbs-id-string.patch
 	$(QUIET)patch -b -p0 -d $(CRYPT_SRC) < cl-channel-select-both.patch
 	$(QUIET)patch -b -p0 -d $(CRYPT_SRC) < cl-allow-none-auth-svr.patch
+	$(QUIET)patch -b -p0 -d $(CRYPT_SRC) < cl-quote-cc.patch
 	$(QUIET)perl -pi.bak -e 's/^(#define CRYPTLIB_VERSION.*)$$/"$$1\n#define CRYPTLIB_PATCHES \"" . (chomp($$val = `cat cl-*.patch | if (which md5sum > \/dev\/null 2>&1); then md5sum; else md5; fi`), $$val) . "\""/e' $(CRYPT_SRC)/cryptlib.h
 	$(QUIET)sed -E -iorig 's/%%MIN_MAC_OSX_VERSION%%/${MIN_MAC_OSX_VERSION}/g' $(CRYPT_SRC)/tools/ccopts.sh
 ifeq ($(os),win32)
diff --git a/3rdp/build/cl-quote-cc.patch b/3rdp/build/cl-quote-cc.patch
new file mode 100644
index 0000000000..5f97b47f91
--- /dev/null
+++ b/3rdp/build/cl-quote-cc.patch
@@ -0,0 +1,90 @@
+--- makefile.orig	2024-03-20 03:12:15.052088000 -0400
++++ makefile	2024-03-20 03:12:36.104348000 -0400
+@@ -414,19 +414,19 @@
+ 
+ default:
+ 	@$(MAKE) common-tasks
+-	@./tools/buildall.sh $(MAKE) $(CC) $(OSNAME) $(CFLAGS) $(BUILDOPTS)
++	@./tools/buildall.sh $(MAKE) "$(CC)" $(OSNAME) $(CFLAGS) $(BUILDOPTS)
+ 
+ shared:
+ 	@$(MAKE) common-tasks
+-	@./tools/buildall.sh shared $(MAKE) $(CC) $(OSNAME) $(CFLAGS) $(BUILDOPTS)
++	@./tools/buildall.sh shared $(MAKE) "$(CC)" $(OSNAME) $(CFLAGS) $(BUILDOPTS)
+ 
+ debug:
+ 	@$(MAKE) common-tasks
+-	@./tools/buildall.sh $(MAKE) $(CC) $(OSNAME) $(CFLAGS_DEBUG) $(BUILDOPTS)
++	@./tools/buildall.sh $(MAKE) "$(CC)" $(OSNAME) $(CFLAGS_DEBUG) $(BUILDOPTS)
+ 
+ generic:
+ 	@$(MAKE) common-tasks
+-	@./tools/buildall.sh generic $(MAKE) $(CC) $(OSNAME) $(CFLAGS) $(BUILDOPTS)
++	@./tools/buildall.sh generic $(MAKE) "$(CC)" $(OSNAME) $(CFLAGS) $(BUILDOPTS)
+ 
+ # Special-case targets.  The "analyse" target isn't used directly but is
+ # invoked as part of the clang static analyser build process.
+--- tools/getlibs.sh.orig	2024-03-20 03:19:12.877267000 -0400
++++ tools/getlibs.sh	2024-03-20 03:19:22.916650000 -0400
+@@ -31,9 +31,9 @@
+ # Get the compiler build options, which affect the linker options.
+ 
+ if [ $ISSPECIAL -eq 0 ] ; then
+-	BUILDOPTS="$(./tools/ccopts.sh $CC $OSNAME 2>/dev/null)" ;
++	BUILDOPTS="$(./tools/ccopts.sh "$CC" $OSNAME 2>/dev/null)" ;
+ else
+-	BUILDOPTS="$(./tools/ccopts.sh special $CC $OSNAME 2>/dev/null)" ;
++	BUILDOPTS="$(./tools/ccopts.sh special "$CC" $OSNAME 2>/dev/null)" ;
+ fi
+ 
+ hasSubstring()
+@@ -212,4 +212,4 @@
+ 
+ # Finally, report what we've found
+ 
+-echo "$LDARGS"
+\ No newline at end of file
++echo "$LDARGS"
+--- tools/buildall.sh.orig	2023-02-07 22:48:48.000000000 -0500
++++ tools/buildall.sh	2024-03-20 03:22:13.342620000 -0400
+@@ -131,7 +131,7 @@
+ # substitutes are more preferred one if available, unless $CC is a custom
+ # compiler like a static source code analyser or fuzzer build.
+ 
+-CC="$(./tools/getcompiler.sh $CC $OSNAME)"
++CC="$(./tools/getcompiler.sh "$CC" $OSNAME)"
+ 
+ # OS X Snow Leopard broke dlopen(), if it's called from a (sub-)thread then it
+ # dies with a SIGTRAP.  Specifically, if you dlopen() a shared library linked
+@@ -199,15 +199,15 @@
+ # we add an extra character to the comparison string to avoid syntax errors.
+ 
+ if [ $ANALYSE -gt 0 ] ; then
+-	CFLAGS="$(./tools/ccopts.sh analyse $CC $OSNAME)" ;
++	CFLAGS="$(./tools/ccopts.sh analyse "$CC" $OSNAME)" ;
+ elif [ $ISSPECIAL -gt 0 ] ; then
+-	CFLAGS="$(./tools/ccopts.sh special $CC $OSNAME)" ;
++	CFLAGS="$(./tools/ccopts.sh special "$CC" $OSNAME)" ;
+ elif [ $GENERICBUILD -gt 0 ] ; then
+-	CFLAGS="$(./tools/ccopts.sh generic $CC $OSNAME)" ;
++	CFLAGS="$(./tools/ccopts.sh generic "$CC" $OSNAME)" ;
+ elif [ $SHARED -gt 0 ] ; then
+-	CFLAGS="$(./tools/ccopts.sh shared $CC $OSNAME)" ;
++	CFLAGS="$(./tools/ccopts.sh shared "$CC" $OSNAME)" ;
+ else
+-	CFLAGS="$(./tools/ccopts.sh $CC $OSNAME)" ;
++	CFLAGS="$(./tools/ccopts.sh "$CC" $OSNAME)" ;
+ fi
+ if [ '$(CFLAGS)x' = 'x' ] ; then
+ 	echo "$0: Couldn't get compiler flags via tools/ccopts.sh." >&2 ;
+--- tools/ccopts.sh.orig	2024-03-20 03:23:53.320971000 -0400
++++ tools/ccopts.sh	2024-03-20 03:24:11.225180000 -0400
+@@ -264,7 +264,7 @@
+ if [ "$($CC -v 2>&1 | grep -c "ccc-analyzer")" -gt 0 ] ; then
+ 	ISCLANG_ANALYSER=1 ;
+ fi
+-if [ $CC != "xlc" ] && [ "$($CC -v 2>&1 | grep -c "gcc")" -gt 0 ] ; then
++if [ "$CC" != "xlc" ] && [ "$($CC -v 2>&1 | grep -c "gcc")" -gt 0 ] ; then
+ 	ISGCC=1 ;
+ fi
+ if [ $ISCLANG_ANALYSER -gt 0 ] ; then
-- 
GitLab