From 86db887aa6ae4c19c134d909899d3fc92781f737 Mon Sep 17 00:00:00 2001 From: Francois-Xavier Coudert Date: Wed, 27 Jun 2007 22:58:37 +0000 Subject: 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 --- gcc/fortran/ChangeLog | 12 ++++++++++++ gcc/fortran/gfortranspec.c | 44 +++++++++++++++++++++++++++++++++++++++++--- gcc/fortran/lang.opt | 4 ++++ gcc/fortran/options.c | 7 +++++++ 4 files changed, 64 insertions(+), 3 deletions(-) (limited to 'gcc/fortran') 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 + + 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 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. */ + { + saw_library = 1; /* -l. */ + 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; -- cgit v1.1