Hi all,

Attached is a first draft of a patch to add a -fstatic-libgfortran
option. This new option is recognized by the driver and instead of
adding "-lgfortran" to the various subprocesses, it adds "-Wl,-Bstatic
-lgfortran -Wl,-Bdynamic". I have two questions about this:
 + linkers other than the GNU linker might have problems with that.
is there a more general way of doing this? or should it be conditional
on some macro, like HAVE_LD_STATIC_DYNAMIC?
 + when -static is used later in the command line, this trick doesn't
work; would "%{!static:-Wl,-Bstatic} -lgfortran
%{!static:-Wl,-Bdynamic}" be a good replacement?

Thanks for the help, I'm a bit a loss with non-GNU linkers... :(

FX
Index: lang.opt
===================================================================
--- lang.opt	(revision 123942)
+++ lang.opt	(working copy)
@@ -249,6 +249,10 @@
 Fortran
 Use the narrowest integer type possible for enumeration types
 
+fstatic-libgfortran
+Fortran
+Statically link the GNU Fortran helper library (libgfortran)
+
 funderscoring
 Fortran
 Append underscores to externally visible names
Index: options.c
===================================================================
--- options.c	(revision 123942)
+++ options.c	(working copy)
@@ -549,6 +549,9 @@
       gfc_option.flag_second_underscore = value;
       break;
 
+    case OPT_fstatic_libgfortran:
+      break;
+
     case OPT_fimplicit_none:
       gfc_option.flag_implicit_none = value;
       break;
Index: gfortranspec.c
===================================================================
--- gfortranspec.c	(revision 123942)
+++ gfortranspec.c	(working copy)
@@ -82,6 +82,7 @@
 				   -nodefaultlibs.  */
   OPTION_o,			/* Aka --output.  */
   OPTION_S,			/* Aka --assemble.  */
+  OPTION_static_libgfortran,	/* -fstatic-libgfortran.  */
   OPTION_syntax_only,		/* -fsyntax-only.  */
   OPTION_v,			/* Aka --verbose.  */
   OPTION_version,		/* --version.  */
@@ -170,6 +171,8 @@
 	opt = OPTION_nostdlib;
       else if (!strcmp (text, "-fsyntax-only"))
 	opt = OPTION_syntax_only;
+      else if (!strcmp (text, "-fstatic-libgfortran"))
+	opt = OPTION_static_libgfortran;
       else if (!strcmp (text, "-dumpversion"))
 	opt = OPTION_version;
       else if (!strcmp (text, "-fversion"))	/* Really --version!! */
@@ -265,6 +268,9 @@
   /* By default, we throw on the math library if we have one.  */
   int need_math = (MATH_LIBRARY[0] != '\0');
 
+  /* Whether we should link a static libgfortran.  */
+  int static_lib = 0;
+
   /* The number of input and output files in the incoming arg list.  */
   int n_infiles = 0;
   int n_outfiles = 0;
@@ -323,6 +329,10 @@
 	  library = 0;
 	  break;
 
+	case OPTION_static_libgfortran:
+	  static_lib = 1;
+	  break;
+
 	case OPTION_l:
 	  ++n_infiles;
 	  break;
@@ -468,11 +478,28 @@
 		      append_arg (FORTRAN_INIT);
 		      use_init = 1;
 		    }
+
+		  if (static_lib)
+		    append_arg ("-Wl,-Bstatic");
 		  append_arg (FORTRAN_LIBRARY);
+		  if (static_lib)
+		    append_arg ("-Wl,-Bdynamic");
 		}
 	    }
 	  else if (strcmp (argv[i], FORTRAN_LIBRARY) == 0)
-	    saw_library = 1;	/* -l<library>.  */
+	    {
+	      saw_library = 1;	/* -l<library>.  */
+
+	      if (static_lib)
+		append_arg ("-Wl,-Bstatic");
+	      
+	      append_arg (argv[i]);
+
+	      if (static_lib)
+		append_arg ("-Wl,-Bdynamic");
+
+	      continue;
+	    }
 	  else
 	    {			/* Other library, or filename.  */
 	      if (saw_library == 1 && need_math)
@@ -498,7 +525,12 @@
 	      append_arg (FORTRAN_INIT);
 	      use_init = 1;
 	    }
+
+	  if (static_lib)
+	    append_arg ("-Wl,-Bstatic");
 	  append_arg (library);
+	  if (static_lib)
+	    append_arg ("-Wl,-Bdynamic");
 	case 1:
 	  if (need_math)
 	    append_arg (MATH_LIBRARY);

Reply via email to