Commit d8ddea40 by Daniel Franke Committed by Daniel Franke

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
parent 2d9ca17b
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> 2010-06-12 Daniel Franke <franke.daniel@gmail.com>
* resolve.c (resolve_global_procedure): Improved checking if an * resolve.c (resolve_global_procedure): Improved checking if an
......
...@@ -35,6 +35,7 @@ along with GCC; see the file COPYING3. If not see ...@@ -35,6 +35,7 @@ along with GCC; see the file COPYING3. If not see
#include "../../libcpp/internal.h" #include "../../libcpp/internal.h"
#include "cpp.h" #include "cpp.h"
#include "incpath.h" #include "incpath.h"
#include "mkdeps.h"
#ifndef TARGET_OS_CPP_BUILTINS #ifndef TARGET_OS_CPP_BUILTINS
# define TARGET_OS_CPP_BUILTINS() # define TARGET_OS_CPP_BUILTINS()
...@@ -84,6 +85,12 @@ struct gfc_cpp_option_data ...@@ -84,6 +85,12 @@ struct gfc_cpp_option_data
int no_predefined; /* -undef */ int no_predefined; /* -undef */
int standard_include_paths; /* -nostdinc */ int standard_include_paths; /* -nostdinc */
int verbose; /* -v */ 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 *multilib; /* -imultilib <dir> */
const char *prefix; /* -iprefix <dir> */ const char *prefix; /* -iprefix <dir> */
...@@ -270,6 +277,26 @@ gfc_cpp_preprocess_only (void) ...@@ -270,6 +277,26 @@ gfc_cpp_preprocess_only (void)
return gfc_cpp_option.preprocess_only; 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 * const char *
gfc_cpp_temporary_file (void) gfc_cpp_temporary_file (void)
{ {
...@@ -299,6 +326,12 @@ gfc_cpp_init_options (unsigned int argc, ...@@ -299,6 +326,12 @@ gfc_cpp_init_options (unsigned int argc,
gfc_cpp_option.no_predefined = 0; gfc_cpp_option.no_predefined = 0;
gfc_cpp_option.standard_include_paths = 1; gfc_cpp_option.standard_include_paths = 1;
gfc_cpp_option.verbose = 0; 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.multilib = NULL;
gfc_cpp_option.prefix = NULL; gfc_cpp_option.prefix = NULL;
...@@ -414,6 +447,43 @@ gfc_cpp_handle_option (size_t scode, const char *arg, int value ATTRIBUTE_UNUSED ...@@ -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; gfc_cpp_option.print_include_names = 1;
break; 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: case OPT_P:
gfc_cpp_option.no_line_commands = 1; gfc_cpp_option.no_line_commands = 1;
break; break;
...@@ -430,16 +500,17 @@ gfc_cpp_post_options (void) ...@@ -430,16 +500,17 @@ gfc_cpp_post_options (void)
an error. */ an error. */
if (!gfc_cpp_enabled () if (!gfc_cpp_enabled ()
&& (gfc_cpp_preprocess_only () && (gfc_cpp_preprocess_only ()
|| !gfc_cpp_option.discard_comments || gfc_cpp_makedep ()
|| !gfc_cpp_option.discard_comments_in_macro_exp || !gfc_cpp_option.discard_comments
|| gfc_cpp_option.print_include_names || !gfc_cpp_option.discard_comments_in_macro_exp
|| gfc_cpp_option.no_line_commands || gfc_cpp_option.print_include_names
|| gfc_cpp_option.dump_macros || gfc_cpp_option.no_line_commands
|| gfc_cpp_option.dump_includes)) || gfc_cpp_option.dump_macros
|| gfc_cpp_option.dump_includes))
gfc_fatal_error("To enable preprocessing, use -cpp"); gfc_fatal_error("To enable preprocessing, use -cpp");
cpp_in = cpp_create_reader (CLK_GNUC89, NULL, line_table); cpp_in = cpp_create_reader (CLK_GNUC89, NULL, line_table);
if (!gfc_cpp_enabled()) if (!gfc_cpp_enabled ())
return; return;
gcc_assert (cpp_in); gcc_assert (cpp_in);
...@@ -462,6 +533,17 @@ gfc_cpp_post_options (void) ...@@ -462,6 +533,17 @@ gfc_cpp_post_options (void)
cpp_option->print_include_names = gfc_cpp_option.print_include_names; cpp_option->print_include_names = gfc_cpp_option.print_include_names;
cpp_option->preprocessed = gfc_option.flag_preprocessed; 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) if (gfc_cpp_option.working_directory == -1)
gfc_cpp_option.working_directory = (debug_info_level != DINFO_LEVEL_NONE); gfc_cpp_option.working_directory = (debug_info_level != DINFO_LEVEL_NONE);
...@@ -572,6 +654,9 @@ gfc_cpp_init (void) ...@@ -572,6 +654,9 @@ gfc_cpp_init (void)
else else
cpp_assert (cpp_in, opt->arg); 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 if (gfc_cpp_option.working_directory
...@@ -615,14 +700,27 @@ gfc_cpp_done (void) ...@@ -615,14 +700,27 @@ gfc_cpp_done (void)
if (!gfc_cpp_enabled ()) if (!gfc_cpp_enabled ())
return; return;
/* TODO: if dependency tracking was enabled, call gcc_assert (cpp_in);
cpp_finish() here to write dependencies.
Use cpp_get_deps() to access the current source's if (gfc_cpp_makedep ())
dependencies during parsing. Add dependencies using {
the mkdeps-interface (defined in libcpp). */ 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_undef_all (cpp_in);
cpp_clear_file_cache (cpp_in); cpp_clear_file_cache (cpp_in);
} }
......
...@@ -24,6 +24,12 @@ bool gfc_cpp_enabled (void); ...@@ -24,6 +24,12 @@ bool gfc_cpp_enabled (void);
bool gfc_cpp_preprocess_only (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); const char *gfc_cpp_temporary_file (void);
......
...@@ -2652,9 +2652,6 @@ J3 Fortran 95 standard. ...@@ -2652,9 +2652,6 @@ J3 Fortran 95 standard.
User-specified alignment rules for structures. User-specified alignment rules for structures.
@item @item
Flag to generate @code{Makefile} info.
@item
Automatically extend single precision constants to double. Automatically extend single precision constants to double.
@item @item
......
...@@ -424,35 +424,6 @@ For more information about these matters, see the file named COPYING\n\n")); ...@@ -424,35 +424,6 @@ For more information about these matters, see the file named COPYING\n\n"));
continue; 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')) if ((argv[i][0] == '-') && (argv[i][1] != 'l'))
{ {
/* Not a filename or library. */ /* Not a filename or library. */
......
...@@ -148,8 +148,7 @@ and warnings}. ...@@ -148,8 +148,7 @@ and warnings}.
@item Directory Options @item Directory Options
@xref{Directory Options,,Options for directory search}. @xref{Directory Options,,Options for directory search}.
@gccoptlist{-I@var{dir} -J@var{dir} -M@var{dir} @gol @gccoptlist{-I@var{dir} -J@var{dir} -fintrinsic-modules-path @var{dir}}
-fintrinsic-modules-path @var{dir}}
@item Link Options @item Link Options
@xref{Link Options,,Options for influencing the linking step}. @xref{Link Options,,Options for influencing the linking step}.
...@@ -964,7 +963,6 @@ gcc,Using the GNU Compiler Collection (GCC)}, for information on the ...@@ -964,7 +963,6 @@ gcc,Using the GNU Compiler Collection (GCC)}, for information on the
@option{-I} option. @option{-I} option.
@item -J@var{dir} @item -J@var{dir}
@item -M@var{dir}
@opindex @code{J}@var{dir} @opindex @code{J}@var{dir}
@opindex @code{M}@var{dir} @opindex @code{M}@var{dir}
@cindex paths, search @cindex paths, search
...@@ -975,8 +973,6 @@ statement. ...@@ -975,8 +973,6 @@ statement.
The default is the current directory. The default is the current directory.
@option{-M} is deprecated to avoid conflicts with existing GCC options.
@item -fintrinsic-modules-path @var{dir} @item -fintrinsic-modules-path @var{dir}
@opindex @code{fintrinsic-modules-path} @var{dir} @opindex @code{fintrinsic-modules-path} @var{dir}
@cindex paths, search @cindex paths, search
......
...@@ -28,7 +28,7 @@ ...@@ -28,7 +28,7 @@
%{O*} %{undef}" %{O*} %{undef}"
/* Options that f951 should know about, even if not preprocessing. */ /* 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) \ #define F951_CPP_OPTIONS "%{!nocpp: -cpp %g.f90 %{E} %(cpp_unique_options) \
%{E|M|MM:%(cpp_debug_options) " CPP_ONLY_OPTIONS \ %{E|M|MM:%(cpp_debug_options) " CPP_ONLY_OPTIONS \
......
...@@ -56,6 +56,42 @@ J ...@@ -56,6 +56,42 @@ J
Fortran Joined Separate Fortran Joined Separate
-J<directory> Put MODULE files in 'directory' -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 P
Fortran Fortran
; Documented in C ; Documented in C
......
...@@ -74,6 +74,7 @@ along with GCC; see the file COPYING3. If not see ...@@ -74,6 +74,7 @@ along with GCC; see the file COPYING3. If not see
#include "parse.h" /* FIXME */ #include "parse.h" /* FIXME */
#include "md5.h" #include "md5.h"
#include "constructor.h" #include "constructor.h"
#include "cpp.h"
#define MODULE_EXTENSION ".mod" #define MODULE_EXTENSION ".mod"
...@@ -5120,6 +5121,9 @@ gfc_dump_module (const char *name, int dump_flag) ...@@ -5120,6 +5121,9 @@ gfc_dump_module (const char *name, int dump_flag)
return; return;
} }
if (gfc_cpp_makedep ())
gfc_cpp_add_target (filename);
/* Write the module to the temporary file. */ /* Write the module to the temporary file. */
module_fp = fopen (filename_tmp, "w"); module_fp = fopen (filename_tmp, "w");
if (module_fp == NULL) if (module_fp == NULL)
......
...@@ -390,7 +390,8 @@ gfc_release_include_path (void) ...@@ -390,7 +390,8 @@ gfc_release_include_path (void)
static FILE * 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; char *fullname;
gfc_directorylist *p; gfc_directorylist *p;
...@@ -407,7 +408,12 @@ open_included_file (const char *name, gfc_directorylist *list, bool module) ...@@ -407,7 +408,12 @@ open_included_file (const char *name, gfc_directorylist *list, bool module)
f = gfc_open_file (fullname); f = gfc_open_file (fullname);
if (f != NULL) if (f != NULL)
return f; {
if (gfc_cpp_makedep ())
gfc_cpp_add_dep (fullname, system);
return f;
}
} }
return NULL; return NULL;
...@@ -421,28 +427,37 @@ open_included_file (const char *name, gfc_directorylist *list, bool module) ...@@ -421,28 +427,37 @@ open_included_file (const char *name, gfc_directorylist *list, bool module)
FILE * FILE *
gfc_open_included_file (const char *name, bool include_cwd, bool module) gfc_open_included_file (const char *name, bool include_cwd, bool module)
{ {
FILE *f; FILE *f = NULL;
if (IS_ABSOLUTE_PATH (name)) if (IS_ABSOLUTE_PATH (name) || include_cwd)
return gfc_open_file (name);
if (include_cwd)
{ {
f = gfc_open_file (name); f = gfc_open_file (name);
if (f != NULL) if (f && gfc_cpp_makedep ())
return f; 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 * FILE *
gfc_open_intrinsic_module (const char *name) gfc_open_intrinsic_module (const char *name)
{ {
FILE *f = NULL;
if (IS_ABSOLUTE_PATH (name)) 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;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment