2010-06-13 Daniel Franke <franke.daniel@gmail.com>
authordfranke <dfranke@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 13 Jun 2010 16:05:01 +0000 (16:05 +0000)
committerdfranke <dfranke@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 13 Jun 2010 16:05:01 +0000 (16:05 +0000)
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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@160684 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/fortran/ChangeLog
gcc/fortran/cpp.c
gcc/fortran/cpp.h
gcc/fortran/gfortran.texi
gcc/fortran/gfortranspec.c
gcc/fortran/invoke.texi
gcc/fortran/lang-specs.h
gcc/fortran/lang.opt
gcc/fortran/module.c
gcc/fortran/scanner.c

index 02d6d4c..3d7dde7 100644 (file)
@@ -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
index 8dbd157..7f960f5 100644 (file)
@@ -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);
 }
index 54a899f..556eecb 100644 (file)
@@ -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);
 
 
index abecf46..939ae61 100644 (file)
@@ -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
index 899cbc5..61f1547 100644 (file)
@@ -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.  */
index 6f7975d..1dfd3bd 100644 (file)
@@ -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
index a622dcb..4fe24de 100644 (file)
@@ -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 \
index eb286f6..1f3ef9d 100644 (file)
@@ -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
index 9bdee2a..5cd760b 100644 (file)
@@ -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)
index 7b4ab24..a8ab235 100644 (file)
@@ -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;
 }