These days I'd suggest you to use ExtUtils::MakeMaker or Dist::Zilla, but if you encounter a module that only has a Build.PL, you will need to understand what is that.

Let's see how Build.PL looks like.

You'd normally use Build.PL if you wanted to use Module::Build. The reason might be that you would like to have everything in Perl without depending on an external make command.

You probbaly don't have any non-perl dependencies either.

Build.PL starts the same way as any other Perl script with use strict; and use warnings;.

Then we load Module::Build itself and declare the minmal version of perl to be used for this script. It is usually recommended to put this requirement early, so if someone is trying to install this module on a perl which is too old, the person will get a clear error message at the beginning of the process.

Then we call the constructor of the Module::Build module. Assign the result to a variable we called $builder here and then call the create_build_script method of the object. That will create a file called Build/hl> that will test and install the module.

The constructor of Module::Build get a number of parameters:

module_name is just the name of the distribution.

license is a code identifying the license of this distribution.

dist_author is the name and e-mail of the person who wrote the module.

dist_abstract is a one-line explanation of the module doesn.

As Module::Build has been added to core Perl only in the last couple of years, some people might not have it installed. In order to make life easier for them, Module::Build can create a Makefile.PL based on its paramaters. The create_makefile_pl parameter controls if we want it to generate a Makefile.PL and if yes, which type.

script_files allows us to install additional perl scripts.

Module::Build can create a README file from the documentaion of the main module. The create_readme will tell it to do so.

requires is the list of prerequisites with the minimum version of each module.

build_requires lists the modules that are needed for the installation, but not during the use of the module.

examples/Build.PL

use strict;
use warnings;
use Module::Build;

use 5.008;

my $builder = Module::Build->new(
    module_name         => 'App',
    license             => 'perl',
    dist_author         => 'Gabor Szabo <gabor@szabgab.com>',
    dist_abstract       => 'Framework to do something',
    create_makefile_pl  => 0,     #'traditional',
    script_files        => 'script/app.pl',
    create_readme       => 0,
    requires            => {
        'File::Basename'      => '0',
        'Moose'               => '0.24',
    },
    build_requires      => {
        'Test::More'          => '0.47',
    },
    meta_merge => {
        resources => {
            repository => 'https://github.com/szabgab/App',
            bugtracker => 'https://github.com/szabgab/App/issues'
        }
    },
);

$builder->create_build_script();