1 package ExtUtils::MM_NW5;
5 ExtUtils::MM_NW5 - methods to override UN*X behaviour in ExtUtils::MakeMaker
9 use ExtUtils::MM_NW5; # Done internally by ExtUtils::MakeMaker if needed
13 See ExtUtils::MM_Unix for a documentation of the methods provided
14 there. This package overrides the implementation of these methods, not
26 Exporter::import('ExtUtils::MakeMaker',
27 qw( $Verbose &neatvalue));
29 $ENV{EMXSHELL} = 'sh'; # to run `commands`
30 unshift @MM::ISA, 'ExtUtils::MM_NW5';
32 $BORLAND = 1 if $Config{'cc'} =~ /^bcc/i;
33 $GCC = 1 if $Config{'cc'} =~ /^gcc/i;
34 $DMAKE = 1 if $Config{'make'} =~ /^dmake/i;
35 $NMAKE = 1 if $Config{'make'} =~ /^nmake/i;
36 $PERLMAKE = 1 if $Config{'make'} =~ /^pmake/i;
37 $OBJ = 1 if $Config{'ccflags'} =~ /PERL_OBJECT/i;
39 # a few workarounds for command.com (very basic)
41 package ExtUtils::MM_Win95;
43 # the $^O test may be overkill, but we want to be sure Win32::IsWin95()
44 # exists before we try it
46 unshift @MM::ISA, 'ExtUtils::MM_Win95'
47 if ($^O =~ /Win32/ && Win32::IsWin95());
51 return '' unless $self->needs_linking();
54 $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) $(XSUBPP) \\
55 $(XSPROTOARG) $(XSUBPPARGS) $*.xs > $*.c
61 return '' unless $self->needs_linking();
64 $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) $(XSUBPP) \\
65 $(XSPROTOARG) $(XSUBPPARGS) $*.xs > $*.cpp
69 # many makes are too dumb to use xs_c then c_o
72 return '' unless $self->needs_linking();
75 $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) $(XSUBPP) \\
76 $(XSPROTOARG) $(XSUBPPARGS) $*.xs > $*.c
77 $(CCCMD) $(CCCDLFLAGS) -I$(PERL_INC) $(DEFINE) $*.c
80 } # end of command.com workarounds
83 my($self,%attribs) = @_;
85 my($funcs) = $attribs{DL_FUNCS} || $self->{DL_FUNCS} || {};
86 my($vars) = $attribs{DL_VARS} || $self->{DL_VARS} || [];
87 my($funclist) = $attribs{FUNCLIST} || $self->{FUNCLIST} || [];
88 my($imports) = $attribs{IMPORTS} || $self->{IMPORTS} || {};
90 (my $boot = $self->{NAME}) =~ s/:/_/g;
92 if (not $self->{SKIPHASH}{'dynamic'}) {
94 $self->{BASEEXT}.def: Makefile.PL
96 q! $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" -MExtUtils::Mksymlists \\
97 -e "Mksymlists('NAME' => '!, $self->{NAME},
98 q!', 'DLBASE' => '!,$self->{DLBASE},
99 q!', 'DL_FUNCS' => !,neatvalue($funcs),
100 q!, 'FUNCLIST' => !,neatvalue($funclist),
101 q!, 'IMPORTS' => !,neatvalue($imports),
102 q!, 'DL_VARS' => !, neatvalue($vars), q!);"
108 sub replace_manpage_separator {
115 my($self,$file) = @_;
116 my @e = exists($ENV{'PATHEXT'})
117 ? split(/;/, $ENV{PATHEXT})
118 : qw(.com .exe .bat .cmd);
120 for (@e) { $e .= "\Q$_\E|" }
122 # see if file ends in one of the known extensions
123 if ($file =~ /($e)$/i) {
124 return $file if -e $file;
128 return "$file$_" if -e "$file$_";
134 sub file_name_is_absolute {
135 my($self,$file) = @_;
136 $file =~ m{^([a-z]:)?[\\/]}i ;
140 my($self, $ver, $names, $dirs, $trace) = @_;
143 print "Looking for perl $ver by these names:
149 foreach $dir (@$dirs){
150 next unless defined $dir; # $self->{PERL_SRC} may be undefined
151 foreach $name (@$names){
153 if ($self->file_name_is_absolute($name)) { # /foo/bar
155 } elsif ($self->canonpath($name) eq $self->canonpath(basename($name))) { # foo
156 $abs = $self->catfile($dir, $name);
158 $abs = $self->canonpath($self->catfile($self->curdir, $name));
160 print "Checking $abs\n" if ($trace >= 2);
161 next unless $self->maybe_command($abs);
162 print "Executing $abs\n" if ($trace >= 2);
163 $val = `$abs -e "require $ver;" 2>&1`;
165 print "Using PERL=$abs\n" if $trace;
167 } elsif ($trace >= 2) {
168 print "Result: `$val'\n";
172 print STDOUT "Unable to find a perl $ver (by these names: @$names, in these dirs: @$dirs)\n";
173 0; # false and not empty
180 # append a slash to each argument unless it has one there
181 $_ .= "\\" if $_ eq '' or substr($_,-1) ne "\\";
183 my $result = $self->canonpath(join('', @args));
189 Concatenate one or more directory names and a filename to form a
190 complete path ending with a filename
197 return $file unless @_;
198 my $dir = $self->catdir(@_);
200 $dir .= "\\" unless substr($dir,length($dir)-1,1) eq "\\";
207 &ExtUtils::MM_Unix::init_others;
208 $self->{'TOUCH'} = '$(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) -MExtUtils::Command -e touch';
209 $self->{'CHMOD'} = '$(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) -MExtUtils::Command -e chmod';
210 $self->{'CP'} = '$(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) -MExtUtils::Command -e cp';
211 $self->{'RM_F'} = '$(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) -MExtUtils::Command -e rm_f';
212 $self->{'RM_RF'} = '$(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) -MExtUtils::Command -e rm_rf';
213 $self->{'MV'} = '$(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) -MExtUtils::Command -e mv';
214 $self->{'NOOP'} = 'rem';
215 $self->{'TEST_F'} = '$(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) -MExtUtils::Command -e test_f';
216 $self->{'LD'} = $Config{'ld'} || 'link';
217 $self->{'AR'} = $Config{'ar'} || 'lib';
218 $self->{'LDLOADLIBS'} ||= $Config{'libs'};
219 # -Lfoo must come first for Borland, so we put it in LDDLFLAGS
221 my $libs = $self->{'LDLOADLIBS'};
223 while ($libs =~ s/(?:^|\s)(("?)-L.+?\2)(?:\s|$)/ /) {
224 $libpath .= ' ' if length $libpath;
227 $self->{'LDLOADLIBS'} = $libs;
228 $self->{'LDDLFLAGS'} ||= $Config{'lddlflags'};
229 $self->{'LDDLFLAGS'} .= " $libpath";
231 $self->{'DEV_NULL'} = '> NUL';
232 # $self->{'NOECHO'} = ''; # till we have it working
234 # incpath is copied to makefile var INCLUDE in constants sub, here just make it empty
235 my $libpth = $Config{'libpth'};
237 $self->{'LIBPTH'} = $libpth;
238 $self->{'BASE_IMPORT'} = $Config{'base_import'};
240 # Additional import file specified from Makefile.pl
241 if($self->{'base_import'}) {
242 $self->{'BASE_IMPORT'} .= ',' . $self->{'base_import'};
245 $self->{'NLM_VERSION'} = $Config{'nlm_version'};
246 $self->{'MPKTOOL'} = $Config{'mpktool'};
247 $self->{'TOOLPATH'} = $Config{'toolpath'};
253 Initializes lots of constants and .SUFFIXES and .PHONY
258 my($self,$libperl)=@_;
259 return $self->{CONST_CCCMD} if $self->{CONST_CCCMD};
260 return '' unless $self->needs_linking();
261 return $self->{CONST_CCCMD} =
262 q{CCCMD = $(CC) $(INC) $(CCFLAGS) $(OPTIMIZE) \\
263 $(PERLTYPE) $(LARGE) $(SPLIT) $(MPOLLUTE) \\
264 -DVERSION="$(VERSION)" -DXS_VERSION="$(XS_VERSION)"};
271 # Added LIBPTH, BASE_IMPORT, ABSTRACT, NLM_VERSION BOOT_SYMBOL, NLM_SHORT_NAME
276 AR_STATIC_ARGS NAME DISTNAME NAME_SYM VERSION
277 VERSION_SYM XS_VERSION INST_BIN INST_EXE INST_LIB
278 INST_ARCHLIB INST_SCRIPT PREFIX INSTALLDIRS
279 INSTALLPRIVLIB INSTALLARCHLIB INSTALLSITELIB
280 INSTALLSITEARCH INSTALLBIN INSTALLSCRIPT PERL_LIB
281 PERL_ARCHLIB SITELIBEXP SITEARCHEXP LIBPERL_A MYEXTLIB
282 FIRST_MAKEFILE MAKE_APERL_FILE PERLMAINCC PERL_SRC
283 PERL_INC PERL FULLPERL LIBPTH BASE_IMPORT
284 NLM_VERSION MPKTOOL TOOLPATH
287 next unless defined $self->{$tmp};
288 push @m, "$tmp = $self->{$tmp}\n";
291 (my $boot = $self->{'NAME'}) =~ s/:/_/g;
292 $self->{'BOOT_SYMBOL'}=$boot;
293 push @m, "BOOT_SYMBOL = $self->{'BOOT_SYMBOL'}\n";
295 # If the final binary name is greater than 8 chars,
296 # truncate it here and rename it after creation
297 # otherwise, Watcom Linker fails
298 if(length($self->{'BASEEXT'}) > 8) {
299 $self->{'NLM_SHORT_NAME'} = substr($self->{'NAME'},0,8);
300 push @m, "NLM_SHORT_NAME = $self->{'NLM_SHORT_NAME'}\n";
304 VERSION_MACRO = VERSION
305 DEFINE_VERSION = -D\$(VERSION_MACRO)=\\\"\$(VERSION)\\\"
306 XS_VERSION_MACRO = XS_VERSION
307 XS_DEFINE_VERSION = -D\$(XS_VERSION_MACRO)=\\\"\$(XS_VERSION)\\\"
310 # Get the include path and replace the spaces with ;
311 # Copy this to makefile as INCLUDE = d:\...;d:\;
312 (my $inc = $Config{'incpath'}) =~ s/ /;/g;
314 # Get the additional include path and append to INCLUDE, keep it in
315 # INC will give problems during compilation, hence reset it after getting
317 (my $add_inc = $self->{'INC'}) =~ s/ -I/;/g;
320 INCLUDE = $inc;$add_inc;
323 # Set the path to Watcom binaries which might not have been set in
326 PATH = \$(PATH);\$(TOOLPATH)
330 MAKEMAKER = $INC{'ExtUtils\MakeMaker.pm'}
331 MM_VERSION = $ExtUtils::MakeMaker::VERSION
335 # FULLEXT = Pathname for extension directory (eg Foo/Bar/Oracle).
336 # BASEEXT = Basename part of FULLEXT. May be just equal FULLEXT. (eg Oracle)
337 # ROOTEXT = Directory part of FULLEXT with leading slash (eg /DBD) !!! Deprecated from MM 5.32 !!!
338 # PARENT_NAME = NAME without BASEEXT and no trailing :: (eg Foo::Bar)
339 # DLBASE = Basename part of dynamic library. May be just equal BASEEXT.
343 FULLEXT BASEEXT PARENT_NAME DLBASE VERSION_FROM INC DEFINE OBJECT
346 next unless defined $self->{$tmp};
347 push @m, "$tmp = $self->{$tmp}\n";
351 # Handy lists of source code files:
352 XS_FILES= ".join(" \\\n\t", sort keys %{$self->{XS}})."
353 C_FILES = ".join(" \\\n\t", @{$self->{C}})."
354 O_FILES = ".join(" \\\n\t", @{$self->{O_FILES}})."
355 H_FILES = ".join(" \\\n\t", @{$self->{H}})."
356 HTMLLIBPODS = ".join(" \\\n\t", sort keys %{$self->{HTMLLIBPODS}})."
357 HTMLSCRIPTPODS = ".join(" \\\n\t", sort keys %{$self->{HTMLSCRIPTPODS}})."
358 MAN1PODS = ".join(" \\\n\t", sort keys %{$self->{MAN1PODS}})."
359 MAN3PODS = ".join(" \\\n\t", sort keys %{$self->{MAN3PODS}})."
363 INST_HTMLPRIVLIBDIR INSTALLHTMLPRIVLIBDIR
364 INST_HTMLSITELIBDIR INSTALLHTMLSITELIBDIR
365 INST_HTMLSCRIPTDIR INSTALLHTMLSCRIPTDIR
366 INST_HTMLLIBDIR HTMLEXT
367 INST_MAN1DIR INSTALLMAN1DIR MAN1EXT
368 INST_MAN3DIR INSTALLMAN3DIR MAN3EXT
370 next unless defined $self->{$tmp};
371 push @m, "$tmp = $self->{$tmp}\n";
379 .NO_CONFIG_REC: Makefile
380 } if $ENV{CLEARCASE_ROOT};
382 # why not q{} ? -- emacs
384 # work around a famous dec-osf make(1) feature(?):
387 .SUFFIXES: .xs .c .C .cpp .cxx .cc \$(OBJ_EXT)
389 # Nick wanted to get rid of .PRECIOUS. I don't remember why. I seem to recall, that
390 # some make implementations will delete the Makefile when we rebuild it. Because
391 # we call false(1) when we rebuild it. So make(1) is not completely wrong when it
392 # does so. Our milage may vary.
393 # .PRECIOUS: Makefile # seems to be not necessary anymore
395 .PHONY: all config static dynamic test linkext manifest
397 # Where is the Config information that we are using/depend on
398 CONFIGDEP = \$(PERL_ARCHLIB)\\Config.pm \$(PERL_INC)\\config.h
401 my @parentdir = split(/::/, $self->{PARENT_NAME});
403 # Where to put things:
404 INST_LIBDIR = }. $self->catdir('$(INST_LIB)',@parentdir) .q{
405 INST_ARCHLIBDIR = }. $self->catdir('$(INST_ARCHLIB)',@parentdir) .q{
407 INST_AUTODIR = }. $self->catdir('$(INST_LIB)','auto','$(FULLEXT)') .q{
408 INST_ARCHAUTODIR = }. $self->catdir('$(INST_ARCHLIB)','auto','$(FULLEXT)') .q{
411 if ($self->has_link_code()) {
413 INST_STATIC = $(INST_ARCHAUTODIR)\$(BASEEXT)$(LIB_EXT)
414 INST_DYNAMIC = $(INST_ARCHAUTODIR)\$(DLBASE).$(DLEXT)
415 INST_BOOT = $(INST_ARCHAUTODIR)\$(BASEEXT).bs
425 $tmp = $self->export_list;
429 $tmp = $self->perl_archive;
435 #INST_PM = }.join(" \\\n\t", sort values %{$self->{PM}}).q{
437 #PM_TO_BLIB = }.join(" \\\n\t", %{$self->{PM}}).q{
441 TO_INST_PM = }.join(" \\\n\t", sort keys %{$self->{PM}}).q{
443 PM_TO_BLIB = }.join(" \\\n\t", %{$self->{PM}}).q{
452 my $path = $ENV{'PATH'} || $ENV{'Path'} || $ENV{'path'};
453 my @path = split(';',$path);
454 foreach(@path) { $_ = '.' if $_ eq '' }
460 Defines how to produce the *.a (or equivalent) files.
466 # Come to think of it, if there are subdirs with linkcode, we still have no INST_STATIC
467 # return '' unless $self->needs_linking(); #might be because of a subdir
469 return '' unless $self->has_link_code;
473 $(INST_STATIC): $(OBJECT) $(MYEXTLIB) $(INST_ARCHAUTODIR)\.exists
477 # If this extension has it's own library (eg SDBM_File)
478 # then copy that to $(INST_STATIC) and add $(OBJECT) into it.
479 push(@m, "\t$self->{CP} \$(MYEXTLIB) \$\@\n") if $self->{MYEXTLIB};
482 q{ $(AR) }.($BORLAND ? '$@ $(OBJECT:^"+")'
483 : ($GCC ? '-ru $@ $(OBJECT)'
484 : '-out:$@ $(OBJECT)')).q{
485 }.$self->{NOECHO}.q{echo "$(EXTRALIBS)" > $(INST_ARCHAUTODIR)\extralibs.ld
489 # Old mechanism - still available:
491 push @m, "\t$self->{NOECHO}".q{echo "$(EXTRALIBS)" >> $(PERL_SRC)\ext.libs}."\n\n"
492 if $self->{PERL_SRC};
494 push @m, $self->dir_target('$(INST_ARCHAUTODIR)');
500 Defines targets for bootstrap files.
505 my($self, %attribs) = @_;
508 ' unless $self->has_link_code();
511 BOOTSTRAP = '."$self->{BASEEXT}.bs".'
513 # As Mkbootstrap might not write a file (if none is required)
514 # we use touch to prevent make continually trying to remake it.
515 # The DynaLoader only reads a non-empty file.
516 $(BOOTSTRAP): '."$self->{MAKEFILE} $self->{BOOTDEP}".' $(INST_ARCHAUTODIR)\.exists
517 '.$self->{NOECHO}.'echo "Running Mkbootstrap for $(NAME) ($(BSLOADLIBS))"
518 '.$self->{NOECHO}.'$(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" \
519 -MExtUtils::Mkbootstrap \
520 -e "Mkbootstrap(\'$(BASEEXT)\',\'$(BSLOADLIBS)\');"
521 '.$self->{NOECHO}.'$(TOUCH) $(BOOTSTRAP)
524 $(INST_BOOT): $(BOOTSTRAP) $(INST_ARCHAUTODIR)\.exists
525 '."$self->{NOECHO}$self->{RM_RF}".' $(INST_BOOT)
526 -'.$self->{CP}.' $(BOOTSTRAP) $(INST_BOOT)
531 =item dynamic_lib (o)
533 Defines how to produce the *.so (or equivalent) files.
538 my($self, %attribs) = @_;
539 return '' unless $self->needs_linking(); #might be because of a subdir
541 return '' unless $self->has_link_code;
543 my($otherldflags) = $attribs{OTHERLDFLAGS} || ($BORLAND ? 'c0d32.obj': '');
544 my($inst_dynamic_dep) = $attribs{INST_DYNAMIC_DEP} || "";
545 my($ldfrom) = '$(LDFROM)';
547 (my $boot = $self->{NAME}) =~ s/:/_/g;
550 # This section creates the dynamically loadable $(INST_DYNAMIC)
551 # from $(OBJECT) and possibly $(MYEXTLIB).
552 OTHERLDFLAGS = '.$otherldflags.'
553 INST_DYNAMIC_DEP = '.$inst_dynamic_dep.'
555 $(INST_DYNAMIC): $(OBJECT) $(MYEXTLIB) $(BOOTSTRAP)
558 # q{ $(LD) -out:$@ $(LDDLFLAGS) }.$ldfrom.q{ $(OTHERLDFLAGS) }
559 # .q{$(MYEXTLIB) $(PERL_ARCHIVE) $(LDLOADLIBS) -def:$(EXPORT_LIST)});
561 # Create xdc data for an MT safe NLM in case of mpk build
562 if ( $self->{CCFLAGS} =~ m/ -DMPK_ON /) {
564 push @m, ' $(MPKTOOL) $(BASEEXT).xdc
571 q{ $(LD) Form Novell NLM '$(DISTNAME) Extension, XS_VERSION=$(XS_VERSION)'}
574 # Taking care of long names like FileHandle, ByteLoader, SDBM_File etc
575 if($self->{NLM_SHORT_NAME}) {
576 # In case of nlms with names exceeding 8 chars, build nlm in the
577 # current dir, rename and move to auto\lib. If we create in auto\lib
578 # in the first place, we can't rename afterwards.
580 q{ Name $(NLM_SHORT_NAME).$(DLEXT)}
584 q{ Name $(INST_AUTODIR)\\$(BASEEXT).$(DLEXT)}
589 q{ Option Quiet Option Version = $(NLM_VERSION) Option Caseexact Option NoDefaultLibs Option screenname 'none' Option Synchronize }
594 q{ Option XDCDATA=$(BASEEXT).xdc }
598 # Add additional lib files if any (SDBM_File)
599 if($self->{MYEXTLIB}) {
601 q{ Library $(MYEXTLIB) }
605 #For now lets comment all the Watcom lib calls
606 #q{ LibPath $(LIBPTH) Library plib3s.lib Library math3s.lib Library clib3s.lib Library emu387.lib Library $(PERL_ARCHIVE) Library $(PERL_INC)\Main.lib}
609 q{ Library $(PERL_ARCHIVE) Library $(PERL_INC)\Main.lib}
610 .q{ Export boot_$(BOOT_SYMBOL) $(BASE_IMPORT) }
611 .q{ FILE $(OBJECT:.obj=,)}
614 # If it is having a short name, rename it
615 if($self->{NLM_SHORT_NAME}) {
617 if exist $(INST_AUTODIR)\\$(BASEEXT).$(DLEXT) del $(INST_AUTODIR)\\$(BASEEXT).$(DLEXT)';
619 rename $(NLM_SHORT_NAME).$(DLEXT) $(BASEEXT).$(DLEXT)';
621 move $(BASEEXT).$(DLEXT) $(INST_AUTODIR)';
628 push @m, $self->dir_target('$(INST_ARCHAUTODIR)');
635 return '$(PERL_INC)\\'.$Config{'libperl'};
641 return "$self->{BASEEXT}.def";
646 No physical check on the filesystem, but a logical cleanup of a
647 path. On UNIX eliminated successive slashes and successive "/.".
652 my($self,$path) = @_;
653 $path =~ s/^([a-z]:)/\u$1/;
655 $path =~ s|(.)\\+|$1\\|g ; # xx////xx -> xx/xx
656 $path =~ s|(\\\.)+\\|\\|g ; # xx/././xx -> xx/xx
657 $path =~ s|^(\.\\)+|| unless $path eq ".\\"; # ./xx -> xx
659 unless $path =~ m#^([a-z]:)?\\#; # xx/ -> xx
660 $path .= '.' if $path =~ m#\\$#;
666 Takes one argument, a file name, and returns the file name, if the
667 argument is likely to be a perl script. On MM_Unix this is true for
668 any ordinary, readable file.
673 my($self,$file) = @_;
674 return $file if -r $file && -f _;
675 return "$file.pl" if -r "$file.pl" && -f _;
676 return "$file.bat" if -r "$file.bat" && -f _;
682 Defines target that copies all files in the hash PM to their
683 destination and autosplits them. See L<ExtUtils::Install/DESCRIPTION>
689 my($autodir) = $self->catdir('$(INST_LIB)','auto');
691 pm_to_blib: $(TO_INST_PM)
692 }.$self->{NOECHO}.q{$(PERL) "-I$(INST_ARCHLIB)" "-I$(INST_LIB)" \
693 "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" -MExtUtils::Install \
695 ($NMAKE ? 'qw[ <<pmfiles.dat ],'
696 : $DMAKE ? 'qw[ $(mktmp,pmfiles.dat $(PM_TO_BLIB:s,\\,\\\\,)\n) ],'
697 : '{ qw[$(PM_TO_BLIB)] },'
698 ).q{'}.$autodir.q{')"
702 } : '') . $self->{NOECHO}.q{$(TOUCH) $@
706 =item test_via_harness (o)
708 Helper method to write the test targets
712 sub test_via_harness {
713 my($self, $perl, $tests) = @_;
714 "\t$perl".q! -Mblib -I$(PERL_ARCHLIB) -I$(PERL_LIB) -e "use Test::Harness qw(&runtests $$verbose); $$verbose=$(TEST_VERBOSE); runtests @ARGV;" !."$tests\n";
718 =item tool_autosplit (override)
720 Use Win32 quoting on command line.
725 my($self, %attribs) = @_;
727 $asl = "\$AutoSplit::Maxlen=$attribs{MAXLEN};" if $attribs{MAXLEN};
729 # Usage: $(AUTOSPLITFILE) FileToSplit AutoDirToSplitInto
730 AUTOSPLITFILE = $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" -MAutoSplit }.$asl.q{ -e "autosplit($$ARGV[0], $$ARGV[1], 0, 1, 1);"
734 =item tools_other (o)
738 Defines SHELL, LD, TOUCH, CP, MV, RM_F, RM_RF, CHMOD, UMASK_NULL in
739 the Makefile. Also defines the perl programs MKPATH,
740 WARN_IF_OLD_PACKLIST, MOD_INSTALL. DOC_INSTALL, and UNINSTALL.
747 my $bin_sh = $Config{sh} || 'cmd /c';
750 } unless $DMAKE; # dmake determines its own shell
752 for (qw/ CHMOD CP LD MV NOOP RM_F RM_RF TEST_F TOUCH UMASK_NULL DEV_NULL/ ) {
753 push @m, "$_ = $self->{$_}\n";
757 # The following is a portable way to say mkdir -p
758 # To see which directories are created, change the if 0 to if 1
759 MKPATH = $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) -MExtUtils::Command -e mkpath
761 # This helps us to minimize the effect of the .exists files A yet
762 # better solution would be to have a stable file in the perl
763 # distribution with a timestamp of zero. But this solution doesn't
764 # need any changes to the core distribution and works with older perls
765 EQUALIZE_TIMESTAMP = $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) -MExtUtils::Command -e eqtime
769 return join "", @m if $self->{PARENT};
772 # Here we warn users that an old packlist file was found somewhere,
773 # and that they should call some uninstall routine
774 WARN_IF_OLD_PACKLIST = $(PERL) -lwe "exit unless -f $$ARGV[0];" \\
775 -e "print 'WARNING: I have found an old package in';" \\
776 -e "print ' ', $$ARGV[0], '.';" \\
777 -e "print 'Please make sure the two installations are not conflicting';"
782 MOD_INSTALL = $(PERL) -I$(INST_LIB) -I$(PERL_LIB) -MExtUtils::Install \
783 -e "install({ @ARGV },'$(VERBINST)',0,'$(UNINST)');"
785 DOC_INSTALL = $(PERL) -e "$$\=\"\n\n\";" \
786 -e "print '=head2 ', scalar(localtime), ': C<', shift, '>', ' L<', shift, '>';" \
787 -e "print '=over 4';" \
788 -e "while (defined($$key = shift) and defined($$val = shift)) { print '=item *';print 'C<', \"$$key: $$val\", '>'; }" \
791 UNINSTALL = $(PERL) -MExtUtils::Install \
792 -e "uninstall($$ARGV[0],1,1); print \"\nUninstall is deprecated. Please check the";" \
793 -e "print \" packlist above carefully.\n There may be errors. Remove the\";" \
794 -e "print \" appropriate files manually.\n Sorry for the inconveniences.\n\""
802 Defines suffix rules to go from XS to object files directly. This is
803 only intended for broken make implementations.
807 sub xs_o { # many makes are too dumb to use xs_c then c_o
812 =item top_targets (o)
814 Defines the targets all, subdirs, config, and O_FILES
819 # --- Target Sections ---
824 #all :: config $(INST_PM) subdirs linkext manifypods
828 all :: pure_all htmlifypods manifypods
829 '.$self->{NOECHO}.'$(NOOP)
831 unless $self->{SKIPHASH}{'all'};
834 pure_all :: config pm_to_blib subdirs linkext
835 '.$self->{NOECHO}.'$(NOOP)
837 subdirs :: $(MYEXTLIB)
838 '.$self->{NOECHO}.'$(NOOP)
840 config :: '.$self->{MAKEFILE}.' $(INST_LIBDIR)\.exists
841 '.$self->{NOECHO}.'$(NOOP)
843 config :: $(INST_ARCHAUTODIR)\.exists
844 '.$self->{NOECHO}.'$(NOOP)
846 config :: $(INST_AUTODIR)\.exists
847 '.$self->{NOECHO}.'$(NOOP)
850 push @m, $self->dir_target(qw[$(INST_AUTODIR) $(INST_LIBDIR) $(INST_ARCHAUTODIR)]);
852 if (%{$self->{HTMLLIBPODS}}) {
854 config :: \$(INST_HTMLLIBDIR)/.exists
855 $self->{NOECHO}\$(NOOP)
858 push @m, $self->dir_target(qw[$(INST_HTMLLIBDIR)]);
861 if (%{$self->{HTMLSCRIPTPODS}}) {
863 config :: \$(INST_HTMLSCRIPTDIR)/.exists
864 $self->{NOECHO}\$(NOOP)
867 push @m, $self->dir_target(qw[$(INST_HTMLSCRIPTDIR)]);
870 if (%{$self->{MAN1PODS}}) {
872 config :: \$(INST_MAN1DIR)\\.exists
873 $self->{NOECHO}\$(NOOP)
876 push @m, $self->dir_target(qw[$(INST_MAN1DIR)]);
878 if (%{$self->{MAN3PODS}}) {
880 config :: \$(INST_MAN3DIR)\\.exists
881 $self->{NOECHO}\$(NOOP)
884 push @m, $self->dir_target(qw[$(INST_MAN3DIR)]);
888 $(O_FILES): $(H_FILES)
889 ' if @{$self->{O_FILES} || []} && @{$self->{H} || []};
893 perldoc ExtUtils::MakeMaker
898 }.$self->{NOECHO}.q{$(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) \
899 -MExtUtils::MakeMaker=Version_check \
900 -e "Version_check('$(MM_VERSION)')"
906 =item htmlifypods (o)
908 Defines targets and routines to translate the pods into HTML manpages
909 and put them into the INST_HTMLLIBDIR and INST_HTMLSCRIPTDIR
912 Same as MM_Unix version (changes command-line quoting).
917 my($self, %attribs) = @_;
918 return "\nhtmlifypods : pure_all\n\t$self->{NOECHO}\$(NOOP)\n" unless
919 %{$self->{HTMLLIBPODS}} || %{$self->{HTMLSCRIPTPODS}};
922 if (defined $self->{PERL_SRC}) {
923 $pod2html_exe = $self->catfile($self->{PERL_SRC},'pod','pod2html');
925 $pod2html_exe = $self->catfile($Config{scriptdirexp},'pod2html');
927 unless ($pod2html_exe = $self->perl_script($pod2html_exe)) {
928 # No pod2html but some HTMLxxxPODS to be installed
931 Warning: I could not locate your pod2html program. Please make sure,
932 your pod2html program is in your PATH before you execute 'make'
935 $pod2html_exe = "-S pod2html";
939 qq[POD2HTML_EXE = $pod2html_exe\n],
940 qq[POD2HTML = \$(PERL) -we "use File::Basename; use File::Path qw(mkpath); %m=\@ARGV;for (keys %m){" \\\n],
941 q[-e "next if -e $$m{$$_} && -M $$m{$$_} < -M $$_ && -M $$m{$$_} < -M '],
942 $self->{MAKEFILE}, q[';" \\
943 -e "print qq(Htmlifying $$m{$$_}\n);" \\
944 -e "$$dir = dirname($$m{$$_}); mkpath($$dir) unless -d $$dir;" \\
945 -e "system(qq[$$^X ].q["-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" $(POD2HTML_EXE) ].qq[$$_>$$m{$$_}])==0 or warn qq(Couldn\\047t install $$m{$$_}\n);" \\
946 -e "chmod(oct($(PERM_RW))), $$m{$$_} or warn qq(chmod $(PERM_RW) $$m{$$_}: $$!\n);}"
948 push @m, "\nhtmlifypods : pure_all ";
949 push @m, join " \\\n\t", keys %{$self->{HTMLLIBPODS}}, keys %{$self->{HTMLSCRIPTPODS}};
952 if (%{$self->{HTMLLIBPODS}} || %{$self->{HTMLSCRIPTPODS}}) {
953 push @m, "\t$self->{NOECHO}\$(POD2HTML) \\\n\t";
954 push @m, join " \\\n\t", %{$self->{HTMLLIBPODS}}, %{$self->{HTMLSCRIPTPODS}};
961 We don't want manpage process.
967 return "\nmanifypods :\n\t$self->{NOECHO}\$(NOOP)\n";
972 Same as MM_Unix version (changes command-line quoting).
981 $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) -MExtUtils::Manifest=maniread \\
982 -e "@all = keys %{ maniread() };" \\
983 -e "print(\"Executing $(CI) @all\n\"); system(\"$(CI) @all\");" \\
984 -e "print(\"Executing $(RCS_LABEL) ...\n\"); system(\"$(RCS_LABEL) @all\");"
991 Same as MM_Unix version (changes command-line quoting).
999 dist : $(DIST_DEFAULT)
1000 }.$self->{NOECHO}.q{$(PERL) -le "print \"Warning: Makefile possibly out of date with $$vf\" if " \
1001 -e "-e ($$vf=\"$(VERSION_FROM)\") and -M $$vf < -M \"}.$self->{MAKEFILE}.q{\";"
1003 tardist : $(DISTVNAME).tar$(SUFFIX)
1005 zipdist : $(DISTVNAME).zip
1007 $(DISTVNAME).tar$(SUFFIX) : distdir
1010 $(TAR) $(TARFLAGS) $(DISTVNAME).tar $(DISTVNAME)
1011 $(RM_RF) $(DISTVNAME)
1012 $(COMPRESS) $(DISTVNAME).tar
1015 $(DISTVNAME).zip : distdir
1017 $(ZIP) $(ZIPFLAGS) $(DISTVNAME).zip $(DISTVNAME)
1018 $(RM_RF) $(DISTVNAME)
1021 uutardist : $(DISTVNAME).tar$(SUFFIX)
1022 uuencode $(DISTVNAME).tar$(SUFFIX) \\
1023 $(DISTVNAME).tar$(SUFFIX) > \\
1024 $(DISTVNAME).tar$(SUFFIX)_uu
1028 $(SHAR) $(DISTVNAME) > $(DISTVNAME).shar
1029 $(RM_RF) $(DISTVNAME)
1037 Defines the string that is passed to recursive make calls in
1044 return "PASTHRU = " . ($NMAKE ? "-nologo" : "");