OSDN Git Service

gcc/
[pf3gnuchains/gcc-fork.git] / gcc / fortran / gfortranspec.c
index 259a0b8..9a44287 100644 (file)
@@ -1,12 +1,13 @@
 /* Specific flags and argument handling of the Fortran front-end.
-   Copyright (C) 1997, 1999, 2000, 2001, 2002, 2003, 2004, 2005 Free
-   Software Foundation, Inc.
+   Copyright (C) 1997, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006,
+   2007, 2008
+   Free Software Foundation, Inc.
 
 This file is part of GCC.
 
 GNU CC is free software; you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2, or (at your option)
+the Free Software Foundation; either version 3, or (at your option)
 any later version.
 
 GNU CC is distributed in the hope that it will be useful,
@@ -15,9 +16,9 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 GNU General Public License for more details.
 
 You should have received a copy of the GNU General Public License
-along with GNU CC; see the file COPYING.  If not, write to
-the Free Software Foundation, 51 Franklin Street, Fifth Floor,
-Boston, MA 02110-1301, USA.  */
+along with GCC; see the file COPYING3.  If not see
+<http://www.gnu.org/licenses/>.  */
+
 /* This file is copied more or less verbatim from g77.  */
 /* This file contains a filter for the main `gcc' driver, which is
    replicated for the `gfortran' driver by adding this filter.  The purpose
@@ -65,6 +66,20 @@ Boston, MA 02110-1301, USA.  */
 #define FORTRAN_LIBRARY "-lgfortran"
 #endif
 
+#ifdef HAVE_LD_STATIC_DYNAMIC
+#define ADD_ARG_LIBGFORTRAN(arg) \
+  { \
+    if (static_lib && !static_linking) \
+      append_arg ("-Wl,-Bstatic"); \
+    append_arg (arg); \
+    if (static_lib && !static_linking) \
+      append_arg ("-Wl,-Bdynamic"); \
+  }
+#else
+#define ADD_ARG_LIBGFORTRAN(arg) append_arg (arg);
+#endif
+
+
 /* Options this driver needs to recognize, not just know how to
    skip over.  */
 typedef enum
@@ -81,6 +96,8 @@ typedef enum
                                   -nodefaultlibs.  */
   OPTION_o,                    /* Aka --output.  */
   OPTION_S,                    /* Aka --assemble.  */
+  OPTION_static,               /* -static.  */
+  OPTION_static_libgfortran,   /* -static-libgfortran.  */
   OPTION_syntax_only,          /* -fsyntax-only.  */
   OPTION_v,                    /* Aka --verbose.  */
   OPTION_version,              /* --version.  */
@@ -100,8 +117,6 @@ static void append_arg (const char *);
 static int g77_newargc;
 static const char **g77_newargv;
 
-const struct spec_function lang_specific_spec_functions[] = {{0,0}};
-
 /* --- This comes from gcc.c (2.8.1) verbatim: */
 
 /* This defines which switch letters take arguments.  */
@@ -162,7 +177,7 @@ lookup_option (Option *xopt, int *xskip, const char **xarg, const char *text)
     opt = OPTION_x, arg = text + 2;
   else
     {
-      if ((skip = WORD_SWITCH_TAKES_ARG (text + 1)) != 0)      /* See gcc.c.  */
+      if ((skip = WORD_SWITCH_TAKES_ARG (text + 1)) != 0)  /* See gcc.c.  */
        ;
       else if (!strcmp (text, "-fhelp"))       /* Really --help!! */
        opt = OPTION_help;
@@ -171,6 +186,8 @@ lookup_option (Option *xopt, int *xskip, const char **xarg, const char *text)
        opt = OPTION_nostdlib;
       else if (!strcmp (text, "-fsyntax-only"))
        opt = OPTION_syntax_only;
+      else if (!strcmp (text, "-static-libgfortran"))
+       opt = OPTION_static_libgfortran;
       else if (!strcmp (text, "-dumpversion"))
        opt = OPTION_version;
       else if (!strcmp (text, "-fversion"))    /* Really --version!! */
@@ -266,6 +283,12 @@ lang_specific_driver (int *in_argc, const char *const **in_argv,
   /* 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;
+
+  /* Whether we need to link statically.  */
+  int static_linking = 0;
+
   /* The number of input and output files in the incoming arg list.  */
   int n_infiles = 0;
   int n_outfiles = 0;
@@ -280,7 +303,7 @@ lang_specific_driver (int *in_argc, const char *const **in_argv,
   g77_xargc = argc;
   g77_xargv = argv;
   g77_newargc = 0;
-  g77_newargv = (const char **) argv;
+  g77_newargv = CONST_CAST2 (const char **, const char *const *, argv);
 
   /* First pass through arglist.
 
@@ -324,6 +347,13 @@ lang_specific_driver (int *in_argc, const char *const **in_argv,
          library = 0;
          break;
 
+       case OPTION_static_libgfortran:
+         static_lib = 1;
+         break;
+
+       case OPTION_static:
+         static_linking = 1;
+
        case OPTION_l:
          ++n_infiles;
          break;
@@ -346,9 +376,9 @@ lang_specific_driver (int *in_argc, const char *const **in_argv,
          break;
 
        case OPTION_version:
-         printf ("GNU Fortran 95 (GCC) %s\n", version_string);
-         printf ("Copyright %s 2005 Free Software Foundation, Inc.\n\n",
-                 _("(C)"));
+         printf ("GNU Fortran %s%s\n", pkgversion_string, version_string);
+         printf ("Copyright %s 2008 Free Software Foundation, Inc.\n\n",
+                 _("(C)"));
          printf (_("GNU Fortran comes with NO WARRANTY, to the extent permitted by law.\n\
 You may redistribute copies of GNU Fortran\n\
 under the terms of the GNU General Public License.\n\
@@ -366,7 +396,7 @@ For more information about these matters, see the file named COPYING\n\n"));
        }
 
       /* This is the one place we check for missing arguments in the
-         program.  */
+        program.  */
 
       if (i + skip < argc)
        i += skip;
@@ -394,25 +424,25 @@ For more information about these matters, see the file named COPYING\n\n"));
        }
 
       if ((argv[i][0] == '-') && (argv[i][1] == 'M'))
-        {
-          char *p;
-
-          if (argv[i][2] == '\0')
-            {
-              p = xmalloc (strlen (argv[i + 1]) + 2);
-              p[0] = '-';
-              p[1] = 'J';
-              strcpy (&p[2], argv[i + 1]);
-              i++;
-            }
-          else
-            {
-              p = xmalloc (strlen (argv[i]) + 1);
-              strcpy (p, argv[i]);
-            }
-          append_arg (p);
-          continue;
-        }
+       {
+         char *p;
+
+         if (argv[i][2] == '\0')
+           {
+             p = XNEWVEC (char, strlen (argv[i + 1]) + 2);
+             p[0] = '-';
+             p[1] = 'J';
+             strcpy (&p[2], argv[i + 1]);
+             i++;
+           }
+         else
+           {
+             p = XNEWVEC (char, strlen (argv[i]) + 1);
+             strcpy (p, argv[i]);
+           }
+         append_arg (p);
+         continue;
+       }
 
       if ((argv[i][0] == '-') && (argv[i][1] != 'l'))
        {
@@ -469,11 +499,16 @@ For more information about these matters, see the file named COPYING\n\n"));
                      append_arg (FORTRAN_INIT);
                      use_init = 1;
                    }
-                 append_arg (FORTRAN_LIBRARY);
+
+                 ADD_ARG_LIBGFORTRAN (FORTRAN_LIBRARY);
                }
            }
          else if (strcmp (argv[i], FORTRAN_LIBRARY) == 0)
-           saw_library = 1;    /* -l<library>.  */
+           {
+             saw_library = 1;  /* -l<library>.  */
+             ADD_ARG_LIBGFORTRAN (argv[i]);
+             continue;
+           }
          else
            {                   /* Other library, or filename.  */
              if (saw_library == 1 && need_math)
@@ -499,7 +534,9 @@ For more information about these matters, see the file named COPYING\n\n"));
              append_arg (FORTRAN_INIT);
              use_init = 1;
            }
-         append_arg (library);
+         ADD_ARG_LIBGFORTRAN (library);
+         /* Fall through.  */
+
        case 1:
          if (need_math)
            append_arg (MATH_LIBRARY);
@@ -537,6 +574,7 @@ For more information about these matters, see the file named COPYING\n\n"));
   *in_argv = g77_newargv;
 }
 
+
 /* Called before linking.  Returns 0 on success and -1 on failure.  */
 int
 lang_specific_pre_link (void)  /* Not used for F77.  */