This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[RFC/RFA] PR 11572 GNU ObjC Runtime for Darwin


Hello,

This patch reactivates the GNU ObjC Runtime on Darwin and installs its headers into a special subdirectory of /include called /libobjc_gnu and also appends _gnu to the library name (i.e.: libobjc_gnu and libobjc_gnu_gc respectively) when installing on Darwin. This is intended to fix:
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=11572


This patch also includes the gcc-lib->gcc fixes, which haven't been committed yet for easy testing. (Any insight on the hold up? Alex doesn't have write access, just in case someone's waiting on him to commit it.)
http://gcc.gnu.org/ml/gcc-patches/2003-08/msg01357.html
http://gcc.gnu.org/ml/gcc-patches/2003-08/msg01370.html
http://gcc.gnu.org/ml/gcc-patches/2003-08/msg01406.html
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=12034


This patch hasn't been tested on Darwin, as I don't have a Darwin to test it. But I've been tested and bootstrapped a slightly modified version that does the same for linux. I'm also not sure how to create a test case for this. Any pointers are appreciated.

I have cc'ed Bill Northcott, as the SWARM project has recently seen some trouble with the Apple compiler when porting to OS X and may be interested in the availability of the GNU ObjC Runtime on Darwin.

I previously tried playing with specs to allow -fgnu-runtime to implicitly correct the include path to find the correct <objc/objc.h> and to set either -L or -l flags. I've added some comments below about this endeavour. But the result was, "don't have -f imply anything about -I, -L or -l" so I've also added a note the description of the flag.

Nicola, I think we can sort the flags out during configuration of gnustep-make on Darwin by parsing gcc -print-search-dirs and testing for the installed runtime libraries, insulating the complexity for our GNUstep users. Does this sound acceptable? Carl?

About Using SPECS to imply -I, -L and -l flags...
To determine the location of the libobjc_gnu directory during spec evaluation, I've had added a gcc_include_dir_spec_function to gcc.c. I then considered a more general function named something like: gcc_config_spec_function() that took a key as an argument. A key from a well known set, which specifies which type of gcc configuration specific information is requested. Candidates for keys would have been something like:


gcc_include_dir
standard_exec_prefix
standard_libexec_prefix
standard_bindir_prefix
tool_base_prefix
default_target_version
default_target_machine
...
[someone with a better understanding of the different configuration possibilities should propose a better list]


I also played with keeping the library name but installing it into a special directory and use a similar mechanism to set a -L flag. But at execution time one would still have to play with ld.so.conf/LD_LIBRARY_PATH to find the "correct" library. That's when I decided to install it in the standard location but to give it a new name. But the new name (-lobjc_gnu)would have to be provided explicitly and most current projects provide -lobjc already. Therefore I've decided that the -I SPEC handling should also be left to the developer.

top:
2003-08-26  David Ayers  <d.ayers@inode.at>

   libobjc/11572
   * configure.in: Allow configuration of libobjc on Darwin.
   * configure: Regenerate.

gcc:
2003-08-26  David Ayers  <d.ayers@inode.at>

   libobjc/11572
   * doc/invoke.texi:  Clarify the implications of
   -fgnu-runtime and -fnext-runtime.

libobjc:
2003-08-26  David Ayers  <d.ayers@inode.at>

   libobjc/11572
   * configure.in: Set special libobjc_gnu directory name
   for headers and append '_gnu' to library names on Darwin.
   Updated some comments.
   * configure: Regenerate.
   * Makefile.in:  Allow for installing headers in special
   subdirectory and libraries with special extension.
   Reformat for coding standards.

Index: configure
===================================================================
RCS file: /cvsroot/gcc/gcc/configure,v
retrieving revision 1.112
diff -u -r1.112 configure
--- configure	23 Aug 2003 04:17:04 -0000	1.112
+++ configure	26 Aug 2003 10:19:33 -0000
@@ -1087,7 +1087,7 @@
     ;;
   *-*-darwin*)
     noconfigdirs="$noconfigdirs bfd binutils ld gas opcodes gdb gprof"
-    noconfigdirs="$noconfigdirs target-libobjc ${libgcj}"
+    noconfigdirs="$noconfigdirs ${libgcj}"
     ;;
   *-*-freebsd[12] | *-*-freebsd[12].* | *-*-freebsd*aout*)
     noconfigdirs="$noconfigdirs target-newlib target-libgloss ${libgcj}"
Index: configure.in
===================================================================
RCS file: /cvsroot/gcc/gcc/configure.in,v
retrieving revision 1.253
diff -u -r1.253 configure.in
--- configure.in	23 Aug 2003 04:17:04 -0000	1.253
+++ configure.in	26 Aug 2003 10:19:33 -0000
@@ -338,7 +338,7 @@
     ;;
   *-*-darwin*)
     noconfigdirs="$noconfigdirs bfd binutils ld gas opcodes gdb gprof"
-    noconfigdirs="$noconfigdirs target-libobjc ${libgcj}"
+    noconfigdirs="$noconfigdirs ${libgcj}"
     ;;
   *-*-freebsd[[12]] | *-*-freebsd[[12]].* | *-*-freebsd*aout*)
     noconfigdirs="$noconfigdirs target-newlib target-libgloss ${libgcj}"
Index: gcc/doc/invoke.texi
===================================================================
RCS file: /cvsroot/gcc/gcc/gcc/doc/invoke.texi,v
retrieving revision 1.330
diff -u -r1.330 invoke.texi
--- gcc/doc/invoke.texi	22 Aug 2003 22:36:42 -0000	1.330
+++ gcc/doc/invoke.texi	26 Aug 2003 10:19:39 -0000
@@ -1783,6 +1783,9 @@
 @opindex fgnu-runtime
 Generate object code compatible with the standard GNU Objective-C
 runtime.  This is the default for most types of systems.
+Note this option does not imply any -I, -L or -l flags to determine
+which runtime headers are included and against which runtime library
+the executable is linked.
 
 @item -fnext-runtime
 @opindex fnext-runtime
@@ -1790,6 +1793,9 @@
 for NeXT-based systems, including Darwin and Mac OS X@.  The macro
 @code{__NEXT_RUNTIME__} is predefined if (and only if) this option is
 used.
+Note this option does not imply any -I, -L or -l flags to determine
+which runtime headers are included and against which runtime library
+the executable is linked.
 
 @item -gen-decls
 @opindex gen-decls
Index: libobjc/Makefile.in
===================================================================
RCS file: /cvsroot/gcc/gcc/libobjc/Makefile.in,v
retrieving revision 1.24
diff -u -r1.24 Makefile.in
--- libobjc/Makefile.in	23 May 2003 20:04:58 -0000	1.24
+++ libobjc/Makefile.in	26 Aug 2003 10:19:43 -0000
@@ -39,11 +39,12 @@
 toolexecdir = @glibcpp_toolexecdir@
 glibcpp_toolexecdir = @glibcpp_toolexecdir@
 glibcpp_toolexeclibdir = @glibcpp_toolexeclibdir@
+install_inc_subdir = @install_inc_subdir@
 
 top_builddir = .
 
 libdir = $(exec_prefix)/lib
-libsubdir = $(libdir)/gcc-lib/$(target_alias)/$(gcc_version)
+libsubdir = $(libdir)/gcc/$(target_alias)/$(gcc_version)
 
 # Multilib support variables.
 MULTISRCTOP =
@@ -103,6 +104,8 @@
 OBJC_THREAD_FILE=thr-objc
 OBJC_BOEHM_GC=@OBJC_BOEHM_GC@
 
+LIBOBJCNAME=@LIBOBJCNAME@
+
 .SUFFIXES:
 .SUFFIXES: .c .m .lo
 
@@ -137,7 +140,7 @@
 	"libsubdir=$(libsubdir)" \
 	"tooldir=$(tooldir)"
 
-all: libobjc.la $(OBJC_BOEHM_GC)
+all: $(LIBOBJCNAME).la $(OBJC_BOEHM_GC)
 	: $(MAKE) ; exec $(MULTIDO) $(FLAGS_TO_PASS) multi-do DO=all
 
 # User-visible header files.
@@ -261,12 +264,12 @@
 
 doc: info dvi html
 
-libobjc.la: $(OBJS)
+$(LIBOBJCNAME).la: $(OBJS)
 	$(LIBTOOL_LINK) $(CC) -o $@ $(OBJS) \
 		-rpath $(glibcpp_toolexeclibdir) \
 		-version-info $(LIBOBJC_VERSION)
 
-libobjc_gc.la: $(OBJS_GC)
+$(LIBOBJCNAME)_gc.la: $(OBJS_GC)
 	$(LIBTOOL_LINK) $(CC) -o $@ $(OBJS_GC) \
 		-rpath $(glibcpp_toolexeclibdir) \
 		-version-info $(LIBOBJC_GC_VERSION)
@@ -277,23 +280,30 @@
 # without extra code but since I don't have a win machine to test 
 # if it already works, I leave the old code here.
 #
-libobjc_s.a: libobjc.la
-	mv libobjc.a libobjc_s.a
+$(LIBOBJCNAME)_s.a: $(LIBOBJCNAME).la
+	mv $(LIBOBJCNAME).a $(LIBOBJCNAME)_s.a
 
 # Create a relocatable DLL
-libobjc.dll: libobjc_s.a libobjc_entry.o
-	$(CC) -mdll -Wl,--base-file -Wl,libobjc.base \
-		-o libobjc.dll libobjc_s.a libobjc_entry.o -lkernel32
-	$(DLLTOOL) --dllname libobjc.dll --def $(srcdir)/libobjc.def \
-		--base-file libobjc.base --output-exp libobjc.exp
-	$(GCC_FOR_TARGET) -mdll -Wl,--base-file libobjc.base libobjc.exp \
-		-o libobjc.dll libobjc_s.a libobjc_entry.o -lkernel32
-	$(DLLTOOL) --dllname libobjc.dll --def $(srcdir)/libobjc.def \
-		--base-file libobjc.base --output-exp libobjc.exp
-	$(GCC_FOR_TARGET) libobjc.exp -mdll \
-		-o libobjc.dll libobjc_s.a libobjc_entry.o -lkernel32
-	$(DLLTOOL) --dllname libobjc.dll --def $(srcdir)/libobjc.def \
-		--output-lib libobjc.a
+$(LIBOBJCNAME).dll: $(LIBOBJCNAME)_s.a $(LIBOBJCNAME)_entry.o
+	$(CC) -mdll -Wl,--base-file -Wl,$(LIBOBJCNAME).base \
+		-o $(LIBOBJCNAME).dll $(LIBOBJCNAME)_s.a \
+		$(LIBOBJCNAME)_entry.o -lkernel32
+	$(DLLTOOL) --dllname $(LIBOBJCNAME).dll \
+		--def $(srcdir)/$(LIBOBJCNAME).def \
+		--base-file $(LIBOBJCNAME).base --output-exp $(LIBOBJCNAME).exp
+	$(GCC_FOR_TARGET) -mdll -Wl,--base-file $(LIBOBJCNAME).base \
+		$(LIBOBJCNAME).exp \
+		-o $(LIBOBJCNAME).dll $(LIBOBJCNAME)_s.a \
+		$(LIBOBJCNAME)_entry.o -lkernel32
+	$(DLLTOOL) --dllname $(LIBOBJCNAME).dll \
+		--def $(srcdir)/$(LIBOBJCNAME).def \
+		--base-file $(LIBOBJCNAME).base --output-exp $(LIBOBJCNAME).exp
+	$(GCC_FOR_TARGET) $(LIBOBJCNAME).exp -mdll \
+		-o $(LIBOBJCNAME).dll $(LIBOBJCNAME)_s.a \
+		$(LIBOBJCNAME)_entry.o -lkernel32
+	$(DLLTOOL) --dllname $(LIBOBJCNAME).dll \
+		--def $(srcdir)/$(LIBOBJCNAME).def \
+		--output-lib $(LIBOBJCNAME).a
 #
 #
 #
@@ -319,28 +329,33 @@
 install: install-libs install-headers
 
 install-libs: installdirs
-	$(SHELL) $(toplevel_srcdir)/mkinstalldirs $(DESTDIR)$(glibcpp_toolexeclibdir)
-	$(LIBTOOL_INSTALL) $(INSTALL) libobjc.la $(DESTDIR)$(glibcpp_toolexeclibdir);
+	$(SHELL) $(toplevel_srcdir)/mkinstalldirs \
+	  $(DESTDIR)$(glibcpp_toolexeclibdir)
+	$(LIBTOOL_INSTALL) $(INSTALL) $(LIBOBJCNAME).la \
+	  $(DESTDIR)$(glibcpp_toolexeclibdir)/$(LIBOBJCNAME).la;
 	if [ "$(OBJC_BOEHM_GC)" ]; then \
-	  $(LIBTOOL_INSTALL) $(INSTALL) libobjc_gc.la \
-				$(DESTDIR)$(glibcpp_toolexeclibdir);\
+	  $(LIBTOOL_INSTALL) $(INSTALL) $(LIBOBJCNAME)_gc.la \
+	    $(DESTDIR)$(glibcpp_toolexeclibdir)/$(LIBOBJCNAME)_gc.la;\
 	fi
 	$(MULTIDO) $(FLAGS_TO_PASS) multi-do DO="$@"
-	@-$(LIBTOOL) --mode=finish $(DESTDIR)$(glibcpp_toolexeclibdir)
+	@-$(LIBTOOL) --mode=finish \
+	  $(DESTDIR)$(glibcpp_toolexeclibdir)
 
 # Copy Objective C headers to installation include directory.
 install-headers:
-	$(SHELL) $(toplevel_srcdir)/mkinstalldirs $(DESTDIR)$(libsubdir)/include/objc
+	$(SHELL) $(toplevel_srcdir)/mkinstalldirs \
+	  $(DESTDIR)$(libsubdir)/include$(install_inc_subdir)/objc
 	for file in $(OBJC_H); do \
 	  realfile=$(srcdir)/objc/$${file}; \
-	  $(INSTALL_DATA) $${realfile} $(DESTDIR)$(libsubdir)/include/objc; \
+	  $(INSTALL_DATA) $${realfile} \
+	    $(DESTDIR)$(libsubdir)/include$(install_inc_subdir)/objc; \
 	done
 
 check uninstall install-strip dist installcheck installdirs:
 
 mostlyclean:
-	-$(LIBTOOL_CLEAN) rm -f libobjc.la libobjc_gc.la *.lo
-	-rm -f runtime-info.h tmp-runtime.s *.o *.lo libobjc* xforward \
+	-$(LIBTOOL_CLEAN) rm -f $(LIBOBJCNAME).la $(LIBOBJCNAME)_gc.la *.lo
+	-rm -f runtime-info.h tmp-runtime.s *.o *.lo $(LIBOBJCNAME)* xforward \
 		fflags *.aux *.cp *.dvi *.fn *.info *.ky *.log *.pg \
 		*.toc *.tp *.vr *.html libobj.exp
 	@$(MULTICLEAN) multi-clean DO=mostlyclean
Index: libobjc/aclocal.m4
===================================================================
RCS file: /cvsroot/gcc/gcc/libobjc/aclocal.m4,v
retrieving revision 1.7
diff -u -r1.7 aclocal.m4
--- libobjc/aclocal.m4	12 Mar 2003 21:34:21 -0000	1.7
+++ libobjc/aclocal.m4	26 Aug 2003 10:19:43 -0000
@@ -196,7 +196,7 @@
   # and header files if --enable-version-specific-runtime-libs option
   # is selected.
   changequote(,)dnl
-  glibcpp_toolexecdir='$(libdir)/gcc-lib/$(target_alias)'
+  glibcpp_toolexecdir='$(libdir)/gcc/$(target_alias)'
   glibcpp_toolexeclibdir='$(toolexecdir)/'${gcc_version}'$(MULTISUBDIR)'
   changequote([,])dnl
 fi
@@ -209,7 +209,7 @@
     glibcpp_toolexecdir='$(exec_prefix)/$(target_alias)'
     glibcpp_toolexeclibdir='$(toolexecdir)/lib'
   else
-    glibcpp_toolexecdir='$(libdir)/gcc-lib/$(target_alias)'
+    glibcpp_toolexecdir='$(libdir)/gcc/$(target_alias)'
     glibcpp_toolexeclibdir='$(libdir)'
   fi
   multi_os_directory=`$CC -print-multi-os-directory`
Index: libobjc/configure
===================================================================
RCS file: /cvsroot/gcc/gcc/libobjc/configure,v
retrieving revision 1.30
diff -u -r1.30 configure
--- libobjc/configure	11 Apr 2003 04:20:16 -0000	1.30
+++ libobjc/configure	26 Aug 2003 10:19:44 -0000
@@ -1255,7 +1255,7 @@
   # Need the gcc compiler version to know where to install libraries
   # and header files if --enable-version-specific-runtime-libs option
   # is selected.
-    glibcpp_toolexecdir='$(libdir)/gcc-lib/$(target_alias)'
+    glibcpp_toolexecdir='$(libdir)/gcc/$(target_alias)'
   glibcpp_toolexeclibdir='$(toolexecdir)/'${gcc_version}'$(MULTISUBDIR)'
   fi
 
@@ -1267,7 +1267,7 @@
     glibcpp_toolexecdir='$(exec_prefix)/$(target_alias)'
     glibcpp_toolexeclibdir='$(toolexecdir)/lib'
   else
-    glibcpp_toolexecdir='$(libdir)/gcc-lib/$(target_alias)'
+    glibcpp_toolexecdir='$(libdir)/gcc/$(target_alias)'
     glibcpp_toolexeclibdir='$(libdir)'
   fi
   multi_os_directory=`$CC -print-multi-os-directory`
@@ -2750,7 +2750,7 @@
 { echo "configure: error: Can't find stdio.h.
 You must have a usable C system for the target already installed, at least
 including headers and, preferably, the library, before you can configure
-the Objective C runtime system.  If necessary, install gcc now with 
+the Objective-C runtime system.  If necessary, install gcc now with 
 \`LANGUAGES=c', then the target library, then build with \`LANGUAGES=objc'." 1>&2; exit 1; }
 fi
 
@@ -2920,13 +2920,37 @@
 GTHREAD_FLAGS=$objc_cv_gthread_flags
 
 
+
+# Darwin preinstalls the NeXT/Apple Objective-C runtime.  To insure that
+# installing the GNU Objective-C runtime does not conflict with that
+# installation, we add an extra level of indirection for the headers
+# (include/libobjc_gnu), which user code should take into account with
+# an appropriate -I flag.  The libraries are suffixed with _gnu
+# accordingly (libobjc_gnu, libobjc_gnu_gc) so user code must also
+# take this into account when specifing the -l option.  This currently
+# only applies to Darwin.  
+
+case "${target}" in
+  *-*-darwin*)
+    install_inc_subdir="/libobjc_gnu"
+    LIBOBJCNAME="libobjc_gnu"
+    ;;
+  *-*-*)
+    install_inc_subdir=""
+    LIBOBJCNAME="libobjc"
+    ;;
+esac
+
+
+
+
 # Check whether --enable-objc-gc or --disable-objc-gc was given.
 if test "${enable_objc_gc+set}" = set; then
   enableval="$enable_objc_gc"
   if [ x$enable_objc_gc = xno ]; then
         OBJC_BOEHM_GC=''
 else
-        OBJC_BOEHM_GC=libobjc_gc.la
+        OBJC_BOEHM_GC="$LIBOBJCNAME"_gc.la
 fi
 else
   OBJC_BOEHM_GC=''
@@ -3109,6 +3133,8 @@
 s%@SET_MAKE@%$SET_MAKE%g
 s%@CPP@%$CPP%g
 s%@GTHREAD_FLAGS@%$GTHREAD_FLAGS%g
+s%@install_inc_subdir@%$install_inc_subdir%g
+s%@LIBOBJCNAME@%$LIBOBJCNAME%g
 s%@OBJC_BOEHM_GC@%$OBJC_BOEHM_GC%g
 
 CEOF
Index: libobjc/configure.in
===================================================================
RCS file: /cvsroot/gcc/gcc/libobjc/configure.in,v
retrieving revision 1.20
diff -u -r1.20 configure.in
--- libobjc/configure.in	20 Feb 2003 09:08:24 -0000	1.20
+++ libobjc/configure.in	26 Aug 2003 10:19:44 -0000
@@ -66,7 +66,7 @@
   [AC_MSG_ERROR([Can't find stdio.h.
 You must have a usable C system for the target already installed, at least
 including headers and, preferably, the library, before you can configure
-the Objective C runtime system.  If necessary, install gcc now with 
+the Objective-C runtime system.  If necessary, install gcc now with 
 \`LANGUAGES=c', then the target library, then build with \`LANGUAGES=objc'.])])
 
 AC_HEADER_STDC
@@ -85,13 +85,37 @@
 GTHREAD_FLAGS=$objc_cv_gthread_flags
 AC_SUBST(GTHREAD_FLAGS)
 
+
+# Darwin preinstalls the NeXT/Apple Objective-C runtime.  To insure that
+# installing the GNU Objective-C runtime does not conflict with that
+# installation, we add an extra level of indirection for the headers
+# (include/libobjc_gnu), which user code should take into account with
+# an appropriate -I flag.  The libraries are suffixed with _gnu
+# accordingly (libobjc_gnu, libobjc_gnu_gc) so user code must also
+# take this into account when specifing the -l option.  This currently
+# only applies to Darwin.  
+
+case "${target}" in
+  *-*-darwin*)
+    install_inc_subdir="/libobjc_gnu"
+    LIBOBJCNAME="libobjc_gnu"
+    ;;
+  *-*-*)
+    install_inc_subdir=""
+    LIBOBJCNAME="libobjc"
+    ;;
+esac
+
+AC_SUBST(install_inc_subdir)
+AC_SUBST(LIBOBJCNAME)
+
 AC_ARG_ENABLE(objc-gc,
 [  --enable-objc-gc       enable the use of Boehm's garbage collector with
                           the GNU Objective-C runtime.],
 if [[[ x$enable_objc_gc = xno ]]]; then
         OBJC_BOEHM_GC=''
 else
-        OBJC_BOEHM_GC=libobjc_gc.la
+        OBJC_BOEHM_GC="$LIBOBJCNAME"_gc.la
 fi,
 OBJC_BOEHM_GC='')
 AC_SUBST(OBJC_BOEHM_GC)

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]