1 1.1 mrg # Build a shared libgcc library with the darwin linker. 2 1.8 mrg 3 1.8 mrg SHLIB_SOVERSION = 1.1 4 1.8 mrg SHLIB_SO_MINVERSION = 1 5 1.8 mrg SHLIB_VERSTRING = -compatibility_version $(SHLIB_SO_MINVERSION) \ 6 1.8 mrg -current_version $(SHLIB_SOVERSION) 7 1.1 mrg SHLIB_EXT = .dylib 8 1.8 mrg SHLIB_LC = -lSystem 9 1.8 mrg SHLIB_INSTALL_DIR = $(slibdir) 10 1.8 mrg 11 1.8 mrg SHLIB_MKMAP = $(srcdir)/mkmap-flat.awk 12 1.8 mrg SHLIB_MKMAP_OPTS = -v leading_underscore=1 13 1.8 mrg 14 1.8 mrg # Shorthand expressions for the LINK below, these are substituted in the 15 1.8 mrg # link expression. 16 1.1 mrg SHLIB_INSTALL_NAME = @shlib_base_name@.$(SHLIB_SOVERSION)$(SHLIB_EXT) 17 1.1 mrg SHLIB_MAP = @shlib_map_file@ 18 1.1 mrg SHLIB_DIR = @multilib_dir@ 19 1.8 mrg SHLIB_SONAME = @shlib_base_name@$(SHLIB_EXT) 20 1.1 mrg 21 1.8 mrg # Darwin only searches in shlib_slibdir for shared libraries, not in 22 1.8 mrg # subdirectories. The link builds one architecture slice in its designated 23 1.8 mrg # subdir. The code under MULTIBUILDTOP combines these into a single FAT 24 1.8 mrg # library, that is what we eventually install. 25 1.1 mrg 26 1.8 mrg SHLIB_LINK = $(CC) $(LIBGCC2_CFLAGS) $(LDFLAGS) -dynamiclib -nodefaultlibs \ 27 1.8 mrg -install_name $(SHLIB_INSTALL_DIR)/$(SHLIB_INSTALL_NAME) \ 28 1.1 mrg -single_module -o $(SHLIB_DIR)/$(SHLIB_SONAME) \ 29 1.1 mrg -Wl,-exported_symbols_list,$(SHLIB_MAP) \ 30 1.1 mrg $(SHLIB_VERSTRING) \ 31 1.8 mrg @multilib_flags@ @shlib_objs@ $(SHLIB_LC) 32 1.8 mrg 33 1.8 mrg # we do our own thing 34 1.8 mrg SHLIB_INSTALL = 35 1.8 mrg 36 1.8 mrg LGCC_FILES = libgcc_s.$(SHLIB_SOVERSION)$(SHLIB_EXT) 37 1.8 mrg 38 1.8 mrg ifeq ($(BUILD_LIBGCCS1),YES) 39 1.8 mrg 40 1.8 mrg # We are going to build a libgcc_s.1.dylib so that distributions can 41 1.8 mrg # install it for compatibility with binaries linked against the old 42 1.8 mrg # libgcc_ext.10.x.dylib stubs. 43 1.8 mrg 44 1.8 mrg # For systems after macOS 10.7 we can forward the correct unwinder symbols 45 1.8 mrg # from libSystem. 46 1.1 mrg 47 1.8 mrg # For older systems we have to forward an entire library (since they cannot 48 1.8 mrg # selectively forward symbols, which means that we cannot forward the unwinder 49 1.8 mrg # in /usr/lib/libgcc_s.1.dylib). We also cannot forward the entire library 50 1.8 mrg # since that creates a self-referencing loop when DYLD_LIBRARY_PATH is used. 51 1.8 mrg # To provide the unwinder symbols in this case, we build the unwinder into a 52 1.8 mrg # separate shared lib (libgcc_ehs) and forward that. 53 1.8 mrg 54 1.8 mrg # These targets are local to this make fragment, which means that they do not 55 1.8 mrg # get the substitutions seen in SHLIB_LINK. 56 1.8 mrg 57 1.8 mrg ifneq ($(LIBEHSOBJS),) 58 1.8 mrg 59 1.8 mrg EHS_INSTNAME = libgcc_ehs.$(SHLIB_SOVERSION)$(SHLIB_EXT) 60 1.8 mrg 61 1.8 mrg # multilib build for a shared EH lib. 62 1.8 mrg 63 1.8 mrg libgcc_ehs$(SHLIB_EXT): $(LIBEHSOBJS) $(extra-parts) 64 1.8 mrg mkdir -p $(MULTIDIR) 65 1.8 mrg $(CC) $(LIBGCC2_CFLAGS) $(LDFLAGS) -dynamiclib -nodefaultlibs \ 66 1.8 mrg -install_name $(SHLIB_INSTALL_DIR)/$(EHS_INSTNAME) \ 67 1.8 mrg -o $(MULTIDIR)/libgcc_ehs$(SHLIB_EXT) $(SHLIB_VERSTRING) \ 68 1.8 mrg $(LIBEHSOBJS) $(SHLIB_LC) 69 1.8 mrg 70 1.8 mrg all: libgcc_ehs$(SHLIB_EXT) 71 1.8 mrg 72 1.8 mrg LGCC_FILES += libgcc_ehs.$(SHLIB_SOVERSION)$(SHLIB_EXT) 73 1.8 mrg 74 1.8 mrg endif 75 1.9 mrg endif 76 1.9 mrg 77 1.9 mrg INSTALL_FILES=$(LGCC_FILES) 78 1.8 mrg 79 1.9 mrg ifeq ($(BUILD_LIBGCCS1),YES) 80 1.8 mrg # Provide libgcc_s.1 for backwards compatibility. 81 1.9 mrg INSTALL_FILES += libgcc_s.1.dylib 82 1.1 mrg endif 83 1.1 mrg 84 1.8 mrg # For the toplevel multilib, build FAT dylibs including all the multilibs. 85 1.1 mrg ifeq ($(MULTIBUILDTOP),) 86 1.1 mrg 87 1.1 mrg ifeq ($(enable_shared),yes) 88 1.1 mrg all: $(INSTALL_FILES) 89 1.1 mrg install-leaf: install-darwin-libgcc-stubs 90 1.1 mrg endif 91 1.1 mrg 92 1.8 mrg libgcc_s.$(SHLIB_SOVERSION)$(SHLIB_EXT): all-multi libgcc_s$(SHLIB_EXT) 93 1.8 mrg MLIBS=`$(CC) --print-multi-lib | sed -e 's/;.*$$//'` ; \ 94 1.8 mrg for mlib in $$MLIBS ; do \ 95 1.8 mrg cp ../$${mlib}/libgcc/$${mlib}/libgcc_s$(SHLIB_EXT) \ 96 1.8 mrg ./libgcc_s.$(SHLIB_SOVERSION)$(SHLIB_EXT)_T_$${mlib} || exit 1 ; \ 97 1.8 mrg done 98 1.8 mrg $(LIPO) -output libgcc_s.$(SHLIB_SOVERSION)$(SHLIB_EXT) \ 99 1.8 mrg -create libgcc_s.$(SHLIB_SOVERSION)$(SHLIB_EXT)_T* 100 1.8 mrg rm libgcc_s.$(SHLIB_SOVERSION)$(SHLIB_EXT)_T* 101 1.8 mrg 102 1.8 mrg ifeq ($(BUILD_LIBGCCS1),YES) 103 1.8 mrg ifneq ($(LIBEHSOBJS),) 104 1.8 mrg 105 1.8 mrg libgcc_ehs.$(SHLIB_SOVERSION)$(SHLIB_EXT): all-multi libgcc_ehs$(SHLIB_EXT) 106 1.1 mrg MLIBS=`$(CC) --print-multi-lib | sed -e 's/;.*$$//'` ; \ 107 1.1 mrg for mlib in $$MLIBS ; do \ 108 1.8 mrg cp ../$${mlib}/libgcc/$${mlib}/libgcc_ehs$(SHLIB_EXT) \ 109 1.8 mrg ./libgcc_ehs.$(SHLIB_SOVERSION)$(SHLIB_EXT)_T_$${mlib} || exit 1 ; \ 110 1.1 mrg done 111 1.8 mrg $(LIPO) -output libgcc_ehs.$(SHLIB_SOVERSION)$(SHLIB_EXT) \ 112 1.8 mrg -create libgcc_ehs.$(SHLIB_SOVERSION)$(SHLIB_EXT)_T* 113 1.8 mrg rm libgcc_ehs.$(SHLIB_SOVERSION)$(SHLIB_EXT)_T* 114 1.1 mrg 115 1.8 mrg 116 1.8 mrg libgcc_s.1.dylib: all-multi libgcc_s.$(SHLIB_SOVERSION)$(SHLIB_EXT) \ 117 1.8 mrg libgcc_ehs.$(SHLIB_SOVERSION)$(SHLIB_EXT) 118 1.1 mrg MLIBS=`$(CC) --print-multi-lib | sed -e 's/;.*$$//'` ; \ 119 1.1 mrg for mlib in $$MLIBS ; do \ 120 1.8 mrg cp ../$${mlib}/libgcc/$${mlib}/libgcc_s$(SHLIB_EXT) \ 121 1.8 mrg ./libgcc_s.$(SHLIB_SOVERSION)$(SHLIB_EXT)_T_$${mlib} || exit 1 ; \ 122 1.8 mrg cp ../$${mlib}/libgcc/$${mlib}/libgcc_ehs$(SHLIB_EXT) \ 123 1.8 mrg ./libgcc_ehs.$(SHLIB_SOVERSION)$(SHLIB_EXT)_T_$${mlib} || exit 1 ; \ 124 1.8 mrg arch=`$(LIPO) -info libgcc_s.$(SHLIB_SOVERSION)$(SHLIB_EXT)_T_$${mlib} | sed -e 's/.*:\ //'` ; \ 125 1.8 mrg $(CC) -arch $${arch} -nodefaultlibs -dynamiclib \ 126 1.8 mrg -o libgcc_s.1$(SHLIB_EXT)_T_$${mlib} \ 127 1.8 mrg -Wl,-reexport_library,libgcc_s.$(SHLIB_SOVERSION)$(SHLIB_EXT)_T_$${mlib} \ 128 1.8 mrg -Wl,-reexport_library,libgcc_ehs.$(SHLIB_SOVERSION)$(SHLIB_EXT)_T_$${mlib} \ 129 1.8 mrg -install_name $(SHLIB_INSTALL_DIR)/libgcc_s.1.dylib \ 130 1.8 mrg -compatibility_version 1 -current_version 1 ; \ 131 1.1 mrg done 132 1.8 mrg $(LIPO) -output libgcc_s.1$(SHLIB_EXT) -create libgcc_s.1$(SHLIB_EXT)_T* 133 1.8 mrg rm libgcc_s.$(SHLIB_SOVERSION)$(SHLIB_EXT)_T* 134 1.8 mrg rm libgcc_ehs.$(SHLIB_SOVERSION)$(SHLIB_EXT)_T* 135 1.1 mrg 136 1.8 mrg else 137 1.8 mrg 138 1.8 mrg libgcc_s.1.dylib: all-multi libgcc_s.$(SHLIB_SOVERSION)$(SHLIB_EXT) 139 1.1 mrg MLIBS=`$(CC) --print-multi-lib | sed -e 's/;.*$$//'` ; \ 140 1.1 mrg for mlib in $$MLIBS ; do \ 141 1.1 mrg cp ../$${mlib}/libgcc/$${mlib}/libgcc_s$(SHLIB_EXT) \ 142 1.1 mrg ./libgcc_s.$(SHLIB_SOVERSION)$(SHLIB_EXT)_T_$${mlib} || exit 1 ; \ 143 1.8 mrg arch=`$(LIPO) -info libgcc_s.$(SHLIB_SOVERSION)$(SHLIB_EXT)_T_$${mlib} | sed -e 's/.*:\ //'` ; \ 144 1.8 mrg $(CC) -arch $${arch} -nodefaultlibs -dynamiclib \ 145 1.8 mrg -o libgcc_s.1$(SHLIB_EXT)_T_$${mlib} \ 146 1.8 mrg -Wl,-reexport_library,libgcc_s.$(SHLIB_SOVERSION)$(SHLIB_EXT)_T_$${mlib} \ 147 1.8 mrg -lSystem \ 148 1.8 mrg -Wl,-reexported_symbols_list,$(srcdir)/config/darwin-unwind.ver \ 149 1.8 mrg -install_name $(SHLIB_INSTALL_DIR)/libgcc_s.1.dylib \ 150 1.8 mrg -compatibility_version 1 -current_version 1 ; \ 151 1.1 mrg done 152 1.8 mrg $(LIPO) -output libgcc_s.1$(SHLIB_EXT) -create libgcc_s.1$(SHLIB_EXT)_T* 153 1.1 mrg rm libgcc_s.$(SHLIB_SOVERSION)$(SHLIB_EXT)_T* 154 1.1 mrg 155 1.8 mrg endif 156 1.8 mrg endif 157 1.8 mrg 158 1.8 mrg # Install the shared libraries. 159 1.8 mrg 160 1.1 mrg install-darwin-libgcc-stubs : 161 1.1 mrg $(mkinstalldirs) $(DESTDIR)$(slibdir) 162 1.9 mrg if test x$(slibdir) = x; then \ 163 1.9 mrg for d in $(LGCC_FILES) ; do \ 164 1.9 mrg $(INSTALL_DATA) $$d $(DESTDIR)$(slibdir)/$$d || exit 1 ; \ 165 1.9 mrg done; \ 166 1.9 mrg else \ 167 1.9 mrg for d in $(INSTALL_FILES) ; do \ 168 1.9 mrg $(INSTALL_DATA) $$d $(DESTDIR)$(slibdir)/$$d || exit 1 ; \ 169 1.9 mrg done; \ 170 1.9 mrg fi 171 1.1 mrg 172 1.1 mrg else 173 1.1 mrg 174 1.8 mrg # Do not install shared libraries for multilibs. Unless we are putting them 175 1.8 mrg # in the gcc directory during a build, for compatibility with the pre-top- 176 1.8 mrg # level layout. In that case we provide symlinks to the FAT lib from the 177 1.8 mrg # multilib sub-directories. 178 1.1 mrg 179 1.1 mrg ifeq ($(enable_shared),yes) 180 1.1 mrg all: install-darwin-libgcc-links 181 1.1 mrg endif 182 1.1 mrg 183 1.1 mrg install-darwin-libgcc-links: 184 1.1 mrg $(mkinstalldirs) $(gcc_objdir)$(MULTISUBDIR) 185 1.1 mrg for file in $(INSTALL_FILES); do \ 186 1.1 mrg rm -f $(gcc_objdir)$(MULTISUBDIR)/$$file; \ 187 1.1 mrg $(LN_S) ../$$file $(gcc_objdir)$(MULTISUBDIR)/; \ 188 1.1 mrg done 189 1.1 mrg 190 1.1 mrg endif 191