defined in the makefiles, one per line, then exit with success. No recipes
are invoked and no makefiles are re-built.
+* Warnings for detecting circular dependencies are controllable via warning
+ reporting, with the name "circular-dep".
+
* 'make --print-data-base' (or 'make -p') now outputs time of day
using the same form as for file timestamps, e.g., "2023-05-10
10:43:57.570558743". Previously it used the form "Wed May 10
or
.I error
to set the default action for all warnings, or it can be a specific warning:
+.I circular-dep
+(finding a circular dependency),
+.I invalid-ref
+(referencing an invalid variable name),
.I invalid-var
(assigning to an invalid variable name),
-.I invalid-ref
-(referencing an invalid variable name), or
+or
.I undefined-var
(referencing an undefined variable). The behavior of each warning can be set
by adding
The types of warnings GNU Make can detect are:
@table @samp
-@item invalid-var
-@findex invalid-var
-@cindex warning invalid variable
-Assigning to an invalid variable name (e.g., a name containing whitespace).
-The default action is @samp{warn}.
+@item circular-dep
+@findex circular-dep
+@cindex warning circular dependency
+Finding a loop in the dependency graph (the prerequisites of a target contain
+or depend on the target itself). If the action is not @samp{error}, the
+circular reference is dropped from the graph before continuing. The default
+action is @samp{warn}.
@item invalid-ref
@findex invalid-ref
Using an invalid variable name in a variable reference. The default action is
@samp{warn}.
+@item invalid-var
+@findex invalid-var
+@cindex warning invalid variable
+Assigning to an invalid variable name (e.g., a name containing whitespace).
+The default action is @samp{warn}.
+
@item undefined-var
@findex undefined-var
@cindex warning undefined variable
#include "commands.h"
#include "dep.h"
#include "variable.h"
+#include "warning.h"
#include "debug.h"
#include <assert.h>
if (is_updating (d->file))
{
- OSS (error, NILF, _("circular %s <- %s dependency dropped"),
- file->name, d->file->name);
+ /* Avoid macro warning, bacause its output differs from that of
+ older makes. */
+ if (warn_error (wt_circular_dep))
+ OSS (fatal, NILF, _("circular %s <- %s dependency detected"),
+ file->name, d->file->name);
+ if (warn_check (wt_circular_dep))
+ OSS (error, NILF, _("circular %s <- %s dependency dropped"),
+ file->name, d->file->name);
if (lastd == 0)
file->deps = du->next;
static const char *w_name_map[wt_max] = {
"invalid-var",
"invalid-ref",
- "undefined-var"
+ "undefined-var",
+ "circular-dep"
};
#define encode_warn_action(_b,_s) \
warn_default.actions[wt_invalid_var] = w_warn;
warn_default.actions[wt_invalid_ref] = w_warn;
warn_default.actions[wt_undefined_var] = w_ignore;
+ warn_default.actions[wt_circular_dep] = w_warn;
set_warnings ();
}
wt_invalid_var = 0, /* Assign to an invalid variable name. */
wt_invalid_ref, /* Reference an invalid variable name. */
wt_undefined_var, /* Reference an undefined variable name. */
+ wt_circular_dep, /* A target depends on itself. */
wt_max
};
run_make_test(undef, '--warn=invalid-var:no-such-action',
"#MAKE#: *** unknown warning action 'no-such-action'. Stop.", 512);
+# sv 65739. Circular dependency.
+run_make_test(q!
+hello: hello; @:
+!,
+ '', "#MAKE#: circular hello <- hello dependency dropped\n");
+
+run_make_test(undef, '--warn=error', "#MAKE#: *** circular hello <- hello dependency detected. Stop.\n", 512);
+run_make_test(undef, '--warn=circular-dep:error', "#MAKE#: *** circular hello <- hello dependency detected. Stop.\n", 512);
+run_make_test(undef, '--warn=warn', "#MAKE#: circular hello <- hello dependency dropped\n");
+run_make_test(undef, '--warn=circular-dep:warn', "#MAKE#: circular hello <- hello dependency dropped\n");
+run_make_test(undef, '--warn=ignore', '');
+run_make_test(undef, '--warn=circular-dep:ignore', '');
+
1;
!,
'',"#MAKEFILE#:2: unknown warning action 'no-such-action': ignored\n#MAKE#: 'all' is up to date.");
+# sv 65739. Circular dependency.
+run_make_test(q!
+hello: hello; @:
+!,
+ '', "#MAKE#: circular hello <- hello dependency dropped\n");
+run_make_test(q!
+.WARNINGS = circular-dep:error
+hello: hello; @:
+!,
+ '', "#MAKE#: *** circular hello <- hello dependency detected. Stop.\n", 512);
+run_make_test(q!
+.WARNINGS = circular-dep:warn
+hello: hello; @:
+!,
+ '', "#MAKE#: circular hello <- hello dependency dropped\n");
+run_make_test(q!
+.WARNINGS = circular-dep:ignore
+hello: hello; @:
+!,
+ '', '');
+
# Validate .WARNINGS set as target-specific variables
# This is not supported (yet...?)