X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FExtUtils%2FMM_Unix.pm;h=88240764d43d9cedbd0ea9acadf567e7f6b83ce3;hb=a689d17c141724192b54fa97a3c59fafae045cf3;hp=f1102aa44e1bf5e60d1404abee9669df49c769f3;hpb=58a50f6288bdd18f3f469352f83c5e7ade50ee7a;p=p5sagit%2Fp5-mst-13.2.git diff --git a/lib/ExtUtils/MM_Unix.pm b/lib/ExtUtils/MM_Unix.pm index f1102aa..8824076 100644 --- a/lib/ExtUtils/MM_Unix.pm +++ b/lib/ExtUtils/MM_Unix.pm @@ -5,20 +5,21 @@ use Config; use File::Basename qw(basename dirname fileparse); use DirHandle; use strict; -use vars qw($VERSION $Is_Mac $Is_OS2 $Is_VMS $Is_Win32 $Is_Dos +use vars qw($VERSION $Is_Mac $Is_OS2 $Is_VMS $Is_Win32 $Is_Dos $Is_PERL_OBJECT $Verbose %pm %static $Xsubpp_Version); -$VERSION = substr q$Revision: 1.118 $, 10; -# $Id: MM_Unix.pm,v 1.118 1997/08/01 09:42:52 k Exp $ +$VERSION = substr q$Revision: 1.12602 $, 10; +# $Id: MM_Unix.pm,v 1.126 1998/06/28 21:32:49 k Exp k $ -Exporter::import('ExtUtils::MakeMaker', - qw( $Verbose &neatvalue)); +Exporter::import('ExtUtils::MakeMaker', qw($Verbose &neatvalue)); $Is_OS2 = $^O eq 'os2'; $Is_Mac = $^O eq 'MacOS'; $Is_Win32 = $^O eq 'MSWin32'; $Is_Dos = $^O eq 'dos'; +$Is_PERL_OBJECT = $Config{'ccflags'} =~ /-DPERL_OBJECT/; + if ($Is_VMS = $^O eq 'VMS') { require VMS::Filespec; import VMS::Filespec qw( &vmsify ); @@ -78,11 +79,15 @@ path. On UNIX eliminated successive slashes and successive "/.". sub canonpath { my($self,$path) = @_; - $path =~ s|/+|/|g ; # xx////xx -> xx/xx + my $node = ''; + if ( $^O eq 'qnx' && $path =~ s|^(//\d+)/|/| ) { + $node = $1; + } + $path =~ s|(?<=[^/])/+|/|g ; # xx////xx -> xx/xx $path =~ s|(/\.)+/|/|g ; # xx/././xx -> xx/xx $path =~ s|^(\./)+|| unless $path eq "./"; # ./xx -> xx - $path =~ s|/$|| unless $path eq "/"; # xx/ -> xx - $path; + $path =~ s|(?<=[^/])/$|| ; # xx/ -> xx + "$node$path"; } =item catdir @@ -182,6 +187,7 @@ sub ExtUtils::MM_Unix::fixin ; sub ExtUtils::MM_Unix::force ; sub ExtUtils::MM_Unix::guess_name ; sub ExtUtils::MM_Unix::has_link_code ; +sub ExtUtils::MM_Unix::htmlifypods ; sub ExtUtils::MM_Unix::init_dirscan ; sub ExtUtils::MM_Unix::init_main ; sub ExtUtils::MM_Unix::init_others ; @@ -227,6 +233,7 @@ sub ExtUtils::MM_Unix::tools_other ; sub ExtUtils::MM_Unix::top_targets ; sub ExtUtils::MM_Unix::writedoc ; sub ExtUtils::MM_Unix::xs_c ; +sub ExtUtils::MM_Unix::xs_cpp ; sub ExtUtils::MM_Unix::xs_o ; sub ExtUtils::MM_Unix::xsubpp_version ; @@ -368,21 +375,33 @@ sub cflags { $self->{uc $_} ||= $cflags{$_} } - if ($self->{CAPI}) { - $self->{CCFLAGS} =~ s/-DPERL_OBJECT(\s|$)//; - $self->{CCFLAGS} .= '-DPERL_CAPI'; - if ($Is_Win32 && $Config{'cc'} =~ /^cl.exe/i) { + if ($Is_PERL_OBJECT) { + $self->{CCFLAGS} =~ s/-DPERL_OBJECT(\b|$)/-DPERL_CAPI/g; + if ($Is_Win32 && $Config{'cc'} =~ /^cl/i) { # Turn off C++ mode of the MSC compiler $self->{CCFLAGS} =~ s/-TP(\s|$)//; $self->{OPTIMIZE} =~ s/-TP(\s|$)//; } } + + if ($self->{POLLUTE}) { + $self->{CCFLAGS} .= ' -DPERL_POLLUTE '; + } + + my $pollute = ''; + if ($Config{usemymalloc} and not $Config{bincompat5005} + and not $Config{ccflags} =~ /-DPERL_POLLUTE_MALLOC\b/ + and $self->{PERL_MALLOC_OK}) { + $pollute = '$(PERL_MALLOC_DEF)'; + } + return $self->{CFLAGS} = qq{ CCFLAGS = $self->{CCFLAGS} OPTIMIZE = $self->{OPTIMIZE} PERLTYPE = $self->{PERLTYPE} LARGE = $self->{LARGE} SPLIT = $self->{SPLIT} +MPOLLUTE = $pollute }; } @@ -439,7 +458,7 @@ sub const_cccmd { return '' unless $self->needs_linking(); return $self->{CONST_CCCMD} = q{CCCMD = $(CC) -c $(INC) $(CCFLAGS) $(OPTIMIZE) \\ - $(PERLTYPE) $(LARGE) $(SPLIT) $(DEFINE_VERSION) \\ + $(PERLTYPE) $(LARGE) $(SPLIT) $(MPOLLUTE) $(DEFINE_VERSION) \\ $(XS_DEFINE_VERSION)}; } @@ -524,6 +543,7 @@ VERSION_MACRO = VERSION DEFINE_VERSION = -D\$(VERSION_MACRO)=\\\"\$(VERSION)\\\" XS_VERSION_MACRO = XS_VERSION XS_DEFINE_VERSION = -D\$(XS_VERSION_MACRO)=\\\"\$(XS_VERSION)\\\" +PERL_MALLOC_DEF = -DPERL_EXTMALLOC_DEF -Dmalloc=Perl_malloc -Dfree=Perl_mfree -Drealloc=Perl_realloc -Dcalloc=Perl_calloc }; push @m, qq{ @@ -553,17 +573,33 @@ XS_FILES= ".join(" \\\n\t", sort keys %{$self->{XS}})." C_FILES = ".join(" \\\n\t", @{$self->{C}})." O_FILES = ".join(" \\\n\t", @{$self->{O_FILES}})." H_FILES = ".join(" \\\n\t", @{$self->{H}})." +HTMLLIBPODS = ".join(" \\\n\t", sort keys %{$self->{HTMLLIBPODS}})." +HTMLSCRIPTPODS = ".join(" \\\n\t", sort keys %{$self->{HTMLSCRIPTPODS}})." MAN1PODS = ".join(" \\\n\t", sort keys %{$self->{MAN1PODS}})." MAN3PODS = ".join(" \\\n\t", sort keys %{$self->{MAN3PODS}})." "; for $tmp (qw/ - INST_MAN1DIR INSTALLMAN1DIR MAN1EXT INST_MAN3DIR INSTALLMAN3DIR MAN3EXT + INST_HTMLPRIVLIBDIR INSTALLHTMLPRIVLIBDIR + INST_HTMLSITELIBDIR INSTALLHTMLSITELIBDIR + INST_HTMLSCRIPTDIR INSTALLHTMLSCRIPTDIR + INST_HTMLLIBDIR HTMLEXT + INST_MAN1DIR INSTALLMAN1DIR MAN1EXT + INST_MAN3DIR INSTALLMAN3DIR MAN3EXT /) { next unless defined $self->{$tmp}; push @m, "$tmp = $self->{$tmp}\n"; } + for $tmp (qw( + PERM_RW PERM_RWX + ) + ) { + my $method = lc($tmp); + # warn "self[$self] method[$method]"; + push @m, "$tmp = ", $self->$method(), "\n"; + } + push @m, q{ .NO_CONFIG_REC: Makefile } if $ENV{CLEARCASE_ROOT}; @@ -688,8 +724,8 @@ $targ :: $src $self->{NOECHO}\$(MKPATH) $targdir $self->{NOECHO}\$(EQUALIZE_TIMESTAMP) $src $targ }; - push(@m,qq{ - -$self->{NOECHO}\$(CHMOD) 755 $targdir + push(@m, qq{ + -$self->{NOECHO}\$(CHMOD) \$(PERM_RWX) $targdir }) unless $Is_VMS; } join "", @m; @@ -712,8 +748,8 @@ sub dist { my($tarflags) = $attribs{TARFLAGS} || 'cvf'; my($zip) = $attribs{ZIP} || 'zip'; # eg pkzip Yuck! my($zipflags) = $attribs{ZIPFLAGS} || '-r'; - my($compress) = $attribs{COMPRESS} || 'compress'; # eg gzip - my($suffix) = $attribs{SUFFIX} || '.Z'; # eg .gz + my($compress) = $attribs{COMPRESS} || 'gzip --best'; + my($suffix) = $attribs{SUFFIX} || '.gz'; # eg .gz my($shar) = $attribs{SHAR} || 'shar'; # eg "shar --gzip" my($preop) = $attribs{PREOP} || "$self->{NOECHO}\$(NOOP)"; # eg update MANIFEST my($postop) = $attribs{POSTOP} || "$self->{NOECHO}\$(NOOP)"; # eg remove the distdir @@ -803,7 +839,7 @@ ci : =item dist_core (o) -Defeines the targets dist, tardist, zipdist, uutardist, shdist +Defines the targets dist, tardist, zipdist, uutardist, shdist =cut @@ -900,6 +936,7 @@ sub dlsyms { my($funcs) = $attribs{DL_FUNCS} || $self->{DL_FUNCS} || {}; my($vars) = $attribs{DL_VARS} || $self->{DL_VARS} || []; + my($funclist) = $attribs{FUNCLIST} || $self->{FUNCLIST} || []; my(@m); push(@m," @@ -916,7 +953,8 @@ static :: $self->{BASEEXT}.exp $self->{BASEEXT}.exp: Makefile.PL ",' $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" -e \'use ExtUtils::Mksymlists; \\ Mksymlists("NAME" => "',$self->{NAME},'", "DL_FUNCS" => ', - neatvalue($funcs),', "DL_VARS" => ', neatvalue($vars), ');\' + neatvalue($funcs), ', "FUNCLIST" => ', neatvalue($funclist), + ', "DL_VARS" => ', neatvalue($vars), ');\' '); join('',@m); @@ -965,12 +1003,12 @@ $(BOOTSTRAP): '."$self->{MAKEFILE} $self->{BOOTDEP}".' $(INST_ARCHAUTODIR)/.exis -MExtUtils::Mkbootstrap \ -e "Mkbootstrap(\'$(BASEEXT)\',\'$(BSLOADLIBS)\');" '.$self->{NOECHO}.'$(TOUCH) $(BOOTSTRAP) - $(CHMOD) 644 $@ + $(CHMOD) $(PERM_RW) $@ $(INST_BOOT): $(BOOTSTRAP) $(INST_ARCHAUTODIR)/.exists '."$self->{NOECHO}$self->{RM_RF}".' $(INST_BOOT) -'.$self->{CP}.' $(BOOTSTRAP) $(INST_BOOT) - $(CHMOD) 644 $@ + $(CHMOD) $(PERM_RW) $@ '; } @@ -1015,13 +1053,13 @@ $(INST_DYNAMIC): $(OBJECT) $(MYEXTLIB) $(BOOTSTRAP) $(INST_ARCHAUTODIR)/.exists if ($^O eq 'solaris'); # The IRIX linker also doesn't use LD_RUN_PATH - $ldrun = "-rpath $self->{LD_RUN_PATH}" - if ($^O eq 'irix'); + $ldrun = qq{-rpath "$self->{LD_RUN_PATH}"} + if ($^O eq 'irix' && $self->{LD_RUN_PATH}); push(@m,' LD_RUN_PATH="$(LD_RUN_PATH)" $(LD) -o $@ '.$ldrun.' $(LDDLFLAGS) '.$ldfrom. ' $(OTHERLDFLAGS) $(MYEXTLIB) $(PERL_ARCHIVE) $(LDLOADLIBS) $(EXPORT_LIST)'); push @m, ' - $(CHMOD) 755 $@ + $(CHMOD) $(PERM_RWX) $@ '; push @m, $self->dir_target('$(INST_ARCHAUTODIR)'); @@ -1186,7 +1224,10 @@ eval 'exec $interpreter $arg -S \$0 \${1+"\$\@"}' next; } my($dev,$ino,$mode) = stat FIXIN; - $mode = 0755 unless $dev; + # If they override perm_rwx, we won't notice it during fixin, + # because fixin is run through a new instance of MakeMaker. + # That is why we must run another CHMOD later. + $mode = oct($self->perm_rwx) unless $dev; chmod $mode, $file; # Print out the new #! line (or equivalent). @@ -1210,7 +1251,8 @@ eval 'exec $interpreter $arg -S \$0 \${1+"\$\@"}' } unlink "$file.bak"; } continue { - chmod 0755, $file or die "Can't reset permissions for $file: $!\n"; + chmod oct($self->perm_rwx), $file or + die "Can't reset permissions for $file: $!\n"; system("$Config{'eunicefix'} $file") if $Config{'eunicefix'} ne ':';; } } @@ -1268,9 +1310,60 @@ sub has_link_code { return $self->{HAS_LINK_CODE} = 0; } +=item htmlifypods (o) + +Defines targets and routines to translate the pods into HTML manpages +and put them into the INST_HTMLLIBDIR and INST_HTMLSCRIPTDIR +directories. + +=cut + +sub htmlifypods { + my($self, %attribs) = @_; + return "\nhtmlifypods : pure_all\n\t$self->{NOECHO}\$(NOOP)\n" unless + %{$self->{HTMLLIBPODS}} || %{$self->{HTMLSCRIPTPODS}}; + my($dist); + my($pod2html_exe); + if (defined $self->{PERL_SRC}) { + $pod2html_exe = $self->catfile($self->{PERL_SRC},'pod','pod2html'); + } else { + $pod2html_exe = $self->catfile($Config{scriptdirexp},'pod2html'); + } + unless ($pod2html_exe = $self->perl_script($pod2html_exe)) { + # No pod2html but some HTMLxxxPODS to be installed + print <{MAKEFILE}, q[";' \\ +-e 'print "Htmlifying $$m{$$_}\n";' \\ +-e '$$dir = dirname($$m{$$_}); mkpath($$dir) unless -d $$dir;' \\ +-e 'system(qq[$$^X ].q["-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" $(POD2HTML_EXE) ].qq[$$_>$$m{$$_}])==0 or warn "Couldn\\047t install $$m{$$_}\n";' \\ +-e 'chmod(oct($(PERM_RW))), $$m{$$_} or warn "chmod $(PERM_RW) $$m{$$_}: $$!\n";}' +]; + push @m, "\nhtmlifypods : pure_all "; + push @m, join " \\\n\t", keys %{$self->{HTMLLIBPODS}}, keys %{$self->{HTMLSCRIPTPODS}}; + + push(@m,"\n"); + if (%{$self->{HTMLLIBPODS}} || %{$self->{HTMLSCRIPTPODS}}) { + push @m, "\t$self->{NOECHO}\$(POD2HTML) \\\n\t"; + push @m, join " \\\n\t", %{$self->{HTMLLIBPODS}}, %{$self->{HTMLSCRIPTPODS}}; + } + join('', @m); +} + =item init_dirscan -Initializes DIR, XS, PM, C, O_FILES, H, PL_FILES, MAN*PODS, EXE_FILES. +Initializes DIR, XS, PM, C, O_FILES, H, PL_FILES, HTML*PODS, MAN*PODS, EXE_FILES. =cut @@ -1298,10 +1391,12 @@ sub init_dirscan { # --- File and Directory Lists (.xs .pm .pod etc) $h{$name} = 1; } elsif ($name =~ /\.PL$/) { ($pl_files{$name} = $name) =~ s/\.PL$// ; - } elsif ($Is_VMS && $name =~ /\.pl$/) { # case-insensitive filesystem + } elsif (($Is_VMS || $Is_Dos) && $name =~ /[._]pl$/i) { + # case-insensitive filesystem, one dot per name, so foo.h.PL + # under Unix appears as foo.h_pl under VMS or fooh.pl on Dos local($/); open(PL,$name); my $txt = ; close PL; if ($txt =~ /Extracting \S+ \(with variable substitutions/) { - ($pl_files{$name} = $name) =~ s/\.pl$// ; + ($pl_files{$name} = $name) =~ s/[._]pl$//i ; } else { $pm{$name} = $self->catfile('$(INST_LIBDIR)',$name); } } elsif ($name =~ /\.(p[ml]|pod)$/){ @@ -1384,65 +1479,59 @@ sub init_dirscan { # --- File and Directory Lists (.xs .pm .pod etc) $self->{PL_FILES} = \%pl_files unless $self->{PL_FILES}; # Set up names of manual pages to generate from pods - if ($self->{MAN1PODS}) { - } elsif ( $self->{INST_MAN1DIR} =~ /^(none|\s*)$/ ) { - $self->{MAN1PODS} = {}; - } else { - my %manifypods = (); + my %pods; + foreach my $man (qw(MAN1 MAN3 HTMLLIB HTMLSCRIPT)) { + unless ($self->{"${man}PODS"}) { + $self->{"${man}PODS"} = {}; + $pods{$man} = 1 unless $self->{"INST_${man}DIR"} =~ /^(none|\s*)$/; + } + } + + if ($pods{MAN1} || $pods{HTMLSCRIPT}) { if ( exists $self->{EXE_FILES} ) { foreach $name (@{$self->{EXE_FILES}}) { -# use FileHandle (); -# my $fh = new FileHandle; local *FH; my($ispod)=0; -# if ($fh->open("<$name")) { if (open(FH,"<$name")) { -# while (<$fh>) { while () { if (/^=head1\s+\w+/) { $ispod=1; last; } } -# $fh->close; close FH; } else { # If it doesn't exist yet, we assume, it has pods in it $ispod = 1; } - if( $ispod ) { - $manifypods{$name} = - $self->catfile('$(INST_MAN1DIR)', - basename($name).'.$(MAN1EXT)'); + next unless $ispod; + if ($pods{HTMLSCRIPT}) { + $self->{HTMLSCRIPTPODS}->{$name} = + $self->catfile("\$(INST_HTMLSCRIPTDIR)", basename($name).".\$(HTMLEXT)"); + } + if ($pods{MAN1}) { + $self->{MAN1PODS}->{$name} = + $self->catfile("\$(INST_MAN1DIR)", basename($name).".\$(MAN1EXT)"); } } } - $self->{MAN1PODS} = \%manifypods; } - if ($self->{MAN3PODS}) { - } elsif ( $self->{INST_MAN3DIR} =~ /^(none|\s*)$/ ) { - $self->{MAN3PODS} = {}; - } else { + if ($pods{MAN3} || $pods{HTMLLIB}) { my %manifypods = (); # we collect the keys first, i.e. the files # we have to convert to pod foreach $name (keys %{$self->{PM}}) { if ($name =~ /\.pod$/ ) { $manifypods{$name} = $self->{PM}{$name}; } elsif ($name =~ /\.p[ml]$/ ) { -# use FileHandle (); -# my $fh = new FileHandle; local *FH; my($ispod)=0; -# $fh->open("<$name"); if (open(FH,"<$name")) { - # while (<$fh>) { while () { if (/^=head1\s+\w+/) { $ispod=1; last; } } - # $fh->close; close FH; } else { $ispod = 1; @@ -1461,14 +1550,20 @@ sub init_dirscan { # --- File and Directory Lists (.xs .pm .pod etc) next; } my($manpagename) = $name; + $manpagename =~ s/\.p(od|m|l)$//; + if ($pods{HTMLLIB}) { + $self->{HTMLLIBPODS}->{$name} = + $self->catfile("\$(INST_HTMLLIBDIR)", "$manpagename.\$(HTMLEXT)"); + } unless ($manpagename =~ s!^\W*lib\W+!!) { # everything below lib is ok $manpagename = $self->catfile(split(/::/,$self->{PARENT_NAME}),$manpagename); } - $manpagename =~ s/\.p(od|m|l)$//; - $manpagename = $self->replace_manpage_separator($manpagename); - $manifypods{$name} = $self->catfile("\$(INST_MAN3DIR)","$manpagename.\$(MAN3EXT)"); + if ($pods{MAN3}) { + $manpagename = $self->replace_manpage_separator($manpagename); + $self->{MAN3PODS}->{$name} = + $self->catfile("\$(INST_MAN3DIR)", "$manpagename.\$(MAN3EXT)"); + } } - $self->{MAN3PODS} = \%manifypods; } } @@ -1579,10 +1674,34 @@ from the perl source tree. } } else { # we should also consider $ENV{PERL5LIB} here + my $old = $self->{PERL_LIB} || $self->{PERL_ARCHLIB} || $self->{PERL_INC}; $self->{PERL_LIB} ||= $Config::Config{privlibexp}; $self->{PERL_ARCHLIB} ||= $Config::Config{archlibexp}; $self->{PERL_INC} = $self->catdir("$self->{PERL_ARCHLIB}","CORE"); # wild guess for now my $perl_h; + + if (not -f ($perl_h = $self->catfile($self->{PERL_INC},"perl.h")) + and not $old){ + # Maybe somebody tries to build an extension with an + # uninstalled Perl outside of Perl build tree + my $found; + for my $dir (@INC) { + $found = $dir, last if -e $self->catdir($dir, "Config.pm"); + } + if ($found) { + my $inc = dirname $found; + if (-e $self->catdir($inc, "perl.h")) { + $self->{PERL_LIB} = $found; + $self->{PERL_ARCHLIB} = $found; + $self->{PERL_INC} = $inc; + $self->{UNINSTALLED_PERL} = 1; + print STDOUT <catfile($self->{PERL_INC},"perl.h"))){ die qq{ Error: Unable to locate installed Perl libraries or Perl source code. @@ -1673,8 +1792,7 @@ usually solves this kind of problem. my($install_variable,$search_prefix,$replace_prefix); - # The rule, taken from Configure, is that if prefix contains perl, - # we shape the tree + # If the prefix contains perl, Configure shapes the tree as follows: # perlprefix/lib/ INSTALLPRIVLIB # perlprefix/lib/pod/ # perlprefix/lib/site_perl/ INSTALLSITELIB @@ -1686,6 +1804,11 @@ usually solves this kind of problem. # prefix/lib/perl5/site_perl/ INSTALLSITELIB # prefix/bin/ INSTALLBIN # prefix/lib/perl5/man/ INSTALLMAN1DIR + # + # The above results in various kinds of breakage on various + # platforms, so we cope with it as follows: if prefix/lib/perl5 + # or prefix/lib/perl5/man exist, we'll replace those instead + # of /prefix/{lib,man} $replace_prefix = qq[\$\(PREFIX\)]; for $install_variable (qw/ @@ -1694,36 +1817,45 @@ usually solves this kind of problem. /) { $self->prefixify($install_variable,$configure_prefix,$replace_prefix); } - $search_prefix = $configure_prefix =~ /perl/ ? - $self->catdir($configure_prefix,"lib") : - $self->catdir($configure_prefix,"lib","perl5"); + my $funkylibdir = $self->catdir($configure_prefix,"lib","perl5"); + $funkylibdir = '' unless -d $funkylibdir; + $search_prefix = $funkylibdir || $self->catdir($configure_prefix,"lib"); if ($self->{LIB}) { $self->{INSTALLPRIVLIB} = $self->{INSTALLSITELIB} = $self->{LIB}; $self->{INSTALLARCHLIB} = $self->{INSTALLSITEARCH} = $self->catdir($self->{LIB},$Config{'archname'}); - } else { - $replace_prefix = $self->{PREFIX} =~ /perl/ ? - $self->catdir(qq[\$\(PREFIX\)],"lib") : - $self->catdir(qq[\$\(PREFIX\)],"lib","perl5"); + } + else { + if (-d $self->catdir($self->{PREFIX},"lib","perl5")) { + $replace_prefix = $self->catdir(qq[\$\(PREFIX\)],"lib", "perl5"); + } + else { + $replace_prefix = $self->catdir(qq[\$\(PREFIX\)],"lib"); + } for $install_variable (qw/ INSTALLPRIVLIB INSTALLARCHLIB INSTALLSITELIB INSTALLSITEARCH - /) { + /) + { $self->prefixify($install_variable,$search_prefix,$replace_prefix); } } - $search_prefix = $configure_prefix =~ /perl/ ? - $self->catdir($configure_prefix,"man") : - $self->catdir($configure_prefix,"lib","perl5","man"); - $replace_prefix = $self->{PREFIX} =~ /perl/ ? - $self->catdir(qq[\$\(PREFIX\)],"man") : - $self->catdir(qq[\$\(PREFIX\)],"lib","perl5","man"); + my $funkymandir = $self->catdir($configure_prefix,"lib","perl5","man"); + $funkymandir = '' unless -d $funkymandir; + $search_prefix = $funkymandir || $self->catdir($configure_prefix,"man"); + if (-d $self->catdir($self->{PREFIX},"lib","perl5", "man")) { + $replace_prefix = $self->catdir(qq[\$\(PREFIX\)],"lib", "perl5", "man"); + } + else { + $replace_prefix = $self->catdir(qq[\$\(PREFIX\)],"man"); + } for $install_variable (qw/ INSTALLMAN1DIR INSTALLMAN3DIR - /) { + /) + { $self->prefixify($install_variable,$search_prefix,$replace_prefix); } @@ -1751,6 +1883,30 @@ usually solves this kind of problem. } $self->{MAN3EXT} ||= $Config::Config{man3ext}; + $self->{INSTALLHTMLPRIVLIBDIR} = $Config::Config{installhtmlprivlibdir} + unless defined $self->{INSTALLHTMLPRIVLIBDIR}; + $self->{INSTALLHTMLSITELIBDIR} = $Config::Config{installhtmlsitelibdir} + unless defined $self->{INSTALLHTMLSITELIBDIR}; + + unless (defined $self->{INST_HTMLLIBDIR}){ + if ($self->{INSTALLHTMLSITELIBDIR} =~ /^(none|\s*)$/){ + $self->{INST_HTMLLIBDIR} = $self->{INSTALLHTMLSITELIBDIR}; + } else { + $self->{INST_HTMLLIBDIR} = $self->catdir($self->curdir,'blib','html','lib'); + } + } + + $self->{INSTALLHTMLSCRIPTDIR} = $Config::Config{installhtmlscriptdir} + unless defined $self->{INSTALLHTMLSCRIPTDIR}; + unless (defined $self->{INST_HTMLSCRIPTDIR}){ + if ($self->{INSTALLHTMLSCRIPTDIR} =~ /^(none|\s*)$/){ + $self->{INST_HTMLSCRIPTDIR} = $self->{INSTALLHTMLSCRIPTDIR}; + } else { + $self->{INST_HTMLSCRIPTDIR} = $self->catdir($self->curdir,'blib','html','bin'); + } + } + $self->{HTMLEXT} ||= $Config::Config{htmlext} || 'html'; + # Get some stuff out of %Config if we haven't yet done so print STDOUT "CONFIG must be an array ref\n" @@ -1824,7 +1980,7 @@ usually solves this kind of problem. push @defpath, $component if defined $component; } $self->{PERL} ||= - $self->find_perl(5.0, [ $^X, 'miniperl','perl','perl5',"perl$]" ], + $self->find_perl(5.0, [ $self->canonpath($^X), 'miniperl','perl','perl5',"perl$]" ], \@defpath, $Verbose ); # don't check if perl is executable, maybe they have decided to # supply switches with perl @@ -1943,6 +2099,8 @@ pure_perl_install :: $(INST_ARCHLIB) $(INSTALLARCHLIB) \ $(INST_BIN) $(INSTALLBIN) \ $(INST_SCRIPT) $(INSTALLSCRIPT) \ + $(INST_HTMLLIBDIR) $(INSTALLHTMLPRIVLIBDIR) \ + $(INST_HTMLSCRIPTDIR) $(INSTALLHTMLSCRIPTDIR) \ $(INST_MAN1DIR) $(INSTALLMAN1DIR) \ $(INST_MAN3DIR) $(INSTALLMAN3DIR) }.$self->{NOECHO}.q{$(WARN_IF_OLD_PACKLIST) \ @@ -1957,6 +2115,8 @@ pure_site_install :: $(INST_ARCHLIB) $(INSTALLSITEARCH) \ $(INST_BIN) $(INSTALLBIN) \ $(INST_SCRIPT) $(INSTALLSCRIPT) \ + $(INST_HTMLLIBDIR) $(INSTALLHTMLSITELIBDIR) \ + $(INST_HTMLSCRIPTDIR) $(INSTALLHTMLSCRIPTDIR) \ $(INST_MAN1DIR) $(INSTALLMAN1DIR) \ $(INST_MAN3DIR) $(INSTALLMAN3DIR) }.$self->{NOECHO}.q{$(WARN_IF_OLD_PACKLIST) \ @@ -1999,7 +2159,7 @@ uninstall_from_sitedirs :: =item installbin (o) -Defines targets to install EXE_FILES. +Defines targets to make and to install EXE_FILES. =cut @@ -2026,7 +2186,7 @@ EXE_FILES = @{$self->{EXE_FILES}} } : q{FIXIN = $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) -MExtUtils::MakeMaker \ -e "MY->fixin(shift)" }).qq{ -all :: @to +pure_all :: @to $self->{NOECHO}\$(NOOP) realclean :: @@ -2041,6 +2201,7 @@ $to: $from $self->{MAKEFILE} " . $self->catdir($todir,'.exists') . " $self->{NOECHO}$self->{RM_F} $to $self->{CP} $from $to \$(FIXIN) $to + -$self->{NOECHO}\$(CHMOD) \$(PERM_RWX) $to "; } join "", @m; @@ -2313,7 +2474,7 @@ MAP_LIBPERL = $libperl push @m, " \$(MAP_TARGET) :: $tmp/perlmain\$(OBJ_EXT) \$(MAP_LIBPERL) \$(MAP_STATIC) \$(INST_ARCHAUTODIR)/extralibs.all - \$(MAP_LINKCMD) -o \$\@ \$(OPTIMIZE) $tmp/perlmain\$(OBJ_EXT) $ldfrom $llibperl \$(MAP_STATIC) `cat \$(INST_ARCHAUTODIR)/extralibs.all` \$(MAP_PRELIBS) + \$(MAP_LINKCMD) -o \$\@ \$(OPTIMIZE) $tmp/perlmain\$(OBJ_EXT) $ldfrom \$(MAP_STATIC) $llibperl `cat \$(INST_ARCHAUTODIR)/extralibs.all` \$(MAP_PRELIBS) $self->{NOECHO}echo 'To install the new \"\$(MAP_TARGET)\" binary, call' $self->{NOECHO}echo ' make -f $makefilename inst_perl MAP_TARGET=\$(MAP_TARGET)' $self->{NOECHO}echo 'To remove the intermediate files say' @@ -2327,7 +2488,7 @@ $tmp/perlmain\$(OBJ_EXT): $tmp/perlmain.c $tmp/perlmain.c: $makefilename}, q{ }.$self->{NOECHO}.q{echo Writing $@ }.$self->{NOECHO}.q{$(PERL) $(MAP_PERLINC) -MExtUtils::Miniperl \\ - -e "writemain(grep s#.*/auto/##, qw|$(MAP_STATIC)|)" > $@t && $(MV) $@t $@ + -e "writemain(grep s#.*/auto/##, split(q| |, q|$(MAP_STATIC)|))" > $@t && $(MV) $@t $@ }; push @m, "\t",$self->{NOECHO}.q{$(PERL) $(INSTALLSCRIPT)/fixpmain @@ -2383,6 +2544,7 @@ $(OBJECT) : $(FIRST_MAKEFILE) }.$self->{MAKEFILE}.q{ : Makefile.PL $(CONFIGDEP) }.$self->{NOECHO}.q{echo "Makefile out-of-date with respect to $?" }.$self->{NOECHO}.q{echo "Cleaning current config before rebuilding Makefile..." + -}.$self->{NOECHO}.q{$(RM_F) }."$self->{MAKEFILE}.old".q{ -}.$self->{NOECHO}.q{$(MV) }."$self->{MAKEFILE} $self->{MAKEFILE}.old".q{ -$(MAKE) -f }.$self->{MAKEFILE}.q{.old clean $(DEV_NULL) || $(NOOP) $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" Makefile.PL }.join(" ",map(qq["$_"],@ARGV)).q{ @@ -2408,7 +2570,8 @@ put them into the INST_* directories. sub manifypods { my($self, %attribs) = @_; - return "\nmanifypods :\n\t$self->{NOECHO}\$(NOOP)\n" unless %{$self->{MAN3PODS}} or %{$self->{MAN1PODS}}; + return "\nmanifypods : pure_all\n\t$self->{NOECHO}\$(NOOP)\n" unless + %{$self->{MAN3PODS}} or %{$self->{MAN1PODS}}; my($dist); my($pod2man_exe); if (defined $self->{PERL_SRC}) { @@ -2416,7 +2579,11 @@ sub manifypods { } else { $pod2man_exe = $self->catfile($Config{scriptdirexp},'pod2man'); } - unless ($self->perl_script($pod2man_exe)) { + unless ($pod2man_exe = $self->perl_script($pod2man_exe)) { + # Maybe a build by uninstalled Perl? + $pod2man_exe = $self->catfile($self->{PERL_INC}, "pod", "pod2man"); + } + unless ($pod2man_exe = $self->perl_script($pod2man_exe)) { # No pod2man but some MAN3PODS to be installed print <{MAKEFILE}.q[";' \\ +qq[POD2MAN = \$(PERL) -we '%m=\@ARGV;for (keys %m){' \\\n], +q[-e 'next if -e $$m{$$_} && -M $$m{$$_} < -M $$_ && -M $$m{$$_} < -M "], + $self->{MAKEFILE}, q[";' \\ -e 'print "Manifying $$m{$$_}\n";' \\ -e 'system(qq[$$^X ].q["-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" $(POD2MAN_EXE) ].qq[$$_>$$m{$$_}])==0 or warn "Couldn\\047t install $$m{$$_}\n";' \\ --e 'chmod 0644, $$m{$$_} or warn "chmod 644 $$m{$$_}: $$!\n";}' +-e 'chmod(oct($(PERM_RW))), $$m{$$_} or warn "chmod $(PERM_RW) $$m{$$_}: $$!\n";}' ]; - push @m, "\nmanifypods : "; + push @m, "\nmanifypods : pure_all "; push @m, join " \\\n\t", keys %{$self->{MAN1PODS}}, keys %{$self->{MAN3PODS}}; push(@m,"\n"); @@ -2542,7 +2710,9 @@ sub nicetext { =item parse_version -parse a file and return what you think is $VERSION in this file set to +parse a file and return what you think is $VERSION in this file set to. +It will return the string "undef" if it can't figure out what $VERSION +is. =cut @@ -2570,7 +2740,7 @@ sub parse_version { }; local($^W) = 0; $result = eval($eval); - die "Could not eval '$eval' in $parsefile: $@" if $@; + warn "Could not eval '$eval' in $parsefile: $@" if $@; $result = "undef" unless defined $result; last; } @@ -2592,26 +2762,13 @@ sub parse_abstract { open(FH,$parsefile) or die "Could not open '$parsefile': $!"; my $inpod = 0; my $package = $self->{DISTNAME}; - $package =~ s/-/::/; + $package =~ s/-/::/g; while () { $inpod = /^=(?!cut)/ ? 1 : /^=cut/ ? 0 : $inpod; next if !$inpod; chop; next unless /^($package\s-\s)(.*)/; $result = $2; -# my $eval = qq{ -# package ExtUtils::MakeMaker::_version; -# no strict; -# -# local $1$2; -# \$$2=undef; do { -# $_ -# }; \$$2 -# }; -# local($^W) = 0; -# $result = eval($eval); -# die "Could not eval '$eval' in $parsefile: $@" if $@; -# $result = "undef" unless defined $result; last; } close FH; @@ -2705,7 +2862,7 @@ $(PERL_INC)/config.h $(PERL_INC)/mg.h $(PERL_INC)/scope.h \ $(PERL_INC)/cop.h $(PERL_INC)/op.h $(PERL_INC)/sv.h \ $(PERL_INC)/cv.h $(PERL_INC)/opcode.h $(PERL_INC)/unixish.h \ $(PERL_INC)/dosish.h $(PERL_INC)/patchlevel.h $(PERL_INC)/util.h \ -$(PERL_INC)/embed.h $(PERL_INC)/perl.h \ +$(PERL_INC)/embed.h $(PERL_INC)/perl.h $(PERL_INC)/iperlsys.h \ $(PERL_INC)/form.h $(PERL_INC)/perly.h $(OBJECT) : $(PERL_HDRS) @@ -2728,7 +2885,7 @@ sub ppd { my(@m); if ($self->{ABSTRACT_FROM}){ $self->{ABSTRACT} = $self->parse_abstract($self->{ABSTRACT_FROM}) or - Carp::carp "WARNING: Setting ABSTRACT via file '$self->{ABSTRACT_FROM}' failed\n" + Carp::carp "WARNING: Setting ABSTRACT via file '$self->{ABSTRACT_FROM}' failed\n"; } my ($pack_ver) = join ",", (split (/\./, $self->{VERSION}), (0) x 4) [0 .. 3]; push(@m, "# Creates a PPD (Perl Package Description) for a binary distribution.\n"); @@ -2736,10 +2893,13 @@ sub ppd { push(@m, "\t\@\$(PERL) -e \"print qq{{DISTNAME}\\\" VERSION=\\\"$pack_ver\\\">\\n}"); push(@m, ". qq{\\t$self->{DISTNAME}\\n}"); my $abstract = $self->{ABSTRACT}; + $abstract =~ s/\n/\\n/sg; $abstract =~ s//>/g; push(@m, ". qq{\\t$abstract\\n}"); my ($author) = $self->{AUTHOR}; + $author =~ s//>/g; $author =~ s/@/\\@/g; push(@m, ". qq{\\t$author\\n}"); push(@m, ". qq{\\t\\n}"); @@ -2747,11 +2907,21 @@ sub ppd { foreach $prereq (sort keys %{$self->{PREREQ_PM}}) { my $pre_req = $prereq; $pre_req =~ s/::/-/g; - push(@m, ". qq{\\t\\t\\n}"); + my ($dep_ver) = join ",", (split (/\./, $self->{PREREQ_PM}{$prereq}), (0) x 4) [0 .. 3]; + push(@m, ". qq{\\t\\t\\n}"); } push(@m, ". qq{\\t\\t\\n}"); + push(@m, ". qq{\\t\\t\\n}"); my ($bin_location) = $self->{BINARY_LOCATION}; $bin_location =~ s/\\/\\\\/g; + if ($self->{PPM_INSTALL_SCRIPT}) { + if ($self->{PPM_INSTALL_EXEC}) { + push(@m, " . qq{\\t\\t{PPM_INSTALL_EXEC}\\\">$self->{PPM_INSTALL_SCRIPT}\\n}"); + } + else { + push(@m, " . qq{\\t\\t$self->{PPM_INSTALL_SCRIPT}\\n}"); + } + } push(@m, ". qq{\\t\\t\\n}"); push(@m, ". qq{\\t\\n}"); push(@m, ". qq{\\n}\" > $self->{DISTNAME}.ppd"); @@ -2759,6 +2929,35 @@ sub ppd { join("", @m); } +=item perm_rw (o) + +Returns the attribute C or the string C<644>. +Used as the string that is passed +to the C command to set the permissions for read/writeable files. +MakeMaker chooses C<644> because it has turned out in the past that +relying on the umask provokes hard-to-track bug reports. +When the return value is used by the perl function C, it is +interpreted as an octal value. + +=cut + +sub perm_rw { + shift->{PERM_RW} || "644"; +} + +=item perm_rwx (o) + +Returns the attribute C or the string C<755>, +i.e. the string that is passed +to the C command to set the permissions for executable files. +See also perl_rw. + +=cut + +sub perm_rwx { + shift->{PERM_RWX} || "755"; +} + =item pm_to_blib Defines target that copies all files in the hash PM to their @@ -2842,13 +3041,18 @@ sub processPL { return "" unless $self->{PL_FILES}; my(@m, $plfile); foreach $plfile (sort keys %{$self->{PL_FILES}}) { + my $list = ref($self->{PL_FILES}->{$plfile}) + ? $self->{PL_FILES}->{$plfile} + : [$self->{PL_FILES}->{$plfile}]; + foreach $target (@$list) { push @m, " -all :: $self->{PL_FILES}->{$plfile} +all :: $target $self->{NOECHO}\$(NOOP) -$self->{PL_FILES}->{$plfile} :: $plfile - \$(PERL) -I\$(INST_ARCHLIB) -I\$(INST_LIB) -I\$(PERL_ARCHLIB) -I\$(PERL_LIB) $plfile +$target :: $plfile + \$(PERL) -I\$(INST_ARCHLIB) -I\$(INST_LIB) -I\$(PERL_ARCHLIB) -I\$(PERL_LIB) $plfile $target "; + } } join "", @m; } @@ -2877,7 +3081,8 @@ realclean purge :: clean push(@m, " $self->{RM_F} \$(INST_DYNAMIC) \$(INST_BOOT)\n"); push(@m, " $self->{RM_F} \$(INST_STATIC)\n"); } - push(@m, " $self->{RM_F} " . join(" ", values %{$self->{PM}}) . "\n"); + push(@m, " $self->{RM_F} " . join(" ", values %{$self->{PM}}) . "\n") + if keys %{$self->{PM}}; my(@otherfiles) = ($self->{MAKEFILE}, "$self->{MAKEFILE}.old"); # Makefiles last push(@otherfiles, $attribs{FILES}) if $attribs{FILES}; @@ -2895,7 +3100,11 @@ form Foo/Bar and replaces the slash with C<::>. Returns the replacement. sub replace_manpage_separator { my($self,$man) = @_; - $man =~ s,/+,::,g; + if ($^O eq 'uwin') { + $man =~ s,/+,.,g; + } else { + $man =~ s,/+,::,g; + } $man; } @@ -2942,7 +3151,7 @@ END push @m, q{ $(AR) $(AR_STATIC_ARGS) $@ $(OBJECT) && $(RANLIB) $@ - $(CHMOD) 755 $@ + $(CHMOD) $(PERM_RWX) $@ }.$self->{NOECHO}.q{echo "$(EXTRALIBS)" > $(INST_ARCHAUTODIR)/extralibs.ld }; # Old mechanism - still available: @@ -3256,7 +3465,7 @@ sub tool_xsubpp { } } - $xsubpp = $self->{CAPI} ? "xsubpp -object_capi" : "xsubpp"; + my $xsubpp = "xsubpp"; return qq{ XSUBPPDIR = $xsdir @@ -3338,7 +3547,7 @@ sub top_targets { '; push @m, ' -all :: pure_all manifypods +all :: pure_all htmlifypods manifypods '.$self->{NOECHO}.'$(NOOP) ' unless $self->{SKIPHASH}{'all'}; @@ -3368,6 +3577,24 @@ config :: Version_check push @m, $self->dir_target(qw[$(INST_AUTODIR) $(INST_LIBDIR) $(INST_ARCHAUTODIR)]); + if (%{$self->{HTMLLIBPODS}}) { + push @m, qq[ +config :: \$(INST_HTMLLIBDIR)/.exists + $self->{NOECHO}\$(NOOP) + +]; + push @m, $self->dir_target(qw[$(INST_HTMLLIBDIR)]); + } + + if (%{$self->{HTMLSCRIPTPODS}}) { + push @m, qq[ +config :: \$(INST_HTMLSCRIPTDIR)/.exists + $self->{NOECHO}\$(NOOP) + +]; + push @m, $self->dir_target(qw[$(INST_HTMLSCRIPTDIR)]); + } + if (%{$self->{MAN1PODS}}) { push @m, qq[ config :: \$(INST_MAN1DIR)/.exists @@ -3406,7 +3633,7 @@ Version_check: =item writedoc -Obsolete, depecated method. Not used since Version 5.21. +Obsolete, deprecated method. Not used since Version 5.21. =cut @@ -3430,7 +3657,22 @@ sub xs_c { return '' unless $self->needs_linking(); ' .xs.c: - $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) $(XSUBPP) $(XSPROTOARG) $(XSUBPPARGS) $*.xs >$*.tc && $(MV) $*.tc $@ + $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) $(XSUBPP) $(XSPROTOARG) $(XSUBPPARGS) $*.xs > $*.xsc && $(MV) $*.xsc $*.c +'; +} + +=item xs_cpp (o) + +Defines the suffix rules to compile XS files to C++. + +=cut + +sub xs_cpp { + my($self) = shift; + return '' unless $self->needs_linking(); + ' +.xs.cpp: + $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) $(XSUBPP) $(XSPROTOARG) $(XSUBPPARGS) $*.xs > $*.xsc && $(MV) $*.xsc $*.cpp '; } @@ -3446,7 +3688,7 @@ sub xs_o { # many makes are too dumb to use xs_c then c_o return '' unless $self->needs_linking(); ' .xs$(OBJ_EXT): - $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) $(XSUBPP) $(XSPROTOARG) $(XSUBPPARGS) $*.xs >xstmp.c && $(MV) xstmp.c $*.c + $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) $(XSUBPP) $(XSPROTOARG) $(XSUBPPARGS) $*.xs > $*.xsc && $(MV) $*.xsc $*.c $(CCCMD) $(CCCDLFLAGS) -I$(PERL_INC) $(DEFINE) $*.c '; } @@ -3461,6 +3703,7 @@ and Win32 do. sub perl_archive { + return '$(PERL_INC)' . "/$Config{libperl}" if $^O eq "beos"; return ""; }