From 4e159595b51af5edcf87aeb91359cb97485ef3df Mon Sep 17 00:00:00 2001
From: Diego Biurrun <diego@biurrun.de>
Date: Mon, 26 Sep 2005 10:05:13 +0000
Subject: [PATCH] support for building dynamic libraries on Mac OS X based on a
 patch by Lina Pezzella <J4rg0n -- at -- gentoo -- dot -- org>

Originally committed as revision 4616 to svn://svn.ffmpeg.org/ffmpeg/trunk
---
 configure                       |  7 +++++--
 libavcodec/Makefile             | 21 +++++++++++++--------
 libavcodec/libpostproc/Makefile | 32 +++++++++++++++++++-------------
 libavformat/Makefile            | 20 +++++++++++---------
 libavutil/Makefile              | 19 +++++++++++--------
 vhook/Makefile                  | 22 +++++++++++++---------
 6 files changed, 72 insertions(+), 49 deletions(-)

diff --git a/configure b/configure
index 4f5a9835ece..a31fdc54f3d 100755
--- a/configure
+++ b/configure
@@ -329,11 +329,12 @@ v4l="no"
 audio_oss="no"
 dv1394="no"
 ffserver="no"
-SHFLAGS="-dynamiclib"
+SHFLAGS="-dynamiclib -Wl,-single_module,-undefined,dynamic_lookup"
 extralibs=""
 darwin="yes"
 strip="strip -x"
-LDFLAGS="-Wl,-search_paths_first"
+LDFLAGS="-Wl,-dynamic,-search_paths_first"
+SLIBSUF=".dylib"
 FFSLDFLAGS=-Wl,-bind_at_load
 ;;
 MINGW32*)
@@ -1428,6 +1429,8 @@ fi
 if test "$lshared" = "yes" ; then
   echo "BUILD_SHARED=yes" >> config.mak
   echo "PIC=-fPIC -DPIC" >> config.mak
+  echo "SPPMAJOR=0" >> config.mak
+  echo "SPPVERSION=0.0.1" >> config.mak 
 fi
 echo "EXTRALIBS=$extralibs" >> config.mak
 version=`grep '#define FFMPEG_VERSION ' "$source_path/libavcodec/avcodec.h" |
diff --git a/libavcodec/Makefile b/libavcodec/Makefile
index 3b60705636a..9e643675b7e 100644
--- a/libavcodec/Makefile
+++ b/libavcodec/Makefile
@@ -377,17 +377,22 @@ ifeq ($(TARGET_ARCH_SPARC64),yes)
 CFLAGS+= -mcpu=ultrasparc -mtune=ultrasparc
 endif
 
+# Darwin specific stuff
+ifeq ($(CONFIG_DARWIN),yes)
+SHFLAGS += -Wl,-install_name,$(libdir)/$(SLIBPREF)avcodec$(SLIBSUF),-current_version,$(SPPVERSION),-compatibility_version,$(SPPVERSION)
+endif
+
 SRCS := $(OBJS:.o=.c) $(ASM_OBJS:.o=.S)
 OBJS := $(OBJS) $(ASM_OBJS)
 
 LIB= $(LIBPREF)avcodec$(LIBSUF)
 LIBAVUTIL= $(SRC_PATH)/libavutil/$(LIBPREF)avutil$(LIBSUF)
 ifeq ($(BUILD_SHARED),yes)
-SLIB= $(SLIBPREF)avcodec$(SLIBSUF)
+SLIBNAME= $(SLIBPREF)avcodec$(SLIBSUF)
 endif
 TESTS= imgresample-test dct-test motion-test fft-test
 
-all: $(LIB) $(SLIB)
+all: $(LIB) $(SLIBNAME)
 
 amrlibs:
 	$(MAKE) -C amr spclib fipoplib
@@ -399,7 +404,7 @@ $(LIB): $(OBJS) $(AMRLIBS)
 	$(AR) rc $@ $(OBJS) $(AMREXTRALIBS)
 	$(RANLIB) $@
 
-$(SLIB): $(OBJS)
+$(SLIBNAME): $(OBJS)
 ifeq ($(CONFIG_PP),yes)
 	$(MAKE) -C libpostproc
 endif
@@ -407,7 +412,7 @@ ifeq ($(CONFIG_WIN32),yes)
 	$(CC) $(SHFLAGS) -Wl,--output-def,$(@:.dll=.def) -o $@ $(OBJS) $(EXTRALIBS) $(AMREXTRALIBS)
 	-lib /machine:i386 /def:$(@:.dll=.def)
 else
-	$(CC) $(SHFLAGS) -o $@ $(OBJS) $(EXTRALIBS) $(AMREXTRALIBS) $(LDFLAGS)
+	$(CC) $(SHFLAGS) $(LDFLAGS) -o $@ $(OBJS) $(EXTRALIBS) $(AMREXTRALIBS)
 endif
 
 dsputil.o: dsputil.c dsputil.h
@@ -427,7 +432,7 @@ depend: $(SRCS)
 dep:	depend
 
 clean: $(CLEANAMR)
-	rm -f *.o *.d *~ .depend $(LIB) $(SLIB) *.so i386/*.o i386/*~ \
+	rm -f *.o *.d *~ .depend $(LIB) $(SLIBNAME) *$(SLIBSUF) i386/*.o i386/*~ \
 	   armv4l/*.o armv4l/*~ \
 	   mlib/*.o mlib/*~ \
 	   alpha/*.o alpha/*~ \
@@ -476,11 +481,11 @@ fft-test: fft-test.o $(LIB)
 ifeq ($(BUILD_SHARED),yes)
 install: all install-headers
 ifeq ($(CONFIG_WIN32),yes)
-	install $(INSTALLSTRIP) -m 755 $(SLIB) "$(prefix)"
+	install $(INSTALLSTRIP) -m 755 $(SLIBNAME) "$(prefix)"
 else
 	install -d $(libdir)
-	install $(INSTALLSTRIP) -m 755 $(SLIB) $(libdir)/libavcodec-$(VERSION).so
-	ln -sf libavcodec-$(VERSION).so $(libdir)/libavcodec.so
+	install $(INSTALLSTRIP) -m 755 $(SLIBNAME) $(libdir)/libavcodec-$(VERSION)$(SLIBSUF)
+	ln -sf libavcodec-$(VERSION)$(SLIBSUF) $(libdir)/libavcodec$(SLIBSUF)
 	$(LDCONFIG) || true
 endif
 ifeq ($(CONFIG_PP),yes)
diff --git a/libavcodec/libpostproc/Makefile b/libavcodec/libpostproc/Makefile
index a12bc721e1f..d435444208d 100644
--- a/libavcodec/libpostproc/Makefile
+++ b/libavcodec/libpostproc/Makefile
@@ -4,9 +4,16 @@ include ../../config.mak
 VPATH=$(SRC_PATH)/libavcodec/libpostproc
 
 ifeq ($(SHARED_PP),yes)
-SPPLIB = $(SLIBPREF)postproc$(SLIBSUF)
-SPPMAJOR = 0
-SPPVERSION = $(SPPMAJOR).0.1
+SPPLIBNAME = $(SLIBPREF)postproc$(SLIBSUF)
+ifeq ($(CONFIG_DARWIN),yes)
+SPPLIBMAJOR = $(SLIBPREF)postproc.$(SPPMAJOR)$(SLIBSUF)
+SPPLIB = $(SLIBPREF)postproc.$(SPPVERSION)$(SLIBSUF)
+SHFLAGS += -Wl,-install_name,$(libdir)/$(SPPLIBNAME),-current_version,$(SPPVERSION),-compatibility_version,$(SPPVERSION)
+else
+SPPLIBMAJOR = $(SPPLIBNAME).$(SPPMAJOR)
+SPPLIB = $(SPPLIBNAME).$(SPPVERSION)
+SHFLAGS = -shared -Wl,-soname,$(SPPLIB)
+endif
 endif
 PPLIB = $(LIBPREF)postproc$(LIBSUF)
 
@@ -23,13 +30,13 @@ CFLAGS  = $(OPTFLAGS) $(MLIB_INC) -I. -I.. $(EXTRA_INC)
 .c.o:
 	$(CC) -c $(CFLAGS) $(LIBOBJFLAGS) -I$(SRC_PATH)/libavcodec -I../.. -o $@ $<
 
-all:    $(SWSLIB) $(PPLIB) $(SPPLIB)
+all:    $(SWSLIB) $(PPLIB) $(SPPLIBNAME)
 
 clean:
-	rm -f *.o *.a *~ *.so $(PPLIB) $(SPPLIB)
+	rm -f *.o *.a *~ *$(SLIBSUF) $(PPLIB) $(SPPLIBNAME)
 
 distclean:
-	rm -f Makefile.bak *.o *.a *~ *.so .depend
+	rm -f Makefile.bak *.o *.a *~ *$(SLIBSUF) .depend
 
 dep:    depend
 
@@ -40,9 +47,8 @@ ifeq ($(SHARED_PP),yes)
 postprocess_pic.o: postprocess.c
 	$(CC) -c $(CFLAGS) -fomit-frame-pointer -fPIC -DPIC -I.. -I../.. -o $@ $<
 
-$(SPPLIB): $(SPPOBJS)
-	$(CC) -shared -Wl,-soname,$(SPPLIB).$(SPPMAJOR) \
-	-o $(SPPLIB) $(SPPOBJS)
+$(SPPLIBNAME): $(SPPOBJS)
+	$(CC) $(SHFLAGS) -o $(SPPLIBNAME) $(SPPOBJS)
 endif
 
 $(PPLIB): $(PPOBJS)
@@ -53,12 +59,12 @@ $(PPLIB): $(PPOBJS)
 install: all
 ifeq ($(SHARED_PP),yes)
 ifeq ($(CONFIG_WIN32),yes)
-	install $(INSTALLSTRIP) -m 755 $(SPPLIB) "$(prefix)"
+	install $(INSTALLSTRIP) -m 755 $(SPPLIBNAME) "$(prefix)"
 else
 	install -d $(libdir)
-	install $(INSTALLSTRIP) -m 755 $(SPPLIB) $(libdir)/$(SPPLIB).$(SPPVERSION)
-	ln -sf $(SPPLIB).$(SPPVERSION) $(libdir)/$(SPPLIB)
-	ln -sf $(SPPLIB).$(SPPVERSION) $(libdir)/$(SPPLIB).$(SPPMAJOR)
+	install $(INSTALLSTRIP) -m 755 $(SPPLIBNAME) $(libdir)/$(SPPLIB)
+	ln -sf $(SPPLIB) $(libdir)/$(SPPLIBNAME)
+	ln -sf $(SPPLIB) $(libdir)/$(SPPLIBMAJOR)
 	install -d $(libdir)/pkgconfig
 	install -m 644 ../../libpostproc.pc $(libdir)/pkgconfig
 	$(LDCONFIG) || true
diff --git a/libavformat/Makefile b/libavformat/Makefile
index ea486a77dbf..5be994b30af 100644
--- a/libavformat/Makefile
+++ b/libavformat/Makefile
@@ -81,9 +81,11 @@ endif
 
 LIB= $(LIBPREF)avformat$(LIBSUF)
 ifeq ($(BUILD_SHARED),yes)
-SLIB= $(SLIBPREF)avformat$(SLIBSUF)
-
-AVCLIBS+=-lavcodec$(BUILDSUF) -L../libavcodec
+SLIBNAME= $(SLIBPREF)avformat$(SLIBSUF)
+AVCLIBS+=-lavcodec$(BUILDSUF) -L../libavcodec -lavutil$(BUILDSUF) -L../libavutil
+ifeq ($(CONFIG_DARWIN),yes)
+SHFLAGS += -Wl,-install_name,$(libdir)/$(SLIBNAME),-current_version,$(SPPVERSION),-compatibility_version,$(SPPVERSION)
+endif
 ifeq ($(CONFIG_MP3LAME),yes)
 AVCLIBS+=-lmp3lame
 endif
@@ -91,14 +93,14 @@ endif
 
 SRCS := $(OBJS:.o=.c) $(PPOBJS:.o=.cpp)
 
-all: $(LIB) $(SLIB)
+all: $(LIB) $(SLIBNAME)
 
 $(LIB): $(OBJS) $(PPOBJS)
 	rm -f $@
 	$(AR) rc $@ $(OBJS) $(PPOBJS)
 	$(RANLIB) $@
 
-$(SLIB): $(OBJS)
+$(SLIBNAME): $(OBJS)
 ifeq ($(CONFIG_WIN32),yes)
 	$(CC) $(SHFLAGS) -Wl,--output-def,$(@:.dll=.def) -o $@ $(OBJS) $(PPOBJS) $(AVCLIBS) $(EXTRALIBS)
 	-lib /machine:i386 /def:$(@:.dll=.def)
@@ -112,11 +114,11 @@ depend: $(SRCS)
 ifeq ($(BUILD_SHARED),yes)
 install: all install-headers
 ifeq ($(CONFIG_WIN32),yes)
-	install $(INSTALLSTRIP) -m 755 $(SLIB) "$(prefix)"
+	install $(INSTALLSTRIP) -m 755 $(SLIBNAME) "$(prefix)"
 else
 	install -d $(libdir)
-	install $(INSTALLSTRIP) -m 755 $(SLIB) $(libdir)/libavformat-$(VERSION).so
-	ln -sf libavformat-$(VERSION).so $(libdir)/libavformat.so
+	install $(INSTALLSTRIP) -m 755 $(SLIBNAME) $(libdir)/$(SLIBPREF)avformat-$(VERSION)$(SLIBSUF)
+	ln -sf $(SLIBPREF)avformat-$(VERSION)$(SLIBSUF) $(libdir)/$(SLIBNAME)
 	$(LDCONFIG) || true
 endif
 else
@@ -143,7 +145,7 @@ install-headers:
 	g++ $(subst -Wall,,$(CFLAGS)) -c -o $@ $< 
 
 distclean clean: 
-	rm -f *.o *.d .depend *~ *.a *.so $(LIB)
+	rm -f *.o *.d .depend *~ *.a *$(SLIBSUF) $(LIB)
 
 #
 # include dependency files if they exist
diff --git a/libavutil/Makefile b/libavutil/Makefile
index 7594ab2c6b2..6765cc7ea17 100644
--- a/libavutil/Makefile
+++ b/libavutil/Makefile
@@ -22,22 +22,25 @@ SRCS := $(OBJS:.o=.c)
 
 LIB= $(LIBPREF)avutil$(LIBSUF)
 ifeq ($(BUILD_SHARED),yes)
-SLIB= $(SLIBPREF)avutil$(SLIBSUF)
+SLIBNAME= $(SLIBPREF)avutil$(SLIBSUF)
+ifeq ($(CONFIG_DARWIN),yes)
+SHFLAGS += -Wl,-install_name,$(libdir)/$(SLIBNAME),-current_version,$(SPPVERSION),-compatibility_version,$(SPPVERSION)
+endif
 endif
 
-all: $(LIB) $(SLIB)
+all: $(LIB) $(SLIBNAME)
 
 $(LIB): $(OBJS)
 	rm -f $@
 	$(AR) rc $@ $(OBJS)
 	$(RANLIB) $@
 
-$(SLIB): $(OBJS)
+$(SLIBNAME): $(OBJS)
 ifeq ($(CONFIG_WIN32),yes)
 	$(CC) $(SHFLAGS) -Wl,--output-def,$(@:.dll=.def) -o $@ $(OBJS) $(EXTRALIBS) $(AMREXTRALIBS)
 	-lib /machine:i386 /def:$(@:.dll=.def)
 else
-	$(CC) $(SHFLAGS) -o $@ $(OBJS) $(EXTRALIBS) $(AMREXTRALIBS) $(LDFLAGS)
+	$(CC) $(SHFLAGS) $(LDFLAGS) -o $@ $(OBJS) $(EXTRALIBS) $(AMREXTRALIBS)
 endif
 
 %.o: %.c
@@ -49,7 +52,7 @@ depend: $(SRCS)
 dep:	depend
 
 clean:
-	rm -f *.o *.d *~ .depend $(LIB) $(SLIB) *.so
+	rm -f *.o *.d *~ .depend $(LIB) $(SLIBNAME) *$(SLIBSUF)
 
 distclean: clean
 	rm -f Makefile.bak .depend
@@ -58,11 +61,11 @@ distclean: clean
 ifeq ($(BUILD_SHARED),yes)
 install: all install-headers
 ifeq ($(CONFIG_WIN32),yes)
-	install $(INSTALLSTRIP) -m 755 $(SLIB) "$(prefix)"
+	install $(INSTALLSTRIP) -m 755 $(SLIBNAME) "$(prefix)"
 else
 	install -d $(libdir)
-	install $(INSTALLSTRIP) -m 755 $(SLIB) $(libdir)/libavutil-$(VERSION).so
-	ln -sf libavutil-$(VERSION).so $(libdir)/libavutil.so
+	install $(INSTALLSTRIP) -m 755 $(SLIBNAME) $(libdir)/libavutil-$(VERSION)$(SLIBSUF)
+	ln -sf libavutil-$(VERSION)$(SLIBSUF) $(libdir)/$(SLIBNAME)
 	$(LDCONFIG) || true
 endif
 else
diff --git a/vhook/Makefile b/vhook/Makefile
index cc001f5e246..d8c7655a300 100644
--- a/vhook/Makefile
+++ b/vhook/Makefile
@@ -5,22 +5,22 @@ VPATH=$(SRC_PATH)/vhook
 CFLAGS=-fPIC $(SHCFLAGS) -I.. -I$(SRC_PATH) -I$(SRC_PATH)/libavformat -I$(SRC_PATH)/libavcodec -I$(SRC_PATH)/libavutil -DHAVE_AV_CONFIG_H
 
 ifeq ($(CONFIG_DARWIN),yes)
-SHFLAGS+=-flat_namespace -undefined suppress
+	SHFLAGS += -flat_namespace
 endif
-HOOKS=null.so fish.so ppm.so watermark.so
+HOOKS=null$(SLIBSUF) fish$(SLIBSUF) ppm$(SLIBSUF) watermark$(SLIBSUF)
 
 ifeq ($(HAVE_IMLIB2),yes)
-    HOOKS += imlib2.so
+    HOOKS += imlib2$(SLIBSUF)
 endif    
 
 ifeq ($(HAVE_FREETYPE2),yes)
-    HOOKS += drawtext.so
+    HOOKS += drawtext$(SLIBSUF)
     CFLAGS += `freetype-config --cflags`
 endif    
 
 all: $(HOOKS) 
 
-SRCS := $(HOOKS:.so=.c)
+SRCS := $(HOOKS:$(SLIBSUF)=.c)
 
 depend: $(SRCS)
 	$(CC) -MM $(CFLAGS) $^ 1>.depend
@@ -29,17 +29,21 @@ install:
 	install -d "$(libdir)/vhook"
 	install -m 755 $(HOOKS) "$(libdir)/vhook"
 
-imlib2.so: imlib2.o
+imlib2$(SLIBSUF): imlib2.o
 	$(CC) $(LDFLAGS) -g -o $@ $(SHFLAGS) $< -lImlib2
 
-drawtext.so: drawtext.o
+drawtext$(SLIBSUF): drawtext.o
 	$(CC) $(LDFLAGS) -g -o $@ $(SHFLAGS) $< `freetype-config --libs`
 
-%.so: %.o
+%$(SLIBSUF): %.o
+ifeq ($(CONFIG_DARWIN),yes)
+	$(CC) $(LDFLAGS) $(SHFLAGS) -Wl,-install_name,$(libdir)/vhoook/$@ -g -o $@ $<
+else
 	$(CC) $(LDFLAGS) -g -o $@ $(SHFLAGS) $<
+endif
 
 clean:
-	rm -f *.o *.d .depend *.so *~
+	rm -f *.o *.d .depend *$(SLIBSUF) *~
 
 ifneq ($(wildcard .depend),)
 include .depend
-- 
GitLab