use strict; use warnings; use Test::More tests => 27; use Makefile::AST; my $ast = Makefile::AST->new; ok $ast, 'ast obj ok'; isa_ok $ast, 'Makefile::AST', 'ast class ok'; my $var = Makefile::AST::Variable->new({ name => 'foo', flavor => 'simple', origin => 'makefile', value => 'bar', }); $ast->add_var($var); my $var2 = $ast->get_var('foo'); is $var2, $var, 'get_var ok'; $ast->add_auto_var('@' => 'blah'); $var = $ast->get_var('@'); is $var->name, '@'; is $var->flavor, 'simple'; is $var->origin, 'automatic'; is $var->value->[0], 'blah'; my $rules = $ast->implicit_rules(); is_deeply $rules, []; my $rule = Makefile::AST::Rule::Implicit->new({ targets => ['%.pm','%.c'], normal_prereqs => ['%.cpp', '%.h', 'foo.h'], order_prereqs => ['foo', '%.bar'], commands => ['echo', 'hello', 'world'], colon => ':', }); $ast->add_implicit_rule($rule); ok $ast->target_ought_to_exist('foo'); ok ! $ast->target_ought_to_exist('bar'); ok $ast->target_ought_to_exist('foo.h'); ok !$ast->target_ought_to_exist('bar.pm'); ok !$ast->target_ought_to_exist('%.pm'); ok !$ast->target_ought_to_exist('%.c'); ok !$ast->target_ought_to_exist('%.cpp'); ok !$ast->target_ought_to_exist('%.h'); $rules = $ast->implicit_rules(); is_deeply $rules, [$rule]; my $applied = $ast->apply_explicit_rules('foo.pm'); is $applied, undef; $applied = $ast->apply_implicit_rules('foo.pm'); is $applied, undef; $ast->{targets}->{'foo.cpp'} = 1; # $ast->{targets}->{'foo.bar'} = 1; $applied = $ast->apply_implicit_rules('foo.pm'); is $applied, undef; $ast->{targets}->{'foo.cpp'} = 1; # $ast->{targets}->{'foo.bar'} = 1; $applied = $ast->apply_implicit_rules('foo.pm'); is $applied, undef; $ast->{targets}->{'foo.cpp'} = 1; $ast->{targets}->{'foo.bar'} = 1; $applied = $ast->apply_implicit_rules('foo.pm'); ok $applied; is $applied->target, 'foo.pm'; is join(' ', @{ $applied->other_targets }), 'foo.c'; is join(' ', @{ $applied->normal_prereqs }), 'foo.cpp foo.h foo.h'; is join(' ', @{ $applied->order_prereqs }), 'foo foo.bar'; $rule = Makefile::AST::Rule->new({ target => 'blah.exe', normal_prereqs => ['blah.cpp', 'blah.h'], order_prereqs => [], commands => ['echo'], colon => ':', }); $ast->add_explicit_rule($rule); my ($rule2) = $ast->apply_explicit_rules('blah.exe'); is $rule2, $rule;