[patch, fortran] output of Makefile dependencies
Kirill Smelkov
kirr@landau.phys.spbu.ru
Mon Jun 14 18:56:00 GMT 2010
On Sun, Jun 13, 2010 at 02:36:46PM +0200, Daniel Franke wrote:
>
> Hi all.
>
> Attached patch enables the output of Makefile dependencies.
> It handles '#include', 'INCLUDE' and module targets/use dependencies alike.
>
> Example:
> $ cat a.f90
> MODULE a
> include "a.inc"
> END MODULE
>
> $ cat b.f90
> USE a
> #include "b.h"
> end
>
> $ gfortran-svn -cpp -M a.f90 b.f90
> a.o a.mod: a.f90 a.inc
> b.o: b.f90 b.h a.mod
>
>
> 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.
> (import_iso_c_binding_module): Add dependency on intrinsic module.
> (use_iso_fortran_env_module): Likewise.
> * scanner.c (gfc_open_included_file): Add the included file as
> dependency if dependency tracking is enabled.
> (gfc_open_intrinsic_module): Likewise.
>
>
> Bootstrapped and regression tested on i686-pc-linux-gnu.
> Ok for trunk?
>
> Daniel
Daniel, thanks for dealing with this.
Because of PR fortran/43954 (4.3 -> 4.4 regression, where -Wp,-M stopped
working) could we please apply your committed version to 4.4 as well?
`make check` tested on top of today's gcc-4_4-branch on
i686-pc-linux-gnu + manually verified that dependency generation works.
Thanks,
Kirill
P.S. If "yes", I'll backport to 4.5 too.
----8<----
From: Kirill Smelkov <kirr@landau.phys.spbu.ru>
Date: Mon, 14 Jun 2010 21:49:47 +0400
Subject: [PATCH] gcc/fortran: output of Makefile dependencies
2010-06-14 Kirill Smelkov <kirr@landau.phys.spbu.ru>
Backport from mainline:
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.
---
gcc/fortran/ChangeLog | 31 +++++++++++
gcc/fortran/cpp.c | 124 +++++++++++++++++++++++++++++++++++++++-----
gcc/fortran/cpp.h | 6 ++
gcc/fortran/gfortran.texi | 3 -
gcc/fortran/gfortranspec.c | 30 -----------
gcc/fortran/invoke.texi | 6 +--
gcc/fortran/lang-specs.h | 2 +-
gcc/fortran/lang.opt | 36 +++++++++++++
gcc/fortran/module.c | 4 ++
gcc/fortran/scanner.c | 39 ++++++++++----
10 files changed, 217 insertions(+), 64 deletions(-)
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index 283f113..adc63af 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,3 +1,34 @@
+2010-06-14 Kirill Smelkov <kirr@landau.phys.spbu.ru>
+
+ Backport from mainline:
+ 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-09 Steven G. Kargl <kargl@gcc.gnu.org>
* fortran/intrinsic.c (add_functions): Change gfc_check_btest,
diff --git a/gcc/fortran/cpp.c b/gcc/fortran/cpp.c
index d45d0c1..d8cdc33 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
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> */
@@ -267,6 +274,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)
{
@@ -296,6 +323,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;
@@ -411,6 +444,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;
@@ -427,16 +497,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);
@@ -460,6 +531,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);
@@ -571,6 +653,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
@@ -614,14 +699,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 0512cb9..de6e18d 100644
--- a/gcc/fortran/gfortran.texi
+++ b/gcc/fortran/gfortran.texi
@@ -1951,9 +1951,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 77324c8..7cb6db6 100644
--- a/gcc/fortran/gfortranspec.c
+++ b/gcc/fortran/gfortranspec.c
@@ -425,36 +425,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;
-
- 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'))
{
/* Not a filename or library. */
diff --git a/gcc/fortran/invoke.texi b/gcc/fortran/invoke.texi
index 8e18dd2..738f6f7 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}.
@@ -935,7 +934,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
@@ -946,8 +944,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 64fd486..b7aef20 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 16f4ffd..8582e38 100644
--- a/gcc/fortran/module.c
+++ b/gcc/fortran/module.c
@@ -72,6 +72,7 @@ along with GCC; see the file COPYING3. If not see
#include "match.h"
#include "parse.h" /* FIXME */
#include "md5.h"
+#include "cpp.h"
#define MODULE_EXTENSION ".mod"
@@ -4839,6 +4840,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 1e7ec96..dc1fc82 100644
--- a/gcc/fortran/scanner.c
+++ b/gcc/fortran/scanner.c
@@ -389,7 +389,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;
@@ -406,7 +407,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;
@@ -420,28 +426,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;
}
--
1.7.1.334.gebb7bc.dirty
More information about the Gcc-patches
mailing list