aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFrancois-Xavier Coudert <fxcoudert@gcc.gnu.org>2007-06-27 22:58:37 +0000
committerFrançois-Xavier Coudert <fxcoudert@gcc.gnu.org>2007-06-27 22:58:37 +0000
commit86db887aa6ae4c19c134d909899d3fc92781f737 (patch)
treea925f05a83569d4de9cc60c8b6dcf3ff583b607b
parent99920b6fbb5bb6006955dd497d40b666fb502216 (diff)
downloadgcc-86db887aa6ae4c19c134d909899d3fc92781f737.zip
gcc-86db887aa6ae4c19c134d909899d3fc92781f737.tar.gz
gcc-86db887aa6ae4c19c134d909899d3fc92781f737.tar.bz2
re PR other/31400 (enable static linking of support libraries through -static-libXY)
PR other/31400 * gcc.c (process_command): Recognize the new -static-libgfortran option. * lang.opt (static-libgfortran): New option. * gfortranspec.c (ADD_ARG_LIBGFORTRAN): New macro. (Option): Add OPTION_static and OPTION_static_libgfortran. (lookup_option): Handle the new -static-libgfortran option. (lang_specific_driver): Check whether -static is passed. Handle the new -static-libgfortran option. * options.c (gfc_handle_option): If -static-libgfortran is passed and isn't supported on this configuration, error out. From-SVN: r126068
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/fortran/ChangeLog12
-rw-r--r--gcc/fortran/gfortranspec.c44
-rw-r--r--gcc/fortran/lang.opt4
-rw-r--r--gcc/fortran/options.c7
-rw-r--r--gcc/gcc.c6
6 files changed, 74 insertions, 5 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 5b707ba..174f39e 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2007-06-28 Francois-Xavier Coudert <fxcoudert@gcc.gnu.org>
+
+ PR other/31400
+ * gcc.c (process_command): Recognize the new -static-libgfortran
+ option.
+
2007-06-27 Rask Ingemann Lambertsen <rask@sygehus.dk>
PR target/32418
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index 6fcd5bc..d8be9304 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,3 +1,15 @@
+2007-06-28 Francois-Xavier Coudert <fxcoudert@gcc.gnu.org>
+
+ PR other/31400
+ * lang.opt (static-libgfortran): New option.
+ * gfortranspec.c (ADD_ARG_LIBGFORTRAN): New macro.
+ (Option): Add OPTION_static and OPTION_static_libgfortran.
+ (lookup_option): Handle the new -static-libgfortran option.
+ (lang_specific_driver): Check whether -static is passed.
+ Handle the new -static-libgfortran option.
+ * options.c (gfc_handle_option): If -static-libgfortran is
+ passed and isn't supported on this configuration, error out.
+
2007-06-27 Daniel Franke <franke.daniel@gmail.com>
PR fortran/32467
diff --git a/gcc/fortran/gfortranspec.c b/gcc/fortran/gfortranspec.c
index 5913bd3..5cc3e15 100644
--- a/gcc/fortran/gfortranspec.c
+++ b/gcc/fortran/gfortranspec.c
@@ -66,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
@@ -82,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. */
@@ -170,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!! */
@@ -265,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;
@@ -323,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;
@@ -468,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)
@@ -498,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);
diff --git a/gcc/fortran/lang.opt b/gcc/fortran/lang.opt
index fe2c4aa..f5385a1 100644
--- a/gcc/fortran/lang.opt
+++ b/gcc/fortran/lang.opt
@@ -253,6 +253,10 @@ funderscoring
Fortran
Append underscores to externally visible names
+static-libgfortran
+Fortran
+Statically link the GNU Fortran helper library (libgfortran)
+
std=f2003
Fortran
Conform to the ISO Fortran 2003 standard
diff --git a/gcc/fortran/options.c b/gcc/fortran/options.c
index fbcb94e..50f5e94 100644
--- a/gcc/fortran/options.c
+++ b/gcc/fortran/options.c
@@ -551,6 +551,13 @@ gfc_handle_option (size_t scode, const char *arg, int value)
gfc_option.flag_second_underscore = value;
break;
+ case OPT_static_libgfortran:
+#ifndef HAVE_LD_STATIC_DYNAMIC
+ gfc_fatal_error ("-static-libgfortran is not supported in this "
+ "configuration");
+#endif
+ break;
+
case OPT_fimplicit_none:
gfc_option.flag_implicit_none = value;
break;
diff --git a/gcc/gcc.c b/gcc/gcc.c
index 11b6b08..32fb21b 100644
--- a/gcc/gcc.c
+++ b/gcc/gcc.c
@@ -4214,11 +4214,13 @@ warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\n"
switches[n_switches].live_cond = SWITCH_OK;
switches[n_switches].validated = 0;
switches[n_switches].ordering = 0;
- /* These are always valid, since gcc.c itself understands them. */
+ /* These are always valid, since gcc.c itself understands the
+ first four and gfortranspec.c understands -static-libgfortran. */
if (!strcmp (p, "save-temps")
|| !strcmp (p, "static-libgcc")
|| !strcmp (p, "shared-libgcc")
- || !strcmp (p, "pipe"))
+ || !strcmp (p, "pipe")
+ || !strcmp (p, "static-libgfortran"))
switches[n_switches].validated = 1;
else
{