Yichun Zhang (章亦春) > Makefile-Parser-0.215 > Makefile::AST::Evaluator

Download:
Makefile-Parser-0.215.tar.gz

Dependencies

Annotate this POD

CPAN RT

New  2
Open  4
View/Report Bugs
Module Version: 0.215   Source  

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,It'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.

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.

syntax highlighting: