mirror of
https://git.savannah.gnu.org/git/make.git
synced 2025-01-12 16:45:35 +00:00
a9e3eb1eec
Add a warning to control circular dependency detection. Use "warn" as the default action to be backward-compatible. * src/warning.h (enum warning_type): Add warning type wt_circular_dep. * src/warning.c (warn_init): Set default wt_circular_dep to w_warn. * src/remake.c (update_file_1): Consult the circular-dep warning to handle circular dependencies. * tests/scripts/options/warn: Test --warn circular-dep flag. * tests/scripts/variables/WARNINGS: Test .WARNINGS circular-dep flag. * doc/make.texi: Document circular-dep warning. * doc/make.1: Ditto.
201 lines
5.4 KiB
Perl
201 lines
5.4 KiB
Perl
# -*-perl-*-
|
|
|
|
$description = "Test the .WARNINGS variable.";
|
|
|
|
my %warn_test = (
|
|
'warn' => 'warn', 'error warn' => 'warn',
|
|
'error' => 'error',
|
|
'ignore error ignore invalid-var,invalid-ref,undefined-var' => 'ignore,invalid-var,invalid-ref,undefined-var',
|
|
'invalid-ref:ignore error invalid-var:warn,,,,,undefined-var:error,,,,,' => '=error,invalid-var,invalid-ref:ignore,undefined-var:error'
|
|
);
|
|
|
|
# Verify that values set in .WARNINGS don't get passed to sub-makes
|
|
|
|
while (my ($f, $r) = each %warn_test) {
|
|
run_make_test(qq!
|
|
.WARNINGS = error
|
|
\$(info MF=\$(MAKEFLAGS))
|
|
all:; \@#HELPER# env MAKEFLAGS
|
|
!,
|
|
'', "MF=\nMAKEFLAGS=");
|
|
}
|
|
|
|
# Verify that make's special variables don't warn even if they're not set
|
|
run_make_test(q!
|
|
.WARNINGS = undefined-var
|
|
vars := $(.VARIABLES) $(MAKECMDGOALS) $(MAKE_RESTARTS) $(CURDIR)
|
|
vars += $(GNUMAKEFLAGS) $(MAKEFLAGS) $(MFLAGS) $(MAKE_COMMAND) $(MAKE)
|
|
vars += $(MAKEFILE_LIST) $(MAKEOVERRIDES) $(-*-command-variables-*-)
|
|
vars += $(.RECIPEPREFIX) $(.LOADED) $(.FEATURES)
|
|
vars += $(SHELL) $(.SHELLFLAGS) $(MAKE_TERMOUT) $(MAKE_TERMERR)
|
|
vars += $(.DEFAULT) $(.DEFAULT_GOAL) $(-*-eval-flags-*-) $(SUFFIXES)
|
|
vars += $(VPATH) $(GPATH)
|
|
all:;
|
|
!,
|
|
'', "#MAKE#: 'all' is up to date.");
|
|
|
|
# sv 63609.
|
|
# Test for buffer overrun in warn_undefined.
|
|
run_make_test(q!
|
|
.WARNINGS = undefined-var
|
|
all:;
|
|
X := $(averyveryveryloooooooooooooooooooooooooooongvariablename)
|
|
!,
|
|
'', "#MAKEFILE#:4: warning: reference to undefined variable 'averyveryveryloooooooooooooooooooooooooooongvariablename'
|
|
#MAKE#: 'all' is up to date.\n"
|
|
);
|
|
|
|
# Check undefined variable warnings
|
|
|
|
# With no options or with ignore, nothing should happen
|
|
run_make_test('
|
|
.WARNINGS := $(warnval)
|
|
EMPTY =
|
|
EREF = $(EMPTY)
|
|
UREF = $(UNDEFINED)
|
|
|
|
SEREF := $(EREF)
|
|
SUREF := $(UREF)
|
|
|
|
all: ; @echo ref $(EREF) $(UREF)',
|
|
'', 'ref');
|
|
|
|
run_make_test(undef, 'warnval=undefined-var:ignore', 'ref');
|
|
|
|
# Check warnings
|
|
run_make_test(undef, 'warnval=undefined-var',
|
|
"#MAKEFILE#:8: warning: reference to undefined variable 'UNDEFINED'
|
|
#MAKEFILE#:10: warning: reference to undefined variable 'UNDEFINED'
|
|
ref");
|
|
|
|
# Check and errors
|
|
run_make_test(undef, 'warnval=undefined-var:error',
|
|
"#MAKEFILE#:8: *** reference to undefined variable 'UNDEFINED'. Stop.", 512);
|
|
|
|
# Check invalid variable reference warnings
|
|
|
|
# With no options we still check for invalid references
|
|
run_make_test('
|
|
.WARNINGS = $(warnval)
|
|
IREF = $(bad variable)
|
|
SIREF := $(IREF)
|
|
|
|
define nl
|
|
|
|
|
|
endef
|
|
|
|
all: ; @echo ref $(also$(nl)bad) $(IREF) $(SIREF)',
|
|
'', "#MAKEFILE#:3: warning: invalid variable reference 'bad variable'
|
|
#MAKEFILE#:11: warning: invalid variable reference 'also\nbad'
|
|
#MAKEFILE#:3: warning: invalid variable reference 'bad variable'
|
|
ref");
|
|
|
|
run_make_test(undef, 'warnval=ignore', 'ref');
|
|
|
|
run_make_test(undef, 'warnval=invalid-ref:ignore', 'ref');
|
|
|
|
# Check and errors
|
|
run_make_test(undef, 'warnval=invalid-ref:error',
|
|
"#MAKEFILE#:3: *** invalid variable reference 'bad variable'. Stop.", 512);
|
|
|
|
# Check invalid variable name warnings
|
|
|
|
# With no options we still check for invalid references
|
|
run_make_test('
|
|
.WARNINGS = $(warnval)
|
|
EMPTY =
|
|
SPACE = $(EMPTY) $(EMPTY)
|
|
BAD$(SPACE)VAR = foo
|
|
|
|
define nl
|
|
|
|
|
|
endef
|
|
|
|
NL$(nl)VAR = bar
|
|
|
|
define BAD$(SPACE)DEF :=
|
|
foo
|
|
endef
|
|
|
|
define NL$(nl)DEF :=
|
|
foo
|
|
endef
|
|
|
|
all: ; @echo ref',
|
|
'', "#MAKEFILE#:5: warning: invalid variable name 'BAD VAR'
|
|
#MAKEFILE#:12: warning: invalid variable name 'NL\nVAR'
|
|
#MAKEFILE#:14: warning: invalid variable name 'BAD DEF'
|
|
#MAKEFILE#:18: warning: invalid variable name 'NL\nDEF'
|
|
ref");
|
|
|
|
run_make_test(undef, 'warnval=ignore', 'ref');
|
|
|
|
run_make_test(undef, 'warnval=invalid-var:ignore', 'ref');
|
|
|
|
# Check errors
|
|
run_make_test(undef, 'warnval=invalid-var:error',
|
|
"#MAKEFILE#:5: *** invalid variable name 'BAD VAR'. Stop.", 512);
|
|
|
|
# Make sure unknown warnings and actions are only noted but not failed on:
|
|
# this allows makefiles to be portable to older versions where those warnings
|
|
# didn't exist
|
|
|
|
run_make_test(q!
|
|
.WARNINGS = no-such-warn
|
|
all:;
|
|
!,
|
|
'',"#MAKEFILE#:2: unknown warning 'no-such-warn': ignored\n#MAKE#: 'all' is up to date.");
|
|
|
|
run_make_test(q!
|
|
.WARNINGS = invalid-var:no-such-action
|
|
all:;
|
|
!,
|
|
'',"#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...?)
|
|
|
|
# run_make_test(q!
|
|
# ok := $(undef)
|
|
# ref = $(undef)
|
|
|
|
# all: enabled disabled enabled2 ;
|
|
|
|
# .WARNINGS = undefined-var
|
|
|
|
# enabled enabled2 disabled ref: ; $(info $@:$(ref))
|
|
|
|
# disabled: .WARNINGS =
|
|
# disabled: ref
|
|
# !,
|
|
# '', "#MAKEFILE#:9: reference to undefined variable 'undef'\nenabled:
|
|
# ref:
|
|
# disabled:
|
|
# #MAKEFILE#:9: reference to undefined variable 'undef'\nenabled2:
|
|
# #MAKE#: 'all' is up to date.");
|
|
|
|
1;
|