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
This commit is contained in:
Daniel Franke 2010-06-13 12:05:01 -04:00 committed by Daniel Franke
parent 2d9ca17ba9
commit d8ddea4044
10 changed files with 216 additions and 65 deletions

View 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

View 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.
Use cpp_get_deps() to access the current source's
dependencies during parsing. Add dependencies using
the mkdeps-interface (defined in libcpp). */
gcc_assert (cpp_in);
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);
}
cpp_undef_all (cpp_in);
cpp_clear_file_cache (cpp_in);
}

View 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);

View File

@ -2651,9 +2651,6 @@ J3 Fortran 95 standard.
@item
User-specified alignment rules for structures.
@item
Flag to generate @code{Makefile} info.
@item
Automatically extend single precision constants to double.

View 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. */

View 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

View 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 \

View 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

View 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)

View 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)
{
if (IS_ABSOLUTE_PATH (name))
return gfc_open_file (name);
FILE *f = NULL;
return open_included_file (name, intrinsic_modules_dirs, true);
if (IS_ABSOLUTE_PATH (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 f;
}