From: Ian Jackson Date: Sun, 29 Dec 2019 15:18:39 +0000 (+0000) Subject: Syntax: Rescope effect of &:local+global X-Git-Tag: subdirmk/0.3~9 X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ian/git?p=subdirmk.git;a=commitdiff_plain;h=4f0ba0e06ccac804cf0dcc9b9d8c3628e35d2336;hp=f2f72a3200b1d81fa84232c03834addbe1bc3547 Syntax: Rescope effect of &:local+global Signed-off-by: Ian Jackson --- diff --git a/README b/README index 2f1a1ce..415913b 100644 --- a/README +++ b/README @@ -175,9 +175,9 @@ So pathname syntax is a subset of: input files (including Final.sd.mk). &:local+global [&]VARIABLE ... - Suppresses the warning about seeing both VARIABLE and - &VARIABLE. Any & specified in the RHS is redundant: this - always affects both versions identically. + Suppresses any warnings relating to forthcoming mentions + to VARIABLE or &VARIABLE, as applicable. Scope ends at + the end of the current directory's Suffix.sd.mk. &:changequote NEWQUOTE changes the escape sequence from & to literally NEWQUOTE diff --git a/generate b/generate index f91cba8..2278928 100755 --- a/generate +++ b/generate @@ -153,6 +153,7 @@ END } our %varref; +our %varref_exp; our ($dir_prefix, $dir_suffix, $dir_name, $var_prefix, $var_prefix_name); @@ -262,6 +263,7 @@ sub process_input_mk ($$$$) { # accurate, since it is only going to be used for advice to the user. my $note_varref = sub { my ($vn,$amp) = @_; + return if $varref_exp{$vn}{$amp}; $varref{$vn}{$amp}{"$f:$."} = 1; }; @@ -294,8 +296,8 @@ sub process_input_mk ($$$$) { next; } elsif (s#^\s*$esc\:local\+global\s+(\S.*)$##) { foreach my $vn (split /\s+/, $1) { - $vn =~ s{^$esc}{}; - $varref{$vn}{NoWarn} = 1; + my $amp = $vn =~ s{^$esc}{}; + $varref_exp{$vn}{!!$amp} = 1; } next; } elsif (s#^\s*$esc\:(?=(-?)include|macro)##) { @@ -435,6 +437,8 @@ sub process_subtree ($$) { #use Data::Dumper; #print STDERR Dumper(\@_); + local %varref_exp; + my $dir_prefix = dir_prefix($path); # ^ this is the only var which we need before we come back from # the recursion. @@ -526,7 +530,6 @@ sub print_varref_warnings () { foreach my $vn (sort keys %varref) { my $vv = $varref{$vn}; next unless $vv->{''} && $vv->{1}; - next if $vv->{NoWarn}; wrncore 'local+global', "saw both $vn and &$vn" or return; foreach my $amp ('', 1) { printf STDERR " saw %s%s at %s\n", diff --git a/tests/filter/stderr.expected b/tests/filter/stderr.expected index 76e32dd..0b4f656 100644 --- a/tests/filter/stderr.expected +++ b/tests/filter/stderr.expected @@ -4,7 +4,10 @@ subdirmk: warning (broken-var-ref): ./Dir.sd.mk:19: broken $&... expansion; you subdirmk: warning (local+global): saw both WARN and &WARN saw WARN at ./Dir.sd.mk:6 saw WARN at ./Dir.sd.mk:9 + saw WARN at ./sub/dir/Dir.sd.mk:16 + saw WARN at ./sub/dir/Dir.sd.mk:19 saw &WARN at ./Dir.sd.mk:7 saw &WARN at ./Dir.sd.mk:10 saw &WARN at ./Dir.sd.mk:11 + saw &WARN at ./sub/dir/Dir.sd.mk:15 subdirmk: warning (unknown-warning): ./sub/dir/Dir.sd.mk:3: attempt to suppress unknown warning(s) `some-unknown-warning' diff --git a/tests/filter/sub/dir/Dir.mk.expected b/tests/filter/sub/dir/Dir.mk.expected index 812e51b..f545495 100644 --- a/tests/filter/sub/dir/Dir.mk.expected +++ b/tests/filter/sub/dir/Dir.mk.expected @@ -11,6 +11,11 @@ sub_dir_TARGETS_sometarget2 line joining +sub_dir_WARN += 4 +WARN += 4 +sub_dir_WARN += 5 # this warning suppressed, precisely +WARN += 5 + # doctests: # Suffix in sub/dir diff --git a/tests/filter/sub/dir/Dir.sd.mk b/tests/filter/sub/dir/Dir.sd.mk index 4b5a50c..a939bbf 100644 --- a/tests/filter/sub/dir/Dir.sd.mk +++ b/tests/filter/sub/dir/Dir.sd.mk @@ -12,5 +12,11 @@ line &\ joining +&WARN += 4 +WARN += 4 +&:local+global &WARN +&WARN += 5 # this warning suppressed, precisely +WARN += 5 + # doctests: &:include &doctests.sd.mk