From 6e69eec18963adad13ff5c531e25a5580ffae22e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Deuc=D0=B5?= <shurd@sasktel.net>
Date: Tue, 31 Dec 2024 01:25:57 -0500
Subject: [PATCH] For macOS, set install_name to @rpath/libNAME.dylib and use
 it

For the SBBS binaries, set @executable_path and
@executable_path/../${LIBODIR} so they can all be in one dir, or
they can be in the build output dirs and still work.

For utilities, set to @executable_path and
@executable_path/../../${LIBODIR} for the same reason.

With this, we shouldn't need to fiddle with DYLD_LIBRARY_PATH
---
 src/build/Common.gmake            |  6 ++++++
 src/sbbs3/GNUmakefile             | 19 +++++++++++--------
 src/sbbs3/gtkmonitor/GNUmakefile  | 21 ++++++++++-----------
 src/sbbs3/gtkuseredit/GNUmakefile | 19 +++++++++----------
 src/sbbs3/gtkuserlist/GNUmakefile | 19 +++++++++----------
 src/sbbs3/userlist/GNUmakefile    |  3 +++
 6 files changed, 48 insertions(+), 39 deletions(-)

diff --git a/src/build/Common.gmake b/src/build/Common.gmake
index 95fe24a09f..763cd42ee9 100644
--- a/src/build/Common.gmake
+++ b/src/build/Common.gmake
@@ -264,6 +264,12 @@ ifeq ($(os),darwin)
  endif
 endif
 
+ifeq ($(os),darwin)
+ RPATH := -rpath
+else
+ RPATH := --rpath
+endif
+
 ifeq ($(machine_uname),x86_64)
  machine_uname	:= x64
 endif
diff --git a/src/sbbs3/GNUmakefile b/src/sbbs3/GNUmakefile
index 8c682a859e..c0647d408b 100644
--- a/src/sbbs3/GNUmakefile
+++ b/src/sbbs3/GNUmakefile
@@ -156,13 +156,16 @@ ifeq ($(os),sunos)
  SHLIBOPTS	:=
 else
  ifeq ($(os),darwin)
-  SHLIBOPTS	=	-shared -install_name `realpath $(SBBSDIR)`/$@
+  SHLIBOPTS	=	-shared -install_name @rpath/`VAR=$@; echo $${VAR\#\#*/}`
  else
   SHLIBOPTS	:=	-shared
  endif
  MKSHLIB		:=	$(CC)
  MKSHPPLIB		:=	$(CXX)
 endif
+ifeq ($(os),darwin)
+ LIB_RPATH := -Wl,$(RPATH),@executable_path,$(RPATH),@executable_path/../$(LIBDIR)
+endif
 
 CFLAGS	+=	$(JS_CFLAGS) $(CRYPT_CFLAGS) $(UIFC-MT_CFLAGS) $(XPDEV-MT_CFLAGS) $(SMBLIB_CFLAGS) $(CIOLIB-MT_CFLAGS) $(ENCODE_CFLAGS) $(HASH_CFLAGS)
 CFLAGS	+=	-I../comio
@@ -190,27 +193,27 @@ endif
 # FTP Server Link Rule
 $(FTPSRVR): $(MTOBJODIR)/ftpsrvr.o
 	@echo Linking $@
-	$(QUIET)$(MKSHLIB) $(LDFLAGS) $(MTOBJODIR)/ftpsrvr.o $(SHLIBOPTS) -o $@ -lsbbs
+	$(QUIET)$(MKSHLIB) $(LDFLAGS) $(MTOBJODIR)/ftpsrvr.o $(SHLIBOPTS) $(LIB_RPATH) -o $@ -lsbbs
 
 # Mail Server Link Rule
 $(MAILSRVR): $(MAIL_OBJS)
 	@echo Linking $@
-	$(QUIET)$(MKSHLIB) $(LDFLAGS) $(MAIL_OBJS) $(SHLIBOPTS) -o $@ -lsbbs
+	$(QUIET)$(MKSHLIB) $(LDFLAGS) $(MAIL_OBJS) $(SHLIBOPTS) $(LIB_RPATH) -o $@ -lsbbs
 
 # Web Server Link Rule
 $(WEBSRVR): $(WEB_OBJS)
 	@echo Linking $@
-	$(QUIET)$(MKSHLIB) $(LDFLAGS) $(WEB_OBJS) $(SHLIBOPTS) -o $@ $(ENCODE_LIBS) -lsbbs $(XPDEV-MT_LIBS)
+	$(QUIET)$(MKSHLIB) $(LDFLAGS) $(WEB_OBJS) $(SHLIBOPTS) $(LIB_RPATH) -o $@ $(ENCODE_LIBS) -lsbbs $(XPDEV-MT_LIBS)
 
 # Services Link Rule
 $(SERVICES): $(SERVICE_OBJS)
 	@echo Linking $@
-	$(QUIET)$(MKSHLIB) $(LDFLAGS) $(SERVICE_OBJS) $(SHLIBOPTS) -o $@ -lsbbs
+	$(QUIET)$(MKSHLIB) $(LDFLAGS) $(SERVICE_OBJS) $(SHLIBOPTS) $(LIB_RPATH) -o $@ -lsbbs
 
 # Synchronet Console Build Rule
 $(SBBSCON): $(CON_OBJS) $(SBBS) $(FTPSRVR) $(WEBSRVR) $(MAILSRVR) $(SERVICES)
 	@echo Linking $@
-	$(QUIET)$(CXX) $(LDFLAGS) $(MT_LDFLAGS) -o $@ $(CON_OBJS) $(CON_LIBS) $(SMBLIB_LIBS) $(XPDEV-MT_LIBS)
+	$(QUIET)$(CXX) $(LDFLAGS) $(MT_LDFLAGS) $(LIB_RPATH) -o $@ $(CON_OBJS) $(CON_LIBS) $(SMBLIB_LIBS) $(XPDEV-MT_LIBS)
 
 # Baja Utility
 $(BAJA): $(BAJA_OBJS) | $(EXEODIR)
@@ -280,7 +283,7 @@ endif
 # JSEXEC
 $(JSEXEC): $(JSEXEC_OBJS) $(SBBS) $(CIOLIB-MT) | $(EXEODIR)
 	@echo Linking $@
-	$(QUIET)$(CXX) $(LDFLAGS) $(MT_LDFLAGS) -o $@ $(JSEXEC_OBJS) -lsbbs $(JS_LIBS) $(SMBLIB_LIBS) $(UIFC-MT_LIBS) $(CIOLIB-MT_LIBS) $(XPDEV-MT_LIBS)
+	$(QUIET)$(CXX) $(LDFLAGS) $(MT_LDFLAGS) $(LIB_RPATH) -o $@ $(JSEXEC_OBJS) -lsbbs $(JS_LIBS) $(SMBLIB_LIBS) $(UIFC-MT_LIBS) $(CIOLIB-MT_LIBS) $(XPDEV-MT_LIBS)
 ifeq ($(os), netbsd)
 	paxctl +m $(JSEXEC)
 endif
@@ -308,7 +311,7 @@ $(QWKNODES): $(QWKNODES_OBJS) | $(EXEODIR)
 # SLOG
 $(SLOG): $(SLOG_OBJS) $(SBBS) | $(EXEODIR)
 	@echo Linking $@
-	$(QUIET)$(CC) $(CONSOLE_LDFLAGS) -o $@ $(SLOG_OBJS) $(XPDEV_LIBS) -lsbbs
+	$(QUIET)$(CC) $(CONSOLE_LDFLAGS) $(LIB_RPATH) -o $@ $(SLOG_OBJS) $(XPDEV_LIBS) -lsbbs
 
 # DELFILES
 $(DELFILES): $(DELFILES_OBJS) $(ENCODE_LIB) | $(EXEODIR)
diff --git a/src/sbbs3/gtkmonitor/GNUmakefile b/src/sbbs3/gtkmonitor/GNUmakefile
index 2f6981002a..bf51846d55 100644
--- a/src/sbbs3/gtkmonitor/GNUmakefile
+++ b/src/sbbs3/gtkmonitor/GNUmakefile
@@ -30,17 +30,16 @@ EXTRA_LIBS +=	`pkg-config gtk+-3.0 --libs`
 # Because pkg-config for libglade uses --rpath, we need to also, LD_RUN_PATH
 # won't work.  :-(
 ifeq ($(os),darwin)
- RPATH := -rpath
-else
- RPATH := --rpath
-endif
-ifdef SBBSDIR
- LDFLAGS	+=	-Wl,$(RPATH),$(SBBSDIR)/exec
-endif
-PARENT_DIR = $(shell dirname `pwd`)
-LDFLAGS	+=	-Wl,$(RPATH),$(PARENT_DIR)/$(LIBODIR)
-ifeq ($(os),sunos)
- LDFLAGS	+=	-Wl,$(RPATH),/opt/sfw/gcc-3/lib
+ LDFLAGS += -Wl,$(RPATH),@executable_path,$(RPATH),@executable_path/../../$(LIBODIR)
+else 
+ ifdef SBBSDIR
+  LDFLAGS	+=	-Wl,$(RPATH),$(SBBSDIR)/exec
+ endif
+ PARENT_DIR = $(shell dirname `pwd`)
+ LDFLAGS	+=	-Wl,$(RPATH),$(PARENT_DIR)/$(LIBODIR)
+ ifeq ($(os),sunos)
+  LDFLAGS	+=	-Wl,$(RPATH),/opt/sfw/gcc-3/lib
+ endif
 endif
 
 $(GTKMONITOR): $(OBJS)
diff --git a/src/sbbs3/gtkuseredit/GNUmakefile b/src/sbbs3/gtkuseredit/GNUmakefile
index a35a9d0e04..a191fa1795 100644
--- a/src/sbbs3/gtkuseredit/GNUmakefile
+++ b/src/sbbs3/gtkuseredit/GNUmakefile
@@ -30,17 +30,16 @@ EXTRA_LIBS += `pkg-config gtk+-3.0 --libs`
 # Because pkg-config for libglade uses --rpath, we need to also, LD_RUN_PATH
 # won't work.  :-(
 ifeq ($(os),darwin)
- RPATH := -rpath
+ LDFLAGS += -Wl,$(RPATH),@executable_path,$(RPATH),@executable_path/../../$(LIBODIR)
 else
- RPATH := --rpath
-endif
-ifdef SBBSDIR
- LDFLAGS	+=	-Wl,$(RPATH),$(SBBSDIR)/exec
-endif
-PARENT_DIR = $(shell dirname `pwd`)
-LDFLAGS	+=	-Wl,$(RPATH),$(PARENT_DIR)/$(LIBODIR)
-ifeq ($(os),sunos)
- LDFLAGS	+=	-Wl,$(RPATH),/opt/sfw/gcc-3/lib
+ ifdef SBBSDIR
+  LDFLAGS	+=	-Wl,$(RPATH),$(SBBSDIR)/exec
+ endif
+ PARENT_DIR = $(shell dirname `pwd`)
+ LDFLAGS	+=	-Wl,$(RPATH),$(PARENT_DIR)/$(LIBODIR)
+ ifeq ($(os),sunos)
+  LDFLAGS	+=	-Wl,$(RPATH),/opt/sfw/gcc-3/lib
+ endif
 endif
 
 $(GTKUSEREDIT): $(OBJS)
diff --git a/src/sbbs3/gtkuserlist/GNUmakefile b/src/sbbs3/gtkuserlist/GNUmakefile
index 356ad3ad34..71b4086a16 100644
--- a/src/sbbs3/gtkuserlist/GNUmakefile
+++ b/src/sbbs3/gtkuserlist/GNUmakefile
@@ -30,17 +30,16 @@ EXTRA_LIBS += `pkg-config gtk+-3.0 --libs`
 # Because pkg-config for libglade uses --rpath, we need to also, LD_RUN_PATH
 # won't work.  :-(
 ifeq ($(os),darwin)
- RPATH := -rpath
+ LDFLAGS += -Wl,$(RPATH),@executable_path,$(RPATH),@executable_path/../../$(LIBODIR)
 else
- RPATH := --rpath
-endif
-ifdef SBBSDIR
- LDFLAGS	+=	-Wl,$(RPATH),$(SBBSDIR)/exec
-endif
-PARENT_DIR = $(shell dirname `pwd`)
-LDFLAGS	+=	-Wl,$(RPATH),$(PARENT_DIR)/$(LIBODIR)
-ifeq ($(os),sunos)
- LDFLAGS	+=	-Wl,$(RPATH),/opt/sfw/gcc-3/lib
+ ifdef SBBSDIR
+  LDFLAGS	+=	-Wl,$(RPATH),$(SBBSDIR)/exec
+ endif
+ PARENT_DIR = $(shell dirname `pwd`)
+ LDFLAGS	+=	-Wl,$(RPATH),$(PARENT_DIR)/$(LIBODIR)
+ ifeq ($(os),sunos)
+  LDFLAGS	+=	-Wl,$(RPATH),/opt/sfw/gcc-3/lib
+ endif
 endif
 
 $(GTKUSERLIST): $(OBJS)
diff --git a/src/sbbs3/userlist/GNUmakefile b/src/sbbs3/userlist/GNUmakefile
index c241a7ff67..ae966ec3fa 100644
--- a/src/sbbs3/userlist/GNUmakefile
+++ b/src/sbbs3/userlist/GNUmakefile
@@ -23,6 +23,9 @@ include ../Common.gmake
 CFLAGS	+=	$(SBBS_CFLAGS) $(SMBLIB_CFLAGS) $(XPDEV-MT_CFLAGS) `$(WX_CONFIG) $(WX_CONFFLAGS) --cflags`
 CXXFLAGS	+= $(CFLAGS)
 LDFLAGS	+=	`$(WX_CONFIG) $(WX_CONFFLAGS) --libs` $(SMBLIB_LDFLAGS) $(XPDEV-MT_LDFLAGS) $(MT_LDFLAGS) $(SBBS_LDFLAGS) 
+ifeq ($(os),darwin)
+ LDFLAGS += -Wl,$(RPATH),@executable_path,$(RPATH),@executable_path/../../$(LIBODIR)
+endif
 
 $(USERLIST): $(SBBS) $(OBJS)
 	@echo Linking $@
-- 
GitLab