summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Smith <psmith@gnu.org>2013-05-13 01:30:24 -0400
committerPaul Smith <psmith@gnu.org>2013-05-13 01:30:24 -0400
commit381baeef7aa4f2c8758a9910ebb97af46c0dd7eb (patch)
treea62e74040e2ea16c3480566b0d2cb246c6fec453
parent5367d393ddb36fc8b3f358418d5c9f2b9f01d2fe (diff)
downloadgunmake-381baeef7aa4f2c8758a9910ebb97af46c0dd7eb.tar.gz
Add new --trace[=MODE] flags, with --trace=dir
This mode replaces the previous heuristic setting enabled with -O, where we would log directory enter/leave for each synchronized output. Now we only do that if --trace=dir is given.
-rw-r--r--ChangeLog12
-rw-r--r--doc/make.texi19
-rw-r--r--job.c20
-rw-r--r--main.c40
-rw-r--r--make.122
-rw-r--r--makeint.h4
-rw-r--r--misc.c8
-rw-r--r--tests/ChangeLog5
-rw-r--r--tests/scripts/features/output-sync8
9 files changed, 102 insertions, 36 deletions
diff --git a/ChangeLog b/ChangeLog
index 4d08576..57803f0 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,15 @@
+2013-05-13 Paul Smith <psmith@gnu.org>
+
+ * makeint.h (TRACE_NONE, TRACE_RULE, TRACE_DIRECTORY): Define
+ constants for the trace mode.
+ * main.c: Add new --trace mode parsing.
+ (decode_trace_flags): New function.
+ (decode_switches): Call it.
+ (define_makeflags): Fix a bug with long-name options.
+ * misc.c (fatal): Remove special output-sync handling.
+ * make.1: Document new --trace mode flags.
+ * doc/make.texi (Options Summary): Ditto.
+
2013-05-11 Eli Zaretskii <eliz@gnu.org>
* job.c (child_out): Output the newline following the message
diff --git a/doc/make.texi b/doc/make.texi
index 69de5b7..8a35780 100644
--- a/doc/make.texi
+++ b/doc/make.texi
@@ -8730,7 +8730,8 @@ With no type or the type @samp{target}, output from the entire recipe
of each target is grouped together. With the type @samp{line}, output
from each line in the recipe is grouped together. With the type
@samp{recurse}, the output from an entire recursive make is grouped
-together. @xref{Parallel Output, ,Output During Parallel Execution}.
+together. With the type @samp{none}, no output synchronization is
+performed. @xref{Parallel Output, ,Output During Parallel Execution}.
@item -q
@cindex @code{-q}
@@ -8803,13 +8804,17 @@ instead of running their recipes. This is used to pretend that the
recipes were done, in order to fool future invocations of
@code{make}. @xref{Instead of Execution, ,Instead of Executing Recipes}.
-@item --trace
+@item --trace[=@var{mode}]
@cindex @code{--trace}
-@c Extra blank line here makes the table look better.
-
-Print the entire recipe to be executed, even for recipes that are
-normally silent (due to @code{.SILENT} or @samp{@@}). Also print the
-makefile name and line number where the recipe was defined.
+Show tracing information for @code{make} execution. With no mode or
+the type @samp{rule}, print the entire recipe to be executed, even for
+recipes that are normally silent (due to @code{.SILENT} or @samp{@@}).
+Also print the makefile name and line number where the recipe was
+defined, and information on why the target is being rebuilt. With the
+type @samp{dir}, directory enter/leave lines are shown around each
+synchronized output segment. These modes are cumulative and can be
+set with multiple instances of the @code{--trace} flag. With the type
+@samp{none}, all tracing is disabled.
@item -v
@cindex @code{-v}
diff --git a/job.c b/job.c
index 106c518..56055e4 100644
--- a/job.c
+++ b/job.c
@@ -768,14 +768,20 @@ sync_output (struct child *c)
unsynchronized; still better than silently discarding it. */
void *sem = acquire_semaphore ();
- /* We've entered the "critical section" during which a lock is held.
- We want to keep it as short as possible. */
- log_working_directory (1, 1);
+ /* We've entered the "critical section" during which a lock is held. We
+ want to keep it as short as possible. */
+
+ /* Log the working directory. Force it if we're doing dir tracing. */
+ log_working_directory (1, (trace_flag & TRACE_DIRECTORY));
+
if (outfd_not_empty)
- pump_from_tmp (c->outfd, stdout);
+ pump_from_tmp (c->outfd, stdout);
if (errfd_not_empty && c->errfd != c->outfd)
pump_from_tmp (c->errfd, stderr);
- log_working_directory (0, 1);
+
+ /* If we're doing dir tracing, force the leave message. */
+ if (trace_flag & TRACE_DIRECTORY)
+ log_working_directory (0, 1);
/* Exit the critical section. */
if (sem)
@@ -1506,7 +1512,7 @@ start_job_command (struct child *child)
return;
}
- print_cmd = (just_print_flag || trace_flag
+ print_cmd = (just_print_flag || (trace_flag & TRACE_RULE)
|| (!(flags & COMMANDS_SILENT) && !silent_flag));
#ifdef OUTPUT_SYNC
@@ -2237,7 +2243,7 @@ new_job (struct file *file)
/* Trace the build.
Use message here so that changes to working directories are logged. */
- if (trace_flag)
+ if (trace_flag & TRACE_RULE)
{
char *newer = allocated_variable_expand_for_file ("$?", c->file);
const char *nm;
diff --git a/main.c b/main.c
index 49f466c..fe0f54e 100644
--- a/main.c
+++ b/main.c
@@ -157,7 +157,7 @@ static struct stringlist *output_sync_option = 0;
/* Tracing (--trace). */
-int trace_flag = 0;
+static struct stringlist *trace_option = 0;
#ifdef WINDOWS32
/* Suspend make in main for a short time to allow debugger to attach */
@@ -370,7 +370,7 @@ static const char *const usage[] =
N_("\
-t, --touch Touch targets instead of remaking them.\n"),
N_("\
- --trace Print tracing information.\n"),
+ --trace[=MODE] Print tracing information.\n"),
N_("\
-v, --version Print the version number of make and exit.\n"),
N_("\
@@ -430,7 +430,7 @@ static const struct command_switch switches[] =
{ 'S', flag_off, &keep_going_flag, 1, 1, 0, 0, &default_keep_going_flag,
"no-keep-going" },
{ 't', flag, &touch_flag, 1, 1, 1, 0, 0, "touch" },
- { CHAR_MAX+3, flag, &trace_flag, 1, 1, 0, 0, 0, "trace" },
+ { CHAR_MAX+3, string, &trace_option, 1, 1, 0, "rule", 0, "trace" },
{ 'v', flag, &print_version_flag, 1, 1, 0, 0, 0, "version" },
{ 'w', flag, &print_directory_flag, 1, 1, 0, 0, 0, "print-directory" },
{ CHAR_MAX+4, flag, &inhibit_print_directory_flag, 1, 1, 0, 0, 0,
@@ -521,7 +521,12 @@ int one_shell;
attempts to synchronize the output of parallel jobs such that the results
of each job stay together. */
-int output_sync;
+int output_sync = OUTPUT_SYNC_NONE;
+
+/* One of TRACE_* if the "--trace" option was given. Enables various types of
+ tracing. */
+
+int trace_flag = TRACE_NONE;
/* Nonzero if we have seen the '.NOTPARALLEL' target.
This turns off parallel builds for this invocation of make. */
@@ -684,6 +689,29 @@ decode_debug_flags (void)
}
static void
+decode_trace_flags (void)
+{
+ const char **pp;
+
+ if (!trace_option)
+ return;
+
+ for (pp=trace_option->list; *pp; ++pp)
+ {
+ const char *p = *pp;
+
+ if (streq (p, "none"))
+ trace_flag = TRACE_NONE;
+ else if (streq (p, "rule"))
+ trace_flag |= TRACE_RULE;
+ else if (streq (p, "dir"))
+ trace_flag |= TRACE_DIRECTORY;
+ else
+ fatal (NILF, _("unknown trace mode '%s'"), p);
+ }
+}
+
+static void
decode_output_sync_flags (void)
{
const char **pp;
@@ -2764,6 +2792,7 @@ decode_switches (int argc, char **argv, int env)
/* If there are any options that need to be decoded do it now. */
decode_debug_flags ();
decode_output_sync_flags ();
+ decode_trace_flags ();
}
/* Decode switches from environment variable ENVAR (which is LEN chars long).
@@ -3000,7 +3029,8 @@ define_makeflags (int all, int makefile)
*p++ = flags->cs->c;
else
{
- if (*p != '-')
+ /* If we don't have a dash, start a double-dash. */
+ if (p[-1] != '-')
{
*p++ = ' ';
*p++ = '-';
diff --git a/make.1 b/make.1
index ad86db3..9420032 100644
--- a/make.1
+++ b/make.1
@@ -231,7 +231,7 @@ the output from the entire recipe for each target is grouped together. If
.I type
is
.B line
-the output from each line within a recipe is grouped together.
+the output from each command line within a recipe is grouped together.
If
.I type
is
@@ -289,9 +289,25 @@ This is used to pretend that the commands were done, in order to fool
future invocations of
.BR make .
.TP 0.5i
-.B \-\-trace
+.B \-\-trace\fR[=\fImode\fR]
Print information about the commands invoked by
-.BR make.
+.BR make .
+If
+.I mode
+is not specified or is
+.B rule
+information about the disposition of each target is printed. If
+.I mode
+is
+.B dir
+then directory enter/leave trace statements are shown for each synchronized
+output segment (see
+.BR \-O ).
+If
+.I mode
+is
+.B none
+then no tracing is performed.
.TP 0.5i
\fB\-v\fR, \fB\-\-version\fR
Print the version of the
diff --git a/makeint.h b/makeint.h
index 6bff07a..ae7e813 100644
--- a/makeint.h
+++ b/makeint.h
@@ -544,6 +544,10 @@ int strncasecmp (const char *s1, const char *s2, int n);
#define OUTPUT_SYNC_TARGET 2
#define OUTPUT_SYNC_RECURSE 3
+#define TRACE_NONE 0x0
+#define TRACE_RULE 0x1
+#define TRACE_DIRECTORY 0x2
+
extern const gmk_floc *reading_file;
extern const gmk_floc **expanding_var;
diff --git a/misc.c b/misc.c
index 2a6c6ea..301a3c2 100644
--- a/misc.c
+++ b/misc.c
@@ -313,10 +313,7 @@ fatal (const gmk_floc *flocp, const char *fmt, ...)
{
va_list args;
- if (output_sync)
- log_working_directory (1, 1);
- else
- log_working_directory (1, 0);
+ log_working_directory (1, 0);
if (flocp && flocp->filenm)
fprintf (stderr, "%s:%lu: *** ", flocp->filenm, flocp->lineno);
@@ -331,8 +328,7 @@ fatal (const gmk_floc *flocp, const char *fmt, ...)
fputs (_(". Stop.\n"), stderr);
- if (output_sync)
- log_working_directory (0, 1);
+ log_working_directory (0, 1);
die (2);
}
diff --git a/tests/ChangeLog b/tests/ChangeLog
index 260093a..34e8cc2 100644
--- a/tests/ChangeLog
+++ b/tests/ChangeLog
@@ -1,3 +1,8 @@
+2013-05-13 Paul Smith <psmith@gnu.org>
+
+ * scripts/features/output-sync (output_sync_set): Update for new
+ --trace behavior.
+
2013-05-05 Paul Smith <psmith@gnu.org>
* scripts/features/output-sync (output_sync_set): Remove
diff --git a/tests/scripts/features/output-sync b/tests/scripts/features/output-sync
index d760885..b4541fb 100644
--- a/tests/scripts/features/output-sync
+++ b/tests/scripts/features/output-sync
@@ -135,8 +135,6 @@ foo: end
#MAKE#[1]: Entering directory '#PWD#/bar'
bar: start
bar: end
-#MAKE#[1]: Leaving directory '#PWD#/bar'
-#MAKE#[1]: Entering directory '#PWD#/bar'
baz: start
baz: end
#MAKE#[1]: Leaving directory '#PWD#/bar'\n", 0, 6);
@@ -159,12 +157,10 @@ $sleep_command 1 ; #MAKEPATH# -C bar
#MAKE#[1]: Entering directory '#PWD#/bar'
bar: start
bar: end
-#MAKE#[1]: Leaving directory '#PWD#/bar'
#MAKE#[1]: Entering directory '#PWD#/foo'
foo: start
foo: end
#MAKE#[1]: Leaving directory '#PWD#/foo'
-#MAKE#[1]: Entering directory '#PWD#/bar'
baz: start
baz: end
#MAKE#[1]: Leaving directory '#PWD#/bar'\n", 0, 6);
@@ -213,14 +209,10 @@ make-bar: ; $sleep_command 1 ; \$(MAKE) -C bar bar-job!,
$sleep_command 1 ; #MAKEPATH# -C bar bar-job
#MAKE#[1]: Entering directory '#PWD#/foo'
foo: start
-#MAKE#[1]: Leaving directory '#PWD#/foo'
#MAKE#[1]: Entering directory '#PWD#/bar'
bar: start
-#MAKE#[1]: Leaving directory '#PWD#/bar'
-#MAKE#[1]: Entering directory '#PWD#/bar'
bar: end
#MAKE#[1]: Leaving directory '#PWD#/bar'
-#MAKE#[1]: Entering directory '#PWD#/foo'
foo: end
#MAKE#[1]: Leaving directory '#PWD#/foo'\n", 0, 6);