From a5a4ce3c3c0eee620f62210898d661a3b05f283a Mon Sep 17 00:00:00 2001 From: Neil Booth Date: Fri, 5 Jan 2001 07:50:24 +0000 Subject: [PATCH] cpp.texi: Update for -MP. * cpp.texi: Update for -MP. Clarify behaviour of -MT. * cppinit.c (initialize_dependency_output): Update. (cpp_finish): Output dummy targets for -MP. (OPT_MP): New. (cpp_handle_option): Handle -MP. Don't quote -MT options. * cpplib.h (struct cpp_options): Add deps_phony_targets. * gcc.c (cpp_options): Update to handle -MP. * mkdeps.c (deps_add_target, deps_add_default_target): Update to quote only the default target. (deps_phony_targets): Insert a preceding newline. Rename from deps_dummy_targets for consistency. * mkdeps.h: Update java: * lang.c (lang_decode_option): Change -MA to -MP. * jcf-depend.c (jcf_dependency_add_target, jcf_dependency_set_target): Update to new prototype; do quote targets. (jcf_dependency_write): Update. From-SVN: r38707 --- gcc/ChangeLog | 15 +++++++++++++++ gcc/cpp.texi | 30 +++++++++++++++++++++++++++--- gcc/cppinit.c | 14 ++++++++++++-- gcc/cpplib.h | 5 ++++- gcc/gcc.c | 2 +- gcc/java/ChangeLog | 7 +++++++ gcc/java/jcf-depend.c | 8 ++++---- gcc/java/lang.c | 5 +++-- gcc/mkdeps.c | 25 ++++++++++++++++--------- gcc/mkdeps.h | 7 ++++--- 10 files changed, 93 insertions(+), 25 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 77a7f79b7c0..d06ad0a1630 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,18 @@ +2001-01-05 Neil Booth + + * cpp.texi: Update for -MP. Clarify behaviour of -MT. + * cppinit.c (initialize_dependency_output): Update. + (cpp_finish): Output dummy targets for -MP. + (OPT_MP): New. + (cpp_handle_option): Handle -MP. Don't quote -MT options. + * cpplib.h (struct cpp_options): Add deps_phony_targets. + * gcc.c (cpp_options): Update to handle -MP. + * mkdeps.c (deps_add_target, deps_add_default_target): Update + to quote only the default target. + (deps_phony_targets): Insert a preceding newline. Rename from + deps_dummy_targets for consistency. + * mkdeps.h: Update + 2001-01-05 Alexandre Oliva * calls.c (emit_library_call_value_1): Support diff --git a/gcc/cpp.texi b/gcc/cpp.texi index db7f86b8506..7df4531af03 100644 --- a/gcc/cpp.texi +++ b/gcc/cpp.texi @@ -3476,14 +3476,38 @@ files into a single dependency file suitable for using with the Like @samp{-MD} except mention only user header files, not system header files. +@item -MP +@findex -MP +This option instructs CPP to add a phony target for each dependency +other than the main file, causing each to depend on nothing. These +dummy rules work around errors MAKE gives if you remove header files +without updating the Makefile to match. + +This is typical output:- + +@smallexample +/tmp/test.o: /tmp/test.c /tmp/test.h + +/tmp/test.h: +@end smallexample + @item -MT @var{target} @findex -MT By default CPP uses the base file name and appends the object suffix, normally ``.o'', to it to obtain the name of the target for dependency -generation. With @samp{-MT} you can specify one or more of your own -targets; doing so overrides the default. +generation. With @samp{-MT} you can specify a target yourself, +overriding the default one. + +If you want multiple targets, you can specify them as a single argument +to @samp{-MT}, or use multiple @samp{-MT} options. + +The targets you specify are output in the order they appear on the +command line, and, unlike the default target, are not quoted for MAKE. +This allows you to do things like, for example, -The targets are output in the order they appear on the command line. +@smallexample +-MT '$(objpfx)foo.o $(objpfx)foo.os $(objpfx)foo.op' +@end smallexample @item -H @findex -H diff --git a/gcc/cppinit.c b/gcc/cppinit.c index de00b2faef6..310fc04edba 100644 --- a/gcc/cppinit.c +++ b/gcc/cppinit.c @@ -760,7 +760,8 @@ initialize_dependency_output (pfile) s = strchr (spec, ' '); if (s) { - deps_add_target (pfile->deps, s + 1); + /* Let the caller perform MAKE quoting. */ + deps_add_target (pfile->deps, s + 1, 0); output_file = (char *) xmalloc (s - spec + 1); memcpy (output_file, spec, s - spec); output_file[s - spec] = 0; @@ -1018,6 +1019,10 @@ cpp_finish (pfile) if (deps_stream) { deps_write (pfile->deps, deps_stream, 72); + + if (CPP_OPTION (pfile, deps_phony_targets)) + deps_phony_targets (pfile->deps, deps_stream); + if (CPP_OPTION (pfile, deps_file)) { if (ferror (deps_stream) || fclose (deps_stream) != 0) @@ -1077,6 +1082,7 @@ new_pending_directive (pend, text, handler) DEF_OPT("MG", 0, OPT_MG) \ DEF_OPT("MM", 0, OPT_MM) \ DEF_OPT("MMD", no_fil, OPT_MMD) \ + DEF_OPT("MP", 0, OPT_MP) \ DEF_OPT("MT", no_tgt, OPT_MT) \ DEF_OPT("P", 0, OPT_P) \ DEF_OPT("U", no_mac, OPT_U) \ @@ -1496,11 +1502,15 @@ cpp_handle_option (pfile, argc, argv) CPP_OPTION (pfile, no_output) = 1; break; + case OPT_MP: + CPP_OPTION (pfile, deps_phony_targets) = 1; + break; + case OPT_MT: /* Add a target. */ if (! pfile->deps) pfile->deps = deps_init (); - deps_add_target (pfile->deps, arg); + deps_add_target (pfile->deps, arg, 0); break; case OPT_A: diff --git a/gcc/cpplib.h b/gcc/cpplib.h index 98e8e1b500c..c2049d787ab 100644 --- a/gcc/cpplib.h +++ b/gcc/cpplib.h @@ -329,6 +329,9 @@ struct cpp_options #include <...> as well. */ unsigned char print_deps; + /* Nonzero if phony targets are created for each header. */ + unsigned char deps_phony_targets; + /* Nonzero if missing .h files in -M output are assumed to be generated files and not errors. */ unsigned char print_deps_missing_files; @@ -570,7 +573,7 @@ struct cpp_reader cpp_token date; cpp_token time; - /* Buffer of -M output. */ + /* Opaque handle to the dependencies of mkdeps.c. Used by -M etc. */ struct deps *deps; /* Obstack holding all macro hash nodes. This never shrinks. diff --git a/gcc/gcc.c b/gcc/gcc.c index 53c7ba24463..b33cacc09a1 100644 --- a/gcc/gcc.c +++ b/gcc/gcc.c @@ -584,7 +584,7 @@ static const char *cpp_options = "%{C:%{!E:%eGNU C does not support -C without using -E}}\ %{std*} %{nostdinc*}\ %{C} %{v} %{I*} %{P} %{$} %I\ - %{M} %{MM} %{MD:-MD %b.d} %{MMD:-MMD %b.d} %{MG} %{MT}\ + %{M} %{MM} %{MD:-MD %b.d} %{MMD:-MMD %b.d} %{MG} %{MP} %{MT}\ %{!no-gcc:-D__GNUC__=%v1 -D__GNUC_MINOR__=%v2 -D__GNUC_PATCHLEVEL__=%v3}\ %{!undef:%{!ansi:%{!std=*:%p}%{std=gnu*:%p}} %P} %{trigraphs}\ %c %{Os:-D__OPTIMIZE_SIZE__} %{O*:%{!O0:-D__OPTIMIZE__}}\ diff --git a/gcc/java/ChangeLog b/gcc/java/ChangeLog index c52b5291a0e..0b8306b2861 100644 --- a/gcc/java/ChangeLog +++ b/gcc/java/ChangeLog @@ -1,3 +1,10 @@ +2001-01-04 Neil Booth + + * lang.c (lang_decode_option): Change -MA to -MP. + * jcf-depend.c (jcf_dependency_add_target, jcf_dependency_set_target): + Update to new prototype; do quote targets. + (jcf_dependency_write): Update. + 2000-12-22 Bryce McKinlay Shorten primitive array allocation path: diff --git a/gcc/java/jcf-depend.c b/gcc/java/jcf-depend.c index 501e239b9ae..c9995609517 100644 --- a/gcc/java/jcf-depend.c +++ b/gcc/java/jcf-depend.c @@ -1,6 +1,6 @@ /* Functions for handling dependency tracking when reading .class files. - Copyright (C) 1998, 1999, 2000 Free Software Foundation, Inc. + Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -74,7 +74,7 @@ jcf_dependency_set_target (name) { /* We just handle this the same as an `add_target'. */ if (dependencies != NULL && name != NULL) - deps_add_target (dependencies, name); + deps_add_target (dependencies, name, 1); } void @@ -82,7 +82,7 @@ jcf_dependency_add_target (name) const char *name; { if (dependencies != NULL) - deps_add_target (dependencies, name); + deps_add_target (dependencies, name, 1); } void @@ -138,6 +138,6 @@ jcf_dependency_write () deps_write (dependencies, dep_out, 72); if (print_dummies) - deps_dummy_targets (dependencies, dep_out); + deps_phony_targets (dependencies, dep_out); fflush (dep_out); } diff --git a/gcc/java/lang.c b/gcc/java/lang.c index b90abdb461e..7565eba9e24 100644 --- a/gcc/java/lang.c +++ b/gcc/java/lang.c @@ -1,5 +1,6 @@ /* Java(TM) language-specific utility routines. - Copyright (C) 1996, 1997, 1998, 1999, 2000 Free Software Foundation, Inc. + Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001 + Free Software Foundation, Inc. This file is part of GNU CC. @@ -340,7 +341,7 @@ lang_decode_option (argc, argv) dependency_tracking |= DEPEND_ENABLE; return 1; } - else if (strcmp (p, "-MA") == 0) + else if (strcmp (p, "-MP") == 0) { jcf_dependency_print_dummies (); return 1; diff --git a/gcc/mkdeps.c b/gcc/mkdeps.c index 8d3e0bfce89..f83d82f9e30 100644 --- a/gcc/mkdeps.c +++ b/gcc/mkdeps.c @@ -73,8 +73,7 @@ munge (filename) break; case '$': - /* '$' is quoted by doubling it. This can mishandle things - like "$(" but there's no easy fix. */ + /* '$' is quoted by doubling it. */ len++; break; } @@ -172,13 +171,14 @@ deps_free (d) free (d); } +/* Adds a target T. We make a copy, so it need not be a permanent + string. QUOTE is true if the string should be quoted. */ void -deps_add_target (d, t) +deps_add_target (d, t, quote) struct deps *d; const char *t; + int quote; { - t = munge (t); /* Also makes permanent copy. */ - if (d->ntargets == d->targets_size) { d->targets_size *= 2; @@ -186,11 +186,17 @@ deps_add_target (d, t) d->targets_size * sizeof (const char *)); } + if (quote) + t = munge (t); /* Also makes permanent copy. */ + else + t = xstrdup (t); + d->targetv[d->ntargets++] = t; } /* Sets the default target if none has been given already. An empty - string as the default target in interpreted as stdin. */ + string as the default target in interpreted as stdin. The string + is quoted for MAKE. */ void deps_add_default_target (d, tgt) struct deps *d; @@ -203,7 +209,7 @@ deps_add_default_target (d, tgt) return; if (tgt[0] == '\0') - deps_add_target (d, "-"); + deps_add_target (d, "-", 1); else { tgt = base_name (tgt); @@ -220,7 +226,7 @@ deps_add_default_target (d, tgt) strcpy (suffix, OBJECT_SUFFIX); else strcat (o, OBJECT_SUFFIX); - deps_add_target (d, o); + deps_add_target (d, o, 1); } } @@ -293,7 +299,7 @@ deps_write (d, fp, colmax) } void -deps_dummy_targets (d, fp) +deps_phony_targets (d, fp) const struct deps *d; FILE *fp; { @@ -301,6 +307,7 @@ deps_dummy_targets (d, fp) for (i = 1; i < d->ndeps; i++) { + putc ('\n', fp); fputs (d->depv[i], fp); putc (':', fp); putc ('\n', fp); diff --git a/gcc/mkdeps.h b/gcc/mkdeps.h index 727a78485a9..2484af18f3e 100644 --- a/gcc/mkdeps.h +++ b/gcc/mkdeps.h @@ -34,8 +34,9 @@ extern struct deps *deps_init PARAMS ((void)); /* Destroy a deps buffer. */ extern void deps_free PARAMS ((struct deps *)); -/* Add a target (appears on left side of the colon) to the deps list. */ -extern void deps_add_target PARAMS ((struct deps *, const char *)); +/* Add a target (appears on left side of the colon) to the deps list. Takes + a boolean indicating whether to quote the target for MAKE. */ +extern void deps_add_target PARAMS ((struct deps *, const char *, int)); /* Sets the default target if none has been given already. An empty string as the default target in interpreted as stdin. */ @@ -56,6 +57,6 @@ extern void deps_write PARAMS ((const struct deps *, FILE *, file, causing it to depend on nothing. This is used to work around the intermediate-file deletion misfeature in Make, in some automatic dependency schemes. */ -extern void deps_dummy_targets PARAMS ((const struct deps *, FILE *)); +extern void deps_phony_targets PARAMS ((const struct deps *, FILE *)); #endif -- 2.30.2