+ my $input = new IO::File $f, '<';
+ if (!$input) {
+ err "open $f: $!" unless $!==ENOENT && $enoent_ok;
+ return;
+ }
+ $input_files{$f}++;
+
+ local $err_file=$f;
+
+ my %srcdirmap = (
+ '^' => "\${top_srcdir}${dir_suffix}",
+ '~' => "\${top_srcdir}",
+ );
+ my %pfxmap = (
+ '' => $dir_prefix,
+ );
+ $pfxmap{$_} = $srcdirmap{$_}.'/' foreach keys %srcdirmap;
+
+ local $ddbl;
+ my @nest = (['']);
+ my $evalcall_brackets;
+
+ my $push_nest = sub {
+ my ($nk, $nndbl, $what) = @_;
+ unshift @nest, [ $nk, $ddbl, $what, $. ];
+ $ddbl = $nndbl;
+ };
+ my $pop_nest = sub {
+ my ($nk) = @_;
+ err "unexpectedly closed $nk in middle of $nest[0][0] ($nest[0][2])"
+ unless $nest[0][0] eq $nk;
+ $ddbl = (shift @nest)[1];
+ };
+
+ # Our detection of variable settings does not have to be completely
+ # accurate, since it is only going to be used for advice to the user.
+ my $note_varref = sub {
+ my ($vn,$amp) = @_;
+ my $exp = !!$varref_exp{$vn}{$amp};
+ $varref{$vn}{$exp}{$amp}{"$f:$."} = 1;
+ };
+
+ while (<$input>) {
+ if (m#^\s*($esc)?(\w+)\s*(?:=|\+=|\?=|:=)# ||
+ m#^\s*(?:$esc\:macro|define)\s+($esc)?(\S+)\s#) {
+ $note_varref->($2,!!$1);
+ }
+ if (s#^\s*$esc\:changequote\s+(\S+)\s+$##) {
+ $$esclitr = $1;
+ $set_esc->();
+ next;
+ } elsif (s#^\s*$esc\:endm\s+$##) {
+ $pop_nest->('macro');
+ od "endef\n";
+ next;
+ } elsif (s#^\s*$esc\:warn\s+(\S.*)$##) {
+ foreach my $wk (split /\s+/, $1) {
+ my $yes = $wk !~ s{^!}{};
+ if (defined $warn_ena{$wk}) {
+ $warn_ena{$wk} = $yes;
+ next;
+ } elsif ($yes) {
+ wrn 'unknown-warning',
+ "unknown warning $wk requested";
+ } else {
+ $warn_unk{$wk} //= "$f:$.";
+ }
+ }
+ next;
+ } elsif (s#^\s*$esc\:local\+global\s+(\S.*)$##) {
+ foreach my $vn (split /\s+/, $1) {
+ my $pos = !($vn =~ s{^!}{});
+ my $amp = $vn =~ s{^$esc}{};
+ $varref_exp{$vn}{!!$amp} = $pos;
+ }
+ next;
+ } elsif (s#^\s*$esc\:(?=(-?)include|macro)##) {
+ $buffering_output='';
+ } elsif (m#^\s*$esc\:([a-z][-+0-9a-z_]*)#) {
+ err "unknown directive &:$1 or bad argumnt syntax";
+ } elsif (s{^\s*${esc}TARGETS(?:_([0-9a-zA-Z_]+))?(?=\W)}{}) {
+ my $t = $1 // 'all';
+ my $vn = target_varname($var_prefix, $t);
+ $note_varref->($vn,1);
+ od $vn;
+ $targets->{$t} //= [ ];
+ }