Makefile::AST::Evaluator(3) Evaluator and runtime for Makefile::AST instances


use Makefile::AST::Evaluator;
$Makefile::AST::Evaluator::JustPrint = 0;
$Makefile::AST::Evaluator::Quiet = 1;
$Makefile::AST::Evaluator::IgnoreErrors = 1;
$Makefile::AST::Evaluator::AlwaysMake = 1;
$Makefile::AST::Evaluator::Question = 1;
# $ast is a Makefile::AST instance:
my $eval = Makefile::AST::Evaluator->new($ast);
firing_rule => sub {
my ($self, $rule, $ast_cmds) = @_;
my $target = $rule->target;
my $colon = $rule->colon;
my @normal_prereqs = @{ $rule->normal_prereqs };
# ...


This module implementes an evaluator or a runtime for makefile ASTs represented by Makefile::AST instances.

It ``executes'' the specified GNU make AST by the GNU makefile semantics. Note that, ``execution'' not necessarily mean building a project tree by firing makefile rule commands. Actually you can defining your own triggers by calling the add_trigger method. (See the ``SYNOPSIS'' for examples.) In other words, you can do more interesting things like plotting the call path tree of a Makefile using Graphviz, or translating the original makefile to another form (like what the makesimple script does).

It's worth mentioning that, most of the construction algorithm for topological graph s (including implicit rule application) have already been implemented in Makefile::AST and its child node classes.


This module provides several package variables (i.e. static class variables) for controlling the behavior of the evaluator.

Particularly the user needs to set the $AlwaysMake variable to true and $Question to true, if she wants to use the evaluator to do special tasks like plotting dependency graphs and translating GNU makefiles to other format.

Setting $AlwaysMake to true will force the evaluator to ignore the timestamps of external files appeared in the makefiles while setting $Question to true will prevent the evaluator from executing the shell commands specified in the makefile rules.

Here's the detailed listing for all the config variables:

This variable corresponds to the command-line option "-q" or <--question> in GNU make. Its purpose is to make the evaluator enter the ``questioning mode'', i.e., a mode in which "make" will never try executing rule commands unless it has to, "and" echoing is suppressed at the same time.
This variable corresponds to the command-line option "-B" or "--always-make". It forces re-constructing all the rule's targets related to the goal, ignoring the timestamp or existence of targets' dependencies.
It corresponds to GNU make's command-line option "-s", "--silent", or "--quiet". Its effect is to cancel the echoing of shell commands being executed.
This variable corresponds to GNU make's command line option "-n", "--just-print", "--dry-run", or "--recon". Its effect is to print out the shell commands requiring execution but without actually executing them.
This variable corresponds to GNU make's command line option "-i" or "--ignore-errors"XIt's used to ignore the errors of shell commands being executed during the make process. The default behavior is quitting as soon as a shell command without the "-" modifier fails.


The "make_by_rule" method of this class defines a trigger named "firing_rule" via the Class::Trait module. Everytime the "make_by_rule" method reaches the trigger point, it will invoke the user's processing handler with the following three arguments: the self object, the Makefile::AST::Rule object, and the corresponding "Makefile::AST::Command" object in the context.

By registering his own processing handlers for the "firing_rule" trigger, the user's code can reuse the evaluator to do his own cool things without traversing the makefile ASTs himself.

See the ``SYNOPSIS'' for code examples.


For the very latest version of this script, check out the source from <>.

There is anonymous access to all.


Zhang ``agentzh'' Yichun "<[email protected]>"


Copyright (c) 2007-2008 by Zhang ``agentzh'' Yichun (agentzh).

This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself.