t-slibgcc-darwin 6.6 KB

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