1package ExtUtils::MM_Unix; 2 3require 5.006; 4 5use strict; 6 7use Carp; 8use ExtUtils::MakeMaker::Config; 9use File::Basename qw(basename dirname); 10use DirHandle; 11 12our %Config_Override; 13 14use ExtUtils::MakeMaker qw($Verbose neatvalue); 15 16# If we make $VERSION an our variable parse_version() breaks 17use vars qw($VERSION); 18$VERSION = '7.10_02'; 19$VERSION = eval $VERSION; ## no critic [BuiltinFunctions::ProhibitStringyEval] 20 21require ExtUtils::MM_Any; 22our @ISA = qw(ExtUtils::MM_Any); 23 24my %Is; 25BEGIN { 26 $Is{OS2} = $^O eq 'os2'; 27 $Is{Win32} = $^O eq 'MSWin32' || $Config{osname} eq 'NetWare'; 28 $Is{Dos} = $^O eq 'dos'; 29 $Is{VMS} = $^O eq 'VMS'; 30 $Is{OSF} = $^O eq 'dec_osf'; 31 $Is{IRIX} = $^O eq 'irix'; 32 $Is{NetBSD} = $^O eq 'netbsd'; 33 $Is{Interix} = $^O eq 'interix'; 34 $Is{SunOS4} = $^O eq 'sunos'; 35 $Is{Solaris} = $^O eq 'solaris'; 36 $Is{SunOS} = $Is{SunOS4} || $Is{Solaris}; 37 $Is{BSD} = ($^O =~ /^(?:free|net|open)bsd$/ or 38 grep( $^O eq $_, qw(bsdos interix dragonfly) ) 39 ); 40 $Is{Android} = $^O =~ /android/; 41} 42 43BEGIN { 44 if( $Is{VMS} ) { 45 # For things like vmsify() 46 require VMS::Filespec; 47 VMS::Filespec->import; 48 } 49} 50 51 52=head1 NAME 53 54ExtUtils::MM_Unix - methods used by ExtUtils::MakeMaker 55 56=head1 SYNOPSIS 57 58C<require ExtUtils::MM_Unix;> 59 60=head1 DESCRIPTION 61 62The methods provided by this package are designed to be used in 63conjunction with ExtUtils::MakeMaker. When MakeMaker writes a 64Makefile, it creates one or more objects that inherit their methods 65from a package C<MM>. MM itself doesn't provide any methods, but it 66ISA ExtUtils::MM_Unix class. The inheritance tree of MM lets operating 67specific packages take the responsibility for all the methods provided 68by MM_Unix. We are trying to reduce the number of the necessary 69overrides by defining rather primitive operations within 70ExtUtils::MM_Unix. 71 72If you are going to write a platform specific MM package, please try 73to limit the necessary overrides to primitive methods, and if it is not 74possible to do so, let's work out how to achieve that gain. 75 76If you are overriding any of these methods in your Makefile.PL (in the 77MY class), please report that to the makemaker mailing list. We are 78trying to minimize the necessary method overrides and switch to data 79driven Makefile.PLs wherever possible. In the long run less methods 80will be overridable via the MY class. 81 82=head1 METHODS 83 84The following description of methods is still under 85development. Please refer to the code for not suitably documented 86sections and complain loudly to the makemaker@perl.org mailing list. 87Better yet, provide a patch. 88 89Not all of the methods below are overridable in a 90Makefile.PL. Overridable methods are marked as (o). All methods are 91overridable by a platform specific MM_*.pm file. 92 93Cross-platform methods are being moved into MM_Any. If you can't find 94something that used to be in here, look in MM_Any. 95 96=cut 97 98# So we don't have to keep calling the methods over and over again, 99# we have these globals to cache the values. Faster and shrtr. 100my $Curdir = __PACKAGE__->curdir; 101my $Rootdir = __PACKAGE__->rootdir; 102my $Updir = __PACKAGE__->updir; 103 104 105=head2 Methods 106 107=over 4 108 109=item os_flavor 110 111Simply says that we're Unix. 112 113=cut 114 115sub os_flavor { 116 return('Unix'); 117} 118 119 120=item c_o (o) 121 122Defines the suffix rules to compile different flavors of C files to 123object files. 124 125=cut 126 127sub c_o { 128# --- Translation Sections --- 129 130 my($self) = shift; 131 return '' unless $self->needs_linking(); 132 my(@m); 133 134 my $command = '$(CCCMD)'; 135 my $flags = '$(CCCDLFLAGS) "-I$(PERL_INC)" $(PASTHRU_DEFINE) $(DEFINE)'; 136 137 if (my $cpp = $Config{cpprun}) { 138 my $cpp_cmd = $self->const_cccmd; 139 $cpp_cmd =~ s/^CCCMD\s*=\s*\$\(CC\)/$cpp/; 140 push @m, qq{ 141.c.i: 142 $cpp_cmd $flags \$*.c > \$*.i 143}; 144 } 145 146 push @m, qq{ 147.c.s: 148 $command -S $flags \$*.c 149 150.c\$(OBJ_EXT): 151 $command $flags \$*.c 152 153.cpp\$(OBJ_EXT): 154 $command $flags \$*.cpp 155 156.cxx\$(OBJ_EXT): 157 $command $flags \$*.cxx 158 159.cc\$(OBJ_EXT): 160 $command $flags \$*.cc 161}; 162 163 push @m, qq{ 164.C\$(OBJ_EXT): 165 $command $flags \$*.C 166} if !$Is{OS2} and !$Is{Win32} and !$Is{Dos}; #Case-specific 167 168 return join "", @m; 169} 170 171=item cflags (o) 172 173Does very much the same as the cflags script in the perl 174distribution. It doesn't return the whole compiler command line, but 175initializes all of its parts. The const_cccmd method then actually 176returns the definition of the CCCMD macro which uses these parts. 177 178=cut 179 180#' 181 182sub cflags { 183 my($self,$libperl)=@_; 184 return $self->{CFLAGS} if $self->{CFLAGS}; 185 return '' unless $self->needs_linking(); 186 187 my($prog, $uc, $perltype, %cflags); 188 $libperl ||= $self->{LIBPERL_A} || "libperl$self->{LIB_EXT}" ; 189 $libperl =~ s/\.\$\(A\)$/$self->{LIB_EXT}/; 190 191 @cflags{qw(cc ccflags optimize shellflags)} 192 = @Config{qw(cc ccflags optimize shellflags)}; 193 194 # Perl 5.21.4 adds the (gcc) warning (-Wall ...) and std (-std=c89) 195 # flags to the %Config, and the modules in the core should be built 196 # with the warning flags, but NOT the -std=c89 flags (the latter 197 # would break using any system header files that are strict C99). 198 my @ccextraflags = qw(ccwarnflags); 199 if ($ENV{PERL_CORE}) { 200 for my $x (@ccextraflags) { 201 if (exists $Config{$x}) { 202 $cflags{$x} = $Config{$x}; 203 } 204 } 205 } 206 207 my($optdebug) = ""; 208 209 $cflags{shellflags} ||= ''; 210 211 my(%map) = ( 212 D => '-DDEBUGGING', 213 E => '-DEMBED', 214 DE => '-DDEBUGGING -DEMBED', 215 M => '-DEMBED -DMULTIPLICITY', 216 DM => '-DDEBUGGING -DEMBED -DMULTIPLICITY', 217 ); 218 219 if ($libperl =~ /libperl(\w*)\Q$self->{LIB_EXT}/){ 220 $uc = uc($1); 221 } else { 222 $uc = ""; # avoid warning 223 } 224 $perltype = $map{$uc} ? $map{$uc} : ""; 225 226 if ($uc =~ /^D/) { 227 $optdebug = "-g"; 228 } 229 230 231 my($name); 232 ( $name = $self->{NAME} . "_cflags" ) =~ s/:/_/g ; 233 if ($prog = $Config{$name}) { 234 # Expand hints for this extension via the shell 235 print "Processing $name hint:\n" if $Verbose; 236 my(@o)=`cc=\"$cflags{cc}\" 237 ccflags=\"$cflags{ccflags}\" 238 optimize=\"$cflags{optimize}\" 239 perltype=\"$cflags{perltype}\" 240 optdebug=\"$cflags{optdebug}\" 241 eval '$prog' 242 echo cc=\$cc 243 echo ccflags=\$ccflags 244 echo optimize=\$optimize 245 echo perltype=\$perltype 246 echo optdebug=\$optdebug 247 `; 248 foreach my $line (@o){ 249 chomp $line; 250 if ($line =~ /(.*?)=\s*(.*)\s*$/){ 251 $cflags{$1} = $2; 252 print " $1 = $2\n" if $Verbose; 253 } else { 254 print "Unrecognised result from hint: '$line'\n"; 255 } 256 } 257 } 258 259 if ($optdebug) { 260 $cflags{optimize} = $optdebug; 261 } 262 263 for (qw(ccflags optimize perltype)) { 264 $cflags{$_} ||= ''; 265 $cflags{$_} =~ s/^\s+//; 266 $cflags{$_} =~ s/\s+/ /g; 267 $cflags{$_} =~ s/\s+$//; 268 $self->{uc $_} ||= $cflags{$_}; 269 } 270 271 if ($self->{POLLUTE}) { 272 $self->{CCFLAGS} .= ' -DPERL_POLLUTE '; 273 } 274 275 for my $x (@ccextraflags) { 276 next unless exists $cflags{$x}; 277 $self->{CCFLAGS} .= $cflags{$x} =~ m!^\s! ? $cflags{$x} : ' ' . $cflags{$x}; 278 } 279 280 my $pollute = ''; 281 if ($Config{usemymalloc} and not $Config{bincompat5005} 282 and not $Config{ccflags} =~ /-DPERL_POLLUTE_MALLOC\b/ 283 and $self->{PERL_MALLOC_OK}) { 284 $pollute = '$(PERL_MALLOC_DEF)'; 285 } 286 287 $self->{CCFLAGS} = quote_paren($self->{CCFLAGS}); 288 $self->{OPTIMIZE} = quote_paren($self->{OPTIMIZE}); 289 290 return $self->{CFLAGS} = qq{ 291CCFLAGS = $self->{CCFLAGS} 292OPTIMIZE = $self->{OPTIMIZE} 293PERLTYPE = $self->{PERLTYPE} 294MPOLLUTE = $pollute 295}; 296 297} 298 299 300=item const_cccmd (o) 301 302Returns the full compiler call for C programs and stores the 303definition in CONST_CCCMD. 304 305=cut 306 307sub const_cccmd { 308 my($self,$libperl)=@_; 309 return $self->{CONST_CCCMD} if $self->{CONST_CCCMD}; 310 return '' unless $self->needs_linking(); 311 return $self->{CONST_CCCMD} = 312 q{CCCMD = $(CC) -c $(PASTHRU_INC) $(INC) \\ 313 $(CCFLAGS) $(OPTIMIZE) \\ 314 $(PERLTYPE) $(MPOLLUTE) $(DEFINE_VERSION) \\ 315 $(XS_DEFINE_VERSION)}; 316} 317 318=item const_config (o) 319 320Sets SHELL if needed, then defines a couple of constants in the Makefile 321that are imported from %Config. 322 323=cut 324 325sub const_config { 326# --- Constants Sections --- 327 328 my($self) = shift; 329 my @m = $self->specify_shell(); # Usually returns empty string 330 push @m, <<"END"; 331 332# These definitions are from config.sh (via $INC{'Config.pm'}). 333# They may have been overridden via Makefile.PL or on the command line. 334END 335 336 my(%once_only); 337 foreach my $key (@{$self->{CONFIG}}){ 338 # SITE*EXP macros are defined in &constants; avoid duplicates here 339 next if $once_only{$key}; 340 $self->{uc $key} = quote_paren($self->{uc $key}); 341 push @m, uc($key) , ' = ' , $self->{uc $key}, "\n"; 342 $once_only{$key} = 1; 343 } 344 join('', @m); 345} 346 347=item const_loadlibs (o) 348 349Defines EXTRALIBS, LDLOADLIBS, BSLOADLIBS, LD_RUN_PATH. See 350L<ExtUtils::Liblist> for details. 351 352=cut 353 354sub const_loadlibs { 355 my($self) = shift; 356 return "" unless $self->needs_linking; 357 my @m; 358 push @m, qq{ 359# $self->{NAME} might depend on some other libraries: 360# See ExtUtils::Liblist for details 361# 362}; 363 for my $tmp (qw/ 364 EXTRALIBS LDLOADLIBS BSLOADLIBS 365 /) { 366 next unless defined $self->{$tmp}; 367 push @m, "$tmp = $self->{$tmp}\n"; 368 } 369 # don't set LD_RUN_PATH if empty 370 for my $tmp (qw/ 371 LD_RUN_PATH 372 /) { 373 next unless $self->{$tmp}; 374 push @m, "$tmp = $self->{$tmp}\n"; 375 } 376 return join "", @m; 377} 378 379=item constants (o) 380 381 my $make_frag = $mm->constants; 382 383Prints out macros for lots of constants. 384 385=cut 386 387sub constants { 388 my($self) = @_; 389 my @m = (); 390 391 $self->{DFSEP} = '$(DIRFILESEP)'; # alias for internal use 392 393 for my $macro (qw( 394 395 AR_STATIC_ARGS DIRFILESEP DFSEP 396 NAME NAME_SYM 397 VERSION VERSION_MACRO VERSION_SYM DEFINE_VERSION 398 XS_VERSION XS_VERSION_MACRO XS_DEFINE_VERSION 399 INST_ARCHLIB INST_SCRIPT INST_BIN INST_LIB 400 INST_MAN1DIR INST_MAN3DIR 401 MAN1EXT MAN3EXT 402 INSTALLDIRS INSTALL_BASE DESTDIR PREFIX 403 PERLPREFIX SITEPREFIX VENDORPREFIX 404 ), 405 (map { ("INSTALL".$_, 406 "DESTINSTALL".$_) 407 } $self->installvars), 408 qw( 409 PERL_LIB 410 PERL_ARCHLIB PERL_ARCHLIBDEP 411 LIBPERL_A MYEXTLIB 412 FIRST_MAKEFILE MAKEFILE_OLD MAKE_APERL_FILE 413 PERLMAINCC PERL_SRC PERL_INC PERL_INCDEP 414 PERL FULLPERL ABSPERL 415 PERLRUN FULLPERLRUN ABSPERLRUN 416 PERLRUNINST FULLPERLRUNINST ABSPERLRUNINST 417 PERL_CORE 418 PERM_DIR PERM_RW PERM_RWX 419 420 ) ) 421 { 422 next unless defined $self->{$macro}; 423 424 # pathnames can have sharp signs in them; escape them so 425 # make doesn't think it is a comment-start character. 426 $self->{$macro} =~ s/#/\\#/g; 427 $self->{$macro} = $self->quote_dep($self->{$macro}) 428 if $ExtUtils::MakeMaker::macro_dep{$macro}; 429 push @m, "$macro = $self->{$macro}\n"; 430 } 431 432 push @m, qq{ 433MAKEMAKER = $self->{MAKEMAKER} 434MM_VERSION = $self->{MM_VERSION} 435MM_REVISION = $self->{MM_REVISION} 436}; 437 438 push @m, q{ 439# FULLEXT = Pathname for extension directory (eg Foo/Bar/Oracle). 440# BASEEXT = Basename part of FULLEXT. May be just equal FULLEXT. (eg Oracle) 441# PARENT_NAME = NAME without BASEEXT and no trailing :: (eg Foo::Bar) 442# DLBASE = Basename part of dynamic library. May be just equal BASEEXT. 443}; 444 445 for my $macro (qw/ 446 MAKE 447 FULLEXT BASEEXT PARENT_NAME DLBASE VERSION_FROM INC DEFINE OBJECT 448 LDFROM LINKTYPE BOOTDEP 449 / ) 450 { 451 next unless defined $self->{$macro}; 452 push @m, "$macro = $self->{$macro}\n"; 453 } 454 455 push @m, " 456# Handy lists of source code files: 457XS_FILES = ".$self->wraplist(sort keys %{$self->{XS}})." 458C_FILES = ".$self->wraplist(@{$self->{C}})." 459O_FILES = ".$self->wraplist(@{$self->{O_FILES}})." 460H_FILES = ".$self->wraplist(@{$self->{H}})." 461MAN1PODS = ".$self->wraplist(sort keys %{$self->{MAN1PODS}})." 462MAN3PODS = ".$self->wraplist(sort keys %{$self->{MAN3PODS}})." 463"; 464 465 466 push @m, q{ 467# Where is the Config information that we are using/depend on 468CONFIGDEP = $(PERL_ARCHLIBDEP)$(DFSEP)Config.pm $(PERL_INCDEP)$(DFSEP)config.h 469} if -e File::Spec->catfile( $self->{PERL_INC}, 'config.h' ); 470 471 472 push @m, qq{ 473# Where to build things 474INST_LIBDIR = $self->{INST_LIBDIR} 475INST_ARCHLIBDIR = $self->{INST_ARCHLIBDIR} 476 477INST_AUTODIR = $self->{INST_AUTODIR} 478INST_ARCHAUTODIR = $self->{INST_ARCHAUTODIR} 479 480INST_STATIC = $self->{INST_STATIC} 481INST_DYNAMIC = $self->{INST_DYNAMIC} 482INST_BOOT = $self->{INST_BOOT} 483}; 484 485 push @m, qq{ 486# Extra linker info 487EXPORT_LIST = $self->{EXPORT_LIST} 488PERL_ARCHIVE = $self->{PERL_ARCHIVE} 489PERL_ARCHIVEDEP = $self->{PERL_ARCHIVEDEP} 490PERL_ARCHIVE_AFTER = $self->{PERL_ARCHIVE_AFTER} 491}; 492 493 push @m, " 494 495TO_INST_PM = ".$self->wraplist(sort keys %{$self->{PM}})." 496 497PM_TO_BLIB = ".$self->wraplist(map { ($_ => $self->{PM}->{$_}) } sort keys %{$self->{PM}})." 498"; 499 500 join('',@m); 501} 502 503 504=item depend (o) 505 506Same as macro for the depend attribute. 507 508=cut 509 510sub depend { 511 my($self,%attribs) = @_; 512 my(@m,$key,$val); 513 while (($key,$val) = each %attribs){ 514 last unless defined $key; 515 push @m, "$key : $val\n"; 516 } 517 join "", @m; 518} 519 520 521=item init_DEST 522 523 $mm->init_DEST 524 525Defines the DESTDIR and DEST* variables paralleling the INSTALL*. 526 527=cut 528 529sub init_DEST { 530 my $self = shift; 531 532 # Initialize DESTDIR 533 $self->{DESTDIR} ||= ''; 534 535 # Make DEST variables. 536 foreach my $var ($self->installvars) { 537 my $destvar = 'DESTINSTALL'.$var; 538 $self->{$destvar} ||= '$(DESTDIR)$(INSTALL'.$var.')'; 539 } 540} 541 542 543=item init_dist 544 545 $mm->init_dist; 546 547Defines a lot of macros for distribution support. 548 549 macro description default 550 551 TAR tar command to use tar 552 TARFLAGS flags to pass to TAR cvf 553 554 ZIP zip command to use zip 555 ZIPFLAGS flags to pass to ZIP -r 556 557 COMPRESS compression command to gzip --best 558 use for tarfiles 559 SUFFIX suffix to put on .gz 560 compressed files 561 562 SHAR shar command to use shar 563 564 PREOP extra commands to run before 565 making the archive 566 POSTOP extra commands to run after 567 making the archive 568 569 TO_UNIX a command to convert linefeeds 570 to Unix style in your archive 571 572 CI command to checkin your ci -u 573 sources to version control 574 RCS_LABEL command to label your sources rcs -Nv$(VERSION_SYM): -q 575 just after CI is run 576 577 DIST_CP $how argument to manicopy() best 578 when the distdir is created 579 580 DIST_DEFAULT default target to use to tardist 581 create a distribution 582 583 DISTVNAME name of the resulting archive $(DISTNAME)-$(VERSION) 584 (minus suffixes) 585 586=cut 587 588sub init_dist { 589 my $self = shift; 590 591 $self->{TAR} ||= 'tar'; 592 $self->{TARFLAGS} ||= 'cvf'; 593 $self->{ZIP} ||= 'zip'; 594 $self->{ZIPFLAGS} ||= '-r'; 595 $self->{COMPRESS} ||= 'gzip --best'; 596 $self->{SUFFIX} ||= '.gz'; 597 $self->{SHAR} ||= 'shar'; 598 $self->{PREOP} ||= '$(NOECHO) $(NOOP)'; # eg update MANIFEST 599 $self->{POSTOP} ||= '$(NOECHO) $(NOOP)'; # eg remove the distdir 600 $self->{TO_UNIX} ||= '$(NOECHO) $(NOOP)'; 601 602 $self->{CI} ||= 'ci -u'; 603 $self->{RCS_LABEL}||= 'rcs -Nv$(VERSION_SYM): -q'; 604 $self->{DIST_CP} ||= 'best'; 605 $self->{DIST_DEFAULT} ||= 'tardist'; 606 607 ($self->{DISTNAME} = $self->{NAME}) =~ s{::}{-}g unless $self->{DISTNAME}; 608 $self->{DISTVNAME} ||= $self->{DISTNAME}.'-'.$self->{VERSION}; 609} 610 611=item dist (o) 612 613 my $dist_macros = $mm->dist(%overrides); 614 615Generates a make fragment defining all the macros initialized in 616init_dist. 617 618%overrides can be used to override any of the above. 619 620=cut 621 622sub dist { 623 my($self, %attribs) = @_; 624 625 my $make = ''; 626 if ( $attribs{SUFFIX} && $attribs{SUFFIX} !~ m!^\.! ) { 627 $attribs{SUFFIX} = '.' . $attribs{SUFFIX}; 628 } 629 foreach my $key (qw( 630 TAR TARFLAGS ZIP ZIPFLAGS COMPRESS SUFFIX SHAR 631 PREOP POSTOP TO_UNIX 632 CI RCS_LABEL DIST_CP DIST_DEFAULT 633 DISTNAME DISTVNAME 634 )) 635 { 636 my $value = $attribs{$key} || $self->{$key}; 637 $make .= "$key = $value\n"; 638 } 639 640 return $make; 641} 642 643=item dist_basics (o) 644 645Defines the targets distclean, distcheck, skipcheck, manifest, veryclean. 646 647=cut 648 649sub dist_basics { 650 my($self) = shift; 651 652 return <<'MAKE_FRAG'; 653distclean :: realclean distcheck 654 $(NOECHO) $(NOOP) 655 656distcheck : 657 $(PERLRUN) "-MExtUtils::Manifest=fullcheck" -e fullcheck 658 659skipcheck : 660 $(PERLRUN) "-MExtUtils::Manifest=skipcheck" -e skipcheck 661 662manifest : 663 $(PERLRUN) "-MExtUtils::Manifest=mkmanifest" -e mkmanifest 664 665veryclean : realclean 666 $(RM_F) *~ */*~ *.orig */*.orig *.bak */*.bak *.old */*.old 667 668MAKE_FRAG 669 670} 671 672=item dist_ci (o) 673 674Defines a check in target for RCS. 675 676=cut 677 678sub dist_ci { 679 my($self) = shift; 680 return sprintf "ci :\n\t%s\n", $self->oneliner(<<'EOF', [qw(-MExtUtils::Manifest=maniread)]); 681@all = sort keys %{ maniread() }; 682print(qq{Executing $(CI) @all\n}); 683system(qq{$(CI) @all}) == 0 or die $!; 684print(qq{Executing $(RCS_LABEL) ...\n}); 685system(qq{$(RCS_LABEL) @all}) == 0 or die $!; 686EOF 687} 688 689=item dist_core (o) 690 691 my $dist_make_fragment = $MM->dist_core; 692 693Puts the targets necessary for 'make dist' together into one make 694fragment. 695 696=cut 697 698sub dist_core { 699 my($self) = shift; 700 701 my $make_frag = ''; 702 foreach my $target (qw(dist tardist uutardist tarfile zipdist zipfile 703 shdist)) 704 { 705 my $method = $target.'_target'; 706 $make_frag .= "\n"; 707 $make_frag .= $self->$method(); 708 } 709 710 return $make_frag; 711} 712 713 714=item B<dist_target> 715 716 my $make_frag = $MM->dist_target; 717 718Returns the 'dist' target to make an archive for distribution. This 719target simply checks to make sure the Makefile is up-to-date and 720depends on $(DIST_DEFAULT). 721 722=cut 723 724sub dist_target { 725 my($self) = shift; 726 727 my $date_check = $self->oneliner(<<'CODE', ['-l']); 728print 'Warning: Makefile possibly out of date with $(VERSION_FROM)' 729 if -e '$(VERSION_FROM)' and -M '$(VERSION_FROM)' < -M '$(FIRST_MAKEFILE)'; 730CODE 731 732 return sprintf <<'MAKE_FRAG', $date_check; 733dist : $(DIST_DEFAULT) $(FIRST_MAKEFILE) 734 $(NOECHO) %s 735MAKE_FRAG 736} 737 738=item B<tardist_target> 739 740 my $make_frag = $MM->tardist_target; 741 742Returns the 'tardist' target which is simply so 'make tardist' works. 743The real work is done by the dynamically named tardistfile_target() 744method, tardist should have that as a dependency. 745 746=cut 747 748sub tardist_target { 749 my($self) = shift; 750 751 return <<'MAKE_FRAG'; 752tardist : $(DISTVNAME).tar$(SUFFIX) 753 $(NOECHO) $(NOOP) 754MAKE_FRAG 755} 756 757=item B<zipdist_target> 758 759 my $make_frag = $MM->zipdist_target; 760 761Returns the 'zipdist' target which is simply so 'make zipdist' works. 762The real work is done by the dynamically named zipdistfile_target() 763method, zipdist should have that as a dependency. 764 765=cut 766 767sub zipdist_target { 768 my($self) = shift; 769 770 return <<'MAKE_FRAG'; 771zipdist : $(DISTVNAME).zip 772 $(NOECHO) $(NOOP) 773MAKE_FRAG 774} 775 776=item B<tarfile_target> 777 778 my $make_frag = $MM->tarfile_target; 779 780The name of this target is the name of the tarball generated by 781tardist. This target does the actual work of turning the distdir into 782a tarball. 783 784=cut 785 786sub tarfile_target { 787 my($self) = shift; 788 789 return <<'MAKE_FRAG'; 790$(DISTVNAME).tar$(SUFFIX) : distdir 791 $(PREOP) 792 $(TO_UNIX) 793 $(TAR) $(TARFLAGS) $(DISTVNAME).tar $(DISTVNAME) 794 $(RM_RF) $(DISTVNAME) 795 $(COMPRESS) $(DISTVNAME).tar 796 $(NOECHO) $(ECHO) 'Created $(DISTVNAME).tar$(SUFFIX)' 797 $(POSTOP) 798MAKE_FRAG 799} 800 801=item zipfile_target 802 803 my $make_frag = $MM->zipfile_target; 804 805The name of this target is the name of the zip file generated by 806zipdist. This target does the actual work of turning the distdir into 807a zip file. 808 809=cut 810 811sub zipfile_target { 812 my($self) = shift; 813 814 return <<'MAKE_FRAG'; 815$(DISTVNAME).zip : distdir 816 $(PREOP) 817 $(ZIP) $(ZIPFLAGS) $(DISTVNAME).zip $(DISTVNAME) 818 $(RM_RF) $(DISTVNAME) 819 $(NOECHO) $(ECHO) 'Created $(DISTVNAME).zip' 820 $(POSTOP) 821MAKE_FRAG 822} 823 824=item uutardist_target 825 826 my $make_frag = $MM->uutardist_target; 827 828Converts the tarfile into a uuencoded file 829 830=cut 831 832sub uutardist_target { 833 my($self) = shift; 834 835 return <<'MAKE_FRAG'; 836uutardist : $(DISTVNAME).tar$(SUFFIX) 837 uuencode $(DISTVNAME).tar$(SUFFIX) $(DISTVNAME).tar$(SUFFIX) > $(DISTVNAME).tar$(SUFFIX)_uu 838 $(NOECHO) $(ECHO) 'Created $(DISTVNAME).tar$(SUFFIX)_uu' 839MAKE_FRAG 840} 841 842 843=item shdist_target 844 845 my $make_frag = $MM->shdist_target; 846 847Converts the distdir into a shell archive. 848 849=cut 850 851sub shdist_target { 852 my($self) = shift; 853 854 return <<'MAKE_FRAG'; 855shdist : distdir 856 $(PREOP) 857 $(SHAR) $(DISTVNAME) > $(DISTVNAME).shar 858 $(RM_RF) $(DISTVNAME) 859 $(NOECHO) $(ECHO) 'Created $(DISTVNAME).shar' 860 $(POSTOP) 861MAKE_FRAG 862} 863 864 865=item dlsyms (o) 866 867Used by some OS' to define DL_FUNCS and DL_VARS and write the *.exp files. 868 869Normally just returns an empty string. 870 871=cut 872 873sub dlsyms { 874 return ''; 875} 876 877 878=item dynamic_bs (o) 879 880Defines targets for bootstrap files. 881 882=cut 883 884sub dynamic_bs { 885 my($self, %attribs) = @_; 886 return ' 887BOOTSTRAP = 888' unless $self->has_link_code(); 889 890 my $target = $Is{VMS} ? '$(MMS$TARGET)' : '$@'; 891 892 return sprintf <<'MAKE_FRAG', ($target) x 2; 893BOOTSTRAP = $(BASEEXT).bs 894 895# As Mkbootstrap might not write a file (if none is required) 896# we use touch to prevent make continually trying to remake it. 897# The DynaLoader only reads a non-empty file. 898$(BOOTSTRAP) : $(FIRST_MAKEFILE) $(BOOTDEP) $(INST_ARCHAUTODIR)$(DFSEP).exists 899 $(NOECHO) $(ECHO) "Running Mkbootstrap for $(NAME) ($(BSLOADLIBS))" 900 $(NOECHO) $(PERLRUN) \ 901 "-MExtUtils::Mkbootstrap" \ 902 -e "Mkbootstrap('$(BASEEXT)','$(BSLOADLIBS)');" 903 $(NOECHO) $(TOUCH) "%s" 904 $(CHMOD) $(PERM_RW) "%s" 905MAKE_FRAG 906} 907 908=item dynamic_lib (o) 909 910Defines how to produce the *.so (or equivalent) files. 911 912=cut 913 914sub dynamic_lib { 915 my($self, %attribs) = @_; 916 return '' unless $self->needs_linking(); #might be because of a subdir 917 918 return '' unless $self->has_link_code; 919 920 my($otherldflags) = $attribs{OTHERLDFLAGS} || ""; 921 my($inst_dynamic_dep) = $attribs{INST_DYNAMIC_DEP} || ""; 922 my($armaybe) = $attribs{ARMAYBE} || $self->{ARMAYBE} || ":"; 923 my($ldfrom) = '$(LDFROM)'; 924 $armaybe = 'ar' if ($Is{OSF} and $armaybe eq ':'); 925 my(@m); 926 my $ld_opt = $Is{OS2} ? '$(OPTIMIZE) ' : ''; # Useful on other systems too? 927 my $ld_fix = $Is{OS2} ? '|| ( $(RM_F) $@ && sh -c false )' : ''; 928 push(@m,' 929# This section creates the dynamically loadable $(INST_DYNAMIC) 930# from $(OBJECT) and possibly $(MYEXTLIB). 931ARMAYBE = '.$armaybe.' 932OTHERLDFLAGS = '.$ld_opt.$otherldflags.' 933INST_DYNAMIC_DEP = '.$inst_dynamic_dep.' 934INST_DYNAMIC_FIX = '.$ld_fix.' 935 936$(INST_DYNAMIC): $(OBJECT) $(MYEXTLIB) $(INST_ARCHAUTODIR)$(DFSEP).exists $(EXPORT_LIST) $(PERL_ARCHIVEDEP) $(PERL_ARCHIVE_AFTER) $(INST_DYNAMIC_DEP) 937'); 938 if ($armaybe ne ':'){ 939 $ldfrom = 'tmp$(LIB_EXT)'; 940 push(@m,' $(ARMAYBE) cr '.$ldfrom.' $(OBJECT)'."\n"); 941 push(@m,' $(RANLIB) '."$ldfrom\n"); 942 } 943 $ldfrom = "-all $ldfrom -none" if $Is{OSF}; 944 945 # The IRIX linker doesn't use LD_RUN_PATH 946 my $ldrun = $Is{IRIX} && $self->{LD_RUN_PATH} ? 947 qq{-rpath "$self->{LD_RUN_PATH}"} : ''; 948 949 # For example in AIX the shared objects/libraries from previous builds 950 # linger quite a while in the shared dynalinker cache even when nobody 951 # is using them. This is painful if one for instance tries to restart 952 # a failed build because the link command will fail unnecessarily 'cos 953 # the shared object/library is 'busy'. 954 push(@m,' $(RM_F) $@ 955'); 956 957 my $libs = '$(LDLOADLIBS)'; 958 959 if (($Is{NetBSD} || $Is{Interix} || $Is{Android}) && $Config{'useshrplib'} eq 'true') { 960 # Use nothing on static perl platforms, and to the flags needed 961 # to link against the shared libperl library on shared perl 962 # platforms. We peek at lddlflags to see if we need -Wl,-R 963 # or -R to add paths to the run-time library search path. 964 if ($Config{'lddlflags'} =~ /-Wl,-R/) { 965 $libs .= ' "-L$(PERL_INC)" "-Wl,-R$(INSTALLARCHLIB)/CORE" "-Wl,-R$(PERL_ARCHLIB)/CORE" -lperl'; 966 } elsif ($Config{'lddlflags'} =~ /-R/) { 967 $libs .= ' "-L$(PERL_INC)" "-R$(INSTALLARCHLIB)/CORE" "-R$(PERL_ARCHLIB)/CORE" -lperl'; 968 } elsif ( $Is{Android} ) { 969 # The Android linker will not recognize symbols from 970 # libperl unless the module explicitly depends on it. 971 $libs .= ' "-L$(PERL_INC)" -lperl'; 972 } 973 } 974 975 my $ld_run_path_shell = ""; 976 if ($self->{LD_RUN_PATH} ne "") { 977 $ld_run_path_shell = 'LD_RUN_PATH="$(LD_RUN_PATH)" '; 978 } 979 980 push @m, sprintf <<'MAKE', $ld_run_path_shell, $ldrun, $ldfrom, $libs; 981 %s$(LD) %s $(LDDLFLAGS) %s $(OTHERLDFLAGS) -o $@ $(MYEXTLIB) \ 982 $(PERL_ARCHIVE) %s $(PERL_ARCHIVE_AFTER) $(EXPORT_LIST) \ 983 $(INST_DYNAMIC_FIX) 984MAKE 985 986 push @m, <<'MAKE'; 987 $(CHMOD) $(PERM_RWX) $@ 988 $(NOECHO) $(RM_RF) $(BOOTSTRAP) 989 - $(CP_NONEMPTY) $(BOOTSTRAP) $(INST_BOOT) $(PERM_RW) 990MAKE 991 992 return join('',@m); 993} 994 995=item exescan 996 997Deprecated method. Use libscan instead. 998 999=cut 1000 1001sub exescan { 1002 my($self,$path) = @_; 1003 $path; 1004} 1005 1006=item extliblist 1007 1008Called by init_others, and calls ext ExtUtils::Liblist. See 1009L<ExtUtils::Liblist> for details. 1010 1011=cut 1012 1013sub extliblist { 1014 my($self,$libs) = @_; 1015 require ExtUtils::Liblist; 1016 $self->ext($libs, $Verbose); 1017} 1018 1019=item find_perl 1020 1021Finds the executables PERL and FULLPERL 1022 1023=cut 1024 1025sub find_perl { 1026 my($self, $ver, $names, $dirs, $trace) = @_; 1027 1028 if ($trace >= 2){ 1029 print "Looking for perl $ver by these names: 1030@$names 1031in these dirs: 1032@$dirs 1033"; 1034 } 1035 1036 my $stderr_duped = 0; 1037 local *STDERR_COPY; 1038 1039 unless ($Is{BSD}) { 1040 # >& and lexical filehandles together give 5.6.2 indigestion 1041 if( open(STDERR_COPY, '>&STDERR') ) { ## no critic 1042 $stderr_duped = 1; 1043 } 1044 else { 1045 warn <<WARNING; 1046find_perl() can't dup STDERR: $! 1047You might see some garbage while we search for Perl 1048WARNING 1049 } 1050 } 1051 1052 foreach my $name (@$names){ 1053 foreach my $dir (@$dirs){ 1054 next unless defined $dir; # $self->{PERL_SRC} may be undefined 1055 my ($abs, $val); 1056 if ($self->file_name_is_absolute($name)) { # /foo/bar 1057 $abs = $name; 1058 } elsif ($self->canonpath($name) eq 1059 $self->canonpath(basename($name))) { # foo 1060 $abs = $self->catfile($dir, $name); 1061 } else { # foo/bar 1062 $abs = $self->catfile($Curdir, $name); 1063 } 1064 print "Checking $abs\n" if ($trace >= 2); 1065 next unless $self->maybe_command($abs); 1066 print "Executing $abs\n" if ($trace >= 2); 1067 1068 my $version_check = qq{"$abs" -le "require $ver; print qq{VER_OK}"}; 1069 1070 # To avoid using the unportable 2>&1 to suppress STDERR, 1071 # we close it before running the command. 1072 # However, thanks to a thread library bug in many BSDs 1073 # ( http://www.freebsd.org/cgi/query-pr.cgi?pr=51535 ) 1074 # we cannot use the fancier more portable way in here 1075 # but instead need to use the traditional 2>&1 construct. 1076 if ($Is{BSD}) { 1077 $val = `$version_check 2>&1`; 1078 } else { 1079 close STDERR if $stderr_duped; 1080 $val = `$version_check`; 1081 1082 # 5.6.2's 3-arg open doesn't work with >& 1083 open STDERR, ">&STDERR_COPY" ## no critic 1084 if $stderr_duped; 1085 } 1086 1087 if ($val =~ /^VER_OK/m) { 1088 print "Using PERL=$abs\n" if $trace; 1089 return $abs; 1090 } elsif ($trace >= 2) { 1091 print "Result: '$val' ".($? >> 8)."\n"; 1092 } 1093 } 1094 } 1095 print "Unable to find a perl $ver (by these names: @$names, in these dirs: @$dirs)\n"; 1096 0; # false and not empty 1097} 1098 1099 1100=item fixin 1101 1102 $mm->fixin(@files); 1103 1104Inserts the sharpbang or equivalent magic number to a set of @files. 1105 1106=cut 1107 1108sub fixin { # stolen from the pink Camel book, more or less 1109 my ( $self, @files ) = @_; 1110 1111 for my $file (@files) { 1112 my $file_new = "$file.new"; 1113 my $file_bak = "$file.bak"; 1114 1115 open( my $fixin, '<', $file ) or croak "Can't process '$file': $!"; 1116 local $/ = "\n"; 1117 chomp( my $line = <$fixin> ); 1118 next unless $line =~ s/^\s*\#!\s*//; # Not a shebang file. 1119 1120 my $shb = $self->_fixin_replace_shebang( $file, $line ); 1121 next unless defined $shb; 1122 1123 open( my $fixout, ">", "$file_new" ) or do { 1124 warn "Can't create new $file: $!\n"; 1125 next; 1126 }; 1127 1128 # Print out the new #! line (or equivalent). 1129 local $\; 1130 local $/; 1131 print $fixout $shb, <$fixin>; 1132 close $fixin; 1133 close $fixout; 1134 1135 chmod 0666, $file_bak; 1136 unlink $file_bak; 1137 unless ( _rename( $file, $file_bak ) ) { 1138 warn "Can't rename $file to $file_bak: $!"; 1139 next; 1140 } 1141 unless ( _rename( $file_new, $file ) ) { 1142 warn "Can't rename $file_new to $file: $!"; 1143 unless ( _rename( $file_bak, $file ) ) { 1144 warn "Can't rename $file_bak back to $file either: $!"; 1145 warn "Leaving $file renamed as $file_bak\n"; 1146 } 1147 next; 1148 } 1149 unlink $file_bak; 1150 } 1151 continue { 1152 system("$Config{'eunicefix'} $file") if $Config{'eunicefix'} ne ':'; 1153 } 1154} 1155 1156 1157sub _rename { 1158 my($old, $new) = @_; 1159 1160 foreach my $file ($old, $new) { 1161 if( $Is{VMS} and basename($file) !~ /\./ ) { 1162 # rename() in 5.8.0 on VMS will not rename a file if it 1163 # does not contain a dot yet it returns success. 1164 $file = "$file."; 1165 } 1166 } 1167 1168 return rename($old, $new); 1169} 1170 1171sub _fixin_replace_shebang { 1172 my ( $self, $file, $line ) = @_; 1173 1174 # Now figure out the interpreter name. 1175 my ( $cmd, $arg ) = split ' ', $line, 2; 1176 $cmd =~ s!^.*/!!; 1177 1178 # Now look (in reverse) for interpreter in absolute PATH (unless perl). 1179 my $interpreter; 1180 if ( $cmd =~ m{^perl(?:\z|[^a-z])} ) { 1181 if ( $Config{startperl} =~ m,^\#!.*/perl, ) { 1182 $interpreter = $Config{startperl}; 1183 $interpreter =~ s,^\#!,,; 1184 } 1185 else { 1186 $interpreter = $Config{perlpath}; 1187 } 1188 } 1189 else { 1190 my (@absdirs) 1191 = reverse grep { $self->file_name_is_absolute($_) } $self->path; 1192 $interpreter = ''; 1193 1194 foreach my $dir (@absdirs) { 1195 if ( $self->maybe_command($cmd) ) { 1196 warn "Ignoring $interpreter in $file\n" 1197 if $Verbose && $interpreter; 1198 $interpreter = $self->catfile( $dir, $cmd ); 1199 } 1200 } 1201 } 1202 1203 # Figure out how to invoke interpreter on this machine. 1204 1205 my ($does_shbang) = $Config{'sharpbang'} =~ /^\s*\#\!/; 1206 my ($shb) = ""; 1207 if ($interpreter) { 1208 print "Changing sharpbang in $file to $interpreter" 1209 if $Verbose; 1210 # this is probably value-free on DOSISH platforms 1211 if ($does_shbang) { 1212 $shb .= "$Config{'sharpbang'}$interpreter"; 1213 $shb .= ' ' . $arg if defined $arg; 1214 $shb .= "\n"; 1215 } 1216 } 1217 else { 1218 warn "Can't find $cmd in PATH, $file unchanged" 1219 if $Verbose; 1220 return; 1221 } 1222 return $shb 1223} 1224 1225=item force (o) 1226 1227Writes an empty FORCE: target. 1228 1229=cut 1230 1231sub force { 1232 my($self) = shift; 1233 '# Phony target to force checking subdirectories. 1234FORCE : 1235 $(NOECHO) $(NOOP) 1236'; 1237} 1238 1239=item guess_name 1240 1241Guess the name of this package by examining the working directory's 1242name. MakeMaker calls this only if the developer has not supplied a 1243NAME attribute. 1244 1245=cut 1246 1247# '; 1248 1249sub guess_name { 1250 my($self) = @_; 1251 use Cwd 'cwd'; 1252 my $name = basename(cwd()); 1253 $name =~ s|[\-_][\d\.\-]+\z||; # this is new with MM 5.00, we 1254 # strip minus or underline 1255 # followed by a float or some such 1256 print "Warning: Guessing NAME [$name] from current directory name.\n"; 1257 $name; 1258} 1259 1260=item has_link_code 1261 1262Returns true if C, XS, MYEXTLIB or similar objects exist within this 1263object that need a compiler. Does not descend into subdirectories as 1264needs_linking() does. 1265 1266=cut 1267 1268sub has_link_code { 1269 my($self) = shift; 1270 return $self->{HAS_LINK_CODE} if defined $self->{HAS_LINK_CODE}; 1271 if ($self->{OBJECT} or @{$self->{C} || []} or $self->{MYEXTLIB}){ 1272 $self->{HAS_LINK_CODE} = 1; 1273 return 1; 1274 } 1275 return $self->{HAS_LINK_CODE} = 0; 1276} 1277 1278 1279=item init_dirscan 1280 1281Scans the directory structure and initializes DIR, XS, XS_FILES, 1282C, C_FILES, O_FILES, H, H_FILES, PL_FILES, EXE_FILES. 1283 1284Called by init_main. 1285 1286=cut 1287 1288sub init_dirscan { # --- File and Directory Lists (.xs .pm .pod etc) 1289 my($self) = @_; 1290 my(%dir, %xs, %c, %o, %h, %pl_files, %pm); 1291 1292 my %ignore = map {( $_ => 1 )} qw(Makefile.PL Build.PL test.pl t); 1293 1294 # ignore the distdir 1295 $Is{VMS} ? $ignore{"$self->{DISTVNAME}.dir"} = 1 1296 : $ignore{$self->{DISTVNAME}} = 1; 1297 1298 my $distprefix = $Is{VMS} ? qr/^\Q$self->{DISTNAME}\E-v?[\d\.]+\.dir$/i 1299 : qr/^\Q$self->{DISTNAME}\E-v?[\d\.]+$/; 1300 1301 @ignore{map lc, keys %ignore} = values %ignore if $Is{VMS}; 1302 1303 if ( defined $self->{XS} and !defined $self->{C} ) { 1304 my @c_files = grep { m/\.c(pp|xx)?\z/i } values %{$self->{XS}}; 1305 my @o_files = grep { m/(?:.(?:o(?:bj)?)|\$\(OBJ_EXT\))\z/i } values %{$self->{XS}}; 1306 %c = map { $_ => 1 } @c_files; 1307 %o = map { $_ => 1 } @o_files; 1308 } 1309 1310 foreach my $name ($self->lsdir($Curdir)){ 1311 next if $name =~ /\#/; 1312 next if $name =~ $distprefix && -d $name; 1313 $name = lc($name) if $Is{VMS}; 1314 next if $name eq $Curdir or $name eq $Updir or $ignore{$name}; 1315 next unless $self->libscan($name); 1316 if (-d $name){ 1317 next if -l $name; # We do not support symlinks at all 1318 next if $self->{NORECURS}; 1319 $dir{$name} = $name if (-f $self->catfile($name,"Makefile.PL")); 1320 } elsif ($name =~ /\.xs\z/){ 1321 my($c); ($c = $name) =~ s/\.xs\z/.c/; 1322 $xs{$name} = $c; 1323 $c{$c} = 1; 1324 } elsif ($name =~ /\.c(pp|xx|c)?\z/i){ # .c .C .cpp .cxx .cc 1325 $c{$name} = 1 1326 unless $name =~ m/perlmain\.c/; # See MAP_TARGET 1327 } elsif ($name =~ /\.h\z/i){ 1328 $h{$name} = 1; 1329 } elsif ($name =~ /\.PL\z/) { 1330 ($pl_files{$name} = $name) =~ s/\.PL\z// ; 1331 } elsif (($Is{VMS} || $Is{Dos}) && $name =~ /[._]pl$/i) { 1332 # case-insensitive filesystem, one dot per name, so foo.h.PL 1333 # under Unix appears as foo.h_pl under VMS or fooh.pl on Dos 1334 local($/); open(my $pl, '<', $name); my $txt = <$pl>; close $pl; 1335 if ($txt =~ /Extracting \S+ \(with variable substitutions/) { 1336 ($pl_files{$name} = $name) =~ s/[._]pl\z//i ; 1337 } 1338 else { 1339 $pm{$name} = $self->catfile($self->{INST_LIBDIR},$name); 1340 } 1341 } elsif ($name =~ /\.(p[ml]|pod)\z/){ 1342 $pm{$name} = $self->catfile($self->{INST_LIBDIR},$name); 1343 } 1344 } 1345 1346 $self->{PL_FILES} ||= \%pl_files; 1347 $self->{DIR} ||= [sort keys %dir]; 1348 $self->{XS} ||= \%xs; 1349 $self->{C} ||= [sort keys %c]; 1350 $self->{H} ||= [sort keys %h]; 1351 $self->{PM} ||= \%pm; 1352 1353 my @o_files = @{$self->{C}}; 1354 %o = (%o, map { $_ => 1 } grep s/\.c(pp|xx|c)?\z/$self->{OBJ_EXT}/i, @o_files); 1355 $self->{O_FILES} = [sort keys %o]; 1356} 1357 1358 1359=item init_MANPODS 1360 1361Determines if man pages should be generated and initializes MAN1PODS 1362and MAN3PODS as appropriate. 1363 1364=cut 1365 1366sub init_MANPODS { 1367 my $self = shift; 1368 1369 # Set up names of manual pages to generate from pods 1370 foreach my $man (qw(MAN1 MAN3)) { 1371 if ( $self->{"${man}PODS"} 1372 or $self->{"INSTALL${man}DIR"} =~ /^(none|\s*)$/ 1373 ) { 1374 $self->{"${man}PODS"} ||= {}; 1375 } 1376 else { 1377 my $init_method = "init_${man}PODS"; 1378 $self->$init_method(); 1379 } 1380 } 1381} 1382 1383 1384sub _has_pod { 1385 my($self, $file) = @_; 1386 1387 my($ispod)=0; 1388 if (open( my $fh, '<', $file )) { 1389 while (<$fh>) { 1390 if (/^=(?:head\d+|item|pod)\b/) { 1391 $ispod=1; 1392 last; 1393 } 1394 } 1395 close $fh; 1396 } else { 1397 # If it doesn't exist yet, we assume, it has pods in it 1398 $ispod = 1; 1399 } 1400 1401 return $ispod; 1402} 1403 1404 1405=item init_MAN1PODS 1406 1407Initializes MAN1PODS from the list of EXE_FILES. 1408 1409=cut 1410 1411sub init_MAN1PODS { 1412 my($self) = @_; 1413 1414 if ( exists $self->{EXE_FILES} ) { 1415 foreach my $name (@{$self->{EXE_FILES}}) { 1416 next unless $self->_has_pod($name); 1417 1418 $self->{MAN1PODS}->{$name} = 1419 $self->catfile("\$(INST_MAN1DIR)", 1420 basename($name).".\$(MAN1EXT)"); 1421 } 1422 } 1423} 1424 1425 1426=item init_MAN3PODS 1427 1428Initializes MAN3PODS from the list of PM files. 1429 1430=cut 1431 1432sub init_MAN3PODS { 1433 my $self = shift; 1434 1435 my %manifypods = (); # we collect the keys first, i.e. the files 1436 # we have to convert to pod 1437 1438 foreach my $name (keys %{$self->{PM}}) { 1439 if ($name =~ /\.pod\z/ ) { 1440 $manifypods{$name} = $self->{PM}{$name}; 1441 } elsif ($name =~ /\.p[ml]\z/ ) { 1442 if( $self->_has_pod($name) ) { 1443 $manifypods{$name} = $self->{PM}{$name}; 1444 } 1445 } 1446 } 1447 1448 my $parentlibs_re = join '|', @{$self->{PMLIBPARENTDIRS}}; 1449 1450 # Remove "Configure.pm" and similar, if it's not the only pod listed 1451 # To force inclusion, just name it "Configure.pod", or override 1452 # MAN3PODS 1453 foreach my $name (keys %manifypods) { 1454 if ($self->{PERL_CORE} and $name =~ /(config|setup).*\.pm/is) { 1455 delete $manifypods{$name}; 1456 next; 1457 } 1458 my($manpagename) = $name; 1459 $manpagename =~ s/\.p(od|m|l)\z//; 1460 # everything below lib is ok 1461 unless($manpagename =~ s!^\W*($parentlibs_re)\W+!!s) { 1462 $manpagename = $self->catfile( 1463 split(/::/,$self->{PARENT_NAME}),$manpagename 1464 ); 1465 } 1466 $manpagename = $self->replace_manpage_separator($manpagename); 1467 $self->{MAN3PODS}->{$name} = 1468 $self->catfile("\$(INST_MAN3DIR)", "$manpagename.\$(MAN3EXT)"); 1469 } 1470} 1471 1472 1473=item init_PM 1474 1475Initializes PMLIBDIRS and PM from PMLIBDIRS. 1476 1477=cut 1478 1479sub init_PM { 1480 my $self = shift; 1481 1482 # Some larger extensions often wish to install a number of *.pm/pl 1483 # files into the library in various locations. 1484 1485 # The attribute PMLIBDIRS holds an array reference which lists 1486 # subdirectories which we should search for library files to 1487 # install. PMLIBDIRS defaults to [ 'lib', $self->{BASEEXT} ]. We 1488 # recursively search through the named directories (skipping any 1489 # which don't exist or contain Makefile.PL files). 1490 1491 # For each *.pm or *.pl file found $self->libscan() is called with 1492 # the default installation path in $_[1]. The return value of 1493 # libscan defines the actual installation location. The default 1494 # libscan function simply returns the path. The file is skipped 1495 # if libscan returns false. 1496 1497 # The default installation location passed to libscan in $_[1] is: 1498 # 1499 # ./*.pm => $(INST_LIBDIR)/*.pm 1500 # ./xyz/... => $(INST_LIBDIR)/xyz/... 1501 # ./lib/... => $(INST_LIB)/... 1502 # 1503 # In this way the 'lib' directory is seen as the root of the actual 1504 # perl library whereas the others are relative to INST_LIBDIR 1505 # (which includes PARENT_NAME). This is a subtle distinction but one 1506 # that's important for nested modules. 1507 1508 unless( $self->{PMLIBDIRS} ) { 1509 if( $Is{VMS} ) { 1510 # Avoid logical name vs directory collisions 1511 $self->{PMLIBDIRS} = ['./lib', "./$self->{BASEEXT}"]; 1512 } 1513 else { 1514 $self->{PMLIBDIRS} = ['lib', $self->{BASEEXT}]; 1515 } 1516 } 1517 1518 #only existing directories that aren't in $dir are allowed 1519 1520 # Avoid $_ wherever possible: 1521 # @{$self->{PMLIBDIRS}} = grep -d && !$dir{$_}, @{$self->{PMLIBDIRS}}; 1522 my (@pmlibdirs) = @{$self->{PMLIBDIRS}}; 1523 @{$self->{PMLIBDIRS}} = (); 1524 my %dir = map { ($_ => $_) } @{$self->{DIR}}; 1525 foreach my $pmlibdir (@pmlibdirs) { 1526 -d $pmlibdir && !$dir{$pmlibdir} && push @{$self->{PMLIBDIRS}}, $pmlibdir; 1527 } 1528 1529 unless( $self->{PMLIBPARENTDIRS} ) { 1530 @{$self->{PMLIBPARENTDIRS}} = ('lib'); 1531 } 1532 1533 return if $self->{PM} and $self->{ARGS}{PM}; 1534 1535 if (@{$self->{PMLIBDIRS}}){ 1536 print "Searching PMLIBDIRS: @{$self->{PMLIBDIRS}}\n" 1537 if ($Verbose >= 2); 1538 require File::Find; 1539 File::Find::find(sub { 1540 if (-d $_){ 1541 unless ($self->libscan($_)){ 1542 $File::Find::prune = 1; 1543 } 1544 return; 1545 } 1546 return if /\#/; 1547 return if /~$/; # emacs temp files 1548 return if /,v$/; # RCS files 1549 return if m{\.swp$}; # vim swap files 1550 1551 my $path = $File::Find::name; 1552 my $prefix = $self->{INST_LIBDIR}; 1553 my $striplibpath; 1554 1555 my $parentlibs_re = join '|', @{$self->{PMLIBPARENTDIRS}}; 1556 $prefix = $self->{INST_LIB} 1557 if ($striplibpath = $path) =~ s{^(\W*)($parentlibs_re)\W} 1558 {$1}i; 1559 1560 my($inst) = $self->catfile($prefix,$striplibpath); 1561 local($_) = $inst; # for backwards compatibility 1562 $inst = $self->libscan($inst); 1563 print "libscan($path) => '$inst'\n" if ($Verbose >= 2); 1564 return unless $inst; 1565 $self->{PM}{$path} = $inst; 1566 }, @{$self->{PMLIBDIRS}}); 1567 } 1568} 1569 1570 1571=item init_DIRFILESEP 1572 1573Using / for Unix. Called by init_main. 1574 1575=cut 1576 1577sub init_DIRFILESEP { 1578 my($self) = shift; 1579 1580 $self->{DIRFILESEP} = '/'; 1581} 1582 1583 1584=item init_main 1585 1586Initializes AR, AR_STATIC_ARGS, BASEEXT, CONFIG, DISTNAME, DLBASE, 1587EXE_EXT, FULLEXT, FULLPERL, FULLPERLRUN, FULLPERLRUNINST, INST_*, 1588INSTALL*, INSTALLDIRS, LIB_EXT, LIBPERL_A, MAP_TARGET, NAME, 1589OBJ_EXT, PARENT_NAME, PERL, PERL_ARCHLIB, PERL_INC, PERL_LIB, 1590PERL_SRC, PERLRUN, PERLRUNINST, PREFIX, VERSION, 1591VERSION_SYM, XS_VERSION. 1592 1593=cut 1594 1595sub init_main { 1596 my($self) = @_; 1597 1598 # --- Initialize Module Name and Paths 1599 1600 # NAME = Foo::Bar::Oracle 1601 # FULLEXT = Foo/Bar/Oracle 1602 # BASEEXT = Oracle 1603 # PARENT_NAME = Foo::Bar 1604### Only UNIX: 1605### ($self->{FULLEXT} = 1606### $self->{NAME}) =~ s!::!/!g ; #eg. BSD/Foo/Socket 1607 $self->{FULLEXT} = $self->catdir(split /::/, $self->{NAME}); 1608 1609 1610 # Copied from DynaLoader: 1611 1612 my(@modparts) = split(/::/,$self->{NAME}); 1613 my($modfname) = $modparts[-1]; 1614 1615 # Some systems have restrictions on files names for DLL's etc. 1616 # mod2fname returns appropriate file base name (typically truncated) 1617 # It may also edit @modparts if required. 1618 # We require DynaLoader to make sure that mod2fname is loaded 1619 eval { require DynaLoader }; 1620 if (defined &DynaLoader::mod2fname) { 1621 $modfname = &DynaLoader::mod2fname(\@modparts); 1622 } 1623 1624 ($self->{PARENT_NAME}, $self->{BASEEXT}) = $self->{NAME} =~ m!(?:([\w:]+)::)?(\w+)\z! ; 1625 $self->{PARENT_NAME} ||= ''; 1626 1627 if (defined &DynaLoader::mod2fname) { 1628 # As of 5.001m, dl_os2 appends '_' 1629 $self->{DLBASE} = $modfname; 1630 } else { 1631 $self->{DLBASE} = '$(BASEEXT)'; 1632 } 1633 1634 1635 # --- Initialize PERL_LIB, PERL_SRC 1636 1637 # *Real* information: where did we get these two from? ... 1638 my $inc_config_dir = dirname($INC{'Config.pm'}); 1639 my $inc_carp_dir = dirname($INC{'Carp.pm'}); 1640 1641 unless ($self->{PERL_SRC}){ 1642 foreach my $dir_count (1..8) { # 8 is the VMS limit for nesting 1643 my $dir = $self->catdir(($Updir) x $dir_count); 1644 1645 if (-f $self->catfile($dir,"config_h.SH") && 1646 -f $self->catfile($dir,"perl.h") && 1647 -f $self->catfile($dir,"lib","strict.pm") 1648 ) { 1649 $self->{PERL_SRC}=$dir ; 1650 last; 1651 } 1652 } 1653 } 1654 1655 warn "PERL_CORE is set but I can't find your PERL_SRC!\n" if 1656 $self->{PERL_CORE} and !$self->{PERL_SRC}; 1657 1658 if ($self->{PERL_SRC}){ 1659 $self->{PERL_LIB} ||= $self->catdir("$self->{PERL_SRC}","lib"); 1660 1661 $self->{PERL_ARCHLIB} = $self->{PERL_LIB}; 1662 $self->{PERL_INC} = ($Is{Win32}) ? 1663 $self->catdir($self->{PERL_LIB},"CORE") : $self->{PERL_SRC}; 1664 1665 # catch a situation that has occurred a few times in the past: 1666 unless ( 1667 -s $self->catfile($self->{PERL_SRC},'cflags') 1668 or 1669 $Is{VMS} 1670 && 1671 -s $self->catfile($self->{PERL_SRC},'vmsish.h') 1672 or 1673 $Is{Win32} 1674 ){ 1675 warn qq{ 1676You cannot build extensions below the perl source tree after executing 1677a 'make clean' in the perl source tree. 1678 1679To rebuild extensions distributed with the perl source you should 1680simply Configure (to include those extensions) and then build perl as 1681normal. After installing perl the source tree can be deleted. It is 1682not needed for building extensions by running 'perl Makefile.PL' 1683usually without extra arguments. 1684 1685It is recommended that you unpack and build additional extensions away 1686from the perl source tree. 1687}; 1688 } 1689 } else { 1690 # we should also consider $ENV{PERL5LIB} here 1691 my $old = $self->{PERL_LIB} || $self->{PERL_ARCHLIB} || $self->{PERL_INC}; 1692 $self->{PERL_LIB} ||= $Config{privlibexp}; 1693 $self->{PERL_ARCHLIB} ||= $Config{archlibexp}; 1694 $self->{PERL_INC} = $self->catdir("$self->{PERL_ARCHLIB}","CORE"); # wild guess for now 1695 my $perl_h; 1696 1697 if (not -f ($perl_h = $self->catfile($self->{PERL_INC},"perl.h")) 1698 and not $old){ 1699 # Maybe somebody tries to build an extension with an 1700 # uninstalled Perl outside of Perl build tree 1701 my $lib; 1702 for my $dir (@INC) { 1703 $lib = $dir, last if -e $self->catfile($dir, "Config.pm"); 1704 } 1705 if ($lib) { 1706 # Win32 puts its header files in /perl/src/lib/CORE. 1707 # Unix leaves them in /perl/src. 1708 my $inc = $Is{Win32} ? $self->catdir($lib, "CORE" ) 1709 : dirname $lib; 1710 if (-e $self->catfile($inc, "perl.h")) { 1711 $self->{PERL_LIB} = $lib; 1712 $self->{PERL_ARCHLIB} = $lib; 1713 $self->{PERL_INC} = $inc; 1714 $self->{UNINSTALLED_PERL} = 1; 1715 print <<EOP; 1716... Detected uninstalled Perl. Trying to continue. 1717EOP 1718 } 1719 } 1720 } 1721 } 1722 1723 if ($Is{Android}) { 1724 # Android fun times! 1725 # ../../perl -I../../lib -MFile::Glob -e1 works 1726 # ../../../perl -I../../../lib -MFile::Glob -e1 fails to find 1727 # the .so for File::Glob. 1728 # This always affects core perl, but may also affect an installed 1729 # perl built with -Duserelocatableinc. 1730 $self->{PERL_LIB} = File::Spec->rel2abs($self->{PERL_LIB}); 1731 $self->{PERL_ARCHLIB} = File::Spec->rel2abs($self->{PERL_ARCHLIB}); 1732 } 1733 $self->{PERL_INCDEP} = $self->{PERL_INC}; 1734 $self->{PERL_ARCHLIBDEP} = $self->{PERL_ARCHLIB}; 1735 1736 # We get SITELIBEXP and SITEARCHEXP directly via 1737 # Get_from_Config. When we are running standard modules, these 1738 # won't matter, we will set INSTALLDIRS to "perl". Otherwise we 1739 # set it to "site". I prefer that INSTALLDIRS be set from outside 1740 # MakeMaker. 1741 $self->{INSTALLDIRS} ||= "site"; 1742 1743 $self->{MAN1EXT} ||= $Config{man1ext}; 1744 $self->{MAN3EXT} ||= $Config{man3ext}; 1745 1746 # Get some stuff out of %Config if we haven't yet done so 1747 print "CONFIG must be an array ref\n" 1748 if ($self->{CONFIG} and ref $self->{CONFIG} ne 'ARRAY'); 1749 $self->{CONFIG} = [] unless (ref $self->{CONFIG}); 1750 push(@{$self->{CONFIG}}, @ExtUtils::MakeMaker::Get_from_Config); 1751 push(@{$self->{CONFIG}}, 'shellflags') if $Config{shellflags}; 1752 my(%once_only); 1753 foreach my $m (@{$self->{CONFIG}}){ 1754 next if $once_only{$m}; 1755 print "CONFIG key '$m' does not exist in Config.pm\n" 1756 unless exists $Config{$m}; 1757 $self->{uc $m} ||= $Config{$m}; 1758 $once_only{$m} = 1; 1759 } 1760 1761# This is too dangerous: 1762# if ($^O eq "next") { 1763# $self->{AR} = "libtool"; 1764# $self->{AR_STATIC_ARGS} = "-o"; 1765# } 1766# But I leave it as a placeholder 1767 1768 $self->{AR_STATIC_ARGS} ||= "cr"; 1769 1770 # These should never be needed 1771 $self->{OBJ_EXT} ||= '.o'; 1772 $self->{LIB_EXT} ||= '.a'; 1773 1774 $self->{MAP_TARGET} ||= "perl"; 1775 1776 $self->{LIBPERL_A} ||= "libperl$self->{LIB_EXT}"; 1777 1778 # make a simple check if we find strict 1779 warn "Warning: PERL_LIB ($self->{PERL_LIB}) seems not to be a perl library directory 1780 (strict.pm not found)" 1781 unless -f $self->catfile("$self->{PERL_LIB}","strict.pm") || 1782 $self->{NAME} eq "ExtUtils::MakeMaker"; 1783} 1784 1785=item init_tools 1786 1787Initializes tools to use their common (and faster) Unix commands. 1788 1789=cut 1790 1791sub init_tools { 1792 my $self = shift; 1793 1794 $self->{ECHO} ||= 'echo'; 1795 $self->{ECHO_N} ||= 'echo -n'; 1796 $self->{RM_F} ||= "rm -f"; 1797 $self->{RM_RF} ||= "rm -rf"; 1798 $self->{TOUCH} ||= "touch"; 1799 $self->{TEST_F} ||= "test -f"; 1800 $self->{TEST_S} ||= "test -s"; 1801 $self->{CP} ||= "cp"; 1802 $self->{MV} ||= "mv"; 1803 $self->{CHMOD} ||= "chmod"; 1804 $self->{FALSE} ||= 'false'; 1805 $self->{TRUE} ||= 'true'; 1806 1807 $self->{LD} ||= 'ld'; 1808 1809 return $self->SUPER::init_tools(@_); 1810 1811 # After SUPER::init_tools so $Config{shell} has a 1812 # chance to get set. 1813 $self->{SHELL} ||= '/bin/sh'; 1814 1815 return; 1816} 1817 1818 1819=item init_linker 1820 1821Unix has no need of special linker flags. 1822 1823=cut 1824 1825sub init_linker { 1826 my($self) = shift; 1827 $self->{PERL_ARCHIVE} ||= ''; 1828 $self->{PERL_ARCHIVEDEP} ||= ''; 1829 $self->{PERL_ARCHIVE_AFTER} ||= ''; 1830 $self->{EXPORT_LIST} ||= ''; 1831} 1832 1833 1834=begin _protected 1835 1836=item init_lib2arch 1837 1838 $mm->init_lib2arch 1839 1840=end _protected 1841 1842=cut 1843 1844sub init_lib2arch { 1845 my($self) = shift; 1846 1847 # The user who requests an installation directory explicitly 1848 # should not have to tell us an architecture installation directory 1849 # as well. We look if a directory exists that is named after the 1850 # architecture. If not we take it as a sign that it should be the 1851 # same as the requested installation directory. Otherwise we take 1852 # the found one. 1853 for my $libpair ({l=>"privlib", a=>"archlib"}, 1854 {l=>"sitelib", a=>"sitearch"}, 1855 {l=>"vendorlib", a=>"vendorarch"}, 1856 ) 1857 { 1858 my $lib = "install$libpair->{l}"; 1859 my $Lib = uc $lib; 1860 my $Arch = uc "install$libpair->{a}"; 1861 if( $self->{$Lib} && ! $self->{$Arch} ){ 1862 my($ilib) = $Config{$lib}; 1863 1864 $self->prefixify($Arch,$ilib,$self->{$Lib}); 1865 1866 unless (-d $self->{$Arch}) { 1867 print "Directory $self->{$Arch} not found\n" 1868 if $Verbose; 1869 $self->{$Arch} = $self->{$Lib}; 1870 } 1871 print "Defaulting $Arch to $self->{$Arch}\n" if $Verbose; 1872 } 1873 } 1874} 1875 1876 1877=item init_PERL 1878 1879 $mm->init_PERL; 1880 1881Called by init_main. Sets up ABSPERL, PERL, FULLPERL and all the 1882*PERLRUN* permutations. 1883 1884 PERL is allowed to be miniperl 1885 FULLPERL must be a complete perl 1886 1887 ABSPERL is PERL converted to an absolute path 1888 1889 *PERLRUN contains everything necessary to run perl, find it's 1890 libraries, etc... 1891 1892 *PERLRUNINST is *PERLRUN + everything necessary to find the 1893 modules being built. 1894 1895=cut 1896 1897sub init_PERL { 1898 my($self) = shift; 1899 1900 my @defpath = (); 1901 foreach my $component ($self->{PERL_SRC}, $self->path(), 1902 $Config{binexp}) 1903 { 1904 push @defpath, $component if defined $component; 1905 } 1906 1907 # Build up a set of file names (not command names). 1908 my $thisperl = $self->canonpath($^X); 1909 $thisperl .= $Config{exe_ext} unless 1910 # VMS might have a file version # at the end 1911 $Is{VMS} ? $thisperl =~ m/$Config{exe_ext}(;\d+)?$/i 1912 : $thisperl =~ m/$Config{exe_ext}$/i; 1913 1914 # We need a relative path to perl when in the core. 1915 $thisperl = $self->abs2rel($thisperl) if $self->{PERL_CORE}; 1916 1917 my @perls = ($thisperl); 1918 push @perls, map { "$_$Config{exe_ext}" } 1919 ("perl$Config{version}", 'perl5', 'perl'); 1920 1921 # miniperl has priority over all but the canonical perl when in the 1922 # core. Otherwise its a last resort. 1923 my $miniperl = "miniperl$Config{exe_ext}"; 1924 if( $self->{PERL_CORE} ) { 1925 splice @perls, 1, 0, $miniperl; 1926 } 1927 else { 1928 push @perls, $miniperl; 1929 } 1930 1931 $self->{PERL} ||= 1932 $self->find_perl(5.0, \@perls, \@defpath, $Verbose ); 1933 1934 my $perl = $self->{PERL}; 1935 $perl =~ s/^"//; 1936 my $has_mcr = $perl =~ s/^MCR\s*//; 1937 my $perlflags = ''; 1938 my $stripped_perl; 1939 while ($perl) { 1940 ($stripped_perl = $perl) =~ s/"$//; 1941 last if -x $stripped_perl; 1942 last unless $perl =~ s/(\s+\S+)$//; 1943 $perlflags = $1.$perlflags; 1944 } 1945 $self->{PERL} = $stripped_perl; 1946 $self->{PERL} = 'MCR '.$self->{PERL} if $has_mcr || $Is{VMS}; 1947 1948 # When built for debugging, VMS doesn't create perl.exe but ndbgperl.exe. 1949 my $perl_name = 'perl'; 1950 $perl_name = 'ndbgperl' if $Is{VMS} && 1951 defined $Config{usevmsdebug} && $Config{usevmsdebug} eq 'define'; 1952 1953 # XXX This logic is flawed. If "miniperl" is anywhere in the path 1954 # it will get confused. It should be fixed to work only on the filename. 1955 # Define 'FULLPERL' to be a non-miniperl (used in test: target) 1956 unless ($self->{FULLPERL}) { 1957 ($self->{FULLPERL} = $self->{PERL}) =~ s/\Q$miniperl\E$/$perl_name$Config{exe_ext}/i; 1958 $self->{FULLPERL} = qq{"$self->{FULLPERL}"}.$perlflags; 1959 } 1960 # Can't have an image name with quotes, and findperl will have 1961 # already escaped spaces. 1962 $self->{FULLPERL} =~ tr/"//d if $Is{VMS}; 1963 1964 # Little hack to get around VMS's find_perl putting "MCR" in front 1965 # sometimes. 1966 $self->{ABSPERL} = $self->{PERL}; 1967 $has_mcr = $self->{ABSPERL} =~ s/^MCR\s*//; 1968 if( $self->file_name_is_absolute($self->{ABSPERL}) ) { 1969 $self->{ABSPERL} = '$(PERL)'; 1970 } 1971 else { 1972 $self->{ABSPERL} = $self->rel2abs($self->{ABSPERL}); 1973 1974 # Quote the perl command if it contains whitespace 1975 $self->{ABSPERL} = $self->quote_literal($self->{ABSPERL}) 1976 if $self->{ABSPERL} =~ /\s/; 1977 1978 $self->{ABSPERL} = 'MCR '.$self->{ABSPERL} if $has_mcr; 1979 } 1980 $self->{PERL} = qq{"$self->{PERL}"}.$perlflags; 1981 1982 # Can't have an image name with quotes, and findperl will have 1983 # already escaped spaces. 1984 $self->{PERL} =~ tr/"//d if $Is{VMS}; 1985 1986 # Are we building the core? 1987 $self->{PERL_CORE} = $ENV{PERL_CORE} unless exists $self->{PERL_CORE}; 1988 $self->{PERL_CORE} = 0 unless defined $self->{PERL_CORE}; 1989 1990 # How do we run perl? 1991 foreach my $perl (qw(PERL FULLPERL ABSPERL)) { 1992 my $run = $perl.'RUN'; 1993 1994 $self->{$run} = qq{\$($perl)}; 1995 1996 # Make sure perl can find itself before it's installed. 1997 $self->{$run} .= q{ "-I$(PERL_LIB)" "-I$(PERL_ARCHLIB)"} 1998 if $self->{UNINSTALLED_PERL} || $self->{PERL_CORE}; 1999 2000 $self->{$perl.'RUNINST'} = 2001 sprintf q{$(%sRUN)%s "-I$(INST_ARCHLIB)" "-I$(INST_LIB)"}, 2002 $perl, $perlflags; 2003 } 2004 2005 return 1; 2006} 2007 2008 2009=item init_platform 2010 2011=item platform_constants 2012 2013Add MM_Unix_VERSION. 2014 2015=cut 2016 2017sub init_platform { 2018 my($self) = shift; 2019 2020 $self->{MM_Unix_VERSION} = $VERSION; 2021 $self->{PERL_MALLOC_DEF} = '-DPERL_EXTMALLOC_DEF -Dmalloc=Perl_malloc '. 2022 '-Dfree=Perl_mfree -Drealloc=Perl_realloc '. 2023 '-Dcalloc=Perl_calloc'; 2024 2025} 2026 2027sub platform_constants { 2028 my($self) = shift; 2029 my $make_frag = ''; 2030 2031 foreach my $macro (qw(MM_Unix_VERSION PERL_MALLOC_DEF)) 2032 { 2033 next unless defined $self->{$macro}; 2034 $make_frag .= "$macro = $self->{$macro}\n"; 2035 } 2036 2037 return $make_frag; 2038} 2039 2040 2041=item init_PERM 2042 2043 $mm->init_PERM 2044 2045Called by init_main. Initializes PERL_* 2046 2047=cut 2048 2049sub init_PERM { 2050 my($self) = shift; 2051 2052 $self->{PERM_DIR} = 755 unless defined $self->{PERM_DIR}; 2053 $self->{PERM_RW} = 644 unless defined $self->{PERM_RW}; 2054 $self->{PERM_RWX} = 755 unless defined $self->{PERM_RWX}; 2055 2056 return 1; 2057} 2058 2059 2060=item init_xs 2061 2062 $mm->init_xs 2063 2064Sets up macros having to do with XS code. Currently just INST_STATIC, 2065INST_DYNAMIC and INST_BOOT. 2066 2067=cut 2068 2069sub init_xs { 2070 my $self = shift; 2071 2072 if ($self->has_link_code()) { 2073 $self->{INST_STATIC} = 2074 $self->catfile('$(INST_ARCHAUTODIR)', '$(BASEEXT)$(LIB_EXT)'); 2075 $self->{INST_DYNAMIC} = 2076 $self->catfile('$(INST_ARCHAUTODIR)', '$(DLBASE).$(DLEXT)'); 2077 $self->{INST_BOOT} = 2078 $self->catfile('$(INST_ARCHAUTODIR)', '$(BASEEXT).bs'); 2079 } else { 2080 $self->{INST_STATIC} = ''; 2081 $self->{INST_DYNAMIC} = ''; 2082 $self->{INST_BOOT} = ''; 2083 } 2084} 2085 2086=item install (o) 2087 2088Defines the install target. 2089 2090=cut 2091 2092sub install { 2093 my($self, %attribs) = @_; 2094 my(@m); 2095 2096 push @m, q{ 2097install :: pure_install doc_install 2098 $(NOECHO) $(NOOP) 2099 2100install_perl :: pure_perl_install doc_perl_install 2101 $(NOECHO) $(NOOP) 2102 2103install_site :: pure_site_install doc_site_install 2104 $(NOECHO) $(NOOP) 2105 2106install_vendor :: pure_vendor_install doc_vendor_install 2107 $(NOECHO) $(NOOP) 2108 2109pure_install :: pure_$(INSTALLDIRS)_install 2110 $(NOECHO) $(NOOP) 2111 2112doc_install :: doc_$(INSTALLDIRS)_install 2113 $(NOECHO) $(NOOP) 2114 2115pure__install : pure_site_install 2116 $(NOECHO) $(ECHO) INSTALLDIRS not defined, defaulting to INSTALLDIRS=site 2117 2118doc__install : doc_site_install 2119 $(NOECHO) $(ECHO) INSTALLDIRS not defined, defaulting to INSTALLDIRS=site 2120 2121pure_perl_install :: all 2122 $(NOECHO) $(MOD_INSTALL) \ 2123}; 2124 2125 push @m, 2126q{ read "}.$self->catfile('$(PERL_ARCHLIB)','auto','$(FULLEXT)','.packlist').q{" \ 2127 write "}.$self->catfile('$(DESTINSTALLARCHLIB)','auto','$(FULLEXT)','.packlist').q{" \ 2128} unless $self->{NO_PACKLIST}; 2129 2130 push @m, 2131q{ "$(INST_LIB)" "$(DESTINSTALLPRIVLIB)" \ 2132 "$(INST_ARCHLIB)" "$(DESTINSTALLARCHLIB)" \ 2133 "$(INST_BIN)" "$(DESTINSTALLBIN)" \ 2134 "$(INST_SCRIPT)" "$(DESTINSTALLSCRIPT)" \ 2135 "$(INST_MAN1DIR)" "$(DESTINSTALLMAN1DIR)" \ 2136 "$(INST_MAN3DIR)" "$(DESTINSTALLMAN3DIR)" 2137 $(NOECHO) $(WARN_IF_OLD_PACKLIST) \ 2138 "}.$self->catdir('$(SITEARCHEXP)','auto','$(FULLEXT)').q{" 2139 2140 2141pure_site_install :: all 2142 $(NOECHO) $(MOD_INSTALL) \ 2143}; 2144 push @m, 2145q{ read "}.$self->catfile('$(SITEARCHEXP)','auto','$(FULLEXT)','.packlist').q{" \ 2146 write "}.$self->catfile('$(DESTINSTALLSITEARCH)','auto','$(FULLEXT)','.packlist').q{" \ 2147} unless $self->{NO_PACKLIST}; 2148 2149 push @m, 2150q{ "$(INST_LIB)" "$(DESTINSTALLSITELIB)" \ 2151 "$(INST_ARCHLIB)" "$(DESTINSTALLSITEARCH)" \ 2152 "$(INST_BIN)" "$(DESTINSTALLSITEBIN)" \ 2153 "$(INST_SCRIPT)" "$(DESTINSTALLSITESCRIPT)" \ 2154 "$(INST_MAN1DIR)" "$(DESTINSTALLSITEMAN1DIR)" \ 2155 "$(INST_MAN3DIR)" "$(DESTINSTALLSITEMAN3DIR)" 2156 $(NOECHO) $(WARN_IF_OLD_PACKLIST) \ 2157 "}.$self->catdir('$(PERL_ARCHLIB)','auto','$(FULLEXT)').q{" 2158 2159pure_vendor_install :: all 2160 $(NOECHO) $(MOD_INSTALL) \ 2161}; 2162 push @m, 2163q{ read "}.$self->catfile('$(VENDORARCHEXP)','auto','$(FULLEXT)','.packlist').q{" \ 2164 write "}.$self->catfile('$(DESTINSTALLVENDORARCH)','auto','$(FULLEXT)','.packlist').q{" \ 2165} unless $self->{NO_PACKLIST}; 2166 2167 push @m, 2168q{ "$(INST_LIB)" "$(DESTINSTALLVENDORLIB)" \ 2169 "$(INST_ARCHLIB)" "$(DESTINSTALLVENDORARCH)" \ 2170 "$(INST_BIN)" "$(DESTINSTALLVENDORBIN)" \ 2171 "$(INST_SCRIPT)" "$(DESTINSTALLVENDORSCRIPT)" \ 2172 "$(INST_MAN1DIR)" "$(DESTINSTALLVENDORMAN1DIR)" \ 2173 "$(INST_MAN3DIR)" "$(DESTINSTALLVENDORMAN3DIR)" 2174 2175}; 2176 2177 push @m, q{ 2178doc_perl_install :: all 2179 $(NOECHO) $(NOOP) 2180 2181doc_site_install :: all 2182 $(NOECHO) $(NOOP) 2183 2184doc_vendor_install :: all 2185 $(NOECHO) $(NOOP) 2186 2187} if $self->{NO_PERLLOCAL}; 2188 2189 push @m, q{ 2190doc_perl_install :: all 2191 $(NOECHO) $(ECHO) Appending installation info to "$(DESTINSTALLARCHLIB)/perllocal.pod" 2192 -$(NOECHO) $(MKPATH) "$(DESTINSTALLARCHLIB)" 2193 -$(NOECHO) $(DOC_INSTALL) \ 2194 "Module" "$(NAME)" \ 2195 "installed into" $(INSTALLPRIVLIB) \ 2196 LINKTYPE "$(LINKTYPE)" \ 2197 VERSION "$(VERSION)" \ 2198 EXE_FILES "$(EXE_FILES)" \ 2199 >> "}.$self->catfile('$(DESTINSTALLARCHLIB)','perllocal.pod').q{" 2200 2201doc_site_install :: all 2202 $(NOECHO) $(ECHO) Appending installation info to "$(DESTINSTALLARCHLIB)/perllocal.pod" 2203 -$(NOECHO) $(MKPATH) "$(DESTINSTALLARCHLIB)" 2204 -$(NOECHO) $(DOC_INSTALL) \ 2205 "Module" "$(NAME)" \ 2206 "installed into" $(INSTALLSITELIB) \ 2207 LINKTYPE "$(LINKTYPE)" \ 2208 VERSION "$(VERSION)" \ 2209 EXE_FILES "$(EXE_FILES)" \ 2210 >> "}.$self->catfile('$(DESTINSTALLARCHLIB)','perllocal.pod').q{" 2211 2212doc_vendor_install :: all 2213 $(NOECHO) $(ECHO) Appending installation info to "$(DESTINSTALLARCHLIB)/perllocal.pod" 2214 -$(NOECHO) $(MKPATH) "$(DESTINSTALLARCHLIB)" 2215 -$(NOECHO) $(DOC_INSTALL) \ 2216 "Module" "$(NAME)" \ 2217 "installed into" $(INSTALLVENDORLIB) \ 2218 LINKTYPE "$(LINKTYPE)" \ 2219 VERSION "$(VERSION)" \ 2220 EXE_FILES "$(EXE_FILES)" \ 2221 >> "}.$self->catfile('$(DESTINSTALLARCHLIB)','perllocal.pod').q{" 2222 2223} unless $self->{NO_PERLLOCAL}; 2224 2225 push @m, q{ 2226uninstall :: uninstall_from_$(INSTALLDIRS)dirs 2227 $(NOECHO) $(NOOP) 2228 2229uninstall_from_perldirs :: 2230 $(NOECHO) $(UNINSTALL) "}.$self->catfile('$(PERL_ARCHLIB)','auto','$(FULLEXT)','.packlist').q{" 2231 2232uninstall_from_sitedirs :: 2233 $(NOECHO) $(UNINSTALL) "}.$self->catfile('$(SITEARCHEXP)','auto','$(FULLEXT)','.packlist').q{" 2234 2235uninstall_from_vendordirs :: 2236 $(NOECHO) $(UNINSTALL) "}.$self->catfile('$(VENDORARCHEXP)','auto','$(FULLEXT)','.packlist').q{" 2237}; 2238 2239 join("",@m); 2240} 2241 2242=item installbin (o) 2243 2244Defines targets to make and to install EXE_FILES. 2245 2246=cut 2247 2248sub installbin { 2249 my($self) = shift; 2250 2251 return "" unless $self->{EXE_FILES} && ref $self->{EXE_FILES} eq "ARRAY"; 2252 my @exefiles = @{$self->{EXE_FILES}}; 2253 return "" unless @exefiles; 2254 2255 @exefiles = map vmsify($_), @exefiles if $Is{VMS}; 2256 2257 my %fromto; 2258 for my $from (@exefiles) { 2259 my($path)= $self->catfile('$(INST_SCRIPT)', basename($from)); 2260 2261 local($_) = $path; # for backwards compatibility 2262 my $to = $self->libscan($path); 2263 print "libscan($from) => '$to'\n" if ($Verbose >=2); 2264 2265 $to = vmsify($to) if $Is{VMS}; 2266 $fromto{$from} = $to; 2267 } 2268 my @to = values %fromto; 2269 2270 my @m; 2271 push(@m, qq{ 2272EXE_FILES = @exefiles 2273 2274pure_all :: @to 2275 \$(NOECHO) \$(NOOP) 2276 2277realclean :: 2278}); 2279 2280 # realclean can get rather large. 2281 push @m, map "\t$_\n", $self->split_command('$(RM_F)', @to); 2282 push @m, "\n"; 2283 2284 2285 # A target for each exe file. 2286 while (my($from,$to) = each %fromto) { 2287 last unless defined $from; 2288 2289 push @m, sprintf <<'MAKE', $to, $from, $to, $from, $to, $to, $to; 2290%s : %s $(FIRST_MAKEFILE) $(INST_SCRIPT)$(DFSEP).exists $(INST_BIN)$(DFSEP).exists 2291 $(NOECHO) $(RM_F) %s 2292 $(CP) %s %s 2293 $(FIXIN) %s 2294 -$(NOECHO) $(CHMOD) $(PERM_RWX) %s 2295 2296MAKE 2297 2298 } 2299 2300 join "", @m; 2301} 2302 2303 2304=item linkext (o) 2305 2306Defines the linkext target which in turn defines the LINKTYPE. 2307 2308=cut 2309 2310sub linkext { 2311 my($self, %attribs) = @_; 2312 # LINKTYPE => static or dynamic or '' 2313 my($linktype) = defined $attribs{LINKTYPE} ? 2314 $attribs{LINKTYPE} : '$(LINKTYPE)'; 2315 " 2316linkext :: $linktype 2317 \$(NOECHO) \$(NOOP) 2318"; 2319} 2320 2321=item lsdir 2322 2323Takes as arguments a directory name and a regular expression. Returns 2324all entries in the directory that match the regular expression. 2325 2326=cut 2327 2328sub lsdir { 2329 my($self) = shift; 2330 my($dir, $regex) = @_; 2331 my(@ls); 2332 my $dh = new DirHandle; 2333 $dh->open($dir || ".") or return (); 2334 @ls = $dh->read; 2335 $dh->close; 2336 @ls = grep(/$regex/, @ls) if $regex; 2337 @ls; 2338} 2339 2340=item macro (o) 2341 2342Simple subroutine to insert the macros defined by the macro attribute 2343into the Makefile. 2344 2345=cut 2346 2347sub macro { 2348 my($self,%attribs) = @_; 2349 my(@m,$key,$val); 2350 while (($key,$val) = each %attribs){ 2351 last unless defined $key; 2352 push @m, "$key = $val\n"; 2353 } 2354 join "", @m; 2355} 2356 2357=item makeaperl (o) 2358 2359Called by staticmake. Defines how to write the Makefile to produce a 2360static new perl. 2361 2362By default the Makefile produced includes all the static extensions in 2363the perl library. (Purified versions of library files, e.g., 2364DynaLoader_pure_p1_c0_032.a are automatically ignored to avoid link errors.) 2365 2366=cut 2367 2368sub makeaperl { 2369 my($self, %attribs) = @_; 2370 my($makefilename, $searchdirs, $static, $extra, $perlinc, $target, $tmp, $libperl) = 2371 @attribs{qw(MAKE DIRS STAT EXTRA INCL TARGET TMP LIBPERL)}; 2372 my(@m); 2373 push @m, " 2374# --- MakeMaker makeaperl section --- 2375MAP_TARGET = $target 2376FULLPERL = $self->{FULLPERL} 2377"; 2378 return join '', @m if $self->{PARENT}; 2379 2380 my($dir) = join ":", @{$self->{DIR}}; 2381 2382 unless ($self->{MAKEAPERL}) { 2383 push @m, q{ 2384$(MAP_TARGET) :: static $(MAKE_APERL_FILE) 2385 $(MAKE) $(USEMAKEFILE) $(MAKE_APERL_FILE) $@ 2386 2387$(MAKE_APERL_FILE) : $(FIRST_MAKEFILE) pm_to_blib 2388 $(NOECHO) $(ECHO) Writing \"$(MAKE_APERL_FILE)\" for this $(MAP_TARGET) 2389 $(NOECHO) $(PERLRUNINST) \ 2390 Makefile.PL DIR="}, $dir, q{" \ 2391 MAKEFILE=$(MAKE_APERL_FILE) LINKTYPE=static \ 2392 MAKEAPERL=1 NORECURS=1 CCCDLFLAGS=}; 2393 2394 foreach (@ARGV){ 2395 if( /\s/ ){ 2396 s/=(.*)/='$1'/; 2397 } 2398 push @m, " \\\n\t\t$_"; 2399 } 2400# push @m, map( " \\\n\t\t$_", @ARGV ); 2401 push @m, "\n"; 2402 2403 return join '', @m; 2404 } 2405 2406 2407 2408 my($cccmd, $linkcmd, $lperl); 2409 2410 2411 $cccmd = $self->const_cccmd($libperl); 2412 $cccmd =~ s/^CCCMD\s*=\s*//; 2413 $cccmd =~ s/\$\(INC\)/ "-I$self->{PERL_INC}" /; 2414 $cccmd .= " $Config{cccdlflags}" 2415 if ($Config{useshrplib} eq 'true'); 2416 $cccmd =~ s/\(CC\)/\(PERLMAINCC\)/; 2417 2418 # The front matter of the linkcommand... 2419 $linkcmd = join ' ', "\$(CC)", 2420 grep($_, @Config{qw(ldflags ccdlflags)}); 2421 $linkcmd =~ s/\s+/ /g; 2422 $linkcmd =~ s,(perl\.exp),\$(PERL_INC)/$1,; 2423 2424 # Which *.a files could we make use of... 2425 my %static; 2426 require File::Find; 2427 File::Find::find(sub { 2428 return unless m/\Q$self->{LIB_EXT}\E$/; 2429 2430 # Skip perl's libraries. 2431 return if m/^libperl/ or m/^perl\Q$self->{LIB_EXT}\E$/; 2432 2433 # Skip purified versions of libraries 2434 # (e.g., DynaLoader_pure_p1_c0_032.a) 2435 return if m/_pure_\w+_\w+_\w+\.\w+$/ and -f "$File::Find::dir/.pure"; 2436 2437 if( exists $self->{INCLUDE_EXT} ){ 2438 my $found = 0; 2439 2440 (my $xx = $File::Find::name) =~ s,.*?/auto/,,s; 2441 $xx =~ s,/?$_,,; 2442 $xx =~ s,/,::,g; 2443 2444 # Throw away anything not explicitly marked for inclusion. 2445 # DynaLoader is implied. 2446 foreach my $incl ((@{$self->{INCLUDE_EXT}},'DynaLoader')){ 2447 if( $xx eq $incl ){ 2448 $found++; 2449 last; 2450 } 2451 } 2452 return unless $found; 2453 } 2454 elsif( exists $self->{EXCLUDE_EXT} ){ 2455 (my $xx = $File::Find::name) =~ s,.*?/auto/,,s; 2456 $xx =~ s,/?$_,,; 2457 $xx =~ s,/,::,g; 2458 2459 # Throw away anything explicitly marked for exclusion 2460 foreach my $excl (@{$self->{EXCLUDE_EXT}}){ 2461 return if( $xx eq $excl ); 2462 } 2463 } 2464 2465 # don't include the installed version of this extension. I 2466 # leave this line here, although it is not necessary anymore: 2467 # I patched minimod.PL instead, so that Miniperl.pm won't 2468 # include duplicates 2469 2470 # Once the patch to minimod.PL is in the distribution, I can 2471 # drop it 2472 return if $File::Find::name =~ m:auto/$self->{FULLEXT}/$self->{BASEEXT}$self->{LIB_EXT}\z:; 2473 use Cwd 'cwd'; 2474 $static{cwd() . "/" . $_}++; 2475 }, grep( -d $_, @{$searchdirs || []}) ); 2476 2477 # We trust that what has been handed in as argument, will be buildable 2478 $static = [] unless $static; 2479 @static{@{$static}} = (1) x @{$static}; 2480 2481 $extra = [] unless $extra && ref $extra eq 'ARRAY'; 2482 for (sort keys %static) { 2483 next unless /\Q$self->{LIB_EXT}\E\z/; 2484 $_ = dirname($_) . "/extralibs.ld"; 2485 push @$extra, $_; 2486 } 2487 2488 s/^(.*)/"-I$1"/ for @{$perlinc || []}; 2489 2490 $target ||= "perl"; 2491 $tmp ||= "."; 2492 2493# MAP_STATIC doesn't look into subdirs yet. Once "all" is made and we 2494# regenerate the Makefiles, MAP_STATIC and the dependencies for 2495# extralibs.all are computed correctly 2496 push @m, " 2497MAP_LINKCMD = $linkcmd 2498MAP_PERLINC = @{$perlinc || []} 2499MAP_STATIC = ", 2500join(" \\\n\t", reverse sort keys %static), " 2501 2502MAP_PRELIBS = $Config{perllibs} $Config{cryptlib} 2503"; 2504 2505 if (defined $libperl) { 2506 ($lperl = $libperl) =~ s/\$\(A\)/$self->{LIB_EXT}/; 2507 } 2508 unless ($libperl && -f $lperl) { # Ilya's code... 2509 my $dir = $self->{PERL_SRC} || "$self->{PERL_ARCHLIB}/CORE"; 2510 $dir = "$self->{PERL_ARCHLIB}/.." if $self->{UNINSTALLED_PERL}; 2511 $libperl ||= "libperl$self->{LIB_EXT}"; 2512 $libperl = "$dir/$libperl"; 2513 $lperl ||= "libperl$self->{LIB_EXT}"; 2514 $lperl = "$dir/$lperl"; 2515 2516 if (! -f $libperl and ! -f $lperl) { 2517 # We did not find a static libperl. Maybe there is a shared one? 2518 if ($Is{SunOS}) { 2519 $lperl = $libperl = "$dir/$Config{libperl}"; 2520 # SUNOS ld does not take the full path to a shared library 2521 $libperl = '' if $Is{SunOS4}; 2522 } 2523 } 2524 2525 print "Warning: $libperl not found 2526 If you're going to build a static perl binary, make sure perl is installed 2527 otherwise ignore this warning\n" 2528 unless (-f $lperl || defined($self->{PERL_SRC})); 2529 } 2530 2531 # SUNOS ld does not take the full path to a shared library 2532 my $llibperl = $libperl ? '$(MAP_LIBPERL)' : '-lperl'; 2533 2534 push @m, " 2535MAP_LIBPERL = $libperl 2536LLIBPERL = $llibperl 2537"; 2538 2539 push @m, ' 2540$(INST_ARCHAUTODIR)/extralibs.all : $(INST_ARCHAUTODIR)$(DFSEP).exists '.join(" \\\n\t", @$extra).' 2541 $(NOECHO) $(RM_F) $@ 2542 $(NOECHO) $(TOUCH) $@ 2543'; 2544 2545 foreach my $catfile (@$extra){ 2546 push @m, "\tcat $catfile >> \$\@\n"; 2547 } 2548 2549push @m, " 2550\$(MAP_TARGET) :: $tmp/perlmain\$(OBJ_EXT) \$(MAP_LIBPERL) \$(MAP_STATIC) \$(INST_ARCHAUTODIR)/extralibs.all 2551 \$(MAP_LINKCMD) -o \$\@ \$(OPTIMIZE) $tmp/perlmain\$(OBJ_EXT) \$(LDFROM) \$(MAP_STATIC) \$(LLIBPERL) `cat \$(INST_ARCHAUTODIR)/extralibs.all` \$(MAP_PRELIBS) 2552 \$(NOECHO) \$(ECHO) 'To install the new \"\$(MAP_TARGET)\" binary, call' 2553 \$(NOECHO) \$(ECHO) ' \$(MAKE) \$(USEMAKEFILE) $makefilename inst_perl MAP_TARGET=\$(MAP_TARGET)' 2554 \$(NOECHO) \$(ECHO) 'To remove the intermediate files say' 2555 \$(NOECHO) \$(ECHO) ' \$(MAKE) \$(USEMAKEFILE) $makefilename map_clean' 2556 2557$tmp/perlmain\$(OBJ_EXT): $tmp/perlmain.c 2558"; 2559 push @m, "\t".$self->cd($tmp, qq[$cccmd "-I\$(PERL_INC)" perlmain.c])."\n"; 2560 2561 push @m, qq{ 2562$tmp/perlmain.c: $makefilename}, q{ 2563 $(NOECHO) $(ECHO) Writing $@ 2564 $(NOECHO) $(PERL) $(MAP_PERLINC) "-MExtUtils::Miniperl" \\ 2565 -e "writemain(grep s#.*/auto/##s, split(q| |, q|$(MAP_STATIC)|))" > $@t && $(MV) $@t $@ 2566 2567}; 2568 push @m, "\t", q{$(NOECHO) $(PERL) "$(INSTALLSCRIPT)/fixpmain" 2569} if (defined (&Dos::UseLFN) && Dos::UseLFN()==0); 2570 2571 2572 push @m, q{ 2573doc_inst_perl : 2574 $(NOECHO) $(ECHO) Appending installation info to "$(DESTINSTALLARCHLIB)/perllocal.pod" 2575 -$(NOECHO) $(MKPATH) "$(DESTINSTALLARCHLIB)" 2576 -$(NOECHO) $(DOC_INSTALL) \ 2577 "Perl binary" "$(MAP_TARGET)" \ 2578 MAP_STATIC "$(MAP_STATIC)" \ 2579 MAP_EXTRA "`cat $(INST_ARCHAUTODIR)/extralibs.all`" \ 2580 MAP_LIBPERL "$(MAP_LIBPERL)" \ 2581 >> "}.$self->catfile('$(DESTINSTALLARCHLIB)','perllocal.pod').q{" 2582 2583}; 2584 2585 push @m, q{ 2586inst_perl : pure_inst_perl doc_inst_perl 2587 2588pure_inst_perl : $(MAP_TARGET) 2589 }.$self->{CP}.q{ $(MAP_TARGET) "}.$self->catfile('$(DESTINSTALLBIN)','$(MAP_TARGET)').q{" 2590 2591clean :: map_clean 2592 2593map_clean : 2594 }.$self->{RM_F}.qq{ $tmp/perlmain\$(OBJ_EXT) $tmp/perlmain.c \$(MAP_TARGET) $makefilename \$(INST_ARCHAUTODIR)/extralibs.all 2595}; 2596 2597 join '', @m; 2598} 2599 2600=item makefile (o) 2601 2602Defines how to rewrite the Makefile. 2603 2604=cut 2605 2606sub makefile { 2607 my($self) = shift; 2608 my $m; 2609 # We do not know what target was originally specified so we 2610 # must force a manual rerun to be sure. But as it should only 2611 # happen very rarely it is not a significant problem. 2612 $m = ' 2613$(OBJECT) : $(FIRST_MAKEFILE) 2614 2615' if $self->{OBJECT}; 2616 2617 my $newer_than_target = $Is{VMS} ? '$(MMS$SOURCE_LIST)' : '$?'; 2618 my $mpl_args = join " ", map qq["$_"], @ARGV; 2619 my $cross = ''; 2620 if (defined $::Cross::platform) { 2621 # Inherited from win32/buildext.pl 2622 $cross = "-MCross=$::Cross::platform "; 2623 } 2624 $m .= sprintf <<'MAKE_FRAG', $newer_than_target, $cross, $mpl_args; 2625# We take a very conservative approach here, but it's worth it. 2626# We move Makefile to Makefile.old here to avoid gnu make looping. 2627$(FIRST_MAKEFILE) : Makefile.PL $(CONFIGDEP) 2628 $(NOECHO) $(ECHO) "Makefile out-of-date with respect to %s" 2629 $(NOECHO) $(ECHO) "Cleaning current config before rebuilding Makefile..." 2630 -$(NOECHO) $(RM_F) $(MAKEFILE_OLD) 2631 -$(NOECHO) $(MV) $(FIRST_MAKEFILE) $(MAKEFILE_OLD) 2632 - $(MAKE) $(USEMAKEFILE) $(MAKEFILE_OLD) clean $(DEV_NULL) 2633 $(PERLRUN) %sMakefile.PL %s 2634 $(NOECHO) $(ECHO) "==> Your Makefile has been rebuilt. <==" 2635 $(NOECHO) $(ECHO) "==> Please rerun the $(MAKE) command. <==" 2636 $(FALSE) 2637 2638MAKE_FRAG 2639 2640 return $m; 2641} 2642 2643 2644=item maybe_command 2645 2646Returns true, if the argument is likely to be a command. 2647 2648=cut 2649 2650sub maybe_command { 2651 my($self,$file) = @_; 2652 return $file if -x $file && ! -d $file; 2653 return; 2654} 2655 2656 2657=item needs_linking (o) 2658 2659Does this module need linking? Looks into subdirectory objects (see 2660also has_link_code()) 2661 2662=cut 2663 2664sub needs_linking { 2665 my($self) = shift; 2666 2667 my $caller = (caller(0))[3]; 2668 confess("needs_linking called too early") if 2669 $caller =~ /^ExtUtils::MakeMaker::/; 2670 return $self->{NEEDS_LINKING} if defined $self->{NEEDS_LINKING}; 2671 if ($self->has_link_code or $self->{MAKEAPERL}){ 2672 $self->{NEEDS_LINKING} = 1; 2673 return 1; 2674 } 2675 foreach my $child (keys %{$self->{CHILDREN}}) { 2676 if ($self->{CHILDREN}->{$child}->needs_linking) { 2677 $self->{NEEDS_LINKING} = 1; 2678 return 1; 2679 } 2680 } 2681 return $self->{NEEDS_LINKING} = 0; 2682} 2683 2684 2685=item parse_abstract 2686 2687parse a file and return what you think is the ABSTRACT 2688 2689=cut 2690 2691sub parse_abstract { 2692 my($self,$parsefile) = @_; 2693 my $result; 2694 2695 local $/ = "\n"; 2696 open(my $fh, '<', $parsefile) or die "Could not open '$parsefile': $!"; 2697 my $inpod = 0; 2698 my $pod_encoding; 2699 my $package = $self->{DISTNAME}; 2700 $package =~ s/-/::/g; 2701 while (<$fh>) { 2702 $inpod = /^=(?!cut)/ ? 1 : /^=cut/ ? 0 : $inpod; 2703 next if !$inpod; 2704 chop; 2705 2706 if ( /^=encoding\s*(.*)$/i ) { 2707 $pod_encoding = $1; 2708 } 2709 2710 if ( /^($package(?:\.pm)? \s+ -+ \s+)(.*)/x ) { 2711 $result = $2; 2712 next; 2713 } 2714 next unless $result; 2715 2716 if ( $result && ( /^\s*$/ || /^\=/ ) ) { 2717 last; 2718 } 2719 $result = join ' ', $result, $_; 2720 } 2721 close $fh; 2722 2723 if ( $pod_encoding and !( $] < 5.008 or !$Config{useperlio} ) ) { 2724 # Have to wrap in an eval{} for when running under PERL_CORE 2725 # Encode isn't available during build phase and parsing 2726 # ABSTRACT isn't important there 2727 eval { 2728 require Encode; 2729 $result = Encode::decode($pod_encoding, $result); 2730 } 2731 } 2732 2733 return $result; 2734} 2735 2736=item parse_version 2737 2738 my $version = MM->parse_version($file); 2739 2740Parse a $file and return what $VERSION is set to by the first assignment. 2741It will return the string "undef" if it can't figure out what $VERSION 2742is. $VERSION should be for all to see, so C<our $VERSION> or plain $VERSION 2743are okay, but C<my $VERSION> is not. 2744 2745C<<package Foo VERSION>> is also checked for. The first version 2746declaration found is used, but this may change as it differs from how 2747Perl does it. 2748 2749parse_version() will try to C<use version> before checking for 2750C<$VERSION> so the following will work. 2751 2752 $VERSION = qv(1.2.3); 2753 2754=cut 2755 2756sub parse_version { 2757 my($self,$parsefile) = @_; 2758 my $result; 2759 2760 local $/ = "\n"; 2761 local $_; 2762 open(my $fh, '<', $parsefile) or die "Could not open '$parsefile': $!"; 2763 my $inpod = 0; 2764 while (<$fh>) { 2765 $inpod = /^=(?!cut)/ ? 1 : /^=cut/ ? 0 : $inpod; 2766 next if $inpod || /^\s*#/; 2767 chop; 2768 next if /^\s*(if|unless|elsif)/; 2769 if ( m{^ \s* package \s+ \w[\w\:\']* \s+ (v?[0-9._]+) \s* ; }x ) { 2770 local $^W = 0; 2771 $result = $1; 2772 } 2773 elsif ( m{(?<!\\) ([\$*]) (([\w\:\']*) \bVERSION)\b .* (?<![<>=!])\=[^=]}x ) { 2774 $result = $self->get_version($parsefile, $1, $2); 2775 } 2776 else { 2777 next; 2778 } 2779 last if defined $result; 2780 } 2781 close $fh; 2782 2783 if ( defined $result && $result !~ /^v?[\d_\.]+$/ ) { 2784 require version; 2785 my $normal = eval { version->new( $result ) }; 2786 $result = $normal if defined $normal; 2787 } 2788 $result = "undef" unless defined $result; 2789 return $result; 2790} 2791 2792sub get_version { 2793 my ($self, $parsefile, $sigil, $name) = @_; 2794 my $line = $_; # from the while() loop in parse_version 2795 { 2796 package ExtUtils::MakeMaker::_version; 2797 undef *version; # in case of unexpected version() sub 2798 eval { 2799 require version; 2800 version::->import; 2801 }; 2802 no strict; 2803 local *{$name}; 2804 local $^W = 0; 2805 $line = $1 if $line =~ m{^(.+)}s; 2806 eval($line); ## no critic 2807 return ${$name}; 2808 } 2809} 2810 2811=item pasthru (o) 2812 2813Defines the string that is passed to recursive make calls in 2814subdirectories. 2815 2816=cut 2817 2818sub pasthru { 2819 my($self) = shift; 2820 my(@m); 2821 2822 my(@pasthru); 2823 my($sep) = $Is{VMS} ? ',' : ''; 2824 $sep .= "\\\n\t"; 2825 2826 foreach my $key (qw(LIB LIBPERL_A LINKTYPE OPTIMIZE 2827 PREFIX INSTALL_BASE) 2828 ) 2829 { 2830 next unless defined $self->{$key}; 2831 push @pasthru, "$key=\"\$($key)\""; 2832 } 2833 2834 foreach my $key (qw(DEFINE INC)) { 2835 next unless defined $self->{$key}; 2836 push @pasthru, "PASTHRU_$key=\"\$(PASTHRU_$key)\""; 2837 } 2838 2839 push @m, "\nPASTHRU = ", join ($sep, @pasthru), "\n"; 2840 join "", @m; 2841} 2842 2843=item perl_script 2844 2845Takes one argument, a file name, and returns the file name, if the 2846argument is likely to be a perl script. On MM_Unix this is true for 2847any ordinary, readable file. 2848 2849=cut 2850 2851sub perl_script { 2852 my($self,$file) = @_; 2853 return $file if -r $file && -f _; 2854 return; 2855} 2856 2857=item perldepend (o) 2858 2859Defines the dependency from all *.h files that come with the perl 2860distribution. 2861 2862=cut 2863 2864sub perldepend { 2865 my($self) = shift; 2866 my(@m); 2867 2868 my $make_config = $self->cd('$(PERL_SRC)', '$(MAKE) lib/Config.pm'); 2869 2870 push @m, sprintf <<'MAKE_FRAG', $make_config if $self->{PERL_SRC}; 2871# Check for unpropogated config.sh changes. Should never happen. 2872# We do NOT just update config.h because that is not sufficient. 2873# An out of date config.h is not fatal but complains loudly! 2874$(PERL_INCDEP)/config.h: $(PERL_SRC)/config.sh 2875 -$(NOECHO) $(ECHO) "Warning: $(PERL_INC)/config.h out of date with $(PERL_SRC)/config.sh"; $(FALSE) 2876 2877$(PERL_ARCHLIB)/Config.pm: $(PERL_SRC)/config.sh 2878 $(NOECHO) $(ECHO) "Warning: $(PERL_ARCHLIB)/Config.pm may be out of date with $(PERL_SRC)/config.sh" 2879 %s 2880MAKE_FRAG 2881 2882 return join "", @m unless $self->needs_linking; 2883 2884 if ($self->{OBJECT}) { 2885 # Need to add an object file dependency on the perl headers. 2886 # this is very important for XS modules in perl.git development. 2887 push @m, $self->_perl_header_files_fragment("/"); # Directory separator between $(PERL_INC)/header.h 2888 } 2889 2890 push @m, join(" ", sort values %{$self->{XS}})." : \$(XSUBPPDEPS)\n" if %{$self->{XS}}; 2891 2892 return join "\n", @m; 2893} 2894 2895 2896=item pm_to_blib 2897 2898Defines target that copies all files in the hash PM to their 2899destination and autosplits them. See L<ExtUtils::Install/DESCRIPTION> 2900 2901=cut 2902 2903sub pm_to_blib { 2904 my $self = shift; 2905 my($autodir) = $self->catdir('$(INST_LIB)','auto'); 2906 my $r = q{ 2907pm_to_blib : $(FIRST_MAKEFILE) $(TO_INST_PM) 2908}; 2909 2910 # VMS will swallow '' and PM_FILTER is often empty. So use q[] 2911 my $pm_to_blib = $self->oneliner(<<CODE, ['-MExtUtils::Install']); 2912pm_to_blib({\@ARGV}, '$autodir', q[\$(PM_FILTER)], '\$(PERM_DIR)') 2913CODE 2914 2915 my @cmds = $self->split_command($pm_to_blib, 2916 map { ($_, $self->{PM}->{$_}) } sort keys %{$self->{PM}}); 2917 2918 $r .= join '', map { "\t\$(NOECHO) $_\n" } @cmds; 2919 $r .= qq{\t\$(NOECHO) \$(TOUCH) pm_to_blib\n}; 2920 2921 return $r; 2922} 2923 2924=item post_constants (o) 2925 2926Returns an empty string per default. Dedicated to overrides from 2927within Makefile.PL after all constants have been defined. 2928 2929=cut 2930 2931sub post_constants{ 2932 ""; 2933} 2934 2935=item post_initialize (o) 2936 2937Returns an empty string per default. Used in Makefile.PLs to add some 2938chunk of text to the Makefile after the object is initialized. 2939 2940=cut 2941 2942sub post_initialize { 2943 ""; 2944} 2945 2946=item postamble (o) 2947 2948Returns an empty string. Can be used in Makefile.PLs to write some 2949text to the Makefile at the end. 2950 2951=cut 2952 2953sub postamble { 2954 ""; 2955} 2956 2957# transform dot-separated version string into comma-separated quadruple 2958# examples: '1.2.3.4.5' => '1,2,3,4' 2959# '1.2.3' => '1,2,3,0' 2960sub _ppd_version { 2961 my ($self, $string) = @_; 2962 return join ',', ((split /\./, $string), (0) x 4)[0..3]; 2963} 2964 2965=item ppd 2966 2967Defines target that creates a PPD (Perl Package Description) file 2968for a binary distribution. 2969 2970=cut 2971 2972sub ppd { 2973 my($self) = @_; 2974 2975 my $abstract = $self->{ABSTRACT} || ''; 2976 $abstract =~ s/\n/\\n/sg; 2977 $abstract =~ s/</</g; 2978 $abstract =~ s/>/>/g; 2979 2980 my $author = join(', ',@{$self->{AUTHOR} || []}); 2981 $author =~ s/</</g; 2982 $author =~ s/>/>/g; 2983 2984 my $ppd_file = '$(DISTNAME).ppd'; 2985 2986 my @ppd_cmds = $self->echo(<<'PPD_HTML', $ppd_file, { append => 0, allow_variables => 1 }); 2987<SOFTPKG NAME="$(DISTNAME)" VERSION="$(VERSION)"> 2988PPD_HTML 2989 2990 my $ppd_xml = sprintf <<'PPD_HTML', $abstract, $author; 2991 <ABSTRACT>%s</ABSTRACT> 2992 <AUTHOR>%s</AUTHOR> 2993PPD_HTML 2994 2995 $ppd_xml .= " <IMPLEMENTATION>\n"; 2996 if ( $self->{MIN_PERL_VERSION} ) { 2997 my $min_perl_version = $self->_ppd_version($self->{MIN_PERL_VERSION}); 2998 $ppd_xml .= sprintf <<'PPD_PERLVERS', $min_perl_version; 2999 <PERLCORE VERSION="%s" /> 3000PPD_PERLVERS 3001 3002 } 3003 3004 # Don't add "perl" to requires. perl dependencies are 3005 # handles by ARCHITECTURE. 3006 my %prereqs = %{$self->{PREREQ_PM}}; 3007 delete $prereqs{perl}; 3008 3009 # Build up REQUIRE 3010 foreach my $prereq (sort keys %prereqs) { 3011 my $name = $prereq; 3012 $name .= '::' unless $name =~ /::/; 3013 my $version = $prereqs{$prereq}; 3014 3015 my %attrs = ( NAME => $name ); 3016 $attrs{VERSION} = $version if $version; 3017 my $attrs = join " ", map { qq[$_="$attrs{$_}"] } sort keys %attrs; 3018 $ppd_xml .= qq( <REQUIRE $attrs />\n); 3019 } 3020 3021 my $archname = $Config{archname}; 3022 if ($] >= 5.008) { 3023 # archname did not change from 5.6 to 5.8, but those versions may 3024 # not be not binary compatible so now we append the part of the 3025 # version that changes when binary compatibility may change 3026 $archname .= "-$Config{PERL_REVISION}.$Config{PERL_VERSION}"; 3027 } 3028 $ppd_xml .= sprintf <<'PPD_OUT', $archname; 3029 <ARCHITECTURE NAME="%s" /> 3030PPD_OUT 3031 3032 if ($self->{PPM_INSTALL_SCRIPT}) { 3033 if ($self->{PPM_INSTALL_EXEC}) { 3034 $ppd_xml .= sprintf qq{ <INSTALL EXEC="%s">%s</INSTALL>\n}, 3035 $self->{PPM_INSTALL_EXEC}, $self->{PPM_INSTALL_SCRIPT}; 3036 } 3037 else { 3038 $ppd_xml .= sprintf qq{ <INSTALL>%s</INSTALL>\n}, 3039 $self->{PPM_INSTALL_SCRIPT}; 3040 } 3041 } 3042 3043 if ($self->{PPM_UNINSTALL_SCRIPT}) { 3044 if ($self->{PPM_UNINSTALL_EXEC}) { 3045 $ppd_xml .= sprintf qq{ <UNINSTALL EXEC="%s">%s</UNINSTALL>\n}, 3046 $self->{PPM_UNINSTALL_EXEC}, $self->{PPM_UNINSTALL_SCRIPT}; 3047 } 3048 else { 3049 $ppd_xml .= sprintf qq{ <UNINSTALL>%s</UNINSTALL>\n}, 3050 $self->{PPM_UNINSTALL_SCRIPT}; 3051 } 3052 } 3053 3054 my ($bin_location) = $self->{BINARY_LOCATION} || ''; 3055 $bin_location =~ s/\\/\\\\/g; 3056 3057 $ppd_xml .= sprintf <<'PPD_XML', $bin_location; 3058 <CODEBASE HREF="%s" /> 3059 </IMPLEMENTATION> 3060</SOFTPKG> 3061PPD_XML 3062 3063 push @ppd_cmds, $self->echo($ppd_xml, $ppd_file, { append => 1 }); 3064 3065 return sprintf <<'PPD_OUT', join "\n\t", @ppd_cmds; 3066# Creates a PPD (Perl Package Description) for a binary distribution. 3067ppd : 3068 %s 3069PPD_OUT 3070 3071} 3072 3073=item prefixify 3074 3075 $MM->prefixify($var, $prefix, $new_prefix, $default); 3076 3077Using either $MM->{uc $var} || $Config{lc $var}, it will attempt to 3078replace it's $prefix with a $new_prefix. 3079 3080Should the $prefix fail to match I<AND> a PREFIX was given as an 3081argument to WriteMakefile() it will set it to the $new_prefix + 3082$default. This is for systems whose file layouts don't neatly fit into 3083our ideas of prefixes. 3084 3085This is for heuristics which attempt to create directory structures 3086that mirror those of the installed perl. 3087 3088For example: 3089 3090 $MM->prefixify('installman1dir', '/usr', '/home/foo', 'man/man1'); 3091 3092this will attempt to remove '/usr' from the front of the 3093$MM->{INSTALLMAN1DIR} path (initializing it to $Config{installman1dir} 3094if necessary) and replace it with '/home/foo'. If this fails it will 3095simply use '/home/foo/man/man1'. 3096 3097=cut 3098 3099sub prefixify { 3100 my($self,$var,$sprefix,$rprefix,$default) = @_; 3101 3102 my $path = $self->{uc $var} || 3103 $Config_Override{lc $var} || $Config{lc $var} || ''; 3104 3105 $rprefix .= '/' if $sprefix =~ m|/$|; 3106 3107 warn " prefixify $var => $path\n" if $Verbose >= 2; 3108 warn " from $sprefix to $rprefix\n" if $Verbose >= 2; 3109 3110 if( $self->{ARGS}{PREFIX} && 3111 $path !~ s{^\Q$sprefix\E\b}{$rprefix}s ) 3112 { 3113 3114 warn " cannot prefix, using default.\n" if $Verbose >= 2; 3115 warn " no default!\n" if !$default && $Verbose >= 2; 3116 3117 $path = $self->catdir($rprefix, $default) if $default; 3118 } 3119 3120 print " now $path\n" if $Verbose >= 2; 3121 return $self->{uc $var} = $path; 3122} 3123 3124 3125=item processPL (o) 3126 3127Defines targets to run *.PL files. 3128 3129=cut 3130 3131sub processPL { 3132 my $self = shift; 3133 my $pl_files = $self->{PL_FILES}; 3134 3135 return "" unless $pl_files; 3136 3137 my $m = ''; 3138 foreach my $plfile (sort keys %$pl_files) { 3139 my $list = ref($pl_files->{$plfile}) 3140 ? $pl_files->{$plfile} 3141 : [$pl_files->{$plfile}]; 3142 3143 foreach my $target (@$list) { 3144 if( $Is{VMS} ) { 3145 $plfile = vmsify($self->eliminate_macros($plfile)); 3146 $target = vmsify($self->eliminate_macros($target)); 3147 } 3148 3149 # Normally a .PL file runs AFTER pm_to_blib so it can have 3150 # blib in its @INC and load the just built modules. BUT if 3151 # the generated module is something in $(TO_INST_PM) which 3152 # pm_to_blib depends on then it can't depend on pm_to_blib 3153 # else we have a dependency loop. 3154 my $pm_dep; 3155 my $perlrun; 3156 if( defined $self->{PM}{$target} ) { 3157 $pm_dep = ''; 3158 $perlrun = 'PERLRUN'; 3159 } 3160 else { 3161 $pm_dep = 'pm_to_blib'; 3162 $perlrun = 'PERLRUNINST'; 3163 } 3164 3165 $m .= <<MAKE_FRAG; 3166 3167all :: $target 3168 \$(NOECHO) \$(NOOP) 3169 3170$target :: $plfile $pm_dep 3171 \$($perlrun) $plfile $target 3172MAKE_FRAG 3173 3174 } 3175 } 3176 3177 return $m; 3178} 3179 3180=item specify_shell 3181 3182Specify SHELL if needed - not done on Unix. 3183 3184=cut 3185 3186sub specify_shell { 3187 return ''; 3188} 3189 3190=item quote_paren 3191 3192Backslashes parentheses C<()> in command line arguments. 3193Doesn't handle recursive Makefile C<$(...)> constructs, 3194but handles simple ones. 3195 3196=cut 3197 3198sub quote_paren { 3199 my $arg = shift; 3200 $arg =~ s{\$\((.+?)\)}{\$\\\\($1\\\\)}g; # protect $(...) 3201 $arg =~ s{(?<!\\)([()])}{\\$1}g; # quote unprotected 3202 $arg =~ s{\$\\\\\((.+?)\\\\\)}{\$($1)}g; # unprotect $(...) 3203 return $arg; 3204} 3205 3206=item replace_manpage_separator 3207 3208 my $man_name = $MM->replace_manpage_separator($file_path); 3209 3210Takes the name of a package, which may be a nested package, in the 3211form 'Foo/Bar.pm' and replaces the slash with C<::> or something else 3212safe for a man page file name. Returns the replacement. 3213 3214=cut 3215 3216sub replace_manpage_separator { 3217 my($self,$man) = @_; 3218 3219 $man =~ s,/+,::,g; 3220 return $man; 3221} 3222 3223 3224=item cd 3225 3226=cut 3227 3228sub cd { 3229 my($self, $dir, @cmds) = @_; 3230 3231 # No leading tab and no trailing newline makes for easier embedding 3232 my $make_frag = join "\n\t", map { "cd $dir && $_" } @cmds; 3233 3234 return $make_frag; 3235} 3236 3237=item oneliner 3238 3239=cut 3240 3241sub oneliner { 3242 my($self, $cmd, $switches) = @_; 3243 $switches = [] unless defined $switches; 3244 3245 # Strip leading and trailing newlines 3246 $cmd =~ s{^\n+}{}; 3247 $cmd =~ s{\n+$}{}; 3248 3249 my @cmds = split /\n/, $cmd; 3250 $cmd = join " \n\t -e ", map $self->quote_literal($_), @cmds; 3251 $cmd = $self->escape_newlines($cmd); 3252 3253 $switches = join ' ', @$switches; 3254 3255 return qq{\$(ABSPERLRUN) $switches -e $cmd --}; 3256} 3257 3258 3259=item quote_literal 3260 3261Quotes macro literal value suitable for being used on a command line so 3262that when expanded by make, will be received by command as given to 3263this method: 3264 3265 my $quoted = $mm->quote_literal(q{it isn't}); 3266 # returns: 3267 # 'it isn'\''t' 3268 print MAKEFILE "target:\n\techo $quoted\n"; 3269 # when run "make target", will output: 3270 # it isn't 3271 3272=cut 3273 3274sub quote_literal { 3275 my($self, $text, $opts) = @_; 3276 $opts->{allow_variables} = 1 unless defined $opts->{allow_variables}; 3277 3278 # Quote single quotes 3279 $text =~ s{'}{'\\''}g; 3280 3281 $text = $opts->{allow_variables} 3282 ? $self->escape_dollarsigns($text) : $self->escape_all_dollarsigns($text); 3283 3284 return "'$text'"; 3285} 3286 3287 3288=item escape_newlines 3289 3290=cut 3291 3292sub escape_newlines { 3293 my($self, $text) = @_; 3294 3295 $text =~ s{\n}{\\\n}g; 3296 3297 return $text; 3298} 3299 3300 3301=item max_exec_len 3302 3303Using POSIX::ARG_MAX. Otherwise falling back to 4096. 3304 3305=cut 3306 3307sub max_exec_len { 3308 my $self = shift; 3309 3310 if (!defined $self->{_MAX_EXEC_LEN}) { 3311 if (my $arg_max = eval { require POSIX; &POSIX::ARG_MAX }) { 3312 $self->{_MAX_EXEC_LEN} = $arg_max; 3313 } 3314 else { # POSIX minimum exec size 3315 $self->{_MAX_EXEC_LEN} = 4096; 3316 } 3317 } 3318 3319 return $self->{_MAX_EXEC_LEN}; 3320} 3321 3322 3323=item static (o) 3324 3325Defines the static target. 3326 3327=cut 3328 3329sub static { 3330# --- Static Loading Sections --- 3331 3332 my($self) = shift; 3333 ' 3334## $(INST_PM) has been moved to the all: target. 3335## It remains here for awhile to allow for old usage: "make static" 3336static :: $(FIRST_MAKEFILE) $(INST_STATIC) 3337 $(NOECHO) $(NOOP) 3338'; 3339} 3340 3341=item static_lib (o) 3342 3343Defines how to produce the *.a (or equivalent) files. 3344 3345=cut 3346 3347sub static_lib { 3348 my($self) = @_; 3349 return '' unless $self->has_link_code; 3350 3351 my(@m); 3352 push(@m, <<'END'); 3353 3354$(INST_STATIC) : $(OBJECT) $(MYEXTLIB) $(INST_ARCHAUTODIR)$(DFSEP).exists 3355 $(RM_RF) $@ 3356END 3357 3358 # If this extension has its own library (eg SDBM_File) 3359 # then copy that to $(INST_STATIC) and add $(OBJECT) into it. 3360 push(@m, <<'MAKE_FRAG') if $self->{MYEXTLIB}; 3361 $(CP) $(MYEXTLIB) "$@" 3362MAKE_FRAG 3363 3364 my $ar; 3365 if (exists $self->{FULL_AR} && -x $self->{FULL_AR}) { 3366 # Prefer the absolute pathed ar if available so that PATH 3367 # doesn't confuse us. Perl itself is built with the full_ar. 3368 $ar = 'FULL_AR'; 3369 } else { 3370 $ar = 'AR'; 3371 } 3372 push @m, sprintf <<'MAKE_FRAG', $ar; 3373 $(%s) $(AR_STATIC_ARGS) $@ $(OBJECT) && $(RANLIB) $@ 3374 $(CHMOD) $(PERM_RWX) $@ 3375 $(NOECHO) $(ECHO) "$(EXTRALIBS)" > "$(INST_ARCHAUTODIR)/extralibs.ld" 3376MAKE_FRAG 3377 3378 # Old mechanism - still available: 3379 push @m, <<'MAKE_FRAG' if $self->{PERL_SRC} && $self->{EXTRALIBS}; 3380 $(NOECHO) $(ECHO) "$(EXTRALIBS)" >> "$(PERL_SRC)/ext.libs" 3381MAKE_FRAG 3382 3383 join('', @m); 3384} 3385 3386=item staticmake (o) 3387 3388Calls makeaperl. 3389 3390=cut 3391 3392sub staticmake { 3393 my($self, %attribs) = @_; 3394 my(@static); 3395 3396 my(@searchdirs)=($self->{PERL_ARCHLIB}, $self->{SITEARCHEXP}, $self->{INST_ARCHLIB}); 3397 3398 # And as it's not yet built, we add the current extension 3399 # but only if it has some C code (or XS code, which implies C code) 3400 if (@{$self->{C}}) { 3401 @static = $self->catfile($self->{INST_ARCHLIB}, 3402 "auto", 3403 $self->{FULLEXT}, 3404 "$self->{BASEEXT}$self->{LIB_EXT}" 3405 ); 3406 } 3407 3408 # Either we determine now, which libraries we will produce in the 3409 # subdirectories or we do it at runtime of the make. 3410 3411 # We could ask all subdir objects, but I cannot imagine, why it 3412 # would be necessary. 3413 3414 # Instead we determine all libraries for the new perl at 3415 # runtime. 3416 my(@perlinc) = ($self->{INST_ARCHLIB}, $self->{INST_LIB}, $self->{PERL_ARCHLIB}, $self->{PERL_LIB}); 3417 3418 $self->makeaperl(MAKE => $self->{MAKEFILE}, 3419 DIRS => \@searchdirs, 3420 STAT => \@static, 3421 INCL => \@perlinc, 3422 TARGET => $self->{MAP_TARGET}, 3423 TMP => "", 3424 LIBPERL => $self->{LIBPERL_A} 3425 ); 3426} 3427 3428=item subdir_x (o) 3429 3430Helper subroutine for subdirs 3431 3432=cut 3433 3434sub subdir_x { 3435 my($self, $subdir) = @_; 3436 3437 my $subdir_cmd = $self->cd($subdir, 3438 '$(MAKE) $(USEMAKEFILE) $(FIRST_MAKEFILE) all $(PASTHRU)' 3439 ); 3440 return sprintf <<'EOT', $subdir_cmd; 3441 3442subdirs :: 3443 $(NOECHO) %s 3444EOT 3445 3446} 3447 3448=item subdirs (o) 3449 3450Defines targets to process subdirectories. 3451 3452=cut 3453 3454sub subdirs { 3455# --- Sub-directory Sections --- 3456 my($self) = shift; 3457 my(@m); 3458 # This method provides a mechanism to automatically deal with 3459 # subdirectories containing further Makefile.PL scripts. 3460 # It calls the subdir_x() method for each subdirectory. 3461 foreach my $dir (@{$self->{DIR}}){ 3462 push(@m, $self->subdir_x($dir)); 3463#### print "Including $dir subdirectory\n"; 3464 } 3465 if (@m){ 3466 unshift(@m, " 3467# The default clean, realclean and test targets in this Makefile 3468# have automatically been given entries for each subdir. 3469 3470"); 3471 } else { 3472 push(@m, "\n# none") 3473 } 3474 join('',@m); 3475} 3476 3477=item test (o) 3478 3479Defines the test targets. 3480 3481=cut 3482 3483sub test { 3484# --- Test and Installation Sections --- 3485 3486 my($self, %attribs) = @_; 3487 my $tests = $attribs{TESTS} || ''; 3488 if (!$tests && -d 't' && defined $attribs{RECURSIVE_TEST_FILES}) { 3489 $tests = $self->find_tests_recursive; 3490 } 3491 elsif (!$tests && -d 't') { 3492 $tests = $self->find_tests; 3493 } 3494 # have to do this because nmake is broken 3495 $tests =~ s!/!\\!g if $self->is_make_type('nmake'); 3496 # note: 'test.pl' name is also hardcoded in init_dirscan() 3497 my(@m); 3498 push(@m," 3499TEST_VERBOSE=0 3500TEST_TYPE=test_\$(LINKTYPE) 3501TEST_FILE = test.pl 3502TEST_FILES = $tests 3503TESTDB_SW = -d 3504 3505testdb :: testdb_\$(LINKTYPE) 3506 3507test :: \$(TEST_TYPE) subdirs-test 3508 3509subdirs-test :: 3510 \$(NOECHO) \$(NOOP) 3511 3512"); 3513 3514 foreach my $dir (@{ $self->{DIR} }) { 3515 my $test = $self->cd($dir, '$(MAKE) test $(PASTHRU)'); 3516 3517 push @m, <<END 3518subdirs-test :: 3519 \$(NOECHO) $test 3520 3521END 3522 } 3523 3524 push(@m, "\t\$(NOECHO) \$(ECHO) 'No tests defined for \$(NAME) extension.'\n") 3525 unless $tests or -f "test.pl" or @{$self->{DIR}}; 3526 push(@m, "\n"); 3527 3528 push(@m, "test_dynamic :: pure_all\n"); 3529 push(@m, $self->test_via_harness('$(FULLPERLRUN)', '$(TEST_FILES)')) 3530 if $tests; 3531 push(@m, $self->test_via_script('$(FULLPERLRUN)', '$(TEST_FILE)')) 3532 if -f "test.pl"; 3533 push(@m, "\n"); 3534 3535 push(@m, "testdb_dynamic :: pure_all\n"); 3536 push(@m, $self->test_via_script('$(FULLPERLRUN) $(TESTDB_SW)', 3537 '$(TEST_FILE)')); 3538 push(@m, "\n"); 3539 3540 # Occasionally we may face this degenerate target: 3541 push @m, "test_ : test_dynamic\n\n"; 3542 3543 if ($self->needs_linking()) { 3544 push(@m, "test_static :: pure_all \$(MAP_TARGET)\n"); 3545 push(@m, $self->test_via_harness('./$(MAP_TARGET)', '$(TEST_FILES)')) if $tests; 3546 push(@m, $self->test_via_script('./$(MAP_TARGET)', '$(TEST_FILE)')) if -f "test.pl"; 3547 push(@m, "\n"); 3548 push(@m, "testdb_static :: pure_all \$(MAP_TARGET)\n"); 3549 push(@m, $self->test_via_script('./$(MAP_TARGET) $(TESTDB_SW)', '$(TEST_FILE)')); 3550 push(@m, "\n"); 3551 } else { 3552 push @m, "test_static :: test_dynamic\n"; 3553 push @m, "testdb_static :: testdb_dynamic\n"; 3554 } 3555 join("", @m); 3556} 3557 3558=item test_via_harness (override) 3559 3560For some reason which I forget, Unix machines like to have 3561PERL_DL_NONLAZY set for tests. 3562 3563=cut 3564 3565sub test_via_harness { 3566 my($self, $perl, $tests) = @_; 3567 return $self->SUPER::test_via_harness("PERL_DL_NONLAZY=1 $perl", $tests); 3568} 3569 3570=item test_via_script (override) 3571 3572Again, the PERL_DL_NONLAZY thing. 3573 3574=cut 3575 3576sub test_via_script { 3577 my($self, $perl, $script) = @_; 3578 return $self->SUPER::test_via_script("PERL_DL_NONLAZY=1 $perl", $script); 3579} 3580 3581 3582=item tool_xsubpp (o) 3583 3584Determines typemaps, xsubpp version, prototype behaviour. 3585 3586=cut 3587 3588sub tool_xsubpp { 3589 my($self) = shift; 3590 return "" unless $self->needs_linking; 3591 3592 my $xsdir; 3593 my @xsubpp_dirs = @INC; 3594 3595 # Make sure we pick up the new xsubpp if we're building perl. 3596 unshift @xsubpp_dirs, $self->{PERL_LIB} if $self->{PERL_CORE}; 3597 3598 my $foundxsubpp = 0; 3599 foreach my $dir (@xsubpp_dirs) { 3600 $xsdir = $self->catdir($dir, 'ExtUtils'); 3601 if( -r $self->catfile($xsdir, "xsubpp") ) { 3602 $foundxsubpp = 1; 3603 last; 3604 } 3605 } 3606 die "ExtUtils::MM_Unix::tool_xsubpp : Can't find xsubpp" if !$foundxsubpp; 3607 3608 my $tmdir = File::Spec->catdir($self->{PERL_LIB},"ExtUtils"); 3609 my(@tmdeps) = $self->catfile($tmdir,'typemap'); 3610 if( $self->{TYPEMAPS} ){ 3611 foreach my $typemap (@{$self->{TYPEMAPS}}){ 3612 if( ! -f $typemap ) { 3613 warn "Typemap $typemap not found.\n"; 3614 } 3615 else { 3616 push(@tmdeps, $typemap); 3617 } 3618 } 3619 } 3620 push(@tmdeps, "typemap") if -f "typemap"; 3621 my @tmargs = map(qq{-typemap "$_"}, @tmdeps); 3622 $_ = $self->quote_dep($_) for @tmdeps; 3623 if( exists $self->{XSOPT} ){ 3624 unshift( @tmargs, $self->{XSOPT} ); 3625 } 3626 3627 if ($Is{VMS} && 3628 $Config{'ldflags'} && 3629 $Config{'ldflags'} =~ m!/Debug!i && 3630 (!exists($self->{XSOPT}) || $self->{XSOPT} !~ /linenumbers/) 3631 ) 3632 { 3633 unshift(@tmargs,'-nolinenumbers'); 3634 } 3635 3636 3637 $self->{XSPROTOARG} = "" unless defined $self->{XSPROTOARG}; 3638 my $xsdirdep = $self->quote_dep($xsdir); 3639 # -dep for use when dependency not command 3640 3641 return qq{ 3642XSUBPPDIR = $xsdir 3643XSUBPP = "\$(XSUBPPDIR)\$(DFSEP)xsubpp" 3644XSUBPPRUN = \$(PERLRUN) \$(XSUBPP) 3645XSPROTOARG = $self->{XSPROTOARG} 3646XSUBPPDEPS = @tmdeps $xsdirdep\$(DFSEP)xsubpp 3647XSUBPPARGS = @tmargs 3648XSUBPP_EXTRA_ARGS = 3649}; 3650} 3651 3652 3653=item all_target 3654 3655Build man pages, too 3656 3657=cut 3658 3659sub all_target { 3660 my $self = shift; 3661 3662 return <<'MAKE_EXT'; 3663all :: pure_all manifypods 3664 $(NOECHO) $(NOOP) 3665MAKE_EXT 3666} 3667 3668=item top_targets (o) 3669 3670Defines the targets all, subdirs, config, and O_FILES 3671 3672=cut 3673 3674sub top_targets { 3675# --- Target Sections --- 3676 3677 my($self) = shift; 3678 my(@m); 3679 3680 push @m, $self->all_target, "\n" unless $self->{SKIPHASH}{'all'}; 3681 3682 push @m, ' 3683pure_all :: config pm_to_blib subdirs linkext 3684 $(NOECHO) $(NOOP) 3685 3686subdirs :: $(MYEXTLIB) 3687 $(NOECHO) $(NOOP) 3688 3689config :: $(FIRST_MAKEFILE) blibdirs 3690 $(NOECHO) $(NOOP) 3691'; 3692 3693 push @m, ' 3694$(O_FILES): $(H_FILES) 3695' if @{$self->{O_FILES} || []} && @{$self->{H} || []}; 3696 3697 push @m, q{ 3698help : 3699 perldoc ExtUtils::MakeMaker 3700}; 3701 3702 join('',@m); 3703} 3704 3705=item writedoc 3706 3707Obsolete, deprecated method. Not used since Version 5.21. 3708 3709=cut 3710 3711sub writedoc { 3712# --- perllocal.pod section --- 3713 my($self,$what,$name,@attribs)=@_; 3714 my $time = localtime; 3715 print "=head2 $time: $what C<$name>\n\n=over 4\n\n=item *\n\n"; 3716 print join "\n\n=item *\n\n", map("C<$_>",@attribs); 3717 print "\n\n=back\n\n"; 3718} 3719 3720=item xs_c (o) 3721 3722Defines the suffix rules to compile XS files to C. 3723 3724=cut 3725 3726sub xs_c { 3727 my($self) = shift; 3728 return '' unless $self->needs_linking(); 3729 ' 3730.xs.c: 3731 $(XSUBPPRUN) $(XSPROTOARG) $(XSUBPPARGS) $(XSUBPP_EXTRA_ARGS) $*.xs > $*.xsc && $(MV) $*.xsc $*.c 3732'; 3733} 3734 3735=item xs_cpp (o) 3736 3737Defines the suffix rules to compile XS files to C++. 3738 3739=cut 3740 3741sub xs_cpp { 3742 my($self) = shift; 3743 return '' unless $self->needs_linking(); 3744 ' 3745.xs.cpp: 3746 $(XSUBPPRUN) $(XSPROTOARG) $(XSUBPPARGS) $*.xs > $*.xsc && $(MV) $*.xsc $*.cpp 3747'; 3748} 3749 3750=item xs_o (o) 3751 3752Defines suffix rules to go from XS to object files directly. This is 3753only intended for broken make implementations. 3754 3755=cut 3756 3757sub xs_o { # many makes are too dumb to use xs_c then c_o 3758 my($self) = shift; 3759 return '' unless $self->needs_linking(); 3760 ' 3761.xs$(OBJ_EXT): 3762 $(XSUBPPRUN) $(XSPROTOARG) $(XSUBPPARGS) $*.xs > $*.xsc && $(MV) $*.xsc $*.c 3763 $(CCCMD) $(CCCDLFLAGS) "-I$(PERL_INC)" $(PASTHRU_DEFINE) $(DEFINE) $*.c 3764'; 3765} 3766 3767 37681; 3769 3770=back 3771 3772=head1 SEE ALSO 3773 3774L<ExtUtils::MakeMaker> 3775 3776=cut 3777 3778__END__ 3779