0 | 0 |
package Module::Build::Tiny;
|
1 | 1 |
{
|
2 | |
$Module::Build::Tiny::VERSION = '0.027';
|
|
2 |
$Module::Build::Tiny::VERSION = '0.028';
|
3 | 3 |
}
|
4 | 4 |
use strict;
|
5 | 5 |
use warnings;
|
|
13 | 13 |
use ExtUtils::InstallPaths 0.002;
|
14 | 14 |
use File::Basename qw/basename dirname/;
|
15 | 15 |
use File::Find ();
|
16 | |
use File::Path qw/mkpath/;
|
|
16 |
use File::Path qw/mkpath rmtree/;
|
17 | 17 |
use File::Spec::Functions qw/catfile catdir rel2abs abs2rel splitdir/;
|
18 | 18 |
use Getopt::Long qw/GetOptions/;
|
19 | 19 |
use JSON::PP 2 qw/encode_json decode_json/;
|
20 | 20 |
|
21 | 21 |
sub write_file {
|
22 | |
my ($filename, $mode, $content) = @_;
|
23 | |
open my $fh, ">:$mode", $filename or die "Could not open $filename: $!\n";;
|
|
22 |
my ($filename, $content) = @_;
|
|
23 |
open my $fh, '>', $filename or die "Could not open $filename: $!\n";
|
24 | 24 |
print $fh $content;
|
25 | 25 |
}
|
26 | 26 |
sub read_file {
|
27 | 27 |
my ($filename, $mode) = @_;
|
28 | |
open my $fh, "<:$mode", $filename or die "Could not open $filename: $!\n";
|
|
28 |
open my $fh, '<', $filename or die "Could not open $filename: $!\n";
|
29 | 29 |
return do { local $/; <$fh> };
|
30 | 30 |
}
|
31 | 31 |
|
|
52 | 52 |
my (undef, @dirnames) = splitdir(dirname($source));
|
53 | 53 |
my $file_base = basename($source, '.xs');
|
54 | 54 |
my $archdir = catdir(qw/blib arch auto/, @dirnames, $file_base);
|
55 | |
|
56 | |
my $c_file = catfile('lib', @dirnames, "$file_base.c");
|
|
55 |
my $tempdir = 'temp';
|
|
56 |
|
|
57 |
my $c_file = catfile($tempdir, "$file_base.c");
|
57 | 58 |
require ExtUtils::ParseXS;
|
|
59 |
mkpath($tempdir, $options->{verbose}, oct '755');
|
58 | 60 |
ExtUtils::ParseXS::process_file(filename => $source, prototypes => 0, output => $c_file);
|
59 | 61 |
|
60 | 62 |
my $version = $options->{meta}->version;
|
|
63 | 65 |
my $ob_file = $builder->compile(source => $c_file, defines => { VERSION => qq/"$version"/, XS_VERSION => qq/"$version"/ });
|
64 | 66 |
|
65 | 67 |
mkpath($archdir, $options->{verbose}, oct '755') unless -d $archdir;
|
66 | |
return $builder->link(objects => $ob_file, lib_file => catfile($archdir, "$file_base.".$options->{config}->get('dlext')), module_name => join '::', @dirnames, $file_base);
|
|
68 |
return $builder->link(objects => $ob_file, lib_file => catfile($archdir, "$file_base." . $options->{config}->get('dlext')), module_name => join '::', @dirnames, $file_base);
|
67 | 69 |
}
|
68 | 70 |
|
69 | 71 |
sub find {
|
|
79 | 81 |
system $^X, $_ and die "$_ returned $?\n" for find(qr/\.PL$/, 'lib');
|
80 | 82 |
my %modules = map { $_ => catfile('blib', $_) } find(qr/\.p(?:m|od)$/, 'lib');
|
81 | 83 |
my %scripts = map { $_ => catfile('blib', $_) } find(qr//, 'script');
|
82 | |
my %shared = map { $_ => catfile(qw/blib lib auto share dist/, $opt{meta}->name, abs2rel($_, 'share')) } find(qr//, 'share');
|
|
84 |
my %shared = map { $_ => catfile(qw/blib lib auto share dist/, $opt{meta}->name, abs2rel($_, 'share')) } find(qr//, 'share');
|
83 | 85 |
pm_to_blib({ %modules, %scripts, %shared }, catdir(qw/blib lib auto/));
|
84 | 86 |
make_executable($_) for values %scripts;
|
85 | 87 |
mkpath(catdir(qw/blib arch/), $opt{verbose});
|
86 | 88 |
process_xs($_, \%opt) for find(qr/.xs$/, 'lib');
|
87 | 89 |
|
|
90 |
if ($opt{install_paths}->install_destination('bindoc') && $opt{install_paths}->is_default_installable('bindoc')) {
|
|
91 |
manify($_, catfile('blib', 'bindoc', man1_pagename($_)), $opt{config}->get('man1ext'), \%opt) for keys %scripts;
|
|
92 |
}
|
88 | 93 |
if ($opt{install_paths}->install_destination('libdoc') && $opt{install_paths}->is_default_installable('libdoc')) {
|
89 | |
manify($_, catfile('blib', 'bindoc', man1_pagename($_)), $opt{config}->get('man1ext'), \%opt) for keys %scripts;
|
90 | 94 |
manify($_, catfile('blib', 'libdoc', man3_pagename($_)), $opt{config}->get('man3ext'), \%opt) for keys %modules;
|
91 | 95 |
}
|
92 | 96 |
},
|
|
94 | 98 |
my %opt = @_;
|
95 | 99 |
die "Must run `./Build build` first\n" if not -d 'blib';
|
96 | 100 |
require TAP::Harness;
|
97 | |
my $tester = TAP::Harness->new({verbosity => $opt{verbose}, lib => [ map { rel2abs(catdir(qw/blib/, $_)) } qw/arch lib/ ], color => -t STDOUT});
|
|
101 |
my $tester = TAP::Harness->new({ verbosity => $opt{verbose}, lib => [ map { rel2abs(catdir(qw/blib/, $_)) } qw/arch lib/ ], color => -t STDOUT });
|
98 | 102 |
$tester->runtests(sort +find(qr/\.t$/, 't'))->has_errors and exit 1;
|
99 | 103 |
},
|
100 | 104 |
install => sub {
|
101 | 105 |
my %opt = @_;
|
102 | 106 |
die "Must run `./Build build` first\n" if not -d 'blib';
|
103 | 107 |
install($opt{install_paths}->install_map, @opt{qw/verbose dry_run uninst/});
|
|
108 |
},
|
|
109 |
clean => sub {
|
|
110 |
my %opt = @_;
|
|
111 |
rmtree($_, $opt{verbose}) for qw/blib temp/;
|
|
112 |
},
|
|
113 |
realclean => sub {
|
|
114 |
my %opt = @_;
|
|
115 |
rmtree($_, $opt{verbose}) for qw/blib temp Build _build_params MYMETA.yml MYMETA.json/;
|
104 | 116 |
},
|
105 | 117 |
);
|
106 | 118 |
|
107 | 119 |
sub Build {
|
108 | 120 |
my $action = @ARGV && $ARGV[0] =~ /\A\w+\z/ ? shift @ARGV : 'build';
|
109 | 121 |
die "No such action '$action'\n" if not $actions{$action};
|
110 | |
unshift @ARGV, @{ decode_json(read_file('_build_params', 'utf8')) };
|
|
122 |
unshift @ARGV, @{ decode_json(read_file('_build_params')) };
|
111 | 123 |
GetOptions(\my %opt, qw/install_base=s install_path=s% installdirs=s destdir=s prefix=s config=s% uninst:1 verbose:1 dry_run:1 pureperl-only:1 create_packlist=i/);
|
112 | 124 |
$_ = detildefy($_) for grep { defined } @opt{qw/install_base destdir prefix/}, values %{ $opt{install_path} };
|
113 | |
@opt{'config', 'meta'} = (ExtUtils::Config->new($opt{config}), get_meta());
|
|
125 |
@opt{ 'config', 'meta' } = (ExtUtils::Config->new($opt{config}), get_meta());
|
114 | 126 |
$actions{$action}->(%opt, install_paths => ExtUtils::InstallPaths->new(%opt, dist_name => $opt{meta}->name));
|
115 | 127 |
}
|
116 | 128 |
|
|
118 | 130 |
my $meta = get_meta();
|
119 | 131 |
printf "Creating new 'Build' script for '%s' version '%s'\n", $meta->name, $meta->version;
|
120 | 132 |
my $dir = $meta->name eq 'Module-Build-Tiny' ? "use lib 'lib';" : '';
|
121 | |
write_file('Build', 'raw', "#!perl\n$dir\nuse Module::Build::Tiny;\nBuild();\n");
|
|
133 |
write_file('Build', "#!perl\n$dir\nuse Module::Build::Tiny;\nBuild();\n");
|
122 | 134 |
make_executable('Build');
|
123 | 135 |
my @env = defined $ENV{PERL_MB_OPT} ? split_like_shell($ENV{PERL_MB_OPT}) : ();
|
124 | |
write_file('_build_params', 'utf8', encode_json([ @env, @ARGV ]));
|
125 | |
$meta->save(@$_) for ['MYMETA.json'], ['MYMETA.yml' => { version => 1.4 }];
|
|
136 |
write_file('_build_params', encode_json([ @env, @ARGV ]));
|
|
137 |
$meta->save(@$_) for ['MYMETA.json'], [ 'MYMETA.yml' => { version => 1.4 } ];
|
126 | 138 |
}
|
127 | 139 |
|
128 | 140 |
1;
|
|
142 | 154 |
|
143 | 155 |
=head1 VERSION
|
144 | 156 |
|
145 | |
version 0.027
|
|
157 |
version 0.028
|
146 | 158 |
|
147 | 159 |
=head1 SYNOPSIS
|
148 | 160 |
|