Skip to content
This repository


Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP

Perl CPAN module Makefile::GraphViz - Draw building flowcharts from Makefiles using GraphViz

branch: master

Fetching latest commit…


Cannot retrieve the latest commit at this time

Octocat-spinner-32 inc
Octocat-spinner-32 lib
Octocat-spinner-32 samples
Octocat-spinner-32 script
Octocat-spinner-32 t
Octocat-spinner-32 .gitignore
Octocat-spinner-32 Changes
Octocat-spinner-32 MANIFEST
Octocat-spinner-32 MANIFEST.SKIP
Octocat-spinner-32 META.yml
Octocat-spinner-32 Makefile.PL
Octocat-spinner-32 README
Octocat-spinner-32 samples.html
    Makefile::GraphViz - Draw building flowcharts from Makefiles using

    This document describes Makefile::GraphViz 0.20 released on 29 November

      use Makefile::GraphViz;

      $parser = Makefile::GraphViz->new;

      # plot the tree rooted at the 'install' goal in Makefile:
      $gv = $parser->plot('install');  # A GraphViz object returned.

      # plot the tree rooted at the 'default' goal in Makefile:
      $gv = $parser->plot;

      # plot the forest consists of all the goals in Makefile:
      $gv = $parser->plot_all;

      # you can also invoke all the methods
      # inherited from the Makefile::Parser class:
      @targets = $parser->targets;

    This module uses Makefile::Parser to render user's Makefiles via the
    amazing GraphViz module. Before I decided to write this thing, there had
    been already a CPAN module named GraphViz::Makefile which did the same
    thing. However, the pictures generated by GraphViz::Makefile is
    oversimplified in my opinion, so a much complex one is still needed.

    For everyday use, the gvmake utility is much more convenient than using
    this module directly. :)

    WARNING This module is highly experimental and is currently at alpha
    stage, so production use is strongly discouraged right now. Anyway, I
    have the plan to improve this stuff unfailingly.

    For instance, the following makefile

        all: foo
        all: bar
                echo hallo

        any: foo hiya
                echo larry
                echo howdy
        any: blah blow

        foo:: blah boo
                echo Hi
        foo:: howdy buz
                echo Hey

    produces the following image via the "plot_all" method:

    for some sample output graphs.

    Prerequisites GraphViz and Makefile::Parser should be installed to your
    Perl distribution first. Among other things, the GraphViz module needs
    tools "dot", "neato", "twopi", "circo" and "fdp" from the Graphviz
    project (<> or
    <>). Hence you have to
    download an executable package of AT&T's Graphviz for your platform or
    build it from source code yourself.

The Makefile::GraphViz Class
    This class is a subclass inherited from Makefile::Parser. So all the
    methods (and hence all the functionalities) provided by Makefile::Parser
    are accessible here. Additionally this class also provides some more
    methods on its own right.

    "$graphviz = plot($target, ...)"
        This method is essential to the class. Users invoke this method to
        plot the specified Makefile target. If the argument is absent, the
        default target in the Makefile will be used. It will return a
        GraphViz object, on which you can later call the "as_png" or
        "as_text" method to obtain the final graphical output.

        The argument can both be the target's name and a Makefile::Target
        object. If the given target can't be found in Makefile, the target
        will be plotted separately.

        This method also accepts several options.

            $gv = $parser->plot(undef, normal_nodes => ['mytar']);
            $gv = $parser->plot(
                exclude  => [qw(
                    all hex2bin.exe
                end_with => [qw(pat_cover.ast pat_cover)],
                normal_nodes => ['pat_cover.ast'],
                vir_nodes => ['pat_cover'],
                trim_mode => 0,

            This option controls the style of the shell command box. The
            default appearance for these nodes are gray ellipses.

            This option's value will be passed directly to GraphViz's
            add_edge method. It controls the appearance of the edges in the
            output graph, which is default to red directed arrows.

                $gv = $parser->plot(
                    edge_style => {
                        style => 'dotted',
                        color => 'seagreen',

            This option takes a list ref as its value. The plot method won't
            continue to iterate the subtree rooted at entries in the list.
            It is worth noting that the entries themselves will be displayed
            as usual. This is the only difference compared to the exclude

            Here is an example:

                $gv = $parser->plot(
                    end_with => [qw(pat_cover.ast pat_cover)],

            This option takes a list ref as its value. All the entries in
            the list won't be displayed and the subtrees rooted at these
            entries won't be displayed either.


        gv  This option accepts user's GraphViz object to render the graph.

                $gv = GraphViz->new(width => 30, height => 20,
                                    pagewidth => 8.5, pageheight => 11);
                $parser->plot('install', gv => $gv);
                print $gv->as_text;

            This option takes a hash ref whose value will be passed to the
            constructor of the GraphViz class if the option gv is not

                    init_args => {
                        width => 30, height => 20,
                        pagewidth => 8.5, pageheight => 11,

            The entries in this option's list are forced to be the normal
            nodes. Normal nodes are defined to be the Makefile targets
            corresponding to disk files. In contrast, virtual nodes are
            those Makefile targets with no real files corresponding to them.

            Override the default style for the normal nodes. By default,
            normal nodes are yellow rectangles with black border.

                $gv = $parser->plot(
                    normal_node_style => {
                       shape => 'circle',
                       style => 'filled',
                       fillcolor => 'red',

            When this option is set to a true value, no shell command nodes
            will be plotted.

            The entries in this option's list are forced to be the virtual
            nodes. Virtual nodes are those Makefile targets with no real
            files corresponding to them, which are generally called "phony
            targets" in the GNU make Manual and "pseudo targets" in MS
            NMAKE's docs.

            Override the default style for the virtual nodes.

                $gv = $parser->plot(
                    virtual_node_style => {
                       shape => 'box',
                       style => 'filled',
                       fillcolor => 'blue',

            By default, virtual nodes are yellow rectangles with no border.

    "$graphviz = $object->plot_all()"
        Plot all the (root) goals appeared in the Makefile.

    Internal functions should not be used directly.

        Generate a unique id for command node.

        Trim the path to a more readable form.

        Trim the shell command to a more friendly size.

        If the given element is found in the given list, this function will
        return 1; otherwise, a false value is returned.

    *   Add support for the various options provided by the "plot" method to
        the "plot_all" method.

    *   Use Params::Util to check the validity of the method arguments.

    *   Use the next generation of Makefile::Parser to do the underlying
        parsing job.

    I use Devel::Cover to test the code coverage of my tests, below is the
    Devel::Cover report on this module test suite.

      ---------------------------- ------ ------ ------ ------ ------ ------ ------
      File                           stmt   bran   cond    sub    pod   time  total
      ---------------------------- ------ ------ ------ ------ ------ ------ ------
      .../lib/Makefile/  100.0   93.2   71.4  100.0  100.0   61.5   92.1
      ---------------------------- ------ ------ ------ ------ ------ ------ ------

    For the very latest version of this module, check out the source from
    the Git repository below:


    There is anonymous access to all. If you'd like a commit bit, please let
    me know. :)

    Please report bugs or send wish-list to

    gvmake, GraphViz, Makefile::Parser.

    Zhang "agentzh" Yichun (章亦春) "<>"

    Copyright (c) 2005-2011 by Zhang "agentzh" Yichun (章亦春).

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

Something went wrong with that request. Please try again.