Alien-Build
view release on metacpan or search on metacpan
lib/Alien/Build/MM.pm view on Meta::CPAN
# prop
$postamble .= "alien_prop :\n" .
"\t\$(FULLPERL) -MAlien::Build::MM=cmd -e dumpprop\n\n";
$postamble .= "alien_prop_meta :\n" .
"\t\$(FULLPERL) -MAlien::Build::MM=cmd -e dumpprop meta\n\n";
$postamble .= "alien_prop_install :\n" .
"\t\$(FULLPERL) -MAlien::Build::MM=cmd -e dumpprop install\n\n";
$postamble .= "alien_prop_runtime :\n" .
"\t\$(FULLPERL) -MAlien::Build::MM=cmd -e dumpprop runtime\n\n";
# install
$postamble .= "alien_clean_install : _alien/mm/prefix\n" .
"\t\$(FULLPERL) -MAlien::Build::MM=cmd -e clean_install\n\n";
$postamble;
}
sub mm_install
{
# NOTE: older versions of the Alien::Build::MM documentation
# didn't include this method, so anything that this method
# does has to be optional
my($self, $mm, @rest) = @_;
my $section = do {
package
MY;
$mm->SUPER::install(@rest);
};
return
".NOTPARALLEL : \n\n"
. ".NO_PARALLEL : \n\n"
. "install :: alien_clean_install\n\n"
. $section;
}
sub import
{
my(undef, @args) = @_;
foreach my $arg (@args)
{
if($arg eq 'cmd')
{
package main;
*_args = sub
{
my $build = Alien::Build->resume('alienfile', '_alien');
$build->load_requires('configure');
$build->load_requires($build->install_type);
($build, @ARGV)
};
*_touch = sub {
my($name) = @_;
my $path = Path::Tiny->new("_alien/mm/$name");
$path->parent->mkpath;
$path->touch;
};
*prefix = sub
{
my($build, $type, $perl, $site, $vendor) = _args();
my $distname = $build->install_prop->{mm}->{distname};
my $prefix = $type eq 'perl'
? $perl
: $type eq 'site'
? $site
: $type eq 'vendor'
? $vendor
: die "unknown INSTALLDIRS ($type)";
$prefix = Path::Tiny->new($prefix)->child("auto/share/dist/$distname")->absolute->stringify;
$build->log("prefix $prefix");
$build->set_prefix($prefix);
$build->checkpoint;
_touch('prefix');
};
*version = sub
{
my($build, $version) = _args();
$build->runtime_prop->{perl_module_version} = $version;
$build->checkpoint;
_touch('version');
};
*download = sub
{
my($build) = _args();
$build->download;
$build->checkpoint;
_touch('download');
};
*build = sub
{
my($build) = _args();
$build->build;
my $distname = $build->install_prop->{mm}->{distname};
if($build->meta_prop->{arch})
{
my $archdir = Path::Tiny->new("blib/arch/auto/@{[ join '/', split /-/, $distname ]}");
$archdir->mkpath;
my $archfile = $archdir->child($archdir->basename . '.txt');
$archfile->spew('Alien based distribution with architecture specific file in share');
}
my $cflags = $build->runtime_prop->{cflags};
my $libs = $build->runtime_prop->{libs};
if(($cflags && $cflags !~ /^\s*$/)
|| ($libs && $libs !~ /^\s*$/))
{
my $mod = join '::', split /-/, $distname;
my $install_files_pm = Path::Tiny->new("blib/lib/@{[ join '/', split /-/, $distname ]}/Install/Files.pm");
$install_files_pm->parent->mkpath;
$install_files_pm->spew(
"package ${mod}::Install::Files;\n",
"use strict;\n",
"use warnings;\n",
"require ${mod};\n",
"sub Inline { shift; ${mod}->Inline(\@_) }\n",
"1;\n",
"\n",
"=begin Pod::Coverage\n",
"\n",
" Inline\n",
"\n",
"=cut\n",
) unless -f "$install_files_pm";
}
$build->checkpoint;
_touch('build');
};
*test = sub
{
my($build) = _args();
$build->test;
$build->checkpoint;
};
*clean_install = sub
{
my($build) = _args();
$build->clean_install;
$build->checkpoint;
};
*dumpprop = sub
{
my($build, $type) = _args();
my %h = (
meta => $build->meta_prop,
install => $build->install_prop,
runtime => $build->runtime_prop,
);
require Alien::Build::Util;
print Alien::Build::Util::_dump($type ? $h{$type} : \%h);
}
}
}
}
1;
__END__
=pod
=encoding UTF-8
=head1 NAME
Alien::Build::MM - Alien::Build installer code for ExtUtils::MakeMaker
=head1 VERSION
version 2.84
=head1 SYNOPSIS
In your C<Makefile.PL>:
use ExtUtils::MakeMaker;
use Alien::Build::MM;
my $abmm = Alien::Build::MM->new;
WriteMakefile($abmm->mm_args(
ABSTRACT => 'Discover or download and install libfoo',
DISTNAME => 'Alien-Libfoo',
NAME => 'Alien::Libfoo',
VERSION_FROM => 'lib/Alien/Libfoo.pm',
...
));
sub MY::postamble {
$abmm->mm_postamble(@_);
}
sub MY::install {
$abmm->mm_install(@_);
}
In your C<lib/Alien/Libfoo.pm>:
package Alien::Libfoo;
use parent qw( Alien::Base );
1;
In your alienfile (needs to be named C<alienfile> and should be in the root of your dist):
use alienfile;
plugin 'PkgConfig' => 'libfoo';
share {
start_url 'http://libfoo.org';
...
};
=head1 DESCRIPTION
This class allows you to use Alien::Build and Alien::Base with L<ExtUtils::MakeMaker>.
It load the L<alienfile> recipe in the root of your L<Alien> dist, updates the prereqs
passed into C<WriteMakefile> if any are specified by your L<alienfile> or its plugins,
and adds a postamble to the C<Makefile> that will download/build/test the alienized
package as appropriate.
The L<alienfile> must be named C<alienfile>.
If you are using L<Dist::Zilla> to author your L<Alien> dist, you should consider using
the L<Dist::Zilla::Plugin::AlienBuild> plugin.
I personally don't recommend it, but if you want to use L<Module::Build> instead, you
can use L<Alien::Build::MB>.
=head1 CONSTRUCTOR
=head2 new
my $abmm = Alien::Build::MM->new;
Create a new instance of L<Alien::Build::MM>.
=head1 PROPERTIES
=head2 build
my $build = $abmm->build;
The L<Alien::Build> instance.
=head2 alienfile_meta
my $bool = $abmm->alienfile_meta
Set to a false value, in order to turn off the x_alienfile meta
=head2 clean_install
my $bool = $abmm->clean_install;
Set to a true value, in order to clean the share directory prior to
installing. If you use this you have to make sure that you install
the install handler in your C<Makefile.PL>:
$abmm = Alien::Build::MM->new(
( run in 0.887 second using v1.01-cache-2.11-cpan-524268b4103 )