package Make::Rule::Vars; use strict; use warnings; use Carp; ## no critic (ValuesAndExpressions::ProhibitConstantPragma) use constant DEBUG => $ENV{MAKE_DEBUG}; ## use critic our $VERSION = '2.011'; my @KEYS = qw( @ * ^ ? < ); my $i; ## no critic (BuiltinFunctions::RequireBlockMap) my %NEXTKEY = map +( $_ => ++$i ), @KEYS; ## use critic # Package to handle automatic variables pertaining to rules e.g. $@ $* $^ $? # by using tie to this package 'subsvars' can work with array of # hash references to possible sources of variable definitions. sub TIEHASH { my ( $class, $rule, $target ) = @_; return bless [ $rule, $target ], $class; } sub FIRSTKEY { return $KEYS[0]; } sub NEXTKEY { my ( $self, $lastkey ) = @_; return $KEYS[ $NEXTKEY{$lastkey} ]; } sub EXISTS { my ( $self, $key ) = @_; return exists $NEXTKEY{$key}; } sub FETCH { my ( $self, $v ) = @_; my ( $rule, $target ) = @$self; DEBUG and print STDERR "FETCH $v for ", $target->Name, "\n"; return $target->Name if $v eq '@'; return $target->Base if $v eq '*'; return join ' ', @{ $rule->prereqs } if $v eq '^'; return join ' ', $rule->out_of_date($target) if $v eq '?'; return ( @{ $rule->prereqs } )[0] if $v eq '<'; return; } 1;