Still More Perl Lightning Articles

Still More Perl Lightning Articles

by Phil Crow, Josh McAdams, Steven Schubiger, chromatic
July 13, 2006

It has been common practice within the Perl community for ages to ship distributions with a Makefile.PL so that the user will be able to install the packages when he retrieves them, either via the shell which the CPAN/CPANPLUS modules offer or via manual CPAN download.

The Makefile.PL consists of meta-information, which in the case of the distribution HTML::Tagset is:

 # This -*-perl-*- program writes the Makefile for installing this distribution.

 #

 # See "perldoc perlmodinstall" or "perldoc ExtUtils::MakeMaker" for

 # info on how to control how the installation goes.



 require 5.004;

 use strict;

 use ExtUtils::MakeMaker;



 WriteMakefile(

     NAME            => 'HTML::Tagset',

     AUTHOR          => 'Andy Lester <andy@petdance.com>',

     VERSION_FROM    => 'Tagset.pm', # finds $VERSION

     ABSTRACT_FROM   => 'Tagset.pm', # retrieve abstract from module

     PMLIBDIRS       => [qw(lib/)],

     dist            => { COMPRESS => 'gzip -9f', SUFFIX => 'gz', },

     clean           => { FILES => 'HTML-Tagset-*' },

 );

Of interest are the arguments to WriteMakefile(), because they influence the Makefile written by ExtUtils::MakeMaker after the user has invoked the usual build and install procedure:

 % perl Makefile.PL

 % make

 % make test

 # make install

Module::Build, Successor of ExtUtils::MakeMaker?

As Ken Williams grew tired of ExtUtils::MakeMaker and its portability issues, he invented Module::Build, a successor of ExtUtils::MakeMaker. One goal of Module::Build is to run smoothly on most operating systems, because it takes advantage of creating Perl-valid syntax files only and does not rely upon crufty Makefiles, which are often subject to misinterpretation, because so many incompatible flavors of make exist in the wild.

The current maintainer of ExtUtils::MakeMaker, Michael G. Schwern, elaborated about this problem in his talk reachable via "MakeMaker is DOOMED."

Module::Build Distribution "Skeleton"

If you take in consideration the distribution HTML::Tagset again, the rough skeleton suitable for Module::Build having converted the Makefile.PL by Module::Build::Convert into a Build.PL, the output would be:

 # This -*-perl-*- program writes the Makefile for installing this distribution.

 #

 # See "perldoc perlmodinstall" or "perldoc ExtUtils::MakeMaker" for

 # info on how to control how the installation goes.

 # Note: this file has been initially generated by Module::Build::Convert 0.24_01



 require 5.004;

 use strict;

 use warnings;



 use Module::Build;



 my $build = Module::Build->new

   (

    module_name => 'HTML::Tagset',

    dist_author => 'Andy Lester <andy@petdance.com>',

    dist_version_from => 'Tagset.pm',

    add_to_cleanup => [

                        'HTML-Tagset-*'

                      ],

    license => 'unknown',

    create_readme => 1,

    create_makefile_pl => 'traditional',

   );

  

 $build->create_build_script;

As you can see, while ExtUtils::MakeMaker prefers uppercased arguments, Module::Build goes by entirely lowercased arguments, which obey the rule of least surprise by being as intuitive as a description can be.

The build and installation procedure for a Module::Build distribution is:

 % perl Build.PL

 % perl Build

 % perl Build test

 # perl Build install

Module::Build::Convert's State of Operation

Module::Build::Convert actually does all of the background work and can be safely considered the back end, whereas make2build is the practical front-end utility. Module::Build::Convert currently exposes two kinds of operation: static approach and dynamic execution. The static approach parses the arguments contained within the Makefile.PL's WriteMakefile() call, whereas dynamic execution runs the Makefile.PL and captures the arguments provided to WriteMakefile().

Module::Build::Convert parses statically by default, because the dynamic execution has the downside that code will be interpreted and the interpreted output will be written to the Build.PL, so you have to conclude that the user of the distribution will end up with predefined values computed on the author's system. This is something to avoid, whenever possible! If the parsing approach fails, perhaps looping endlessly on input, Module::Build::Convert will reinitialize to perform dynamic execution of the Makefile.PL instead.

[1] [2] [3] [4] Next

Close    To Top
  • Prev Article-Programming:
  • Next Article-Programming:
  • Now: Tutorial for Web and Software Design > Programming > Perl > Programming Content
    Photoshop Tutorial
     

    Special Effect

      3D Effect
      Photoshop Articles
    Programming Tutorial
     

    C/C++ Tutorial

      Visual Basic
      C# Tutorial
    Database Tutorial
     

    MySQL Tutorial

      MS SQL Tutorial
      Oracle Tutorial
    Geek Tutorial
     

    Blogging Tutorial

      RSS Tutorial
      Podcasting Tutorial
    Graphic Design Tutorial
      Coreldraw Tutorial
      Illustrator Tutorial
      3D Tutorials
    Webmaster Articles
     

    Domain Service

      Web Hosting
      Site Promotion
    Java Tutorial/ Articles
     

    Java Servlets

      JavaEE Tutorial
     

    JavaBeans Tutorial

    XML Tutorial/ Articles
     

    XML Style

      AJAX Tutorial
      XML Mobile
    Flash Tutorial/ Articles
     

    Flash Video

      Action Script
      Flash Articles
    OS Tutorial/ Articles
      Linux Tutorial
      Symbian Tutorial
      MacOS Tutorial
    Personal Tech
      Hardware Tutorial
      Software Tutorial
      Online Auction