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:
parent
2d9ca17ba9
commit
d8ddea4044
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
||||
|
|
|
@ -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.
|
||||
|
||||
|
|
|
@ -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. */
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 \
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
||||
|
|
Loading…
Reference in New Issue