From patchwork Sun Jun 13 12:36:46 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Daniel Franke X-Patchwork-Id: 55428 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) by ozlabs.org (Postfix) with SMTP id 080D11007D1 for ; Sun, 13 Jun 2010 22:37:44 +1000 (EST) Received: (qmail 6159 invoked by alias); 13 Jun 2010 12:37:41 -0000 Received: (qmail 6141 invoked by uid 22791); 13 Jun 2010 12:37:39 -0000 X-SWARE-Spam-Status: No, hits=-1.1 required=5.0 tests=AWL, BAYES_00, TW_CP, TW_SV, T_RP_MATCHES_RCVD X-Spam-Check-By: sourceware.org Received: from smtp.EMBL-Hamburg.DE (HELO smtp.EMBL-Hamburg.DE) (192.109.31.26) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Sun, 13 Jun 2010 12:37:28 +0000 Received: from silence.localnet (d097018.adsl.hansenet.de [80.171.97.18]) (authenticated bits=0) by smtp.EMBL-Hamburg.DE (8.13.8/8.13.8/Debian-2) with ESMTP id o5DCawOX000596 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NOT); Sun, 13 Jun 2010 14:36:59 +0200 From: Daniel Franke To: fortran@gcc.gnu.org Subject: [patch, fortran] output of Makefile dependencies Date: Sun, 13 Jun 2010 14:36:46 +0200 User-Agent: KMail/1.13.2 (Linux/2.6.32-22-generic; KDE/4.4.2; i686; ; ) Cc: gcc-patches@gcc.gnu.org, Kirill Smelkov MIME-Version: 1.0 Message-Id: <201006131436.46910.franke@embl-hamburg.de> X-EMBL-Hamburg-Mailsystem-MailScanner: Found to be clean X-EMBL-Hamburg-Mailsystem-MailScanner-SpamCheck: not spam, SpamAssassin (not cached, score=-4.399, required 5, autolearn=not spam, ALL_TRUSTED -1.80, BAYES_00 -2.60) Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org 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 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 Index: gfortranspec.c =================================================================== --- gfortranspec.c (revision 160677) +++ gfortranspec.c (working copy) @@ -424,35 +424,6 @@ For more information about these matters continue; } - if ((argv[i][0] == '-') && (argv[i][1] == 'M')) - { - char *p; - - warning (0, "using -M 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: lang-specs.h =================================================================== --- lang-specs.h (revision 160677) +++ lang-specs.h (working copy) @@ -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: lang.opt =================================================================== --- lang.opt (revision 160677) +++ lang.opt (working copy) @@ -56,6 +56,42 @@ J Fortran Joined Separate -J 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: cpp.h =================================================================== --- cpp.h (revision 160677) +++ cpp.h (working copy) @@ -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: cpp.c =================================================================== --- cpp.c (revision 160677) +++ cpp.c (working copy) @@ -35,6 +35,7 @@ along with GCC; see the file COPYING3. #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 */ + int deps_missing_are_generated; /* -MG */ + int deps_phony; /* -MP */ const char *multilib; /* -imultilib */ const char *prefix; /* -iprefix */ @@ -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, con 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 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: module.c =================================================================== --- module.c (revision 160677) +++ module.c (working copy) @@ -74,6 +74,7 @@ along with GCC; see the file COPYING3. #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 d 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) @@ -5321,6 +5325,9 @@ import_iso_c_binding_module (void) "module ISO_C_BINDING", u->use_name, &u->where); } } + + if (gfc_cpp_makedep ()) + gfc_cpp_add_dep ("iso_c_binding" MODULE_EXTENSION, true); } @@ -5476,6 +5483,9 @@ use_iso_fortran_env_module (void) "module ISO_FORTRAN_ENV", u->use_name, &u->where); } } + + if (gfc_cpp_makedep ()) + gfc_cpp_add_dep ("iso_fortran_env" MODULE_EXTENSION, true); } Index: scanner.c =================================================================== --- scanner.c (revision 160677) +++ scanner.c (working copy) @@ -421,28 +421,38 @@ open_included_file (const char *name, gf 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); + f = gfc_open_file (name); - if (include_cwd) - { - f = gfc_open_file (name); - if (f != NULL) - return f; - } + if (!f && include_cwd) + f = gfc_open_file (name); + + if (!f) + f = open_included_file (name, include_dirs, module); - return open_included_file (name, include_dirs, module); + if (f && gfc_cpp_makedep ()) + gfc_cpp_add_dep (name, 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) + f = open_included_file (name, intrinsic_modules_dirs, true); - return open_included_file (name, intrinsic_modules_dirs, true); + if (f && gfc_cpp_makedep ()) + gfc_cpp_add_dep (name, true); + + return f; }