File Coverage

lib/CPANPLUS/Dist/Build.pm
Criterion Covered Total %
statement 214 308 69.4
branch 59 134 44.0
condition 14 39 35.9
subroutine 23 23 100.0
pod 5 5 100.0
total 315 509 61.8


line stmt bran cond sub pod time code
1             package CPANPLUS::Dist::Build;
2             $CPANPLUS::Dist::Build::VERSION = '0.86';
3             #ABSTRACT: CPANPLUS plugin to install packages that use Build.PL
4              
5 1     1   25513 use if $] > 5.017, 'deprecate';
  1         2  
  1         11  
6              
7 1     1   134 use strict;
  1         1  
  1         19  
8 1     1   3 use warnings;
  1         0  
  1         37  
9 1     1   4 use vars qw[@ISA $STATUS];
  1         0  
  1         48  
10             @ISA = qw[CPANPLUS::Dist];
11              
12 1     1   4 use CPANPLUS::Internals::Constants;
  1         1  
  1         281  
13              
14             ### these constants were exported by CPANPLUS::Internals::Constants
15             ### in previous versions.. they do the same though. If we want to have
16             ### a normal 'use' here, up the dependency to CPANPLUS 0.056 or higher
17             BEGIN {
18 1     1   378 require CPANPLUS::Dist::Build::Constants;
19 1 50 33     56 CPANPLUS::Dist::Build::Constants->import()
20             if not __PACKAGE__->can('BUILD') && __PACKAGE__->can('BUILD_DIR');
21             }
22              
23 1     1   3 use CPANPLUS::Error;
  1         1  
  1         35  
24              
25 1     1   3 use Config;
  1         1  
  1         29  
26 1     1   3 use FileHandle;
  1         1  
  1         8  
27 1     1   378 use Cwd;
  1         1  
  1         52  
28 1     1   17 use version;
  1         1  
  1         4  
29              
30 1     1   41 use IPC::Cmd qw[run];
  1         1  
  1         32  
31 1     1   2 use Params::Check qw[check];
  1         1  
  1         29  
32 1     1   3 use Module::Load::Conditional qw[can_load check_install];
  1         0  
  1         35  
33 1     1   4 use Locale::Maketext::Simple Class => 'CPANPLUS', Style => 'gettext';
  1         0  
  1         4  
34              
35             local $Params::Check::VERBOSE = 1;
36              
37              
38              
39             ### check if the format is available ###
40             sub format_available {
41 4     4 1 949667 my $mod = 'Module::Build';
42 4 50       27 unless( can_load( modules => { $mod => '0.2611' }, nocache => 1 ) ) {
43 0         0 error( loc( "You do not have '%1' -- '%2' not available",
44             $mod, __PACKAGE__ ) );
45 0         0 return;
46             }
47              
48 4         56021 return 1;
49             }
50              
51              
52              
53             sub init {
54 3     3 1 20 my $dist = shift;
55 3         18 my $status = $dist->status;
56              
57 3         194 $status->mk_accessors(qw[build_pl build test created installed uninstalled
58             _create_args _install_args _prepare_args
59             _mb_object _buildflags
60             ]);
61              
62             ### just in case 'format_available' didn't get called
63 3         170 require Module::Build;
64              
65 3         8 return 1;
66             }
67              
68              
69             sub prepare {
70             ### just in case you already did a create call for this module object
71             ### just via a different dist object
72 7     7 1 20122 my $dist = shift;
73 7         36 my $self = $dist->parent;
74              
75             ### we're also the cpan_dist, since we don't need to have anything
76             ### prepared from another installer
77 7 50       375 $dist = $self->status->dist_cpan if $self->status->dist_cpan;
78 7 50       639 $self->status->dist_cpan( $dist ) unless $self->status->dist_cpan;
79              
80 7         343 my $cb = $self->parent;
81 7         92 my $conf = $cb->configure_object;
82 7         52 my %hash = @_;
83              
84 7         14 my $dir;
85 7 50       21 unless( $dir = $self->status->extract ) {
86 0         0 error( loc( "No dir found to operate on!" ) );
87 0         0 return;
88             }
89              
90 7         350 my $args;
91 7         14 my( $force, $verbose, $buildflags, $perl, $prereq_target, $prereq_format,
92             $prereq_build );
93 7         16 { local $Params::Check::ALLOW_UNKNOWN = 1;
  7         12  
94 7         38 my $tmpl = {
95             force => { default => $conf->get_conf('force'),
96             store => \$force },
97             verbose => { default => $conf->get_conf('verbose'),
98             store => \$verbose },
99             perl => { default => $^X, store => \$perl },
100             buildflags => { default => $conf->get_conf('buildflags'),
101             store => \$buildflags },
102             prereq_target => { default => '', store => \$prereq_target },
103             prereq_format => { default => '',
104             store => \$prereq_format },
105             prereq_build => { default => 0, store => \$prereq_build },
106             };
107              
108 7 50       2949 $args = check( $tmpl, \%hash ) or return;
109             }
110              
111 7 100 100     807 return 1 if $dist->status->prepared && !$force;
112              
113 5         543 $dist->status->_prepare_args( $args );
114              
115             ### chdir to work directory ###
116 5         14704 my $orig = cwd();
117 5 50       94 unless( $cb->_chdir( dir => $dir ) ) {
118 0         0 error( loc( "Could not chdir to build directory '%1'", $dir ) );
119 0         0 return;
120             }
121              
122             ### by now we've loaded module::build, and we're using the API, so
123             ### it's safe to remove CPANPLUS::inc from our inc path, especially
124             ### because it can trip up tests run under taint (just like EU::MM).
125             ### turn off our PERL5OPT so no modules from CPANPLUS::inc get
126             ### included in make test -- it should build without.
127             ### also, modules that run in taint mode break if we leave
128             ### our code ref in perl5opt
129             ### XXX we've removed the ENV settings from cp::inc, so only need
130             ### to reset the @INC
131             #local $ENV{PERL5OPT} = CPANPLUS::inc->original_perl5opt;
132             #local $ENV{PERL5LIB} = CPANPLUS::inc->original_perl5lib;
133             #local @INC = CPANPLUS::inc->original_inc;
134              
135             ### this will generate warnings under anything lower than M::B 0.2606
136 5         892 my @buildflags = $dist->_buildflags_as_list( $buildflags );
137 5         770 $dist->status->_buildflags( $buildflags );
138              
139 5         813 my $fail; my $prereq_fail;
140 5         11 my $status = { };
141             RUN: {
142              
143 5         5 local $ENV{PERL_USE_UNSAFE_INC} = 1
144 5 50       52 unless exists $ENV{PERL_USE_UNSAFE_INC};
145              
146             # 0.85_01
147             ### we resolve 'configure requires' here, so we can run the 'perl
148             ### Makefile.PL' command
149             ### XXX for tests: mock f_c_r to something that *can* resolve and
150             ### something that *doesn't* resolve. Check the error log for ok
151             ### on this step or failure
152             ### XXX make a separate tarball to test for this scenario: simply
153             ### containing a makefile.pl/build.pl for test purposes?
154 5         74 my $safe_ver = version->new('0.85_01');
155 5 50       77 if ( version->new($CPANPLUS::Internals::VERSION) >= $safe_ver )
156 5         46 { my $configure_requires = $dist->find_configure_requires;
157 5         9757 my $ok = $dist->_resolve_prereqs(
158             format => $prereq_format,
159             verbose => $verbose,
160             prereqs => $configure_requires,
161             target => $prereq_target,
162             force => $force,
163             prereq_build => $prereq_build,
164             );
165              
166 5 50       3790 unless( $ok ) {
167              
168             #### use $dist->flush to reset the cache ###
169 0         0 error( loc( "Unable to satisfy '%1' for '%2' " .
170             "-- aborting install",
171             'configure_requires', $self->module ) );
172 0         0 $dist->status->prepared(0);
173 0         0 $prereq_fail++;
174 0         0 $fail++;
175 0         0 last RUN;
176             }
177             ### end of prereq resolving ###
178             }
179              
180             # Wrap the exception that may be thrown here (should likely be
181             # done at a much higher level).
182 5         16 my $prep_output;
183              
184 5         14 my $env = ENV_CPANPLUS_IS_EXECUTING;
185 5         20 local $ENV{$env} = BUILD_PL->( $dir );
186 5         106 my @run_perl = $dist->_perlrun();
187 5         14 my $cmd = [$perl, @run_perl, BUILD_PL->($dir), @buildflags];
188              
189 5 100       82 unless ( scalar run( command => $cmd,
190             buffer => \$prep_output,
191             verbose => $verbose )
192             ) {
193 1         8937 error( loc( "Build.PL failed: %1", $prep_output ) );
194 1 50       1524 if ( $conf->get_conf('cpantest') ) {
195 0         0 $status->{stage} = 'prepare';
196 0         0 $status->{capture} = $prep_output;
197             }
198 1         145 $fail++; last RUN;
  1         25  
199             }
200              
201 4 50       915373 unless ( -e BUILD->( $dir ) ) {
202 0         0 error( loc( "Build.PL failed to generate a Build script: %1", $prep_output ) );
203 0 0       0 if ( $conf->get_conf('cpantest') ) {
204 0         0 $status->{stage} = 'prepare';
205 0         0 $status->{capture} = $prep_output;
206             }
207 0         0 $fail++; last RUN;
  0         0  
208             }
209              
210 4         38 msg( $prep_output, 0 );
211              
212 4         5413 my $prereqs = $self->status->prereqs;
213              
214 4   66     592 $prereqs ||= $dist->_find_prereqs( verbose => $verbose,
215             dir => $dir,
216             perl => $perl,
217             buildflags => $buildflags );
218              
219             }
220              
221             ### send out test report? ###
222             ### there is no way to accurately know if it is a PASS/FAIL/ETC
223             ### CPANPLUS::Dist::MM doesn't bother why are we?
224 5         9 if( 0 and $fail and $conf->get_conf('cpantest') and not $prereq_fail ) {
225             $cb->_send_report(
226             module => $self,
227             failed => $fail,
228             buffer => CPANPLUS::Error->stack_as_string,
229             status => $status,
230             verbose => $verbose,
231             force => $force,
232             ) or error(loc("Failed to send test report for '%1'",
233             $self->module ) );
234             }
235              
236 5 50       46 unless( $cb->_chdir( dir => $orig ) ) {
237 0         0 error( loc( "Could not chdir back to start dir '%1'", $orig ) );
238             }
239              
240             ### save where we wrote this stuff -- same as extract dir in normal
241             ### installer circumstances
242 5         686 $dist->status->distdir( $self->status->extract );
243              
244 5 100       903 return $dist->status->prepared( $fail ? 0 : 1 );
245             }
246              
247             sub _find_prereqs {
248 2     2   6 my $dist = shift;
249 2         14 my $self = $dist->parent;
250 2         136 my $cb = $self->parent;
251 2         70 my $conf = $cb->configure_object;
252 2         38 my %hash = @_;
253              
254 2         3 my ($verbose, $dir, $buildflags, $perl);
255 2         33 my $tmpl = {
256             verbose => { default => $conf->get_conf('verbose'), store => \$verbose },
257             dir => { default => $self->status->extract, store => \$dir },
258             perl => { default => $^X, store => \$perl },
259             buildflags => { default => $conf->get_conf('buildflags'),
260             store => \$buildflags },
261             };
262              
263 2 50       685 my $args = check( $tmpl, \%hash ) or return;
264              
265 2         187 my $prereqs = {};
266              
267 2 50       8 $prereqs = $dist->find_mymeta_requires()
268             if $dist->can('find_mymeta_requires');
269              
270 2 100       6864 if ( keys %$prereqs ) {
271             # Ugly hack
272             }
273             else {
274 1         11 my $safe_ver = version->new('0.31_03');
275 1         2 my $content;
276             PREREQS: {
277 1 50 33     3 if ( version->new( $Module::Build::VERSION ) >= $safe_ver and IPC::Cmd->can_capture_buffer ) {
  1         26  
278 1         149 my @buildflags = $dist->_buildflags_as_list( $buildflags );
279              
280             # Use the new Build action 'prereq_data'
281 1         120 my @run_perl = $dist->_perlrun();
282              
283 1 50       7 unless ( scalar run( command => [$perl, @run_perl, BUILD->($dir), 'prereq_data', @buildflags],
284             buffer => \$content,
285             verbose => 0 )
286             ) {
287 0         0 error( loc( "Build 'prereq_data' failed: %1 %2", $!, $content ) );
288             #return;
289             }
290             else {
291 1         122774 last PREREQS;
292             }
293              
294             }
295              
296 0         0 my $file = File::Spec->catfile( $dir, '_build', 'prereqs' );
297 0 0       0 return unless -f $file;
298              
299 0         0 my $fh = FileHandle->new();
300              
301 0 0       0 unless( $fh->open( $file ) ) {
302 0         0 error( loc( "Cannot open '%1': %2", $file, $! ) );
303 0         0 return;
304             }
305              
306 0         0 $content = do { local $/; <$fh> };
  0         0  
  0         0  
307              
308             }
309              
310 1 50       16 return unless $content;
311 1         140 my $bphash = eval $content;
312 1 50 33     13 return unless $bphash and ref $bphash eq 'HASH';
313 1         6 foreach my $type ('requires', 'build_requires', 'test_requires') {
314 3 50 33     16 next unless $bphash->{$type} and ref $bphash->{$type} eq 'HASH';
315 0         0 $prereqs->{$_} = $bphash->{$type}->{$_} for keys %{ $bphash->{$type} };
  0         0  
316             }
317             }
318              
319             {
320 2 50       6 delete $prereqs->{'perl'}
  2         47  
321             unless version->new($CPANPLUS::Internals::VERSION)
322             >= version->new('0.9102');
323             }
324              
325             ### allows for a user defined callback to filter the prerequisite
326             ### list as they see fit, to remove (or add) any prereqs they see
327             ### fit. The default installed callback will return the hashref in
328             ### an unmodified form
329             ### this callback got added after cpanplus 0.0562, so use a 'can'
330             ### to find out if it's supported. For older versions, we'll just
331             ### return the hashref as is ourselves.
332 2 50       32 my $href = $cb->_callbacks->can('filter_prereqs')
333             ? $cb->_callbacks->filter_prereqs->( $cb, $prereqs )
334             : $prereqs;
335              
336 2         2861 $self->status->prereqs( $href );
337              
338             ### make sure it's not the same ref
339 2         203 return { %$href };
340             }
341              
342              
343             sub create {
344             ### just in case you already did a create call for this module object
345             ### just via a different dist object
346 4     4 1 708 my $dist = shift;
347 4         24 my $self = $dist->parent;
348              
349             ### we're also the cpan_dist, since we don't need to have anything
350             ### prepared from another installer
351 4 50       224 $dist = $self->status->dist_cpan if $self->status->dist_cpan;
352 4 50       415 $self->status->dist_cpan( $dist ) unless $self->status->dist_cpan;
353              
354 4         245 my $cb = $self->parent;
355 4         94 my $conf = $cb->configure_object;
356 4         56 my %hash = @_;
357              
358 4         6 my $dir;
359 4 50       11 unless( $dir = $self->status->extract ) {
360 0         0 error( loc( "No dir found to operate on!" ) );
361 0         0 return;
362             }
363              
364 4         221 my $args;
365 4         9 my( $force, $verbose, $buildflags, $skiptest, $prereq_target,
366             $perl, $prereq_format, $prereq_build);
367 4         5 { local $Params::Check::ALLOW_UNKNOWN = 1;
  4         56  
368 4         41 my $tmpl = {
369             force => { default => $conf->get_conf('force'),
370             store => \$force },
371             verbose => { default => $conf->get_conf('verbose'),
372             store => \$verbose },
373             perl => { default => $^X, store => \$perl },
374             buildflags => { default => $conf->get_conf('buildflags'),
375             store => \$buildflags },
376             skiptest => { default => $conf->get_conf('skiptest'),
377             store => \$skiptest },
378             prereq_target => { default => '', store => \$prereq_target },
379             ### don't set the default format to 'build' -- that is wrong!
380             prereq_format => { #default => $self->status->installer_type,
381             default => '',
382             store => \$prereq_format },
383             prereq_build => { default => 0, store => \$prereq_build },
384             };
385              
386 4 50       2293 $args = check( $tmpl, \%hash ) or return;
387             }
388              
389             # restore the state as we have created this already.
390 4 50 66     540 if ( $dist->status->created && !$force ) {
391             ### add this directory to your lib ###
392 0         0 $self->add_to_includepath();
393 0         0 return 1;
394             }
395              
396 4         447 $dist->status->_create_args( $args );
397              
398             ### is this dist prepared?
399 4 50       386 unless( $dist->status->prepared ) {
400 0         0 error( loc( "You have not successfully prepared a '%2' distribution ".
401             "yet -- cannot create yet", __PACKAGE__ ) );
402 0         0 return;
403             }
404              
405             ### chdir to work directory ###
406 4         13614 my $orig = cwd();
407 4 50       66 unless( $cb->_chdir( dir => $dir ) ) {
408 0         0 error( loc( "Could not chdir to build directory '%1'", $dir ) );
409 0         0 return;
410             }
411              
412             ### by now we've loaded module::build, and we're using the API, so
413             ### it's safe to remove CPANPLUS::inc from our inc path, especially
414             ### because it can trip up tests run under taint (just like EU::MM).
415             ### turn off our PERL5OPT so no modules from CPANPLUS::inc get
416             ### included in make test -- it should build without.
417             ### also, modules that run in taint mode break if we leave
418             ### our code ref in perl5opt
419             ### XXX we've removed the ENV settings from cp::inc, so only need
420             ### to reset the @INC
421             #local $ENV{PERL5OPT} = CPANPLUS::inc->original_perl5opt;
422             #local $ENV{PERL5LIB} = CPANPLUS::inc->original_perl5lib;
423             #local @INC = CPANPLUS::inc->original_inc;
424              
425             ### but do it *before* the new_from_context, as M::B seems
426             ### to be actually running the file...
427             ### an unshift in the block seems to be ignored.. somehow...
428             #{ my $lib = $self->best_path_to_module_build;
429             # unshift @INC, $lib if $lib;
430             #}
431 4 50       710 unshift @INC, $self->best_path_to_module_build
432             if $self->best_path_to_module_build;
433              
434             ### this will generate warnings under anything lower than M::B 0.2606
435 4         46 my @buildflags = $dist->_buildflags_as_list( $buildflags );
436 4         605 $dist->status->_buildflags( $buildflags );
437              
438 4         631 my $fail; my $prereq_fail; my $test_fail;
  0         0  
439 4         9 my $status = { };
440             RUN: {
441              
442 4         5 local $ENV{PERL_USE_UNSAFE_INC} = 1
443 4 50       41 unless exists $ENV{PERL_USE_UNSAFE_INC};
444              
445 4         15 my @run_perl = $dist->_perlrun();
446              
447             ### this will set the directory back to the start
448             ### dir, so we must chdir /again/
449 4         27 my $ok = $dist->_resolve_prereqs(
450             force => $force,
451             format => $prereq_format,
452             verbose => $verbose,
453             prereqs => $self->status->prereqs,
454             target => $prereq_target,
455             prereq_build => $prereq_build,
456             );
457              
458 4 50       9822 unless( $cb->_chdir( dir => $dir ) ) {
459 0         0 error( loc( "Could not chdir to build directory '%1'", $dir ) );
460 0         0 return;
461             }
462              
463 4 50       405 unless( $ok ) {
464             #### use $dist->flush to reset the cache ###
465 0         0 error( loc( "Unable to satisfy prerequisites for '%1' " .
466             "-- aborting install", $self->module ) );
467 0         0 $dist->status->build(0);
468 0         0 $fail++; $prereq_fail++;
  0         0  
469 0         0 last RUN;
470             }
471              
472 4         6 my ($captured, $cmd);
473 4         6 if ( ON_VMS ) {
474             $cmd = [$perl, BUILD->($dir), @buildflags];
475             }
476             else {
477 4         28 $cmd = [$perl, @run_perl, BUILD->($dir), @buildflags];
478             }
479              
480 4 50       31 unless ( scalar run( command => $cmd,
481             buffer => \$captured,
482             verbose => $verbose )
483             ) {
484 0         0 error( loc( "MAKE failed:\n%1", $captured ) );
485 0         0 $dist->status->build(0);
486 0 0       0 if ( $conf->get_conf('cpantest') ) {
487 0         0 $status->{stage} = 'build';
488 0         0 $status->{capture} = $captured;
489             }
490 0         0 $fail++; last RUN;
  0         0  
491             }
492              
493 4         1109452 msg( $captured, 0 );
494              
495 4         5286 $dist->status->build(1);
496              
497             ### add this directory to your lib ###
498 4         735 $self->add_to_includepath();
499              
500             ### this buffer will not include what tests failed due to a
501             ### M::B/Test::Harness bug. Reported as #9793 with patch
502             ### against 0.2607 on 26/1/2005
503 4 50       2726 unless( $skiptest ) {
504 4         8 my $test_output;
505 4         8 if ( ON_VMS ) {
506             $cmd = [$perl, BUILD->($dir), "test", @buildflags];
507             }
508             else {
509 4         37 $cmd = [$perl, @run_perl, BUILD->($dir), "test", @buildflags];
510             }
511 4         29 local $ENV{PERL_INSTALL_QUIET};
512 4 50       22 unless ( scalar run( command => $cmd,
513             buffer => \$test_output,
514             verbose => $verbose )
515             ) {
516 0 0       0 error( loc( "MAKE TEST failed:\n%1 ", $test_output ), ( $verbose ? 0 : 1 ) );
517              
518             ### mark specifically *test* failure.. so we don't
519             ### send success on force...
520 0         0 $test_fail++;
521              
522 0 0 0     0 if( !$force and !$cb->_callbacks->proceed_on_test_failure->(
523             $self, $@ )
524             ) {
525 0         0 $dist->status->test(0);
526 0 0       0 if ( $conf->get_conf('cpantest') ) {
527 0         0 $status->{stage} = 'test';
528 0         0 $status->{capture} = $test_output;
529             }
530 0         0 $fail++; last RUN;
  0         0  
531             }
532              
533             }
534             else {
535 4         1950063 msg( loc( "MAKE TEST passed:\n%1", $test_output ), 0 );
536 4         5788 $dist->status->test(1);
537 4 50       852 if ( $conf->get_conf('cpantest') ) {
538 0         0 $status->{stage} = 'test';
539 0         0 $status->{capture} = $test_output;
540             }
541             }
542             }
543             else {
544 0         0 msg(loc("Tests skipped"), $verbose);
545             }
546             }
547              
548 4 50       914 unless( $cb->_chdir( dir => $orig ) ) {
549 0         0 error( loc( "Could not chdir back to start dir '%1'", $orig ) );
550             }
551              
552             ### send out test report? ###
553 4 50 33     604 if( $conf->get_conf('cpantest') and not $prereq_fail ) {
554 0 0 0     0 $cb->_send_report(
555             module => $self,
556             failed => $test_fail || $fail,
557             buffer => CPANPLUS::Error->stack_as_string,
558             status => $status,
559             verbose => $verbose,
560             force => $force,
561             tests_skipped => $skiptest,
562             ) or error(loc("Failed to send test report for '%1'",
563             $self->module ) );
564             }
565              
566 4 50       659 return $dist->status->created( $fail ? 0 : 1 );
567             }
568              
569              
570             sub install {
571             ### just in case you already did a create call for this module object
572             ### just via a different dist object
573 2     2 1 387 my $dist = shift;
574 2         14 my $self = $dist->parent;
575              
576             ### we're also the cpan_dist, since we don't need to have anything
577             ### prepared from another installer
578 2 50       104 $dist = $self->status->dist_cpan if $self->status->dist_cpan;
579              
580 2         181 my $cb = $self->parent;
581 2         65 my $conf = $cb->configure_object;
582 2         28 my %hash = @_;
583              
584              
585 2         4 my $verbose; my $perl; my $force; my $buildflags;
  0         0  
  0         0  
586 2         3 { local $Params::Check::ALLOW_UNKNOWN = 1;
  2         10  
587 2         14 my $tmpl = {
588             verbose => { default => $conf->get_conf('verbose'),
589             store => \$verbose },
590             force => { default => $conf->get_conf('force'),
591             store => \$force },
592             buildflags => { default => $conf->get_conf('buildflags'),
593             store => \$buildflags },
594             perl => { default => $^X, store => \$perl },
595             };
596              
597 2 50       820 my $args = check( $tmpl, \%hash ) or return;
598 2         192 $dist->status->_install_args( $args );
599             }
600              
601 2         199 my $dir;
602 2 50       8 unless( $dir = $self->status->extract ) {
603 0         0 error( loc( "No dir found to operate on!" ) );
604 0         0 return;
605             }
606              
607 2         6204 my $orig = cwd();
608              
609 2 50       31 unless( $cb->_chdir( dir => $dir ) ) {
610 0         0 error( loc( "Could not chdir to build directory '%1'", $dir ) );
611 0         0 return;
612             }
613              
614             ### value set and false -- means failure ###
615 2 0 33     357 if( defined $self->status->installed &&
      33        
616             !$self->status->installed && !$force
617             ) {
618 0         0 error( loc( "Module '%1' has failed to install before this session " .
619             "-- aborting install", $self->module ) );
620 0         0 return;
621             }
622              
623 2         250 my $fail;
624 2         15 my @buildflags = $dist->_buildflags_as_list( $buildflags );
625 2         245 my @run_perl = $dist->_perlrun();
626              
627             local $ENV{PERL_USE_UNSAFE_INC} = 1
628 2 50       24 unless exists $ENV{PERL_USE_UNSAFE_INC};
629              
630             ### hmm, how is this going to deal with sudo?
631             ### for now, check effective uid, if it's not root,
632             ### shell out, otherwise use the method
633 2 50       17 if( $> ) {
634              
635             ### don't worry about loading the right version of M::B anymore
636             ### the 'new_from_context' already added the 'right' path to
637             ### M::B at the top of the build.pl
638 0         0 my $cmd;
639 0         0 if ( ON_VMS ) {
640             $cmd = [$perl, BUILD->($dir), "install", @buildflags];
641             }
642             else {
643 0         0 $cmd = [$perl, @run_perl, BUILD->($dir), "install", @buildflags];
644             }
645              
646             ### Detect local::lib type behaviour. Do not use 'sudo' in these cases
647 0         0 my $sudo = $conf->get_program('sudo');
648             SUDO: {
649             ### Actual local::lib in use
650 0 0 0     0 last SUDO if defined $ENV{PERL_MB_OPT} and $ENV{PERL_MB_OPT} =~ m!install_base!;
  0         0  
651             ### 'buildflags' is configured with '--install_base'
652 0 0       0 last SUDO if scalar grep { m!install_base! } @buildflags;
  0         0  
653             ### oh well 'sudo make me a sandwich'
654 0         0 unshift @$cmd, $sudo;
655             }
656              
657 0         0 my $buffer;
658 0 0       0 unless( scalar run( command => $cmd,
659             buffer => \$buffer,
660             verbose => $verbose )
661             ) {
662 0         0 error(loc("Could not run '%1': %2", 'Build install', $buffer));
663 0         0 $fail++;
664             }
665             } else {
666 2         4 my ($install_output, $cmd);
667 2         2 if ( ON_VMS ) {
668             $cmd = [$perl, BUILD->($dir), "install", @buildflags];
669             }
670             else {
671 2         17 $cmd = [$perl, @run_perl, BUILD->($dir), "install", @buildflags];
672             }
673 2 50       18 unless( scalar run( command => $cmd,
674             buffer => \$install_output,
675             verbose => $verbose )
676             ) {
677 0         0 error(loc("Could not run '%1': %2", 'Build install', $install_output));
678 0         0 $fail++;
679             }
680             else {
681 2         532326 msg( $install_output, 0 );
682             }
683             }
684              
685              
686 2 50       2548 unless( $cb->_chdir( dir => $orig ) ) {
687 0         0 error( loc( "Could not chdir back to start dir '%1'", $orig ) );
688             }
689              
690 2 50       293 return $dist->status->installed( $fail ? 0 : 1 );
691             }
692              
693             ### returns the string 'foo=bar --zot quux'
694             ### as the list 'foo=bar', '--zot', 'qux'
695             sub _buildflags_as_list {
696 12     12   30 my $self = shift;
697 12 50       52 my $flags = shift or return;
698              
699 12         187 return Module::Build->split_like_shell($flags);
700             }
701              
702             {
703             my $afe_ver = version->new($CPANPLUS::Internals::VERSION) >= version->new("0.9166");
704              
705             sub _perlrun {
706 12     12   21 my $self = shift;
707 12 50       37 if ( $afe_ver ) {
708 12         44 return ( '-MCPANPLUS::Internals::Utils::Autoflush' );
709             }
710             else {
711 0           return ( '-e', CPDB_PERL_WRAPPER );
712             }
713             }
714             }
715              
716              
717             qq[Putting the Module::Build into CPANPLUS];
718              
719              
720             # Local variables:
721             # c-indentation-style: bsd
722             # c-basic-offset: 4
723             # indent-tabs-mode: nil
724             # End:
725             # vim: expandtab shiftwidth=4:
726              
727             __END__