diff options
author | Daniel Franke <franke.daniel@gmail.com> | 2010-06-13 12:05:01 -0400 |
---|---|---|
committer | Daniel Franke <dfranke@gcc.gnu.org> | 2010-06-13 12:05:01 -0400 |
commit | d8ddea4044ee8212d5fe305e8e2a547700cd7b8f (patch) | |
tree | 7a5503c8e4ec3840ceca10f783c86bdc8998d3d0 | |
parent | 2d9ca17ba98b2fcf77b8df192634a27f8e5d4d5b (diff) | |
download | gcc-d8ddea4044ee8212d5fe305e8e2a547700cd7b8f.zip gcc-d8ddea4044ee8212d5fe305e8e2a547700cd7b8f.tar.gz gcc-d8ddea4044ee8212d5fe305e8e2a547700cd7b8f.tar.bz2 |
re PR fortran/31588 (gfortran should be able to output Makefile dependencies with -M* options)
2010-06-13 Daniel Franke <franke.daniel@gmail.com>
PR fortran/31588
PR fortran/43954
* gfortranspec.c (lang_specific_driver): Removed deprecation
warning for -M.
* lang.opt: Add options -M, -MM, -MD, -MMD, -MF, -MG, -MP, -MT, -MQ.
* lang-specs.h (CPP_FORWARD_OPTIONS): Add -M* options.
* cpp.h (gfc_cpp_makedep): New.
(gfc_cpp_add_dep): New.
(gfc_cpp_add_target): New.
* cpp.c (gfc_cpp_option): Add deps* members.
(gfc_cpp_makedep): New.
(gfc_cpp_add_dep): New.
(gfc_cpp_add_target): New.
(gfc_cpp_init_options): Initialize new options.
(gfc_cpp_handle_option): Handle new options.
(gfc_cpp_post_options): Map new options to libcpp-options.
(gfc_cpp_init): Handle deferred -MQ and -MT options.
(gfc_cpp_done): If requested, write dependencies to file.
* module.c (gfc_dump_module): Add a module filename as target.
* scanner.c (open_included_file): New parameter system; add the
included file as dependency.
(gfc_open_included_file): Add the included file as dependency.
(gfc_open_intrinsic_module): Likewise.
* invoke.texi: Removed deprecation warning for -M.
* gfortran.texi: Removed Makefile-dependencies project.
From-SVN: r160684
-rw-r--r-- | gcc/fortran/ChangeLog | 28 | ||||
-rw-r--r-- | gcc/fortran/cpp.c | 124 | ||||
-rw-r--r-- | gcc/fortran/cpp.h | 6 | ||||
-rw-r--r-- | gcc/fortran/gfortran.texi | 3 | ||||
-rw-r--r-- | gcc/fortran/gfortranspec.c | 29 | ||||
-rw-r--r-- | gcc/fortran/invoke.texi | 6 | ||||
-rw-r--r-- | gcc/fortran/lang-specs.h | 2 | ||||
-rw-r--r-- | gcc/fortran/lang.opt | 36 | ||||
-rw-r--r-- | gcc/fortran/module.c | 4 | ||||
-rw-r--r-- | gcc/fortran/scanner.c | 39 |
10 files changed, 214 insertions, 63 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 02d6d4c..3d7dde7 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,31 @@ +2010-06-13 Daniel Franke <franke.daniel@gmail.com> + + PR fortran/31588 + PR fortran/43954 + * gfortranspec.c (lang_specific_driver): Removed deprecation + warning for -M. + * lang.opt: Add options -M, -MM, -MD, -MMD, -MF, -MG, -MP, -MT, -MQ. + * lang-specs.h (CPP_FORWARD_OPTIONS): Add -M* options. + * cpp.h (gfc_cpp_makedep): New. + (gfc_cpp_add_dep): New. + (gfc_cpp_add_target): New. + * cpp.c (gfc_cpp_option): Add deps* members. + (gfc_cpp_makedep): New. + (gfc_cpp_add_dep): New. + (gfc_cpp_add_target): New. + (gfc_cpp_init_options): Initialize new options. + (gfc_cpp_handle_option): Handle new options. + (gfc_cpp_post_options): Map new options to libcpp-options. + (gfc_cpp_init): Handle deferred -MQ and -MT options. + (gfc_cpp_done): If requested, write dependencies to file. + * module.c (gfc_dump_module): Add a module filename as target. + * scanner.c (open_included_file): New parameter system; add the + included file as dependency. + (gfc_open_included_file): Add the included file as dependency. + (gfc_open_intrinsic_module): Likewise. + * invoke.texi: Removed deprecation warning for -M. + * gfortran.texi: Removed Makefile-dependencies project. + 2010-06-12 Daniel Franke <franke.daniel@gmail.com> * resolve.c (resolve_global_procedure): Improved checking if an diff --git a/gcc/fortran/cpp.c b/gcc/fortran/cpp.c index 8dbd157..7f960f5 100644 --- a/gcc/fortran/cpp.c +++ b/gcc/fortran/cpp.c @@ -35,6 +35,7 @@ along with GCC; see the file COPYING3. If not see #include "../../libcpp/internal.h" #include "cpp.h" #include "incpath.h" +#include "mkdeps.h" #ifndef TARGET_OS_CPP_BUILTINS # define TARGET_OS_CPP_BUILTINS() @@ -84,6 +85,12 @@ struct gfc_cpp_option_data int no_predefined; /* -undef */ int standard_include_paths; /* -nostdinc */ int verbose; /* -v */ + int deps; /* -M */ + int deps_skip_system; /* -MM */ + const char *deps_filename; /* -M[M]D */ + const char *deps_filename_user; /* -MF <arg> */ + int deps_missing_are_generated; /* -MG */ + int deps_phony; /* -MP */ const char *multilib; /* -imultilib <dir> */ const char *prefix; /* -iprefix <dir> */ @@ -270,6 +277,26 @@ gfc_cpp_preprocess_only (void) return gfc_cpp_option.preprocess_only; } +bool +gfc_cpp_makedep (void) +{ + return gfc_cpp_option.deps; +} + +void +gfc_cpp_add_dep (const char *name, bool system) +{ + if (!gfc_cpp_option.deps_skip_system || !system) + deps_add_dep (cpp_get_deps (cpp_in), name); +} + +void +gfc_cpp_add_target (const char *name) +{ + deps_add_target (cpp_get_deps (cpp_in), name, 0); +} + + const char * gfc_cpp_temporary_file (void) { @@ -299,6 +326,12 @@ gfc_cpp_init_options (unsigned int argc, gfc_cpp_option.no_predefined = 0; gfc_cpp_option.standard_include_paths = 1; gfc_cpp_option.verbose = 0; + gfc_cpp_option.deps = 0; + gfc_cpp_option.deps_skip_system = 0; + gfc_cpp_option.deps_phony = 0; + gfc_cpp_option.deps_missing_are_generated = 0; + gfc_cpp_option.deps_filename = NULL; + gfc_cpp_option.deps_filename_user = NULL; gfc_cpp_option.multilib = NULL; gfc_cpp_option.prefix = NULL; @@ -414,6 +447,43 @@ gfc_cpp_handle_option (size_t scode, const char *arg, int value ATTRIBUTE_UNUSED gfc_cpp_option.print_include_names = 1; break; + case OPT_MM: + gfc_cpp_option.deps_skip_system = 1; + /* fall through */ + + case OPT_M: + gfc_cpp_option.deps = 1; + break; + + case OPT_MMD: + gfc_cpp_option.deps_skip_system = 1; + /* fall through */ + + case OPT_MD: + gfc_cpp_option.deps = 1; + gfc_cpp_option.deps_filename = arg; + break; + + case OPT_MF: + /* If specified multiple times, last one wins. */ + gfc_cpp_option.deps_filename_user = arg; + break; + + case OPT_MG: + gfc_cpp_option.deps_missing_are_generated = 1; + break; + + case OPT_MP: + gfc_cpp_option.deps_phony = 1; + break; + + case OPT_MQ: + case OPT_MT: + gfc_cpp_option.deferred_opt[gfc_cpp_option.deferred_opt_count].code = code; + gfc_cpp_option.deferred_opt[gfc_cpp_option.deferred_opt_count].arg = arg; + gfc_cpp_option.deferred_opt_count++; + break; + case OPT_P: gfc_cpp_option.no_line_commands = 1; break; @@ -430,16 +500,17 @@ gfc_cpp_post_options (void) an error. */ if (!gfc_cpp_enabled () && (gfc_cpp_preprocess_only () - || !gfc_cpp_option.discard_comments - || !gfc_cpp_option.discard_comments_in_macro_exp - || gfc_cpp_option.print_include_names - || gfc_cpp_option.no_line_commands - || gfc_cpp_option.dump_macros - || gfc_cpp_option.dump_includes)) + || gfc_cpp_makedep () + || !gfc_cpp_option.discard_comments + || !gfc_cpp_option.discard_comments_in_macro_exp + || gfc_cpp_option.print_include_names + || gfc_cpp_option.no_line_commands + || gfc_cpp_option.dump_macros + || gfc_cpp_option.dump_includes)) gfc_fatal_error("To enable preprocessing, use -cpp"); cpp_in = cpp_create_reader (CLK_GNUC89, NULL, line_table); - if (!gfc_cpp_enabled()) + if (!gfc_cpp_enabled ()) return; gcc_assert (cpp_in); @@ -462,6 +533,17 @@ gfc_cpp_post_options (void) cpp_option->print_include_names = gfc_cpp_option.print_include_names; cpp_option->preprocessed = gfc_option.flag_preprocessed; + if (gfc_cpp_makedep ()) + { + cpp_option->deps.style = DEPS_USER; + cpp_option->deps.phony_targets = gfc_cpp_option.deps_phony; + cpp_option->deps.missing_files = gfc_cpp_option.deps_missing_are_generated; + + /* -MF <arg> overrides -M[M]D. */ + if (gfc_cpp_option.deps_filename_user) + gfc_cpp_option.deps_filename = gfc_cpp_option.deps_filename_user; + } + if (gfc_cpp_option.working_directory == -1) gfc_cpp_option.working_directory = (debug_info_level != DINFO_LEVEL_NONE); @@ -572,6 +654,9 @@ gfc_cpp_init (void) else cpp_assert (cpp_in, opt->arg); } + else if (opt->code == OPT_MT || opt->code == OPT_MQ) + deps_add_target (cpp_get_deps (cpp_in), + opt->arg, opt->code == OPT_MQ); } if (gfc_cpp_option.working_directory @@ -615,14 +700,27 @@ gfc_cpp_done (void) if (!gfc_cpp_enabled ()) return; - /* TODO: if dependency tracking was enabled, call - cpp_finish() here to write dependencies. + gcc_assert (cpp_in); - Use cpp_get_deps() to access the current source's - dependencies during parsing. Add dependencies using - the mkdeps-interface (defined in libcpp). */ + if (gfc_cpp_makedep ()) + { + if (gfc_cpp_option.deps_filename) + { + FILE *f = fopen (gfc_cpp_option.deps_filename, "w"); + if (f) + { + cpp_finish (cpp_in, f); + fclose (f); + } + else + gfc_fatal_error ("opening output file %s: %s", + gfc_cpp_option.deps_filename, + xstrerror (errno)); + } + else + cpp_finish (cpp_in, stdout); + } - gcc_assert (cpp_in); cpp_undef_all (cpp_in); cpp_clear_file_cache (cpp_in); } diff --git a/gcc/fortran/cpp.h b/gcc/fortran/cpp.h index 54a899f..556eecb 100644 --- a/gcc/fortran/cpp.h +++ b/gcc/fortran/cpp.h @@ -24,6 +24,12 @@ bool gfc_cpp_enabled (void); bool gfc_cpp_preprocess_only (void); +bool gfc_cpp_makedep (void); + +void gfc_cpp_add_dep (const char *name, bool system); + +void gfc_cpp_add_target (const char *name); + const char *gfc_cpp_temporary_file (void); diff --git a/gcc/fortran/gfortran.texi b/gcc/fortran/gfortran.texi index abecf46..939ae61 100644 --- a/gcc/fortran/gfortran.texi +++ b/gcc/fortran/gfortran.texi @@ -2652,9 +2652,6 @@ J3 Fortran 95 standard. User-specified alignment rules for structures. @item -Flag to generate @code{Makefile} info. - -@item Automatically extend single precision constants to double. @item diff --git a/gcc/fortran/gfortranspec.c b/gcc/fortran/gfortranspec.c index 899cbc5..61f1547 100644 --- a/gcc/fortran/gfortranspec.c +++ b/gcc/fortran/gfortranspec.c @@ -424,35 +424,6 @@ For more information about these matters, see the file named COPYING\n\n")); continue; } - if ((argv[i][0] == '-') && (argv[i][1] == 'M')) - { - char *p; - - warning (0, "using -M <directory> is deprecated, use -J instead"); - 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_error ("argument to %qs 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')) { /* Not a filename or library. */ diff --git a/gcc/fortran/invoke.texi b/gcc/fortran/invoke.texi index 6f7975d..1dfd3bd 100644 --- a/gcc/fortran/invoke.texi +++ b/gcc/fortran/invoke.texi @@ -148,8 +148,7 @@ and warnings}. @item Directory Options @xref{Directory Options,,Options for directory search}. -@gccoptlist{-I@var{dir} -J@var{dir} -M@var{dir} @gol --fintrinsic-modules-path @var{dir}} +@gccoptlist{-I@var{dir} -J@var{dir} -fintrinsic-modules-path @var{dir}} @item Link Options @xref{Link Options,,Options for influencing the linking step}. @@ -964,7 +963,6 @@ gcc,Using the GNU Compiler Collection (GCC)}, for information on the @option{-I} option. @item -J@var{dir} -@item -M@var{dir} @opindex @code{J}@var{dir} @opindex @code{M}@var{dir} @cindex paths, search @@ -975,8 +973,6 @@ statement. The default is the current directory. -@option{-M} is deprecated to avoid conflicts with existing GCC options. - @item -fintrinsic-modules-path @var{dir} @opindex @code{fintrinsic-modules-path} @var{dir} @cindex paths, search diff --git a/gcc/fortran/lang-specs.h b/gcc/fortran/lang-specs.h index a622dcb..4fe24de 100644 --- a/gcc/fortran/lang-specs.h +++ b/gcc/fortran/lang-specs.h @@ -28,7 +28,7 @@ %{O*} %{undef}" /* Options that f951 should know about, even if not preprocessing. */ -#define CPP_FORWARD_OPTIONS "%{i*} %{I*}" +#define CPP_FORWARD_OPTIONS "%{i*} %{I*} %{M*}" #define F951_CPP_OPTIONS "%{!nocpp: -cpp %g.f90 %{E} %(cpp_unique_options) \ %{E|M|MM:%(cpp_debug_options) " CPP_ONLY_OPTIONS \ diff --git a/gcc/fortran/lang.opt b/gcc/fortran/lang.opt index eb286f6..1f3ef9d 100644 --- a/gcc/fortran/lang.opt +++ b/gcc/fortran/lang.opt @@ -56,6 +56,42 @@ J Fortran Joined Separate -J<directory> Put MODULE files in 'directory' +M +Fortran +; Documented in C + +MD +Fortran Separate +; Documented in C + +MF +Fortran Joined Separate +; Documented in C + +MG +Fortran +; Documented in C + +MM +Fortran +; Documented in C + +MMD +Fortran Separate +; Documented in C + +MP +Fortran +; Documented in C + +MT +Fortran Joined Separate +; Documented in C + +MQ +Fortran Joined Separate +; Documented in C + P Fortran ; Documented in C diff --git a/gcc/fortran/module.c b/gcc/fortran/module.c index 9bdee2a..5cd760b 100644 --- a/gcc/fortran/module.c +++ b/gcc/fortran/module.c @@ -74,6 +74,7 @@ along with GCC; see the file COPYING3. If not see #include "parse.h" /* FIXME */ #include "md5.h" #include "constructor.h" +#include "cpp.h" #define MODULE_EXTENSION ".mod" @@ -5120,6 +5121,9 @@ gfc_dump_module (const char *name, int dump_flag) return; } + if (gfc_cpp_makedep ()) + gfc_cpp_add_target (filename); + /* Write the module to the temporary file. */ module_fp = fopen (filename_tmp, "w"); if (module_fp == NULL) diff --git a/gcc/fortran/scanner.c b/gcc/fortran/scanner.c index 7b4ab24..a8ab235 100644 --- a/gcc/fortran/scanner.c +++ b/gcc/fortran/scanner.c @@ -390,7 +390,8 @@ gfc_release_include_path (void) static FILE * -open_included_file (const char *name, gfc_directorylist *list, bool module) +open_included_file (const char *name, gfc_directorylist *list, + bool module, bool system) { char *fullname; gfc_directorylist *p; @@ -407,7 +408,12 @@ open_included_file (const char *name, gfc_directorylist *list, bool module) f = gfc_open_file (fullname); if (f != NULL) - return f; + { + if (gfc_cpp_makedep ()) + gfc_cpp_add_dep (fullname, system); + + return f; + } } return NULL; @@ -421,28 +427,37 @@ open_included_file (const char *name, gfc_directorylist *list, bool module) FILE * gfc_open_included_file (const char *name, bool include_cwd, bool module) { - FILE *f; + FILE *f = NULL; - if (IS_ABSOLUTE_PATH (name)) - return gfc_open_file (name); - - if (include_cwd) + if (IS_ABSOLUTE_PATH (name) || include_cwd) { f = gfc_open_file (name); - if (f != NULL) - return f; + if (f && gfc_cpp_makedep ()) + gfc_cpp_add_dep (name, false); } - return open_included_file (name, include_dirs, module); + if (!f) + f = open_included_file (name, include_dirs, module, false); + + return f; } FILE * gfc_open_intrinsic_module (const char *name) { + FILE *f = NULL; + if (IS_ABSOLUTE_PATH (name)) - return gfc_open_file (name); + { + f = gfc_open_file (name); + if (f && gfc_cpp_makedep ()) + gfc_cpp_add_dep (name, true); + } + + if (!f) + f = open_included_file (name, intrinsic_modules_dirs, true, true); - return open_included_file (name, intrinsic_modules_dirs, true); + return f; } |