---
name: "Makefile::AST::Evaluator"
section: "3pm"
platform: "linux"
package: "libmakefile-parser-perl"
version: "0.215-1"
release: "Debian 7 (Wheezy)"
platforms: ["linux"]
url: "https://new.carta.tech/Makefile::AST::Evaluator"
---

# Makefile::AST::Evaluator(3pm)

Evaluator and runtime for Makefile::AST instances

## NAME

Makefile::AST::Evaluator - Evaluator and runtime for Makefile::AST instances

## SYNOPSIS

```
    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);
    Makefile::AST::Evaluator->add_trigger(
        firing_rule => sub {
            my ($self, $rule, $ast_cmds) = @_;
            my $target = $rule->target;
            my $colon = $rule->colon;
            my @normal_prereqs = @{ $rule->normal_prereqs };
            # ...
        }
    );
    $eval->set_required_target($user_makefile)
    $eval->make($goal);
```

## DESCRIPTION

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.

## CONFIGURE VARIABLES

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:

- $Question

  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.

- $AlwaysMake

  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.

- $Quiet

  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.

- $JustPrint

  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.

- $IgnoreErrors

  This variable corresponds to GNU make's command line option `"-i"` or `"--ignore-errors"`ieXXIt'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.

## CLASS TRIGGERS

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.

## CODE REPOSITORY

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

http://github.com/agentzh/makefile-parser-pm \<http://github.com/agentzh/makefile-parser-pm\>.

There is anonymous access to all.

## AUTHOR

Zhang "agentzh" Yichun `"<agentzh@gmail.com>"`

## COPYRIGHT AND LICENSE

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.

## SEE ALSO

Makefile::AST, Makefile::Parser::GmakeDB, pgmake-db, makesimple, Makefile::DOM.
