Updated PAR support to use "make catalyst_par", packages are no longer written by...
[catagits/Catalyst-Runtime.git] / lib / Module / Install / Catalyst.pm
CommitLineData
a2e038a1 1package Module::Install::Catalyst;
2
3use strict;
bd2be280 4
5our @ISA;
6require Module::Install::Base;
7@ISA = qw/Module::Install::Base/;
8
a2e038a1 9use File::Find;
10use FindBin;
11use File::Copy::Recursive 'rcopy';
12use File::Spec ();
13
14our @IGNORE =
15 qw/Build Build.PL Changes MANIFEST META.yml Makefile.PL Makefile README
16 _build blib lib script t inc/;
0427c6c0 17our @CLASSES = ();
a2e038a1 18our $ENGINE = 'CGI';
19our $CORE = 0;
20our $MULTIARCH = 0;
f63cd9ac 21our $SCRIPT;
951da69c 22our $USAGE;
a2e038a1 23
24=head1 NAME
25
26Module::Install::Catalyst - Module::Install extension for Catalyst
27
28=head1 SYNOPSIS
29
30See L<Catalyst>
31
32=head1 DESCRIPTION
33
34L<Module::Install> extension for Catalyst.
35
36=head1 METHODS
37
38=head2 catalyst_files
39
40=cut
41
42sub catalyst_files {
43 my $self = shift;
44
45 chdir $FindBin::Bin;
46
47 my @files;
48 opendir CATDIR, '.';
49 CATFILES: for my $name ( readdir CATDIR ) {
50 for my $ignore (@IGNORE) {
51 next CATFILES if $name =~ /^$ignore$/;
52 next CATFILES if $name !~ /\w/;
53 }
54 push @files, $name;
55 }
56 closedir CATDIR;
5fdd8dc8 57 my @path = split '-', $self->name;
a2e038a1 58 for my $orig (@files) {
59 my $path = File::Spec->catdir( 'blib', 'lib', @path, $orig );
60 rcopy( $orig, $path );
61 }
62}
63
64=head2 catalyst_ignore_all(\@ignore)
65
66=cut
67
68sub catalyst_ignore_all {
69 my ( $self, $ignore ) = @_;
70 @IGNORE = @$ignore;
71}
72
73=head2 catalyst_ignore(\@ignore)
74
75=cut
76
77sub catalyst_ignore {
78 my ( $self, @ignore ) = @_;
79 push @IGNORE, @ignore;
80}
81
82=head2 catalyst_par($name)
83
84=cut
85
f221c65f 86# Workaround for a namespace conflict
20682ed8 87sub catalyst_par {
88 my ( $self, $par ) = @_;
89 print <<EOF;
90*** Module::Install::Catalyst
91EOF
92 my $name = $self->name;
93 my $usage = $USAGE;
94 $usage =~ s/"/\\"/g;
95 my $class_string = join "', '", @CLASSES;
96 $class_string = "'$class_string'" if $class_string;
97 $self->postamble(<<EOF);
98catalyst_par :: all
99\t\$(NOECHO) \$(PERL) -Ilib -Minc::Module::Install -MModule::Install::Catalyst -e"Catalyst::Module::Install::_catalyst_par( '$par', '$name', { CLASSES => [$class_string], CORE => $CORE, ENGINE => '$ENGINE', MULTIARCH => $MULTIARCH, SCRIPT => '$SCRIPT', USAGE => q#$usage# } )"
100EOF
101 print <<EOF;
102Please run "make catalyst_par" to create the PAR package!
103*** Module::Install::Catalyst finished.
104EOF
105}
f221c65f 106
107=head2 catalyst_par_core($core)
108
109=cut
110
111sub catalyst_par_core {
112 my ( $self, $core ) = @_;
6c165c4b 113 $core ? ( $CORE = $core ) : $CORE++;
f221c65f 114}
115
0427c6c0 116=head2 catalyst_par_classes(@clases)
117
118=cut
119
120sub catalyst_par_classes {
121 my ( $self, @classes ) = @_;
122 push @CLASSES, @classes;
123}
124
f221c65f 125=head2 catalyst_par_engine($engine)
126
127=cut
128
129sub catalyst_par_engine {
130 my ( $self, $engine ) = @_;
131 $ENGINE = $engine;
132}
133
134=head2 catalyst_par_multiarch($multiarch)
135
136=cut
137
138sub catalyst_par_multiarch {
139 my ( $self, $multiarch ) = @_;
6c165c4b 140 $multiarch ? ( $MULTIARCH = $multiarch ) : $MULTIARCH++;
3cc41d1a 141}
142
f63cd9ac 143=head2 catalyst_par_script($script)
144
145=cut
146
147sub catalyst_par_script {
148 my ( $self, $script ) = @_;
149 $SCRIPT = $script;
150}
151
951da69c 152=head2 catalyst_par_usage($usage)
3cc41d1a 153
154=cut
155
951da69c 156sub catalyst_par_usage {
157 my ( $self, $usage ) = @_;
158 $USAGE = $usage;
f221c65f 159}
160
161package Catalyst::Module::Install;
162
163use strict;
164use FindBin;
165use File::Copy::Recursive 'rmove';
166use File::Spec ();
167
168sub _catalyst_par {
20682ed8 169 my ( $par, $class_name, $opts ) = @_;
170
171 my $ENGINE = $opts->{ENGINE};
172 my $CLASSES = $opts->{CLASSES} || [];
173 my $USAGE = $opts->{USAGE};
174 my $SCRIPT = $opts->{SCRIPT};
175 my $MULTIARCH = $opts->{MULTIARCH};
176 my $CORE = $opts->{CORE};
a2e038a1 177
20682ed8 178 my $name = $class_name;
f221c65f 179 $name =~ s/::/_/g;
180 $name = lc $name;
181 $par ||= "$name.par";
20682ed8 182 my $engine = $ENGINE || 'CGI';
a2e038a1 183
184 # Check for PAR
185 eval "use PAR ()";
839ff59e 186 die "Please install PAR\n" if $@;
a2e038a1 187 eval "use PAR::Packer ()";
839ff59e 188 die "Please install PAR::Packer\n" if $@;
a2e038a1 189 eval "use App::Packer::PAR ()";
839ff59e 190 die "Please install App::Packer::PAR\n" if $@;
a2e038a1 191 eval "use Module::ScanDeps ()";
839ff59e 192 die "Please install Module::ScanDeps\n" if $@;
a2e038a1 193
194 my $root = $FindBin::Bin;
20682ed8 195 my $path = File::Spec->catfile( 'blib', 'lib', split( '::', $class_name ) );
f221c65f 196 $path .= '.pm';
07ab88a9 197 unless ( -f $path ) {
198 print qq/Not writing PAR, "$path" doesn't exist\n/;
199 return 0;
200 }
201 print qq/Writing PAR "$par"\n/;
a2e038a1 202 chdir File::Spec->catdir( $root, 'blib' );
203
204 my $par_pl = 'par.pl';
205 unlink $par_pl;
206
207 my $version = $Catalyst::VERSION;
20682ed8 208 my $class = $class_name;
a2e038a1 209
0427c6c0 210 my $classes = '';
20682ed8 211 $classes .= " require $_;\n" for @$CLASSES;
951da69c 212
213 unlink $par_pl;
214
20682ed8 215 my $usage = $USAGE || <<"EOF";
951da69c 216Usage:
8ffeab56 217 [parl] $name\[.par] [script] [arguments]
218
219 Examples:
220 parl $name.par $name\_server.pl -r
221 myapp $name\_cgi.pl
951da69c 222EOF
223
20682ed8 224 my $script = $SCRIPT;
975ba103 225 my $tmp_file = IO::File->new("> $par_pl ");
a2e038a1 226 print $tmp_file <<"EOF";
951da69c 227if ( \$ENV{PAR_PROGNAME} ) {
228 my \$zip = \$PAR::LibCache{\$ENV{PAR_PROGNAME}}
229 || Archive::Zip->new(__FILE__);
f63cd9ac 230 my \$script = '$script';
231 \$ARGV[0] ||= \$script if \$script;
232 if ( ( \@ARGV == 0 ) || ( \$ARGV[0] eq '-h' ) || ( \$ARGV[0] eq '-help' )) {
951da69c 233 my \@members = \$zip->membersMatching('.*script/.*\.pl');
234 my \$list = " Available scripts:\\n";
235 for my \$member ( \@members ) {
236 my \$name = \$member->fileName;
237 \$name =~ /(\\w+\\.pl)\$/;
238 \$name = \$1;
239 next if \$name =~ /^main\.pl\$/;
240 next if \$name =~ /^par\.pl\$/;
241 \$list .= " \$name\\n";
242 }
243 die <<"END";
244$usage
245\$list
246END
247 }
248 my \$file = shift \@ARGV;
249 \$file =~ s/^.*[\\/\\\\]//;
250 \$file =~ s/\\.[^.]*\$//i;
251 my \$member = eval { \$zip->memberNamed("./script/\$file.pl") };
252 die qq/Can't open perl script "\$file"\n/ unless \$member;
253 PAR::_run_member( \$member, 1 );
3cc41d1a 254}
255else {
951da69c 256 require lib;
3cc41d1a 257 import lib 'lib';
258 \$ENV{CATALYST_ENGINE} = '$engine';
259 require $class;
260 import $class;
261 require Catalyst::Helper;
262 require Catalyst::Test;
263 require Catalyst::Engine::HTTP;
264 require Catalyst::Engine::CGI;
265 require Catalyst::Controller;
266 require Catalyst::Model;
267 require Catalyst::View;
724c0767 268 require Getopt::Long;
269 require Pod::Usage;
270 require Pod::Text;
3cc41d1a 271 $classes
272}
a2e038a1 273EOF
274 $tmp_file->close;
275
276 # Create package
fb68a697 277 local $SIG{__WARN__} = sub { };
278 open my $olderr, '>&STDERR';
279 open STDERR, '>', File::Spec->devnull;
a2e038a1 280 my %opt = (
281 'x' => 1,
282 'n' => 0,
283 'o' => $par,
284 'a' => [ grep( !/par.pl/, glob '.' ) ],
285 'p' => 1,
20682ed8 286 'B' => $CORE,
287 'm' => $MULTIARCH
a2e038a1 288 );
289 App::Packer::PAR->new(
290 frontend => 'Module::ScanDeps',
291 backend => 'PAR::Packer',
292 frontopts => \%opt,
293 backopts => \%opt,
294 args => ['par.pl'],
295 )->go;
f221c65f 296
fb68a697 297 open STDERR, '>&', $olderr;
a2e038a1 298
fb68a697 299 unlink $par_pl;
a2e038a1 300 chdir $root;
f221c65f 301 rmove( File::Spec->catfile( 'blib', $par ), $par );
07ab88a9 302 return 1;
a2e038a1 303}
304
305=head1 AUTHOR
306
307Sebastian Riedel, C<sri@oook.de>
308
309=head1 LICENSE
310
311This library is free software, you can redistribute it and/or modify it under
312the same terms as Perl itself.
313
314=cut
315
3161;