OSDN Git Service

gcc/
[pf3gnuchains/gcc-fork.git] / gcc / fortran / gfortranspec.c
index dfb8466..d628253 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, 2009, 2010
+   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
@@ -57,14 +58,24 @@ Boston, MA 02110-1301, USA.  */
 #define MATH_LIBRARY "-lm"
 #endif
 
-#ifndef FORTRAN_INIT
-#define FORTRAN_INIT "-lgfortranbegin"
-#endif
-
 #ifndef FORTRAN_LIBRARY
 #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 +92,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.  */
@@ -158,9 +171,11 @@ lookup_option (Option *xopt, int *xskip, const char **xarg, const char *text)
     opt = OPTION_v, skip = 0;
   else if (text[1] == 'x')
     opt = OPTION_x, arg = text + 2;
+  else if (text[1] == 'J')
+    ;
   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;
@@ -169,8 +184,10 @@ 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, "-dumpversion"))
-       opt = OPTION_version;
+      else if (!strcmp (text, "-static-libgfortran"))
+       opt = OPTION_static_libgfortran;
+      else if (!strcmp (text, "-static"))
+       opt = OPTION_static;
       else if (!strcmp (text, "-fversion"))    /* Really --version!! */
        opt = OPTION_version;
       else if (!strcmp (text, "-Xlinker") || !strcmp (text, "-specs"))
@@ -257,13 +274,17 @@ lang_specific_driver (int *in_argc, const char *const **in_argv,
      2 => last two args were -l<library> -lm.  */
   int saw_library = 0;
 
-  /* 0 => initial/reset state
-     1 => FORTRAN_INIT linked in */
-  int use_init = 0;
-
   /* By default, we throw on the math library if we have one.  */
   int need_math = (MATH_LIBRARY[0] != '\0');
 
+#ifdef HAVE_LD_STATIC_DYNAMIC
+  /* Whether we should link a static libgfortran. */
+  int static_lib = 0; 
+
+  /* Whether we need to link statically.  */
+  int static_linking = 0;
+#endif
+
   /* The number of input and output files in the incoming arg list.  */
   int n_infiles = 0;
   int n_outfiles = 0;
@@ -278,7 +299,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.
 
@@ -322,6 +343,19 @@ lang_specific_driver (int *in_argc, const char *const **in_argv,
          library = 0;
          break;
 
+       case OPTION_static_libgfortran:
+#ifdef HAVE_LD_STATIC_DYNAMIC
+         static_lib = 1;
+#endif
+         break;
+
+       case OPTION_static:
+#ifdef HAVE_LD_STATIC_DYNAMIC
+         static_linking = 1;
+#endif
+         /* Fall through, count OPTION_static as an item included in
+            the rewritten command line. */
+
        case OPTION_l:
          ++n_infiles;
          break;
@@ -344,9 +378,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 2010 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\
@@ -364,7 +398,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;
@@ -392,25 +426,34 @@ 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;
+
+         fprintf (stderr, _("Warning: Using -M <directory> is deprecated, "
+                  "use -J instead\n"));
+         if (argv[i][2] == '\0')
+           {
+             if (i+1 < argc)
+               {
+                 p = XNEWVEC (char, strlen (argv[i + 1]) + 3);
+                 p[0] = '-';
+                 p[1] = 'J';
+                 strcpy (&p[2], argv[i + 1]);
+                 i++;
+               }
+             else
+               fatal ("argument to '%s' missing", argv[i]);
+           }
+         else
+           {
+             p = XNEWVEC (char, strlen (argv[i]) + 1);
+             p[0] = '-';
+             p[1] = 'J';
+             strcpy (&p[2], argv[i] + 2);
+           }
+         append_arg (p);
+         continue;
+       }
 
       if ((argv[i][0] == '-') && (argv[i][1] != 'l'))
        {
@@ -462,16 +505,15 @@ For more information about these matters, see the file named COPYING\n\n"));
                saw_library = 2;        /* -l<library> -lm.  */
              else
                {
-                 if (0 == use_init)
-                   {
-                     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)
@@ -492,12 +534,9 @@ For more information about these matters, see the file named COPYING\n\n"));
       switch (saw_library)
        {
        case 0:
-         if (0 == use_init)
-           {
-             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);
@@ -535,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.  */