1package ExtUtils::MM_Any; 2 3use strict; 4our $VERSION = '7.10_02'; 5 6use Carp; 7use File::Spec; 8use File::Basename; 9BEGIN { our @ISA = qw(File::Spec); } 10 11# We need $Verbose 12use ExtUtils::MakeMaker qw($Verbose); 13 14use ExtUtils::MakeMaker::Config; 15 16 17# So we don't have to keep calling the methods over and over again, 18# we have these globals to cache the values. Faster and shrtr. 19my $Curdir = __PACKAGE__->curdir; 20my $Rootdir = __PACKAGE__->rootdir; 21my $Updir = __PACKAGE__->updir; 22 23 24=head1 NAME 25 26ExtUtils::MM_Any - Platform-agnostic MM methods 27 28=head1 SYNOPSIS 29 30 FOR INTERNAL USE ONLY! 31 32 package ExtUtils::MM_SomeOS; 33 34 # Temporarily, you have to subclass both. Put MM_Any first. 35 require ExtUtils::MM_Any; 36 require ExtUtils::MM_Unix; 37 @ISA = qw(ExtUtils::MM_Any ExtUtils::Unix); 38 39=head1 DESCRIPTION 40 41B<FOR INTERNAL USE ONLY!> 42 43ExtUtils::MM_Any is a superclass for the ExtUtils::MM_* set of 44modules. It contains methods which are either inherently 45cross-platform or are written in a cross-platform manner. 46 47Subclass off of ExtUtils::MM_Any I<and> ExtUtils::MM_Unix. This is a 48temporary solution. 49 50B<THIS MAY BE TEMPORARY!> 51 52 53=head1 METHODS 54 55Any methods marked I<Abstract> must be implemented by subclasses. 56 57 58=head2 Cross-platform helper methods 59 60These are methods which help writing cross-platform code. 61 62 63 64=head3 os_flavor I<Abstract> 65 66 my @os_flavor = $mm->os_flavor; 67 68@os_flavor is the style of operating system this is, usually 69corresponding to the MM_*.pm file we're using. 70 71The first element of @os_flavor is the major family (ie. Unix, 72Windows, VMS, OS/2, etc...) and the rest are sub families. 73 74Some examples: 75 76 Cygwin98 ('Unix', 'Cygwin', 'Cygwin9x') 77 Windows ('Win32') 78 Win98 ('Win32', 'Win9x') 79 Linux ('Unix', 'Linux') 80 MacOS X ('Unix', 'Darwin', 'MacOS', 'MacOS X') 81 OS/2 ('OS/2') 82 83This is used to write code for styles of operating system. 84See os_flavor_is() for use. 85 86 87=head3 os_flavor_is 88 89 my $is_this_flavor = $mm->os_flavor_is($this_flavor); 90 my $is_this_flavor = $mm->os_flavor_is(@one_of_these_flavors); 91 92Checks to see if the current operating system is one of the given flavors. 93 94This is useful for code like: 95 96 if( $mm->os_flavor_is('Unix') ) { 97 $out = `foo 2>&1`; 98 } 99 else { 100 $out = `foo`; 101 } 102 103=cut 104 105sub os_flavor_is { 106 my $self = shift; 107 my %flavors = map { ($_ => 1) } $self->os_flavor; 108 return (grep { $flavors{$_} } @_) ? 1 : 0; 109} 110 111 112=head3 can_load_xs 113 114 my $can_load_xs = $self->can_load_xs; 115 116Returns true if we have the ability to load XS. 117 118This is important because miniperl, used to build XS modules in the 119core, can not load XS. 120 121=cut 122 123sub can_load_xs { 124 return defined &DynaLoader::boot_DynaLoader ? 1 : 0; 125} 126 127 128=head3 can_run 129 130 use ExtUtils::MM; 131 my $runnable = MM->can_run($Config{make}); 132 133If called in a scalar context it will return the full path to the binary 134you asked for if it was found, or C<undef> if it was not. 135 136If called in a list context, it will return a list of the full paths to instances 137of the binary where found in C<PATH>, or an empty list if it was not found. 138 139Copied from L<IPC::Cmd|IPC::Cmd/"$path = can_run( PROGRAM );">, but modified into 140a method (and removed C<$INSTANCES> capability). 141 142=cut 143 144sub can_run { 145 my ($self, $command) = @_; 146 147 # a lot of VMS executables have a symbol defined 148 # check those first 149 if ( $^O eq 'VMS' ) { 150 require VMS::DCLsym; 151 my $syms = VMS::DCLsym->new; 152 return $command if scalar $syms->getsym( uc $command ); 153 } 154 155 my @possibles; 156 157 if( File::Spec->file_name_is_absolute($command) ) { 158 return $self->maybe_command($command); 159 160 } else { 161 for my $dir ( 162 File::Spec->path, 163 File::Spec->curdir 164 ) { 165 next if ! $dir || ! -d $dir; 166 my $abs = File::Spec->catfile($self->os_flavor_is('Win32') ? Win32::GetShortPathName( $dir ) : $dir, $command); 167 push @possibles, $abs if $abs = $self->maybe_command($abs); 168 } 169 } 170 return @possibles if wantarray; 171 return shift @possibles; 172} 173 174 175=head3 can_redirect_error 176 177 $useredirect = MM->can_redirect_error; 178 179True if on an OS where qx operator (or backticks) can redirect C<STDERR> 180onto C<STDOUT>. 181 182=cut 183 184sub can_redirect_error { 185 my $self = shift; 186 $self->os_flavor_is('Unix') 187 or ($self->os_flavor_is('Win32') and !$self->os_flavor_is('Win9x')) 188 or $self->os_flavor_is('OS/2') 189} 190 191 192=head3 is_make_type 193 194 my $is_dmake = $self->is_make_type('dmake'); 195 196Returns true if C<<$self->make>> is the given type; possibilities are: 197 198 gmake GNU make 199 dmake 200 nmake 201 bsdmake BSD pmake-derived 202 203=cut 204 205my %maketype2true; 206# undocumented - so t/cd.t can still do its thing 207sub _clear_maketype_cache { %maketype2true = () } 208 209sub is_make_type { 210 my($self, $type) = @_; 211 return $maketype2true{$type} if defined $maketype2true{$type}; 212 (undef, undef, my $make_basename) = $self->splitpath($self->make); 213 return $maketype2true{$type} = 1 214 if $make_basename =~ /\b$type\b/i; # executable's filename 215 return $maketype2true{$type} = 0 216 if $make_basename =~ /\b[gdn]make\b/i; # Never fall through for dmake/nmake/gmake 217 # now have to run with "-v" and guess 218 my $redirect = $self->can_redirect_error ? '2>&1' : ''; 219 my $make = $self->make || $self->{MAKE}; 220 my $minus_v = `"$make" -v $redirect`; 221 return $maketype2true{$type} = 1 222 if $type eq 'gmake' and $minus_v =~ /GNU make/i; 223 return $maketype2true{$type} = 1 224 if $type eq 'bsdmake' 225 and $minus_v =~ /^usage: make \[-BeikNnqrstWwX\]/im; 226 $maketype2true{$type} = 0; # it wasn't whatever you asked 227} 228 229 230=head3 can_dep_space 231 232 my $can_dep_space = $self->can_dep_space; 233 234Returns true if C<make> can handle (probably by quoting) 235dependencies that contain a space. Currently known true for GNU make, 236false for BSD pmake derivative. 237 238=cut 239 240my $cached_dep_space; 241sub can_dep_space { 242 my $self = shift; 243 return $cached_dep_space if defined $cached_dep_space; 244 return $cached_dep_space = 1 if $self->is_make_type('gmake'); 245 return $cached_dep_space = 0 if $self->is_make_type('dmake'); # only on W32 246 return $cached_dep_space = 0 if $self->is_make_type('bsdmake'); 247 return $cached_dep_space = 0; # assume no 248} 249 250 251=head3 quote_dep 252 253 $text = $mm->quote_dep($text); 254 255Method that protects Makefile single-value constants (mainly filenames), 256so that make will still treat them as single values even if they 257inconveniently have spaces in. If the make program being used cannot 258achieve such protection and the given text would need it, throws an 259exception. 260 261=cut 262 263sub quote_dep { 264 my ($self, $arg) = @_; 265 die <<EOF if $arg =~ / / and not $self->can_dep_space; 266Tried to use make dependency with space for make that can't: 267 '$arg' 268EOF 269 $arg =~ s/( )/\\$1/g; # how GNU make does it 270 return $arg; 271} 272 273 274=head3 split_command 275 276 my @cmds = $MM->split_command($cmd, @args); 277 278Most OS have a maximum command length they can execute at once. Large 279modules can easily generate commands well past that limit. Its 280necessary to split long commands up into a series of shorter commands. 281 282C<split_command> will return a series of @cmds each processing part of 283the args. Collectively they will process all the arguments. Each 284individual line in @cmds will not be longer than the 285$self->max_exec_len being careful to take into account macro expansion. 286 287$cmd should include any switches and repeated initial arguments. 288 289If no @args are given, no @cmds will be returned. 290 291Pairs of arguments will always be preserved in a single command, this 292is a heuristic for things like pm_to_blib and pod2man which work on 293pairs of arguments. This makes things like this safe: 294 295 $self->split_command($cmd, %pod2man); 296 297 298=cut 299 300sub split_command { 301 my($self, $cmd, @args) = @_; 302 303 my @cmds = (); 304 return(@cmds) unless @args; 305 306 # If the command was given as a here-doc, there's probably a trailing 307 # newline. 308 chomp $cmd; 309 310 # set aside 30% for macro expansion. 311 my $len_left = int($self->max_exec_len * 0.70); 312 $len_left -= length $self->_expand_macros($cmd); 313 314 do { 315 my $arg_str = ''; 316 my @next_args; 317 while( @next_args = splice(@args, 0, 2) ) { 318 # Two at a time to preserve pairs. 319 my $next_arg_str = "\t ". join ' ', @next_args, "\n"; 320 321 if( !length $arg_str ) { 322 $arg_str .= $next_arg_str 323 } 324 elsif( length($arg_str) + length($next_arg_str) > $len_left ) { 325 unshift @args, @next_args; 326 last; 327 } 328 else { 329 $arg_str .= $next_arg_str; 330 } 331 } 332 chop $arg_str; 333 334 push @cmds, $self->escape_newlines("$cmd \n$arg_str"); 335 } while @args; 336 337 return @cmds; 338} 339 340 341sub _expand_macros { 342 my($self, $cmd) = @_; 343 344 $cmd =~ s{\$\((\w+)\)}{ 345 defined $self->{$1} ? $self->{$1} : "\$($1)" 346 }e; 347 return $cmd; 348} 349 350 351=head3 echo 352 353 my @commands = $MM->echo($text); 354 my @commands = $MM->echo($text, $file); 355 my @commands = $MM->echo($text, $file, \%opts); 356 357Generates a set of @commands which print the $text to a $file. 358 359If $file is not given, output goes to STDOUT. 360 361If $opts{append} is true the $file will be appended to rather than 362overwritten. Default is to overwrite. 363 364If $opts{allow_variables} is true, make variables of the form 365C<$(...)> will not be escaped. Other C<$> will. Default is to escape 366all C<$>. 367 368Example of use: 369 370 my $make = map "\t$_\n", $MM->echo($text, $file); 371 372=cut 373 374sub echo { 375 my($self, $text, $file, $opts) = @_; 376 377 # Compatibility with old options 378 if( !ref $opts ) { 379 my $append = $opts; 380 $opts = { append => $append || 0 }; 381 } 382 $opts->{allow_variables} = 0 unless defined $opts->{allow_variables}; 383 384 my $ql_opts = { allow_variables => $opts->{allow_variables} }; 385 my @cmds = map { '$(NOECHO) $(ECHO) '.$self->quote_literal($_, $ql_opts) } 386 split /\n/, $text; 387 if( $file ) { 388 my $redirect = $opts->{append} ? '>>' : '>'; 389 $cmds[0] .= " $redirect $file"; 390 $_ .= " >> $file" foreach @cmds[1..$#cmds]; 391 } 392 393 return @cmds; 394} 395 396 397=head3 wraplist 398 399 my $args = $mm->wraplist(@list); 400 401Takes an array of items and turns them into a well-formatted list of 402arguments. In most cases this is simply something like: 403 404 FOO \ 405 BAR \ 406 BAZ 407 408=cut 409 410sub wraplist { 411 my $self = shift; 412 return join " \\\n\t", @_; 413} 414 415 416=head3 maketext_filter 417 418 my $filter_make_text = $mm->maketext_filter($make_text); 419 420The text of the Makefile is run through this method before writing to 421disk. It allows systems a chance to make portability fixes to the 422Makefile. 423 424By default it does nothing. 425 426This method is protected and not intended to be called outside of 427MakeMaker. 428 429=cut 430 431sub maketext_filter { return $_[1] } 432 433 434=head3 cd I<Abstract> 435 436 my $subdir_cmd = $MM->cd($subdir, @cmds); 437 438This will generate a make fragment which runs the @cmds in the given 439$dir. The rough equivalent to this, except cross platform. 440 441 cd $subdir && $cmd 442 443Currently $dir can only go down one level. "foo" is fine. "foo/bar" is 444not. "../foo" is right out. 445 446The resulting $subdir_cmd has no leading tab nor trailing newline. This 447makes it easier to embed in a make string. For example. 448 449 my $make = sprintf <<'CODE', $subdir_cmd; 450 foo : 451 $(ECHO) what 452 %s 453 $(ECHO) mouche 454 CODE 455 456 457=head3 oneliner I<Abstract> 458 459 my $oneliner = $MM->oneliner($perl_code); 460 my $oneliner = $MM->oneliner($perl_code, \@switches); 461 462This will generate a perl one-liner safe for the particular platform 463you're on based on the given $perl_code and @switches (a -e is 464assumed) suitable for using in a make target. It will use the proper 465shell quoting and escapes. 466 467$(PERLRUN) will be used as perl. 468 469Any newlines in $perl_code will be escaped. Leading and trailing 470newlines will be stripped. Makes this idiom much easier: 471 472 my $code = $MM->oneliner(<<'CODE', [...switches...]); 473some code here 474another line here 475CODE 476 477Usage might be something like: 478 479 # an echo emulation 480 $oneliner = $MM->oneliner('print "Foo\n"'); 481 $make = '$oneliner > somefile'; 482 483All dollar signs must be doubled in the $perl_code if you expect them 484to be interpreted normally, otherwise it will be considered a make 485macro. Also remember to quote make macros else it might be used as a 486bareword. For example: 487 488 # Assign the value of the $(VERSION_FROM) make macro to $vf. 489 $oneliner = $MM->oneliner('$$vf = "$(VERSION_FROM)"'); 490 491Its currently very simple and may be expanded sometime in the figure 492to include more flexible code and switches. 493 494 495=head3 quote_literal I<Abstract> 496 497 my $safe_text = $MM->quote_literal($text); 498 my $safe_text = $MM->quote_literal($text, \%options); 499 500This will quote $text so it is interpreted literally in the shell. 501 502For example, on Unix this would escape any single-quotes in $text and 503put single-quotes around the whole thing. 504 505If $options{allow_variables} is true it will leave C<'$(FOO)'> make 506variables untouched. If false they will be escaped like any other 507C<$>. Defaults to true. 508 509=head3 escape_dollarsigns 510 511 my $escaped_text = $MM->escape_dollarsigns($text); 512 513Escapes stray C<$> so they are not interpreted as make variables. 514 515It lets by C<$(...)>. 516 517=cut 518 519sub escape_dollarsigns { 520 my($self, $text) = @_; 521 522 # Escape dollar signs which are not starting a variable 523 $text =~ s{\$ (?!\() }{\$\$}gx; 524 525 return $text; 526} 527 528 529=head3 escape_all_dollarsigns 530 531 my $escaped_text = $MM->escape_all_dollarsigns($text); 532 533Escapes all C<$> so they are not interpreted as make variables. 534 535=cut 536 537sub escape_all_dollarsigns { 538 my($self, $text) = @_; 539 540 # Escape dollar signs 541 $text =~ s{\$}{\$\$}gx; 542 543 return $text; 544} 545 546 547=head3 escape_newlines I<Abstract> 548 549 my $escaped_text = $MM->escape_newlines($text); 550 551Shell escapes newlines in $text. 552 553 554=head3 max_exec_len I<Abstract> 555 556 my $max_exec_len = $MM->max_exec_len; 557 558Calculates the maximum command size the OS can exec. Effectively, 559this is the max size of a shell command line. 560 561=for _private 562$self->{_MAX_EXEC_LEN} is set by this method, but only for testing purposes. 563 564 565=head3 make 566 567 my $make = $MM->make; 568 569Returns the make variant we're generating the Makefile for. This attempts 570to do some normalization on the information from %Config or the user. 571 572=cut 573 574sub make { 575 my $self = shift; 576 577 my $make = lc $self->{MAKE}; 578 579 # Truncate anything like foomake6 to just foomake. 580 $make =~ s/^(\w+make).*/$1/; 581 582 # Turn gnumake into gmake. 583 $make =~ s/^gnu/g/; 584 585 return $make; 586} 587 588 589=head2 Targets 590 591These are methods which produce make targets. 592 593 594=head3 all_target 595 596Generate the default target 'all'. 597 598=cut 599 600sub all_target { 601 my $self = shift; 602 603 return <<'MAKE_EXT'; 604all :: pure_all 605 $(NOECHO) $(NOOP) 606MAKE_EXT 607 608} 609 610 611=head3 blibdirs_target 612 613 my $make_frag = $mm->blibdirs_target; 614 615Creates the blibdirs target which creates all the directories we use 616in blib/. 617 618The blibdirs.ts target is deprecated. Depend on blibdirs instead. 619 620 621=cut 622 623sub blibdirs_target { 624 my $self = shift; 625 626 my @dirs = map { uc "\$(INST_$_)" } qw(libdir archlib 627 autodir archautodir 628 bin script 629 man1dir man3dir 630 ); 631 632 my @exists = map { $_.'$(DFSEP).exists' } @dirs; 633 634 my $make = sprintf <<'MAKE', join(' ', @exists); 635blibdirs : %s 636 $(NOECHO) $(NOOP) 637 638# Backwards compat with 6.18 through 6.25 639blibdirs.ts : blibdirs 640 $(NOECHO) $(NOOP) 641 642MAKE 643 644 $make .= $self->dir_target(@dirs); 645 646 return $make; 647} 648 649 650=head3 clean (o) 651 652Defines the clean target. 653 654=cut 655 656sub clean { 657# --- Cleanup and Distribution Sections --- 658 659 my($self, %attribs) = @_; 660 my @m; 661 push(@m, ' 662# Delete temporary files but do not touch installed files. We don\'t delete 663# the Makefile here so a later make realclean still has a makefile to use. 664 665clean :: clean_subdirs 666'); 667 668 my @files = sort values %{$self->{XS}}; # .c files from *.xs files 669 my @dirs = qw(blib); 670 671 # Normally these are all under blib but they might have been 672 # redefined. 673 # XXX normally this would be a good idea, but the Perl core sets 674 # INST_LIB = ../../lib rather than actually installing the files. 675 # So a "make clean" in an ext/ directory would blow away lib. 676 # Until the core is adjusted let's leave this out. 677# push @dirs, qw($(INST_ARCHLIB) $(INST_LIB) 678# $(INST_BIN) $(INST_SCRIPT) 679# $(INST_MAN1DIR) $(INST_MAN3DIR) 680# $(INST_LIBDIR) $(INST_ARCHLIBDIR) $(INST_AUTODIR) 681# $(INST_STATIC) $(INST_DYNAMIC) 682# ); 683 684 685 if( $attribs{FILES} ) { 686 # Use @dirs because we don't know what's in here. 687 push @dirs, ref $attribs{FILES} ? 688 @{$attribs{FILES}} : 689 split /\s+/, $attribs{FILES} ; 690 } 691 692 push(@files, qw[$(MAKE_APERL_FILE) 693 MYMETA.json MYMETA.yml perlmain.c tmon.out mon.out so_locations 694 blibdirs.ts pm_to_blib pm_to_blib.ts 695 *$(OBJ_EXT) *$(LIB_EXT) perl.exe perl perl$(EXE_EXT) 696 $(BOOTSTRAP) $(BASEEXT).bso 697 $(BASEEXT).def lib$(BASEEXT).def 698 $(BASEEXT).exp $(BASEEXT).x 699 ]); 700 701 push(@files, $self->catfile('$(INST_ARCHAUTODIR)','extralibs.all')); 702 push(@files, $self->catfile('$(INST_ARCHAUTODIR)','extralibs.ld')); 703 704 # core files 705 if ($^O eq 'vos') { 706 push(@files, qw[perl*.kp]); 707 } 708 else { 709 push(@files, qw[core core.*perl.*.? *perl.core]); 710 } 711 712 push(@files, map { "core." . "[0-9]"x$_ } (1..5)); 713 714 # OS specific things to clean up. Use @dirs since we don't know 715 # what might be in here. 716 push @dirs, $self->extra_clean_files; 717 718 # Occasionally files are repeated several times from different sources 719 { my(%f) = map { ($_ => 1) } @files; @files = sort keys %f; } 720 { my(%d) = map { ($_ => 1) } @dirs; @dirs = sort keys %d; } 721 722 push @m, map "\t$_\n", $self->split_command('- $(RM_F)', @files); 723 push @m, map "\t$_\n", $self->split_command('- $(RM_RF)', @dirs); 724 725 # Leave Makefile.old around for realclean 726 push @m, <<'MAKE'; 727 $(NOECHO) $(RM_F) $(MAKEFILE_OLD) 728 - $(MV) $(FIRST_MAKEFILE) $(MAKEFILE_OLD) $(DEV_NULL) 729MAKE 730 731 push(@m, "\t$attribs{POSTOP}\n") if $attribs{POSTOP}; 732 733 join("", @m); 734} 735 736 737=head3 clean_subdirs_target 738 739 my $make_frag = $MM->clean_subdirs_target; 740 741Returns the clean_subdirs target. This is used by the clean target to 742call clean on any subdirectories which contain Makefiles. 743 744=cut 745 746sub clean_subdirs_target { 747 my($self) = shift; 748 749 # No subdirectories, no cleaning. 750 return <<'NOOP_FRAG' unless @{$self->{DIR}}; 751clean_subdirs : 752 $(NOECHO) $(NOOP) 753NOOP_FRAG 754 755 756 my $clean = "clean_subdirs :\n"; 757 758 for my $dir (@{$self->{DIR}}) { 759 my $subclean = $self->oneliner(sprintf <<'CODE', $dir); 760exit 0 unless chdir '%s'; system '$(MAKE) clean' if -f '$(FIRST_MAKEFILE)'; 761CODE 762 763 $clean .= "\t$subclean\n"; 764 } 765 766 return $clean; 767} 768 769 770=head3 dir_target 771 772 my $make_frag = $mm->dir_target(@directories); 773 774Generates targets to create the specified directories and set its 775permission to PERM_DIR. 776 777Because depending on a directory to just ensure it exists doesn't work 778too well (the modified time changes too often) dir_target() creates a 779.exists file in the created directory. It is this you should depend on. 780For portability purposes you should use the $(DIRFILESEP) macro rather 781than a '/' to separate the directory from the file. 782 783 yourdirectory$(DIRFILESEP).exists 784 785=cut 786 787sub dir_target { 788 my($self, @dirs) = @_; 789 790 my $make = ''; 791 foreach my $dir (@dirs) { 792 $make .= sprintf <<'MAKE', ($dir) x 4; 793%s$(DFSEP).exists :: Makefile.PL 794 $(NOECHO) $(MKPATH) %s 795 $(NOECHO) $(CHMOD) $(PERM_DIR) %s 796 $(NOECHO) $(TOUCH) %s$(DFSEP).exists 797 798MAKE 799 800 } 801 802 return $make; 803} 804 805 806=head3 distdir 807 808Defines the scratch directory target that will hold the distribution 809before tar-ing (or shar-ing). 810 811=cut 812 813# For backwards compatibility. 814*dist_dir = *distdir; 815 816sub distdir { 817 my($self) = shift; 818 819 my $meta_target = $self->{NO_META} ? '' : 'distmeta'; 820 my $sign_target = !$self->{SIGN} ? '' : 'distsignature'; 821 822 return sprintf <<'MAKE_FRAG', $meta_target, $sign_target; 823create_distdir : 824 $(RM_RF) $(DISTVNAME) 825 $(PERLRUN) "-MExtUtils::Manifest=manicopy,maniread" \ 826 -e "manicopy(maniread(),'$(DISTVNAME)', '$(DIST_CP)');" 827 828distdir : create_distdir %s %s 829 $(NOECHO) $(NOOP) 830 831MAKE_FRAG 832 833} 834 835 836=head3 dist_test 837 838Defines a target that produces the distribution in the 839scratch directory, and runs 'perl Makefile.PL; make ;make test' in that 840subdirectory. 841 842=cut 843 844sub dist_test { 845 my($self) = shift; 846 847 my $mpl_args = join " ", map qq["$_"], @ARGV; 848 849 my $test = $self->cd('$(DISTVNAME)', 850 '$(ABSPERLRUN) Makefile.PL '.$mpl_args, 851 '$(MAKE) $(PASTHRU)', 852 '$(MAKE) test $(PASTHRU)' 853 ); 854 855 return sprintf <<'MAKE_FRAG', $test; 856disttest : distdir 857 %s 858 859MAKE_FRAG 860 861 862} 863 864 865=head3 dynamic (o) 866 867Defines the dynamic target. 868 869=cut 870 871sub dynamic { 872# --- Dynamic Loading Sections --- 873 874 my($self) = shift; 875 ' 876dynamic :: $(FIRST_MAKEFILE) $(BOOTSTRAP) $(INST_DYNAMIC) 877 $(NOECHO) $(NOOP) 878'; 879} 880 881 882=head3 makemakerdflt_target 883 884 my $make_frag = $mm->makemakerdflt_target 885 886Returns a make fragment with the makemakerdeflt_target specified. 887This target is the first target in the Makefile, is the default target 888and simply points off to 'all' just in case any make variant gets 889confused or something gets snuck in before the real 'all' target. 890 891=cut 892 893sub makemakerdflt_target { 894 return <<'MAKE_FRAG'; 895makemakerdflt : all 896 $(NOECHO) $(NOOP) 897MAKE_FRAG 898 899} 900 901 902=head3 manifypods_target 903 904 my $manifypods_target = $self->manifypods_target; 905 906Generates the manifypods target. This target generates man pages from 907all POD files in MAN1PODS and MAN3PODS. 908 909=cut 910 911sub manifypods_target { 912 my($self) = shift; 913 914 my $man1pods = ''; 915 my $man3pods = ''; 916 my $dependencies = ''; 917 918 # populate manXpods & dependencies: 919 foreach my $name (sort keys %{$self->{MAN1PODS}}, sort keys %{$self->{MAN3PODS}}) { 920 $dependencies .= " \\\n\t$name"; 921 } 922 923 my $manify = <<END; 924manifypods : pure_all $dependencies 925END 926 927 my @man_cmds; 928 foreach my $section (qw(1 3)) { 929 my $pods = $self->{"MAN${section}PODS"}; 930 my $p2m = sprintf <<CMD, $] > 5.008 ? " -u" : ""; 931 \$(NOECHO) \$(POD2MAN) --section=$section --perm_rw=\$(PERM_RW)%s 932CMD 933 push @man_cmds, $self->split_command($p2m, map {($_,$pods->{$_})} sort keys %$pods); 934 } 935 936 $manify .= "\t\$(NOECHO) \$(NOOP)\n" unless @man_cmds; 937 $manify .= join '', map { "$_\n" } @man_cmds; 938 939 return $manify; 940} 941 942sub _has_cpan_meta { 943 return eval { 944 require CPAN::Meta; 945 CPAN::Meta->VERSION(2.112150); 946 1; 947 }; 948} 949 950=head3 metafile_target 951 952 my $target = $mm->metafile_target; 953 954Generate the metafile target. 955 956Writes the file META.yml (YAML encoded meta-data) and META.json 957(JSON encoded meta-data) about the module in the distdir. 958The format follows Module::Build's as closely as possible. 959 960=cut 961 962sub metafile_target { 963 my $self = shift; 964 return <<'MAKE_FRAG' if $self->{NO_META} or ! _has_cpan_meta(); 965metafile : 966 $(NOECHO) $(NOOP) 967MAKE_FRAG 968 969 my %metadata = $self->metafile_data( 970 $self->{META_ADD} || {}, 971 $self->{META_MERGE} || {}, 972 ); 973 974 _fix_metadata_before_conversion( \%metadata ); 975 976 # paper over validation issues, but still complain, necessary because 977 # there's no guarantee that the above will fix ALL errors 978 my $meta = eval { CPAN::Meta->create( \%metadata, { lazy_validation => 1 } ) }; 979 warn $@ if $@ and 980 $@ !~ /encountered CODE.*, but JSON can only represent references to arrays or hashes/; 981 982 # use the original metadata straight if the conversion failed 983 # or if it can't be stringified. 984 if( !$meta || 985 !eval { $meta->as_string( { version => "1.4" } ) } || 986 !eval { $meta->as_string } 987 ) 988 { 989 $meta = bless \%metadata, 'CPAN::Meta'; 990 } 991 992 my @write_metayml = $self->echo( 993 $meta->as_string({version => "1.4"}), 'META_new.yml' 994 ); 995 my @write_metajson = $self->echo( 996 $meta->as_string(), 'META_new.json' 997 ); 998 999 my $metayml = join("\n\t", @write_metayml); 1000 my $metajson = join("\n\t", @write_metajson); 1001 return sprintf <<'MAKE_FRAG', $metayml, $metajson; 1002metafile : create_distdir 1003 $(NOECHO) $(ECHO) Generating META.yml 1004 %s 1005 -$(NOECHO) $(MV) META_new.yml $(DISTVNAME)/META.yml 1006 $(NOECHO) $(ECHO) Generating META.json 1007 %s 1008 -$(NOECHO) $(MV) META_new.json $(DISTVNAME)/META.json 1009MAKE_FRAG 1010 1011} 1012 1013=begin private 1014 1015=head3 _fix_metadata_before_conversion 1016 1017 _fix_metadata_before_conversion( \%metadata ); 1018 1019Fixes errors in the metadata before it's handed off to CPAN::Meta for 1020conversion. This hopefully results in something that can be used further 1021on, no guarantee is made though. 1022 1023=end private 1024 1025=cut 1026 1027sub _fix_metadata_before_conversion { 1028 my ( $metadata ) = @_; 1029 1030 # we should never be called unless this already passed but 1031 # prefer to be defensive in case somebody else calls this 1032 1033 return unless _has_cpan_meta; 1034 1035 my $bad_version = $metadata->{version} && 1036 !CPAN::Meta::Validator->new->version( 'version', $metadata->{version} ); 1037 1038 # just delete all invalid versions 1039 if( $bad_version ) { 1040 warn "Can't parse version '$metadata->{version}'\n"; 1041 $metadata->{version} = ''; 1042 } 1043 1044 my $validator = CPAN::Meta::Validator->new( $metadata ); 1045 return if $validator->is_valid; 1046 1047 # fix non-camelcase custom resource keys (only other trick we know) 1048 for my $error ( $validator->errors ) { 1049 my ( $key ) = ( $error =~ /Custom resource '(.*)' must be in CamelCase./ ); 1050 next if !$key; 1051 1052 # first try to remove all non-alphabetic chars 1053 ( my $new_key = $key ) =~ s/[^_a-zA-Z]//g; 1054 1055 # if that doesn't work, uppercase first one 1056 $new_key = ucfirst $new_key if !$validator->custom_1( $new_key ); 1057 1058 # copy to new key if that worked 1059 $metadata->{resources}{$new_key} = $metadata->{resources}{$key} 1060 if $validator->custom_1( $new_key ); 1061 1062 # and delete old one in any case 1063 delete $metadata->{resources}{$key}; 1064 } 1065 1066 return; 1067} 1068 1069 1070=begin private 1071 1072=head3 _sort_pairs 1073 1074 my @pairs = _sort_pairs($sort_sub, \%hash); 1075 1076Sorts the pairs of a hash based on keys ordered according 1077to C<$sort_sub>. 1078 1079=end private 1080 1081=cut 1082 1083sub _sort_pairs { 1084 my $sort = shift; 1085 my $pairs = shift; 1086 return map { $_ => $pairs->{$_} } 1087 sort $sort 1088 keys %$pairs; 1089} 1090 1091 1092# Taken from Module::Build::Base 1093sub _hash_merge { 1094 my ($self, $h, $k, $v) = @_; 1095 if (ref $h->{$k} eq 'ARRAY') { 1096 push @{$h->{$k}}, ref $v ? @$v : $v; 1097 } elsif (ref $h->{$k} eq 'HASH') { 1098 $self->_hash_merge($h->{$k}, $_, $v->{$_}) foreach keys %$v; 1099 } else { 1100 $h->{$k} = $v; 1101 } 1102} 1103 1104 1105=head3 metafile_data 1106 1107 my @metadata_pairs = $mm->metafile_data(\%meta_add, \%meta_merge); 1108 1109Returns the data which MakeMaker turns into the META.yml file 1110and the META.json file. 1111 1112Values of %meta_add will overwrite any existing metadata in those 1113keys. %meta_merge will be merged with them. 1114 1115=cut 1116 1117sub metafile_data { 1118 my $self = shift; 1119 my($meta_add, $meta_merge) = @_; 1120 1121 my %meta = ( 1122 # required 1123 name => $self->{DISTNAME}, 1124 version => _normalize_version($self->{VERSION}), 1125 abstract => $self->{ABSTRACT} || 'unknown', 1126 license => $self->{LICENSE} || 'unknown', 1127 dynamic_config => 1, 1128 1129 # optional 1130 distribution_type => $self->{PM} ? 'module' : 'script', 1131 1132 no_index => { 1133 directory => [qw(t inc)] 1134 }, 1135 1136 generated_by => "ExtUtils::MakeMaker version $ExtUtils::MakeMaker::VERSION", 1137 'meta-spec' => { 1138 url => 'http://module-build.sourceforge.net/META-spec-v1.4.html', 1139 version => 1.4 1140 }, 1141 ); 1142 1143 # The author key is required and it takes a list. 1144 $meta{author} = defined $self->{AUTHOR} ? $self->{AUTHOR} : []; 1145 1146 { 1147 my $vers = _metaspec_version( $meta_add, $meta_merge ); 1148 my $method = $vers =~ m!^2! 1149 ? '_add_requirements_to_meta_v2' 1150 : '_add_requirements_to_meta_v1_4'; 1151 %meta = $self->$method( %meta ); 1152 } 1153 1154 while( my($key, $val) = each %$meta_add ) { 1155 $meta{$key} = $val; 1156 } 1157 1158 while( my($key, $val) = each %$meta_merge ) { 1159 $self->_hash_merge(\%meta, $key, $val); 1160 } 1161 1162 return %meta; 1163} 1164 1165 1166=begin private 1167 1168=cut 1169 1170sub _metaspec_version { 1171 my ( $meta_add, $meta_merge ) = @_; 1172 return $meta_add->{'meta-spec'}->{version} 1173 if defined $meta_add->{'meta-spec'} 1174 and defined $meta_add->{'meta-spec'}->{version}; 1175 return $meta_merge->{'meta-spec'}->{version} 1176 if defined $meta_merge->{'meta-spec'} 1177 and defined $meta_merge->{'meta-spec'}->{version}; 1178 return '1.4'; 1179} 1180 1181sub _add_requirements_to_meta_v1_4 { 1182 my ( $self, %meta ) = @_; 1183 1184 # Check the original args so we can tell between the user setting it 1185 # to an empty hash and it just being initialized. 1186 if( $self->{ARGS}{CONFIGURE_REQUIRES} ) { 1187 $meta{configure_requires} = $self->{CONFIGURE_REQUIRES}; 1188 } else { 1189 $meta{configure_requires} = { 1190 'ExtUtils::MakeMaker' => 0, 1191 }; 1192 } 1193 1194 if( $self->{ARGS}{BUILD_REQUIRES} ) { 1195 $meta{build_requires} = $self->{BUILD_REQUIRES}; 1196 } else { 1197 $meta{build_requires} = { 1198 'ExtUtils::MakeMaker' => 0, 1199 }; 1200 } 1201 1202 if( $self->{ARGS}{TEST_REQUIRES} ) { 1203 $meta{build_requires} = { 1204 %{ $meta{build_requires} }, 1205 %{ $self->{TEST_REQUIRES} }, 1206 }; 1207 } 1208 1209 $meta{requires} = $self->{PREREQ_PM} 1210 if defined $self->{PREREQ_PM}; 1211 $meta{requires}{perl} = _normalize_version($self->{MIN_PERL_VERSION}) 1212 if $self->{MIN_PERL_VERSION}; 1213 1214 return %meta; 1215} 1216 1217sub _add_requirements_to_meta_v2 { 1218 my ( $self, %meta ) = @_; 1219 1220 # Check the original args so we can tell between the user setting it 1221 # to an empty hash and it just being initialized. 1222 if( $self->{ARGS}{CONFIGURE_REQUIRES} ) { 1223 $meta{prereqs}{configure}{requires} = $self->{CONFIGURE_REQUIRES}; 1224 } else { 1225 $meta{prereqs}{configure}{requires} = { 1226 'ExtUtils::MakeMaker' => 0, 1227 }; 1228 } 1229 1230 if( $self->{ARGS}{BUILD_REQUIRES} ) { 1231 $meta{prereqs}{build}{requires} = $self->{BUILD_REQUIRES}; 1232 } else { 1233 $meta{prereqs}{build}{requires} = { 1234 'ExtUtils::MakeMaker' => 0, 1235 }; 1236 } 1237 1238 if( $self->{ARGS}{TEST_REQUIRES} ) { 1239 $meta{prereqs}{test}{requires} = $self->{TEST_REQUIRES}; 1240 } 1241 1242 $meta{prereqs}{runtime}{requires} = $self->{PREREQ_PM} 1243 if $self->{ARGS}{PREREQ_PM}; 1244 $meta{prereqs}{runtime}{requires}{perl} = _normalize_version($self->{MIN_PERL_VERSION}) 1245 if $self->{MIN_PERL_VERSION}; 1246 1247 return %meta; 1248} 1249 1250# Adapted from Module::Build::Base 1251sub _normalize_version { 1252 my ($version) = @_; 1253 $version = 0 unless defined $version; 1254 1255 if ( ref $version eq 'version' ) { # version objects 1256 $version = $version->is_qv ? $version->normal : $version->stringify; 1257 } 1258 elsif ( $version =~ /^[^v][^.]*\.[^.]+\./ ) { # no leading v, multiple dots 1259 # normalize string tuples without "v": "1.2.3" -> "v1.2.3" 1260 $version = "v$version"; 1261 } 1262 else { 1263 # leave alone 1264 } 1265 return $version; 1266} 1267 1268=head3 _dump_hash 1269 1270 $yaml = _dump_hash(\%options, %hash); 1271 1272Implements a fake YAML dumper for a hash given 1273as a list of pairs. No quoting/escaping is done. Keys 1274are supposed to be strings. Values are undef, strings, 1275hash refs or array refs of strings. 1276 1277Supported options are: 1278 1279 delta => STR - indentation delta 1280 use_header => BOOL - whether to include a YAML header 1281 indent => STR - a string of spaces 1282 default: '' 1283 1284 max_key_length => INT - maximum key length used to align 1285 keys and values of the same hash 1286 default: 20 1287 key_sort => CODE - a sort sub 1288 It may be undef, which means no sorting by keys 1289 default: sub { lc $a cmp lc $b } 1290 1291 customs => HASH - special options for certain keys 1292 (whose values are hashes themselves) 1293 may contain: max_key_length, key_sort, customs 1294 1295=end private 1296 1297=cut 1298 1299sub _dump_hash { 1300 croak "first argument should be a hash ref" unless ref $_[0] eq 'HASH'; 1301 my $options = shift; 1302 my %hash = @_; 1303 1304 # Use a list to preserve order. 1305 my @pairs; 1306 1307 my $k_sort 1308 = exists $options->{key_sort} ? $options->{key_sort} 1309 : sub { lc $a cmp lc $b }; 1310 if ($k_sort) { 1311 croak "'key_sort' should be a coderef" unless ref $k_sort eq 'CODE'; 1312 @pairs = _sort_pairs($k_sort, \%hash); 1313 } else { # list of pairs, no sorting 1314 @pairs = @_; 1315 } 1316 1317 my $yaml = $options->{use_header} ? "--- #YAML:1.0\n" : ''; 1318 my $indent = $options->{indent} || ''; 1319 my $k_length = min( 1320 ($options->{max_key_length} || 20), 1321 max(map { length($_) + 1 } grep { !ref $hash{$_} } keys %hash) 1322 ); 1323 my $customs = $options->{customs} || {}; 1324 1325 # printf format for key 1326 my $k_format = "%-${k_length}s"; 1327 1328 while( @pairs ) { 1329 my($key, $val) = splice @pairs, 0, 2; 1330 $val = '~' unless defined $val; 1331 if(ref $val eq 'HASH') { 1332 if ( keys %$val ) { 1333 my %k_options = ( # options for recursive call 1334 delta => $options->{delta}, 1335 use_header => 0, 1336 indent => $indent . $options->{delta}, 1337 ); 1338 if (exists $customs->{$key}) { 1339 my %k_custom = %{$customs->{$key}}; 1340 foreach my $k (qw(key_sort max_key_length customs)) { 1341 $k_options{$k} = $k_custom{$k} if exists $k_custom{$k}; 1342 } 1343 } 1344 $yaml .= $indent . "$key:\n" 1345 . _dump_hash(\%k_options, %$val); 1346 } 1347 else { 1348 $yaml .= $indent . "$key: {}\n"; 1349 } 1350 } 1351 elsif (ref $val eq 'ARRAY') { 1352 if( @$val ) { 1353 $yaml .= $indent . "$key:\n"; 1354 1355 for (@$val) { 1356 croak "only nested arrays of non-refs are supported" if ref $_; 1357 $yaml .= $indent . $options->{delta} . "- $_\n"; 1358 } 1359 } 1360 else { 1361 $yaml .= $indent . "$key: []\n"; 1362 } 1363 } 1364 elsif( ref $val and !blessed($val) ) { 1365 croak "only nested hashes, arrays and objects are supported"; 1366 } 1367 else { # if it's an object, just stringify it 1368 $yaml .= $indent . sprintf "$k_format %s\n", "$key:", $val; 1369 } 1370 }; 1371 1372 return $yaml; 1373 1374} 1375 1376sub blessed { 1377 return eval { $_[0]->isa("UNIVERSAL"); }; 1378} 1379 1380sub max { 1381 return (sort { $b <=> $a } @_)[0]; 1382} 1383 1384sub min { 1385 return (sort { $a <=> $b } @_)[0]; 1386} 1387 1388=head3 metafile_file 1389 1390 my $meta_yml = $mm->metafile_file(@metadata_pairs); 1391 1392Turns the @metadata_pairs into YAML. 1393 1394This method does not implement a complete YAML dumper, being limited 1395to dump a hash with values which are strings, undef's or nested hashes 1396and arrays of strings. No quoting/escaping is done. 1397 1398=cut 1399 1400sub metafile_file { 1401 my $self = shift; 1402 1403 my %dump_options = ( 1404 use_header => 1, 1405 delta => ' ' x 4, 1406 key_sort => undef, 1407 ); 1408 return _dump_hash(\%dump_options, @_); 1409 1410} 1411 1412 1413=head3 distmeta_target 1414 1415 my $make_frag = $mm->distmeta_target; 1416 1417Generates the distmeta target to add META.yml and META.json to the MANIFEST 1418in the distdir. 1419 1420=cut 1421 1422sub distmeta_target { 1423 my $self = shift; 1424 1425 my @add_meta = ( 1426 $self->oneliner(<<'CODE', ['-MExtUtils::Manifest=maniadd']), 1427exit unless -e q{META.yml}; 1428eval { maniadd({q{META.yml} => q{Module YAML meta-data (added by MakeMaker)}}) } 1429 or print "Could not add META.yml to MANIFEST: $${'@'}\n" 1430CODE 1431 $self->oneliner(<<'CODE', ['-MExtUtils::Manifest=maniadd']) 1432exit unless -f q{META.json}; 1433eval { maniadd({q{META.json} => q{Module JSON meta-data (added by MakeMaker)}}) } 1434 or print "Could not add META.json to MANIFEST: $${'@'}\n" 1435CODE 1436 ); 1437 1438 my @add_meta_to_distdir = map { $self->cd('$(DISTVNAME)', $_) } @add_meta; 1439 1440 return sprintf <<'MAKE', @add_meta_to_distdir; 1441distmeta : create_distdir metafile 1442 $(NOECHO) %s 1443 $(NOECHO) %s 1444 1445MAKE 1446 1447} 1448 1449 1450=head3 mymeta 1451 1452 my $mymeta = $mm->mymeta; 1453 1454Generate MYMETA information as a hash either from an existing CPAN Meta file 1455(META.json or META.yml) or from internal data. 1456 1457=cut 1458 1459sub mymeta { 1460 my $self = shift; 1461 my $file = shift || ''; # for testing 1462 1463 my $mymeta = $self->_mymeta_from_meta($file); 1464 my $v2 = 1; 1465 1466 unless ( $mymeta ) { 1467 my @metadata = $self->metafile_data( 1468 $self->{META_ADD} || {}, 1469 $self->{META_MERGE} || {}, 1470 ); 1471 $mymeta = {@metadata}; 1472 $v2 = 0; 1473 } 1474 1475 # Overwrite the non-configure dependency hashes 1476 1477 my $method = $v2 1478 ? '_add_requirements_to_meta_v2' 1479 : '_add_requirements_to_meta_v1_4'; 1480 1481 $mymeta = { $self->$method( %$mymeta ) }; 1482 1483 $mymeta->{dynamic_config} = 0; 1484 1485 return $mymeta; 1486} 1487 1488 1489sub _mymeta_from_meta { 1490 my $self = shift; 1491 my $metafile = shift || ''; # for testing 1492 1493 return unless _has_cpan_meta(); 1494 1495 my $meta; 1496 for my $file ( $metafile, "META.json", "META.yml" ) { 1497 next unless -e $file; 1498 eval { 1499 $meta = CPAN::Meta->load_file($file)->as_struct( { version => 2 } ); 1500 }; 1501 last if $meta; 1502 } 1503 return unless $meta; 1504 1505 # META.yml before 6.25_01 cannot be trusted. META.yml lived in the source directory. 1506 # There was a good chance the author accidentally uploaded a stale META.yml if they 1507 # rolled their own tarball rather than using "make dist". 1508 if ($meta->{generated_by} && 1509 $meta->{generated_by} =~ /ExtUtils::MakeMaker version ([\d\._]+)/) { 1510 my $eummv = do { local $^W = 0; $1+0; }; 1511 if ($eummv < 6.2501) { 1512 return; 1513 } 1514 } 1515 1516 return $meta; 1517} 1518 1519=head3 write_mymeta 1520 1521 $self->write_mymeta( $mymeta ); 1522 1523Write MYMETA information to MYMETA.json and MYMETA.yml. 1524 1525=cut 1526 1527sub write_mymeta { 1528 my $self = shift; 1529 my $mymeta = shift; 1530 1531 return unless _has_cpan_meta(); 1532 1533 _fix_metadata_before_conversion( $mymeta ); 1534 1535 # this can still blow up 1536 # not sure if i should just eval this and skip file creation if it 1537 # blows up 1538 my $meta_obj = CPAN::Meta->new( $mymeta, { lazy_validation => 1 } ); 1539 $meta_obj->save( 'MYMETA.json' ); 1540 $meta_obj->save( 'MYMETA.yml', { version => "1.4" } ); 1541 return 1; 1542} 1543 1544=head3 realclean (o) 1545 1546Defines the realclean target. 1547 1548=cut 1549 1550sub realclean { 1551 my($self, %attribs) = @_; 1552 1553 my @dirs = qw($(DISTVNAME)); 1554 my @files = qw($(FIRST_MAKEFILE) $(MAKEFILE_OLD)); 1555 1556 # Special exception for the perl core where INST_* is not in blib. 1557 # This cleans up the files built from the ext/ directory (all XS). 1558 if( $self->{PERL_CORE} ) { 1559 push @dirs, qw($(INST_AUTODIR) $(INST_ARCHAUTODIR)); 1560 push @files, values %{$self->{PM}}; 1561 } 1562 1563 if( $self->has_link_code ){ 1564 push @files, qw($(OBJECT)); 1565 } 1566 1567 if( $attribs{FILES} ) { 1568 if( ref $attribs{FILES} ) { 1569 push @dirs, @{ $attribs{FILES} }; 1570 } 1571 else { 1572 push @dirs, split /\s+/, $attribs{FILES}; 1573 } 1574 } 1575 1576 # Occasionally files are repeated several times from different sources 1577 { my(%f) = map { ($_ => 1) } @files; @files = keys %f; } 1578 { my(%d) = map { ($_ => 1) } @dirs; @dirs = keys %d; } 1579 1580 my $rm_cmd = join "\n\t", map { "$_" } 1581 $self->split_command('- $(RM_F)', @files); 1582 my $rmf_cmd = join "\n\t", map { "$_" } 1583 $self->split_command('- $(RM_RF)', @dirs); 1584 1585 my $m = sprintf <<'MAKE', $rm_cmd, $rmf_cmd; 1586# Delete temporary files (via clean) and also delete dist files 1587realclean purge :: clean realclean_subdirs 1588 %s 1589 %s 1590MAKE 1591 1592 $m .= "\t$attribs{POSTOP}\n" if $attribs{POSTOP}; 1593 1594 return $m; 1595} 1596 1597 1598=head3 realclean_subdirs_target 1599 1600 my $make_frag = $MM->realclean_subdirs_target; 1601 1602Returns the realclean_subdirs target. This is used by the realclean 1603target to call realclean on any subdirectories which contain Makefiles. 1604 1605=cut 1606 1607sub realclean_subdirs_target { 1608 my $self = shift; 1609 1610 return <<'NOOP_FRAG' unless @{$self->{DIR}}; 1611realclean_subdirs : 1612 $(NOECHO) $(NOOP) 1613NOOP_FRAG 1614 1615 my $rclean = "realclean_subdirs :\n"; 1616 1617 foreach my $dir (@{$self->{DIR}}) { 1618 foreach my $makefile ('$(MAKEFILE_OLD)', '$(FIRST_MAKEFILE)' ) { 1619 my $subrclean .= $self->oneliner(sprintf <<'CODE', $dir, ($makefile) x 2); 1620chdir '%s'; system '$(MAKE) $(USEMAKEFILE) %s realclean' if -f '%s'; 1621CODE 1622 1623 $rclean .= sprintf <<'RCLEAN', $subrclean; 1624 - %s 1625RCLEAN 1626 1627 } 1628 } 1629 1630 return $rclean; 1631} 1632 1633 1634=head3 signature_target 1635 1636 my $target = $mm->signature_target; 1637 1638Generate the signature target. 1639 1640Writes the file SIGNATURE with "cpansign -s". 1641 1642=cut 1643 1644sub signature_target { 1645 my $self = shift; 1646 1647 return <<'MAKE_FRAG'; 1648signature : 1649 cpansign -s 1650MAKE_FRAG 1651 1652} 1653 1654 1655=head3 distsignature_target 1656 1657 my $make_frag = $mm->distsignature_target; 1658 1659Generates the distsignature target to add SIGNATURE to the MANIFEST in the 1660distdir. 1661 1662=cut 1663 1664sub distsignature_target { 1665 my $self = shift; 1666 1667 my $add_sign = $self->oneliner(<<'CODE', ['-MExtUtils::Manifest=maniadd']); 1668eval { maniadd({q{SIGNATURE} => q{Public-key signature (added by MakeMaker)}}) } 1669 or print "Could not add SIGNATURE to MANIFEST: $${'@'}\n" 1670CODE 1671 1672 my $sign_dist = $self->cd('$(DISTVNAME)' => 'cpansign -s'); 1673 1674 # cpansign -s complains if SIGNATURE is in the MANIFEST yet does not 1675 # exist 1676 my $touch_sig = $self->cd('$(DISTVNAME)' => '$(TOUCH) SIGNATURE'); 1677 my $add_sign_to_dist = $self->cd('$(DISTVNAME)' => $add_sign ); 1678 1679 return sprintf <<'MAKE', $add_sign_to_dist, $touch_sig, $sign_dist 1680distsignature : distmeta 1681 $(NOECHO) %s 1682 $(NOECHO) %s 1683 %s 1684 1685MAKE 1686 1687} 1688 1689 1690=head3 special_targets 1691 1692 my $make_frag = $mm->special_targets 1693 1694Returns a make fragment containing any targets which have special 1695meaning to make. For example, .SUFFIXES and .PHONY. 1696 1697=cut 1698 1699sub special_targets { 1700 my $make_frag = <<'MAKE_FRAG'; 1701.SUFFIXES : .xs .c .C .cpp .i .s .cxx .cc $(OBJ_EXT) 1702 1703.PHONY: all config static dynamic test linkext manifest blibdirs clean realclean disttest distdir 1704 1705MAKE_FRAG 1706 1707 $make_frag .= <<'MAKE_FRAG' if $ENV{CLEARCASE_ROOT}; 1708.NO_CONFIG_REC: Makefile 1709 1710MAKE_FRAG 1711 1712 return $make_frag; 1713} 1714 1715 1716 1717 1718=head2 Init methods 1719 1720Methods which help initialize the MakeMaker object and macros. 1721 1722 1723=head3 init_ABSTRACT 1724 1725 $mm->init_ABSTRACT 1726 1727=cut 1728 1729sub init_ABSTRACT { 1730 my $self = shift; 1731 1732 if( $self->{ABSTRACT_FROM} and $self->{ABSTRACT} ) { 1733 warn "Both ABSTRACT_FROM and ABSTRACT are set. ". 1734 "Ignoring ABSTRACT_FROM.\n"; 1735 return; 1736 } 1737 1738 if ($self->{ABSTRACT_FROM}){ 1739 $self->{ABSTRACT} = $self->parse_abstract($self->{ABSTRACT_FROM}) or 1740 carp "WARNING: Setting ABSTRACT via file ". 1741 "'$self->{ABSTRACT_FROM}' failed\n"; 1742 } 1743 1744 if ($self->{ABSTRACT} && $self->{ABSTRACT} =~ m![[:cntrl:]]+!) { 1745 warn "WARNING: ABSTRACT contains control character(s),". 1746 " they will be removed\n"; 1747 $self->{ABSTRACT} =~ s![[:cntrl:]]+!!g; 1748 return; 1749 } 1750} 1751 1752=head3 init_INST 1753 1754 $mm->init_INST; 1755 1756Called by init_main. Sets up all INST_* variables except those related 1757to XS code. Those are handled in init_xs. 1758 1759=cut 1760 1761sub init_INST { 1762 my($self) = shift; 1763 1764 $self->{INST_ARCHLIB} ||= $self->catdir($Curdir,"blib","arch"); 1765 $self->{INST_BIN} ||= $self->catdir($Curdir,'blib','bin'); 1766 1767 # INST_LIB typically pre-set if building an extension after 1768 # perl has been built and installed. Setting INST_LIB allows 1769 # you to build directly into, say $Config{privlibexp}. 1770 unless ($self->{INST_LIB}){ 1771 if ($self->{PERL_CORE}) { 1772 $self->{INST_LIB} = $self->{INST_ARCHLIB} = $self->{PERL_LIB}; 1773 } else { 1774 $self->{INST_LIB} = $self->catdir($Curdir,"blib","lib"); 1775 } 1776 } 1777 1778 my @parentdir = split(/::/, $self->{PARENT_NAME}); 1779 $self->{INST_LIBDIR} = $self->catdir('$(INST_LIB)', @parentdir); 1780 $self->{INST_ARCHLIBDIR} = $self->catdir('$(INST_ARCHLIB)', @parentdir); 1781 $self->{INST_AUTODIR} = $self->catdir('$(INST_LIB)', 'auto', 1782 '$(FULLEXT)'); 1783 $self->{INST_ARCHAUTODIR} = $self->catdir('$(INST_ARCHLIB)', 'auto', 1784 '$(FULLEXT)'); 1785 1786 $self->{INST_SCRIPT} ||= $self->catdir($Curdir,'blib','script'); 1787 1788 $self->{INST_MAN1DIR} ||= $self->catdir($Curdir,'blib','man1'); 1789 $self->{INST_MAN3DIR} ||= $self->catdir($Curdir,'blib','man3'); 1790 1791 return 1; 1792} 1793 1794 1795=head3 init_INSTALL 1796 1797 $mm->init_INSTALL; 1798 1799Called by init_main. Sets up all INSTALL_* variables (except 1800INSTALLDIRS) and *PREFIX. 1801 1802=cut 1803 1804sub init_INSTALL { 1805 my($self) = shift; 1806 1807 if( $self->{ARGS}{INSTALL_BASE} and $self->{ARGS}{PREFIX} ) { 1808 die "Only one of PREFIX or INSTALL_BASE can be given. Not both.\n"; 1809 } 1810 1811 if( $self->{ARGS}{INSTALL_BASE} ) { 1812 $self->init_INSTALL_from_INSTALL_BASE; 1813 } 1814 else { 1815 $self->init_INSTALL_from_PREFIX; 1816 } 1817} 1818 1819 1820=head3 init_INSTALL_from_PREFIX 1821 1822 $mm->init_INSTALL_from_PREFIX; 1823 1824=cut 1825 1826sub init_INSTALL_from_PREFIX { 1827 my $self = shift; 1828 1829 $self->init_lib2arch; 1830 1831 # There are often no Config.pm defaults for these new man variables so 1832 # we fall back to the old behavior which is to use installman*dir 1833 foreach my $num (1, 3) { 1834 my $k = 'installsiteman'.$num.'dir'; 1835 1836 $self->{uc $k} ||= uc "\$(installman${num}dir)" 1837 unless $Config{$k}; 1838 } 1839 1840 foreach my $num (1, 3) { 1841 my $k = 'installvendorman'.$num.'dir'; 1842 1843 unless( $Config{$k} ) { 1844 $self->{uc $k} ||= $Config{usevendorprefix} 1845 ? uc "\$(installman${num}dir)" 1846 : ''; 1847 } 1848 } 1849 1850 $self->{INSTALLSITEBIN} ||= '$(INSTALLBIN)' 1851 unless $Config{installsitebin}; 1852 $self->{INSTALLSITESCRIPT} ||= '$(INSTALLSCRIPT)' 1853 unless $Config{installsitescript}; 1854 1855 unless( $Config{installvendorbin} ) { 1856 $self->{INSTALLVENDORBIN} ||= $Config{usevendorprefix} 1857 ? $Config{installbin} 1858 : ''; 1859 } 1860 unless( $Config{installvendorscript} ) { 1861 $self->{INSTALLVENDORSCRIPT} ||= $Config{usevendorprefix} 1862 ? $Config{installscript} 1863 : ''; 1864 } 1865 1866 1867 my $iprefix = $Config{installprefixexp} || $Config{installprefix} || 1868 $Config{prefixexp} || $Config{prefix} || ''; 1869 my $vprefix = $Config{usevendorprefix} ? $Config{vendorprefixexp} : ''; 1870 my $sprefix = $Config{siteprefixexp} || ''; 1871 1872 # 5.005_03 doesn't have a siteprefix. 1873 $sprefix = $iprefix unless $sprefix; 1874 1875 1876 $self->{PREFIX} ||= ''; 1877 1878 if( $self->{PREFIX} ) { 1879 @{$self}{qw(PERLPREFIX SITEPREFIX VENDORPREFIX)} = 1880 ('$(PREFIX)') x 3; 1881 } 1882 else { 1883 $self->{PERLPREFIX} ||= $iprefix; 1884 $self->{SITEPREFIX} ||= $sprefix; 1885 $self->{VENDORPREFIX} ||= $vprefix; 1886 1887 # Lots of MM extension authors like to use $(PREFIX) so we 1888 # put something sensible in there no matter what. 1889 $self->{PREFIX} = '$('.uc $self->{INSTALLDIRS}.'PREFIX)'; 1890 } 1891 1892 my $arch = $Config{archname}; 1893 my $version = $Config{version}; 1894 1895 # default style 1896 my $libstyle = $Config{installstyle} || 'lib/perl5'; 1897 my $manstyle = ''; 1898 1899 if( $self->{LIBSTYLE} ) { 1900 $libstyle = $self->{LIBSTYLE}; 1901 $manstyle = $self->{LIBSTYLE} eq 'lib/perl5' ? 'lib/perl5' : ''; 1902 } 1903 1904 # Some systems, like VOS, set installman*dir to '' if they can't 1905 # read man pages. 1906 for my $num (1, 3) { 1907 $self->{'INSTALLMAN'.$num.'DIR'} ||= 'none' 1908 unless $Config{'installman'.$num.'dir'}; 1909 } 1910 1911 my %bin_layouts = 1912 ( 1913 bin => { s => $iprefix, 1914 t => 'perl', 1915 d => 'bin' }, 1916 vendorbin => { s => $vprefix, 1917 t => 'vendor', 1918 d => 'bin' }, 1919 sitebin => { s => $sprefix, 1920 t => 'site', 1921 d => 'bin' }, 1922 script => { s => $iprefix, 1923 t => 'perl', 1924 d => 'bin' }, 1925 vendorscript=> { s => $vprefix, 1926 t => 'vendor', 1927 d => 'bin' }, 1928 sitescript => { s => $sprefix, 1929 t => 'site', 1930 d => 'bin' }, 1931 ); 1932 1933 my %man_layouts = 1934 ( 1935 man1dir => { s => $iprefix, 1936 t => 'perl', 1937 d => 'man/man1', 1938 style => $manstyle, }, 1939 siteman1dir => { s => $sprefix, 1940 t => 'site', 1941 d => 'man/man1', 1942 style => $manstyle, }, 1943 vendorman1dir => { s => $vprefix, 1944 t => 'vendor', 1945 d => 'man/man1', 1946 style => $manstyle, }, 1947 1948 man3dir => { s => $iprefix, 1949 t => 'perl', 1950 d => 'man/man3', 1951 style => $manstyle, }, 1952 siteman3dir => { s => $sprefix, 1953 t => 'site', 1954 d => 'man/man3', 1955 style => $manstyle, }, 1956 vendorman3dir => { s => $vprefix, 1957 t => 'vendor', 1958 d => 'man/man3', 1959 style => $manstyle, }, 1960 ); 1961 1962 my %lib_layouts = 1963 ( 1964 privlib => { s => $iprefix, 1965 t => 'perl', 1966 d => '', 1967 style => $libstyle, }, 1968 vendorlib => { s => $vprefix, 1969 t => 'vendor', 1970 d => '', 1971 style => $libstyle, }, 1972 sitelib => { s => $sprefix, 1973 t => 'site', 1974 d => 'site_perl', 1975 style => $libstyle, }, 1976 1977 archlib => { s => $iprefix, 1978 t => 'perl', 1979 d => "$version/$arch", 1980 style => $libstyle }, 1981 vendorarch => { s => $vprefix, 1982 t => 'vendor', 1983 d => "$version/$arch", 1984 style => $libstyle }, 1985 sitearch => { s => $sprefix, 1986 t => 'site', 1987 d => "site_perl/$version/$arch", 1988 style => $libstyle }, 1989 ); 1990 1991 1992 # Special case for LIB. 1993 if( $self->{LIB} ) { 1994 foreach my $var (keys %lib_layouts) { 1995 my $Installvar = uc "install$var"; 1996 1997 if( $var =~ /arch/ ) { 1998 $self->{$Installvar} ||= 1999 $self->catdir($self->{LIB}, $Config{archname}); 2000 } 2001 else { 2002 $self->{$Installvar} ||= $self->{LIB}; 2003 } 2004 } 2005 } 2006 2007 my %type2prefix = ( perl => 'PERLPREFIX', 2008 site => 'SITEPREFIX', 2009 vendor => 'VENDORPREFIX' 2010 ); 2011 2012 my %layouts = (%bin_layouts, %man_layouts, %lib_layouts); 2013 while( my($var, $layout) = each(%layouts) ) { 2014 my($s, $t, $d, $style) = @{$layout}{qw(s t d style)}; 2015 my $r = '$('.$type2prefix{$t}.')'; 2016 2017 warn "Prefixing $var\n" if $Verbose >= 2; 2018 2019 my $installvar = "install$var"; 2020 my $Installvar = uc $installvar; 2021 next if $self->{$Installvar}; 2022 2023 $d = "$style/$d" if $style; 2024 $self->prefixify($installvar, $s, $r, $d); 2025 2026 warn " $Installvar == $self->{$Installvar}\n" 2027 if $Verbose >= 2; 2028 } 2029 2030 # Generate these if they weren't figured out. 2031 $self->{VENDORARCHEXP} ||= $self->{INSTALLVENDORARCH}; 2032 $self->{VENDORLIBEXP} ||= $self->{INSTALLVENDORLIB}; 2033 2034 return 1; 2035} 2036 2037 2038=head3 init_from_INSTALL_BASE 2039 2040 $mm->init_from_INSTALL_BASE 2041 2042=cut 2043 2044my %map = ( 2045 lib => [qw(lib perl5)], 2046 arch => [('lib', 'perl5', $Config{archname})], 2047 bin => [qw(bin)], 2048 man1dir => [qw(man man1)], 2049 man3dir => [qw(man man3)] 2050 ); 2051$map{script} = $map{bin}; 2052 2053sub init_INSTALL_from_INSTALL_BASE { 2054 my $self = shift; 2055 2056 @{$self}{qw(PREFIX VENDORPREFIX SITEPREFIX PERLPREFIX)} = 2057 '$(INSTALL_BASE)'; 2058 2059 my %install; 2060 foreach my $thing (keys %map) { 2061 foreach my $dir (('', 'SITE', 'VENDOR')) { 2062 my $uc_thing = uc $thing; 2063 my $key = "INSTALL".$dir.$uc_thing; 2064 2065 $install{$key} ||= 2066 $self->catdir('$(INSTALL_BASE)', @{$map{$thing}}); 2067 } 2068 } 2069 2070 # Adjust for variable quirks. 2071 $install{INSTALLARCHLIB} ||= delete $install{INSTALLARCH}; 2072 $install{INSTALLPRIVLIB} ||= delete $install{INSTALLLIB}; 2073 2074 foreach my $key (keys %install) { 2075 $self->{$key} ||= $install{$key}; 2076 } 2077 2078 return 1; 2079} 2080 2081 2082=head3 init_VERSION I<Abstract> 2083 2084 $mm->init_VERSION 2085 2086Initialize macros representing versions of MakeMaker and other tools 2087 2088MAKEMAKER: path to the MakeMaker module. 2089 2090MM_VERSION: ExtUtils::MakeMaker Version 2091 2092MM_REVISION: ExtUtils::MakeMaker version control revision (for backwards 2093 compat) 2094 2095VERSION: version of your module 2096 2097VERSION_MACRO: which macro represents the version (usually 'VERSION') 2098 2099VERSION_SYM: like version but safe for use as an RCS revision number 2100 2101DEFINE_VERSION: -D line to set the module version when compiling 2102 2103XS_VERSION: version in your .xs file. Defaults to $(VERSION) 2104 2105XS_VERSION_MACRO: which macro represents the XS version. 2106 2107XS_DEFINE_VERSION: -D line to set the xs version when compiling. 2108 2109Called by init_main. 2110 2111=cut 2112 2113sub init_VERSION { 2114 my($self) = shift; 2115 2116 $self->{MAKEMAKER} = $ExtUtils::MakeMaker::Filename; 2117 $self->{MM_VERSION} = $ExtUtils::MakeMaker::VERSION; 2118 $self->{MM_REVISION}= $ExtUtils::MakeMaker::Revision; 2119 $self->{VERSION_FROM} ||= ''; 2120 2121 if ($self->{VERSION_FROM}){ 2122 $self->{VERSION} = $self->parse_version($self->{VERSION_FROM}); 2123 if( $self->{VERSION} eq 'undef' ) { 2124 carp("WARNING: Setting VERSION via file ". 2125 "'$self->{VERSION_FROM}' failed\n"); 2126 } 2127 } 2128 2129 if (defined $self->{VERSION}) { 2130 if ( $self->{VERSION} !~ /^\s*v?[\d_\.]+\s*$/ ) { 2131 require version; 2132 my $normal = eval { version->new( $self->{VERSION} ) }; 2133 $self->{VERSION} = $normal if defined $normal; 2134 } 2135 $self->{VERSION} =~ s/^\s+//; 2136 $self->{VERSION} =~ s/\s+$//; 2137 } 2138 else { 2139 $self->{VERSION} = ''; 2140 } 2141 2142 2143 $self->{VERSION_MACRO} = 'VERSION'; 2144 ($self->{VERSION_SYM} = $self->{VERSION}) =~ s/\W/_/g; 2145 $self->{DEFINE_VERSION} = '-D$(VERSION_MACRO)=\"$(VERSION)\"'; 2146 2147 2148 # Graham Barr and Paul Marquess had some ideas how to ensure 2149 # version compatibility between the *.pm file and the 2150 # corresponding *.xs file. The bottom line was, that we need an 2151 # XS_VERSION macro that defaults to VERSION: 2152 $self->{XS_VERSION} ||= $self->{VERSION}; 2153 2154 $self->{XS_VERSION_MACRO} = 'XS_VERSION'; 2155 $self->{XS_DEFINE_VERSION} = '-D$(XS_VERSION_MACRO)=\"$(XS_VERSION)\"'; 2156 2157} 2158 2159 2160=head3 init_tools 2161 2162 $MM->init_tools(); 2163 2164Initializes the simple macro definitions used by tools_other() and 2165places them in the $MM object. These use conservative cross platform 2166versions and should be overridden with platform specific versions for 2167performance. 2168 2169Defines at least these macros. 2170 2171 Macro Description 2172 2173 NOOP Do nothing 2174 NOECHO Tell make not to display the command itself 2175 2176 SHELL Program used to run shell commands 2177 2178 ECHO Print text adding a newline on the end 2179 RM_F Remove a file 2180 RM_RF Remove a directory 2181 TOUCH Update a file's timestamp 2182 TEST_F Test for a file's existence 2183 TEST_S Test the size of a file 2184 CP Copy a file 2185 CP_NONEMPTY Copy a file if it is not empty 2186 MV Move a file 2187 CHMOD Change permissions on a file 2188 FALSE Exit with non-zero 2189 TRUE Exit with zero 2190 2191 UMASK_NULL Nullify umask 2192 DEV_NULL Suppress all command output 2193 2194=cut 2195 2196sub init_tools { 2197 my $self = shift; 2198 2199 $self->{ECHO} ||= $self->oneliner('binmode STDOUT, qq{:raw}; print qq{@ARGV}', ['-l']); 2200 $self->{ECHO_N} ||= $self->oneliner('print qq{@ARGV}'); 2201 2202 $self->{TOUCH} ||= $self->oneliner('touch', ["-MExtUtils::Command"]); 2203 $self->{CHMOD} ||= $self->oneliner('chmod', ["-MExtUtils::Command"]); 2204 $self->{RM_F} ||= $self->oneliner('rm_f', ["-MExtUtils::Command"]); 2205 $self->{RM_RF} ||= $self->oneliner('rm_rf', ["-MExtUtils::Command"]); 2206 $self->{TEST_F} ||= $self->oneliner('test_f', ["-MExtUtils::Command"]); 2207 $self->{TEST_S} ||= $self->oneliner('test_s', ["-MExtUtils::Command::MM"]); 2208 $self->{CP_NONEMPTY} ||= $self->oneliner('cp_nonempty', ["-MExtUtils::Command::MM"]); 2209 $self->{FALSE} ||= $self->oneliner('exit 1'); 2210 $self->{TRUE} ||= $self->oneliner('exit 0'); 2211 2212 $self->{MKPATH} ||= $self->oneliner('mkpath', ["-MExtUtils::Command"]); 2213 2214 $self->{CP} ||= $self->oneliner('cp', ["-MExtUtils::Command"]); 2215 $self->{MV} ||= $self->oneliner('mv', ["-MExtUtils::Command"]); 2216 2217 $self->{MOD_INSTALL} ||= 2218 $self->oneliner(<<'CODE', ['-MExtUtils::Install']); 2219install([ from_to => {@ARGV}, verbose => '$(VERBINST)', uninstall_shadows => '$(UNINST)', dir_mode => '$(PERM_DIR)' ]); 2220CODE 2221 $self->{DOC_INSTALL} ||= $self->oneliner('perllocal_install', ["-MExtUtils::Command::MM"]); 2222 $self->{UNINSTALL} ||= $self->oneliner('uninstall', ["-MExtUtils::Command::MM"]); 2223 $self->{WARN_IF_OLD_PACKLIST} ||= 2224 $self->oneliner('warn_if_old_packlist', ["-MExtUtils::Command::MM"]); 2225 $self->{FIXIN} ||= $self->oneliner('MY->fixin(shift)', ["-MExtUtils::MY"]); 2226 $self->{EQUALIZE_TIMESTAMP} ||= $self->oneliner('eqtime', ["-MExtUtils::Command"]); 2227 2228 $self->{UNINST} ||= 0; 2229 $self->{VERBINST} ||= 0; 2230 2231 $self->{SHELL} ||= $Config{sh}; 2232 2233 # UMASK_NULL is not used by MakeMaker but some CPAN modules 2234 # make use of it. 2235 $self->{UMASK_NULL} ||= "umask 0"; 2236 2237 # Not the greatest default, but its something. 2238 $self->{DEV_NULL} ||= "> /dev/null 2>&1"; 2239 2240 $self->{NOOP} ||= '$(TRUE)'; 2241 $self->{NOECHO} = '@' unless defined $self->{NOECHO}; 2242 2243 $self->{FIRST_MAKEFILE} ||= $self->{MAKEFILE} || 'Makefile'; 2244 $self->{MAKEFILE} ||= $self->{FIRST_MAKEFILE}; 2245 $self->{MAKEFILE_OLD} ||= $self->{MAKEFILE}.'.old'; 2246 $self->{MAKE_APERL_FILE} ||= $self->{MAKEFILE}.'.aperl'; 2247 2248 # Not everybody uses -f to indicate "use this Makefile instead" 2249 $self->{USEMAKEFILE} ||= '-f'; 2250 2251 # Some makes require a wrapper around macros passed in on the command 2252 # line. 2253 $self->{MACROSTART} ||= ''; 2254 $self->{MACROEND} ||= ''; 2255 2256 return; 2257} 2258 2259 2260=head3 init_others 2261 2262 $MM->init_others(); 2263 2264Initializes the macro definitions having to do with compiling and 2265linking used by tools_other() and places them in the $MM object. 2266 2267If there is no description, its the same as the parameter to 2268WriteMakefile() documented in ExtUtils::MakeMaker. 2269 2270=cut 2271 2272sub init_others { 2273 my $self = shift; 2274 2275 $self->{LD_RUN_PATH} = ""; 2276 2277 $self->{LIBS} = $self->_fix_libs($self->{LIBS}); 2278 2279 # Compute EXTRALIBS, BSLOADLIBS and LDLOADLIBS from $self->{LIBS} 2280 foreach my $libs ( @{$self->{LIBS}} ){ 2281 $libs =~ s/^\s*(.*\S)\s*$/$1/; # remove leading and trailing whitespace 2282 my(@libs) = $self->extliblist($libs); 2283 if ($libs[0] or $libs[1] or $libs[2]){ 2284 # LD_RUN_PATH now computed by ExtUtils::Liblist 2285 ($self->{EXTRALIBS}, $self->{BSLOADLIBS}, 2286 $self->{LDLOADLIBS}, $self->{LD_RUN_PATH}) = @libs; 2287 last; 2288 } 2289 } 2290 2291 if ( $self->{OBJECT} ) { 2292 $self->{OBJECT} = join(" ", @{$self->{OBJECT}}) if ref $self->{OBJECT}; 2293 $self->{OBJECT} =~ s!\.o(bj)?\b!\$(OBJ_EXT)!g; 2294 } elsif ( $self->{MAGICXS} && @{$self->{O_FILES}||[]} ) { 2295 $self->{OBJECT} = join(" ", @{$self->{O_FILES}}); 2296 $self->{OBJECT} =~ s!\.o(bj)?\b!\$(OBJ_EXT)!g; 2297 } else { 2298 # init_dirscan should have found out, if we have C files 2299 $self->{OBJECT} = ""; 2300 $self->{OBJECT} = '$(BASEEXT)$(OBJ_EXT)' if @{$self->{C}||[]}; 2301 } 2302 $self->{OBJECT} =~ s/\n+/ \\\n\t/g; 2303 2304 $self->{BOOTDEP} = (-f "$self->{BASEEXT}_BS") ? "$self->{BASEEXT}_BS" : ""; 2305 $self->{PERLMAINCC} ||= '$(CC)'; 2306 $self->{LDFROM} = '$(OBJECT)' unless $self->{LDFROM}; 2307 2308 # Sanity check: don't define LINKTYPE = dynamic if we're skipping 2309 # the 'dynamic' section of MM. We don't have this problem with 2310 # 'static', since we either must use it (%Config says we can't 2311 # use dynamic loading) or the caller asked for it explicitly. 2312 if (!$self->{LINKTYPE}) { 2313 $self->{LINKTYPE} = $self->{SKIPHASH}{'dynamic'} 2314 ? 'static' 2315 : ($Config{usedl} ? 'dynamic' : 'static'); 2316 } 2317 2318 return; 2319} 2320 2321 2322# Lets look at $self->{LIBS} carefully: It may be an anon array, a string or 2323# undefined. In any case we turn it into an anon array 2324sub _fix_libs { 2325 my($self, $libs) = @_; 2326 2327 return !defined $libs ? [''] : 2328 !ref $libs ? [$libs] : 2329 !defined $libs->[0] ? [''] : 2330 $libs ; 2331} 2332 2333 2334=head3 tools_other 2335 2336 my $make_frag = $MM->tools_other; 2337 2338Returns a make fragment containing definitions for the macros init_others() 2339initializes. 2340 2341=cut 2342 2343sub tools_other { 2344 my($self) = shift; 2345 my @m; 2346 2347 # We set PM_FILTER as late as possible so it can see all the earlier 2348 # on macro-order sensitive makes such as nmake. 2349 for my $tool (qw{ SHELL CHMOD CP MV NOOP NOECHO RM_F RM_RF TEST_F TOUCH 2350 UMASK_NULL DEV_NULL MKPATH EQUALIZE_TIMESTAMP 2351 FALSE TRUE 2352 ECHO ECHO_N 2353 UNINST VERBINST 2354 MOD_INSTALL DOC_INSTALL UNINSTALL 2355 WARN_IF_OLD_PACKLIST 2356 MACROSTART MACROEND 2357 USEMAKEFILE 2358 PM_FILTER 2359 FIXIN 2360 CP_NONEMPTY 2361 } ) 2362 { 2363 next unless defined $self->{$tool}; 2364 push @m, "$tool = $self->{$tool}\n"; 2365 } 2366 2367 return join "", @m; 2368} 2369 2370 2371=head3 init_DIRFILESEP I<Abstract> 2372 2373 $MM->init_DIRFILESEP; 2374 my $dirfilesep = $MM->{DIRFILESEP}; 2375 2376Initializes the DIRFILESEP macro which is the separator between the 2377directory and filename in a filepath. ie. / on Unix, \ on Win32 and 2378nothing on VMS. 2379 2380For example: 2381 2382 # instead of $(INST_ARCHAUTODIR)/extralibs.ld 2383 $(INST_ARCHAUTODIR)$(DIRFILESEP)extralibs.ld 2384 2385Something of a hack but it prevents a lot of code duplication between 2386MM_* variants. 2387 2388Do not use this as a separator between directories. Some operating 2389systems use different separators between subdirectories as between 2390directories and filenames (for example: VOLUME:[dir1.dir2]file on VMS). 2391 2392=head3 init_linker I<Abstract> 2393 2394 $mm->init_linker; 2395 2396Initialize macros which have to do with linking. 2397 2398PERL_ARCHIVE: path to libperl.a equivalent to be linked to dynamic 2399extensions. 2400 2401PERL_ARCHIVE_AFTER: path to a library which should be put on the 2402linker command line I<after> the external libraries to be linked to 2403dynamic extensions. This may be needed if the linker is one-pass, and 2404Perl includes some overrides for C RTL functions, such as malloc(). 2405 2406EXPORT_LIST: name of a file that is passed to linker to define symbols 2407to be exported. 2408 2409Some OSes do not need these in which case leave it blank. 2410 2411 2412=head3 init_platform 2413 2414 $mm->init_platform 2415 2416Initialize any macros which are for platform specific use only. 2417 2418A typical one is the version number of your OS specific module. 2419(ie. MM_Unix_VERSION or MM_VMS_VERSION). 2420 2421=cut 2422 2423sub init_platform { 2424 return ''; 2425} 2426 2427 2428=head3 init_MAKE 2429 2430 $mm->init_MAKE 2431 2432Initialize MAKE from either a MAKE environment variable or $Config{make}. 2433 2434=cut 2435 2436sub init_MAKE { 2437 my $self = shift; 2438 2439 $self->{MAKE} ||= $ENV{MAKE} || $Config{make}; 2440} 2441 2442 2443=head2 Tools 2444 2445A grab bag of methods to generate specific macros and commands. 2446 2447 2448 2449=head3 manifypods 2450 2451Defines targets and routines to translate the pods into manpages and 2452put them into the INST_* directories. 2453 2454=cut 2455 2456sub manifypods { 2457 my $self = shift; 2458 2459 my $POD2MAN_macro = $self->POD2MAN_macro(); 2460 my $manifypods_target = $self->manifypods_target(); 2461 2462 return <<END_OF_TARGET; 2463 2464$POD2MAN_macro 2465 2466$manifypods_target 2467 2468END_OF_TARGET 2469 2470} 2471 2472 2473=head3 POD2MAN_macro 2474 2475 my $pod2man_macro = $self->POD2MAN_macro 2476 2477Returns a definition for the POD2MAN macro. This is a program 2478which emulates the pod2man utility. You can add more switches to the 2479command by simply appending them on the macro. 2480 2481Typical usage: 2482 2483 $(POD2MAN) --section=3 --perm_rw=$(PERM_RW) podfile1 man_page1 ... 2484 2485=cut 2486 2487sub POD2MAN_macro { 2488 my $self = shift; 2489 2490# Need the trailing '--' so perl stops gobbling arguments and - happens 2491# to be an alternative end of line separator on VMS so we quote it 2492 return <<'END_OF_DEF'; 2493POD2MAN_EXE = $(PERLRUN) "-MExtUtils::Command::MM" -e pod2man "--" 2494POD2MAN = $(POD2MAN_EXE) 2495END_OF_DEF 2496} 2497 2498 2499=head3 test_via_harness 2500 2501 my $command = $mm->test_via_harness($perl, $tests); 2502 2503Returns a $command line which runs the given set of $tests with 2504Test::Harness and the given $perl. 2505 2506Used on the t/*.t files. 2507 2508=cut 2509 2510sub test_via_harness { 2511 my($self, $perl, $tests) = @_; 2512 2513 return qq{\t$perl "-MExtUtils::Command::MM" "-MTest::Harness" }. 2514 qq{"-e" "undef *Test::Harness::Switches; test_harness(\$(TEST_VERBOSE), '\$(INST_LIB)', '\$(INST_ARCHLIB)')" $tests\n}; 2515} 2516 2517=head3 test_via_script 2518 2519 my $command = $mm->test_via_script($perl, $script); 2520 2521Returns a $command line which just runs a single test without 2522Test::Harness. No checks are done on the results, they're just 2523printed. 2524 2525Used for test.pl, since they don't always follow Test::Harness 2526formatting. 2527 2528=cut 2529 2530sub test_via_script { 2531 my($self, $perl, $script) = @_; 2532 return qq{\t$perl "-I\$(INST_LIB)" "-I\$(INST_ARCHLIB)" $script\n}; 2533} 2534 2535 2536=head3 tool_autosplit 2537 2538Defines a simple perl call that runs autosplit. May be deprecated by 2539pm_to_blib soon. 2540 2541=cut 2542 2543sub tool_autosplit { 2544 my($self, %attribs) = @_; 2545 2546 my $maxlen = $attribs{MAXLEN} ? '$$AutoSplit::Maxlen=$attribs{MAXLEN};' 2547 : ''; 2548 2549 my $asplit = $self->oneliner(sprintf <<'PERL_CODE', $maxlen); 2550use AutoSplit; %s autosplit($$ARGV[0], $$ARGV[1], 0, 1, 1) 2551PERL_CODE 2552 2553 return sprintf <<'MAKE_FRAG', $asplit; 2554# Usage: $(AUTOSPLITFILE) FileToSplit AutoDirToSplitInto 2555AUTOSPLITFILE = %s 2556 2557MAKE_FRAG 2558 2559} 2560 2561 2562=head3 arch_check 2563 2564 my $arch_ok = $mm->arch_check( 2565 $INC{"Config.pm"}, 2566 File::Spec->catfile($Config{archlibexp}, "Config.pm") 2567 ); 2568 2569A sanity check that what Perl thinks the architecture is and what 2570Config thinks the architecture is are the same. If they're not it 2571will return false and show a diagnostic message. 2572 2573When building Perl it will always return true, as nothing is installed 2574yet. 2575 2576The interface is a bit odd because this is the result of a 2577quick refactoring. Don't rely on it. 2578 2579=cut 2580 2581sub arch_check { 2582 my $self = shift; 2583 my($pconfig, $cconfig) = @_; 2584 2585 return 1 if $self->{PERL_SRC}; 2586 2587 my($pvol, $pthinks) = $self->splitpath($pconfig); 2588 my($cvol, $cthinks) = $self->splitpath($cconfig); 2589 2590 $pthinks = $self->canonpath($pthinks); 2591 $cthinks = $self->canonpath($cthinks); 2592 2593 my $ret = 1; 2594 if ($pthinks ne $cthinks) { 2595 print "Have $pthinks\n"; 2596 print "Want $cthinks\n"; 2597 2598 $ret = 0; 2599 2600 my $arch = (grep length, $self->splitdir($pthinks))[-1]; 2601 2602 print <<END unless $self->{UNINSTALLED_PERL}; 2603Your perl and your Config.pm seem to have different ideas about the 2604architecture they are running on. 2605Perl thinks: [$arch] 2606Config says: [$Config{archname}] 2607This may or may not cause problems. Please check your installation of perl 2608if you have problems building this extension. 2609END 2610 } 2611 2612 return $ret; 2613} 2614 2615 2616 2617=head2 File::Spec wrappers 2618 2619ExtUtils::MM_Any is a subclass of File::Spec. The methods noted here 2620override File::Spec. 2621 2622 2623 2624=head3 catfile 2625 2626File::Spec <= 0.83 has a bug where the file part of catfile is not 2627canonicalized. This override fixes that bug. 2628 2629=cut 2630 2631sub catfile { 2632 my $self = shift; 2633 return $self->canonpath($self->SUPER::catfile(@_)); 2634} 2635 2636 2637 2638=head2 Misc 2639 2640Methods I can't really figure out where they should go yet. 2641 2642 2643=head3 find_tests 2644 2645 my $test = $mm->find_tests; 2646 2647Returns a string suitable for feeding to the shell to return all 2648tests in t/*.t. 2649 2650=cut 2651 2652sub find_tests { 2653 my($self) = shift; 2654 return -d 't' ? 't/*.t' : ''; 2655} 2656 2657=head3 find_tests_recursive 2658 2659 my $tests = $mm->find_tests_recursive; 2660 2661Returns a string suitable for feeding to the shell to return all 2662tests in t/ but recursively. 2663 2664=cut 2665 2666sub find_tests_recursive { 2667 my($self) = shift; 2668 return '' unless -d 't'; 2669 2670 require File::Find; 2671 2672 my %testfiles; 2673 2674 my $wanted = sub { 2675 return unless m!\.t$!; 2676 my ($volume,$directories,$file) = 2677 File::Spec->splitpath( $File::Find::name ); 2678 my @dirs = File::Spec->splitdir( $directories ); 2679 for ( @dirs ) { 2680 next if $_ eq 't'; 2681 unless ( $_ ) { 2682 $_ = '*.t'; 2683 next; 2684 } 2685 $_ = '*'; 2686 } 2687 my $testfile = join '/', @dirs; 2688 $testfiles{ $testfile } = 1; 2689 }; 2690 2691 File::Find::find( $wanted, 't' ); 2692 2693 return join ' ', sort keys %testfiles; 2694} 2695 2696=head3 extra_clean_files 2697 2698 my @files_to_clean = $MM->extra_clean_files; 2699 2700Returns a list of OS specific files to be removed in the clean target in 2701addition to the usual set. 2702 2703=cut 2704 2705# An empty method here tickled a perl 5.8.1 bug and would return its object. 2706sub extra_clean_files { 2707 return; 2708} 2709 2710 2711=head3 installvars 2712 2713 my @installvars = $mm->installvars; 2714 2715A list of all the INSTALL* variables without the INSTALL prefix. Useful 2716for iteration or building related variable sets. 2717 2718=cut 2719 2720sub installvars { 2721 return qw(PRIVLIB SITELIB VENDORLIB 2722 ARCHLIB SITEARCH VENDORARCH 2723 BIN SITEBIN VENDORBIN 2724 SCRIPT SITESCRIPT VENDORSCRIPT 2725 MAN1DIR SITEMAN1DIR VENDORMAN1DIR 2726 MAN3DIR SITEMAN3DIR VENDORMAN3DIR 2727 ); 2728} 2729 2730 2731=head3 libscan 2732 2733 my $wanted = $self->libscan($path); 2734 2735Takes a path to a file or dir and returns an empty string if we don't 2736want to include this file in the library. Otherwise it returns the 2737the $path unchanged. 2738 2739Mainly used to exclude version control administrative directories from 2740installation. 2741 2742=cut 2743 2744sub libscan { 2745 my($self,$path) = @_; 2746 my($dirs,$file) = ($self->splitpath($path))[1,2]; 2747 return '' if grep /^(?:RCS|CVS|SCCS|\.svn|_darcs)$/, 2748 $self->splitdir($dirs), $file; 2749 2750 return $path; 2751} 2752 2753 2754=head3 platform_constants 2755 2756 my $make_frag = $mm->platform_constants 2757 2758Returns a make fragment defining all the macros initialized in 2759init_platform() rather than put them in constants(). 2760 2761=cut 2762 2763sub platform_constants { 2764 return ''; 2765} 2766 2767=begin private 2768 2769=head3 _PREREQ_PRINT 2770 2771 $self->_PREREQ_PRINT; 2772 2773Implements PREREQ_PRINT. 2774 2775Refactored out of MakeMaker->new(). 2776 2777=end private 2778 2779=cut 2780 2781sub _PREREQ_PRINT { 2782 my $self = shift; 2783 2784 require Data::Dumper; 2785 my @what = ('PREREQ_PM'); 2786 push @what, 'MIN_PERL_VERSION' if $self->{MIN_PERL_VERSION}; 2787 push @what, 'BUILD_REQUIRES' if $self->{BUILD_REQUIRES}; 2788 print Data::Dumper->Dump([@{$self}{@what}], \@what); 2789 exit 0; 2790} 2791 2792 2793=begin private 2794 2795=head3 _PRINT_PREREQ 2796 2797 $mm->_PRINT_PREREQ; 2798 2799Implements PRINT_PREREQ, a slightly different version of PREREQ_PRINT 2800added by Redhat to, I think, support generating RPMs from Perl modules. 2801 2802Should not include BUILD_REQUIRES as RPMs do not incluide them. 2803 2804Refactored out of MakeMaker->new(). 2805 2806=end private 2807 2808=cut 2809 2810sub _PRINT_PREREQ { 2811 my $self = shift; 2812 2813 my $prereqs= $self->{PREREQ_PM}; 2814 my @prereq = map { [$_, $prereqs->{$_}] } keys %$prereqs; 2815 2816 if ( $self->{MIN_PERL_VERSION} ) { 2817 push @prereq, ['perl' => $self->{MIN_PERL_VERSION}]; 2818 } 2819 2820 print join(" ", map { "perl($_->[0])>=$_->[1] " } 2821 sort { $a->[0] cmp $b->[0] } @prereq), "\n"; 2822 exit 0; 2823} 2824 2825 2826=begin private 2827 2828=head3 _all_prereqs 2829 2830 my $prereqs = $self->_all_prereqs; 2831 2832Returns a hash ref of both PREREQ_PM and BUILD_REQUIRES. 2833 2834=end private 2835 2836=cut 2837 2838sub _all_prereqs { 2839 my $self = shift; 2840 2841 return { %{$self->{PREREQ_PM}}, %{$self->{BUILD_REQUIRES}} }; 2842} 2843 2844=begin private 2845 2846=head3 _perl_header_files 2847 2848 my $perl_header_files= $self->_perl_header_files; 2849 2850returns a sorted list of header files as found in PERL_SRC or $archlibexp/CORE. 2851 2852Used by perldepend() in MM_Unix and MM_VMS via _perl_header_files_fragment() 2853 2854=end private 2855 2856=cut 2857 2858sub _perl_header_files { 2859 my $self = shift; 2860 2861 my $header_dir = $self->{PERL_SRC} || $ENV{PERL_SRC} || $self->catdir($Config{archlibexp}, 'CORE'); 2862 opendir my $dh, $header_dir 2863 or die "Failed to opendir '$header_dir' to find header files: $!"; 2864 2865 # we need to use a temporary here as the sort in scalar context would have undefined results. 2866 my @perl_headers= sort grep { /\.h\z/ } readdir($dh); 2867 2868 closedir $dh; 2869 2870 return @perl_headers; 2871} 2872 2873=begin private 2874 2875=head3 _perl_header_files_fragment ($o, $separator) 2876 2877 my $perl_header_files_fragment= $self->_perl_header_files_fragment("/"); 2878 2879return a Makefile fragment which holds the list of perl header files which 2880XS code depends on $(PERL_INC), and sets up the dependency for the $(OBJECT) file. 2881 2882The $separator argument defaults to "". MM_VMS will set it to "" and MM_UNIX to "/" 2883in perldepend(). This reason child subclasses need to control this is that in 2884VMS the $(PERL_INC) directory will already have delimiters in it, but in 2885UNIX $(PERL_INC) will need a slash between it an the filename. Hypothetically 2886win32 could use "\\" (but it doesn't need to). 2887 2888=end private 2889 2890=cut 2891 2892sub _perl_header_files_fragment { 2893 my ($self, $separator)= @_; 2894 $separator ||= ""; 2895 return join("\\\n", 2896 "PERL_HDRS = ", 2897 map { 2898 sprintf( " \$(PERL_INCDEP)%s%s ", $separator, $_ ) 2899 } $self->_perl_header_files() 2900 ) . "\n\n" 2901 . "\$(OBJECT) : \$(PERL_HDRS)\n"; 2902} 2903 2904 2905=head1 AUTHOR 2906 2907Michael G Schwern <schwern@pobox.com> and the denizens of 2908makemaker@perl.org with code from ExtUtils::MM_Unix and 2909ExtUtils::MM_Win32. 2910 2911 2912=cut 2913 29141; 2915