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 PERLRUN
284 PERLRUNINST TEST_LIBS FULL_AR PERL_CORE
285 NLM_VERSION MPKTOOL TOOLPATH
288 next unless defined $self->{$tmp};
289 push @m, "$tmp = $self->{$tmp}\n";
292 (my $boot = $self->{'NAME'}) =~ s/:/_/g;
293 $self->{'BOOT_SYMBOL'}=$boot;
294 push @m, "BOOT_SYMBOL = $self->{'BOOT_SYMBOL'}\n";
296 # If the final binary name is greater than 8 chars,
297 # truncate it here and rename it after creation
298 # otherwise, Watcom Linker fails
299 if(length($self->{'BASEEXT'}) > 8) {
300 $self->{'NLM_SHORT_NAME'} = substr($self->{'NAME'},0,8);
301 push @m, "NLM_SHORT_NAME = $self->{'NLM_SHORT_NAME'}\n";
305 VERSION_MACRO = VERSION
306 DEFINE_VERSION = -D\$(VERSION_MACRO)=\\\"\$(VERSION)\\\"
307 XS_VERSION_MACRO = XS_VERSION
308 XS_DEFINE_VERSION = -D\$(XS_VERSION_MACRO)=\\\"\$(XS_VERSION)\\\"
311 # Get the include path and replace the spaces with ;
312 # Copy this to makefile as INCLUDE = d:\...;d:\;
313 (my $inc = $Config{'incpath'}) =~ s/ /;/g;
315 # Get the additional include path and append to INCLUDE, keep it in
316 # INC will give problems during compilation, hence reset it after getting
318 (my $add_inc = $self->{'INC'}) =~ s/ -I/;/g;
321 INCLUDE = $inc;$add_inc;
324 # Set the path to Watcom binaries which might not have been set in
327 PATH = \$(PATH);\$(TOOLPATH)
331 MAKEMAKER = $INC{'ExtUtils\MakeMaker.pm'}
332 MM_VERSION = $ExtUtils::MakeMaker::VERSION
336 # FULLEXT = Pathname for extension directory (eg Foo/Bar/Oracle).
337 # BASEEXT = Basename part of FULLEXT. May be just equal FULLEXT. (eg Oracle)
338 # ROOTEXT = Directory part of FULLEXT with leading slash (eg /DBD) !!! Deprecated from MM 5.32 !!!
339 # PARENT_NAME = NAME without BASEEXT and no trailing :: (eg Foo::Bar)
340 # DLBASE = Basename part of dynamic library. May be just equal BASEEXT.
344 FULLEXT BASEEXT PARENT_NAME DLBASE VERSION_FROM INC DEFINE OBJECT
347 next unless defined $self->{$tmp};
348 push @m, "$tmp = $self->{$tmp}\n";
352 # Handy lists of source code files:
353 XS_FILES= ".join(" \\\n\t", sort keys %{$self->{XS}})."
354 C_FILES = ".join(" \\\n\t", @{$self->{C}})."
355 O_FILES = ".join(" \\\n\t", @{$self->{O_FILES}})."
356 H_FILES = ".join(" \\\n\t", @{$self->{H}})."
357 HTMLLIBPODS = ".join(" \\\n\t", sort keys %{$self->{HTMLLIBPODS}})."
358 HTMLSCRIPTPODS = ".join(" \\\n\t", sort keys %{$self->{HTMLSCRIPTPODS}})."
359 MAN1PODS = ".join(" \\\n\t", sort keys %{$self->{MAN1PODS}})."
360 MAN3PODS = ".join(" \\\n\t", sort keys %{$self->{MAN3PODS}})."
364 INST_HTMLPRIVLIBDIR INSTALLHTMLPRIVLIBDIR
365 INST_HTMLSITELIBDIR INSTALLHTMLSITELIBDIR
366 INST_HTMLSCRIPTDIR INSTALLHTMLSCRIPTDIR
367 INST_HTMLLIBDIR HTMLEXT
368 INST_MAN1DIR INSTALLMAN1DIR MAN1EXT
369 INST_MAN3DIR INSTALLMAN3DIR MAN3EXT
371 next unless defined $self->{$tmp};
372 push @m, "$tmp = $self->{$tmp}\n";
380 .NO_CONFIG_REC: Makefile
381 } if $ENV{CLEARCASE_ROOT};
383 # why not q{} ? -- emacs
385 # work around a famous dec-osf make(1) feature(?):
388 .SUFFIXES: .xs .c .C .cpp .cxx .cc \$(OBJ_EXT)
390 # Nick wanted to get rid of .PRECIOUS. I don't remember why. I seem to recall, that
391 # some make implementations will delete the Makefile when we rebuild it. Because
392 # we call false(1) when we rebuild it. So make(1) is not completely wrong when it
393 # does so. Our milage may vary.
394 # .PRECIOUS: Makefile # seems to be not necessary anymore
396 .PHONY: all config static dynamic test linkext manifest
398 # Where is the Config information that we are using/depend on
399 CONFIGDEP = \$(PERL_ARCHLIB)\\Config.pm \$(PERL_INC)\\config.h
402 my @parentdir = split(/::/, $self->{PARENT_NAME});
404 # Where to put things:
405 INST_LIBDIR = }. $self->catdir('$(INST_LIB)',@parentdir) .q{
406 INST_ARCHLIBDIR = }. $self->catdir('$(INST_ARCHLIB)',@parentdir) .q{
408 INST_AUTODIR = }. $self->catdir('$(INST_LIB)','auto','$(FULLEXT)') .q{
409 INST_ARCHAUTODIR = }. $self->catdir('$(INST_ARCHLIB)','auto','$(FULLEXT)') .q{
412 if ($self->has_link_code()) {
414 INST_STATIC = $(INST_ARCHAUTODIR)\$(BASEEXT)$(LIB_EXT)
415 INST_DYNAMIC = $(INST_ARCHAUTODIR)\$(DLBASE).$(DLEXT)
416 INST_BOOT = $(INST_ARCHAUTODIR)\$(BASEEXT).bs
426 $tmp = $self->export_list;
430 $tmp = $self->perl_archive;
436 #INST_PM = }.join(" \\\n\t", sort values %{$self->{PM}}).q{
438 #PM_TO_BLIB = }.join(" \\\n\t", %{$self->{PM}}).q{
442 TO_INST_PM = }.join(" \\\n\t", sort keys %{$self->{PM}}).q{
444 PM_TO_BLIB = }.join(" \\\n\t", %{$self->{PM}}).q{
453 my $path = $ENV{'PATH'} || $ENV{'Path'} || $ENV{'path'};
454 my @path = split(';',$path);
455 foreach(@path) { $_ = '.' if $_ eq '' }
461 Defines how to produce the *.a (or equivalent) files.
467 # Come to think of it, if there are subdirs with linkcode, we still have no INST_STATIC
468 # return '' unless $self->needs_linking(); #might be because of a subdir
470 return '' unless $self->has_link_code;
474 $(INST_STATIC): $(OBJECT) $(MYEXTLIB) $(INST_ARCHAUTODIR)\.exists
478 # If this extension has its own library (eg SDBM_File)
479 # then copy that to $(INST_STATIC) and add $(OBJECT) into it.
480 push(@m, "\t$self->{CP} \$(MYEXTLIB) \$\@\n") if $self->{MYEXTLIB};
483 q{ $(AR) }.($BORLAND ? '$@ $(OBJECT:^"+")'
484 : ($GCC ? '-ru $@ $(OBJECT)'
485 : '-out:$@ $(OBJECT)')).q{
486 }.$self->{NOECHO}.q{echo "$(EXTRALIBS)" > $(INST_ARCHAUTODIR)\extralibs.ld
490 # Old mechanism - still available:
492 push @m, "\t$self->{NOECHO}".q{echo "$(EXTRALIBS)" >> $(PERL_SRC)\ext.libs}."\n\n"
493 if $self->{PERL_SRC};
495 push @m, $self->dir_target('$(INST_ARCHAUTODIR)');
501 Defines targets for bootstrap files.
506 my($self, %attribs) = @_;
509 ' unless $self->has_link_code();
512 BOOTSTRAP = '."$self->{BASEEXT}.bs".'
514 # As Mkbootstrap might not write a file (if none is required)
515 # we use touch to prevent make continually trying to remake it.
516 # The DynaLoader only reads a non-empty file.
517 $(BOOTSTRAP): '."$self->{MAKEFILE} $self->{BOOTDEP}".' $(INST_ARCHAUTODIR)\.exists
518 '.$self->{NOECHO}.'echo "Running Mkbootstrap for $(NAME) ($(BSLOADLIBS))"
519 '.$self->{NOECHO}.'$(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" \
520 -MExtUtils::Mkbootstrap \
521 -e "Mkbootstrap(\'$(BASEEXT)\',\'$(BSLOADLIBS)\');"
522 '.$self->{NOECHO}.'$(TOUCH) $(BOOTSTRAP)
525 $(INST_BOOT): $(BOOTSTRAP) $(INST_ARCHAUTODIR)\.exists
526 '."$self->{NOECHO}$self->{RM_RF}".' $(INST_BOOT)
527 -'.$self->{CP}.' $(BOOTSTRAP) $(INST_BOOT)
532 =item dynamic_lib (o)
534 Defines how to produce the *.so (or equivalent) files.
539 my($self, %attribs) = @_;
540 return '' unless $self->needs_linking(); #might be because of a subdir
542 return '' unless $self->has_link_code;
544 my($otherldflags) = $attribs{OTHERLDFLAGS} || ($BORLAND ? 'c0d32.obj': '');
545 my($inst_dynamic_dep) = $attribs{INST_DYNAMIC_DEP} || "";
546 my($ldfrom) = '$(LDFROM)';
548 (my $boot = $self->{NAME}) =~ s/:/_/g;
551 # This section creates the dynamically loadable $(INST_DYNAMIC)
552 # from $(OBJECT) and possibly $(MYEXTLIB).
553 OTHERLDFLAGS = '.$otherldflags.'
554 INST_DYNAMIC_DEP = '.$inst_dynamic_dep.'
556 $(INST_DYNAMIC): $(OBJECT) $(MYEXTLIB) $(BOOTSTRAP)
559 # q{ $(LD) -out:$@ $(LDDLFLAGS) }.$ldfrom.q{ $(OTHERLDFLAGS) }
560 # .q{$(MYEXTLIB) $(PERL_ARCHIVE) $(LDLOADLIBS) -def:$(EXPORT_LIST)});
562 # Create xdc data for an MT safe NLM in case of mpk build
563 if ( $self->{CCFLAGS} =~ m/ -DMPK_ON /) {
565 push @m, ' $(MPKTOOL) $(BASEEXT).xdc
572 q{ $(LD) Form Novell NLM '$(DISTNAME) Extension, XS_VERSION=$(XS_VERSION)'}
575 # Taking care of long names like FileHandle, ByteLoader, SDBM_File etc
576 if($self->{NLM_SHORT_NAME}) {
577 # In case of nlms with names exceeding 8 chars, build nlm in the
578 # current dir, rename and move to auto\lib. If we create in auto\lib
579 # in the first place, we can't rename afterwards.
581 q{ Name $(NLM_SHORT_NAME).$(DLEXT)}
585 q{ Name $(INST_AUTODIR)\\$(BASEEXT).$(DLEXT)}
590 q{ Option Quiet Option Version = $(NLM_VERSION) Option Caseexact Option NoDefaultLibs Option screenname 'none' Option Synchronize }
595 q{ Option XDCDATA=$(BASEEXT).xdc }
599 # Add additional lib files if any (SDBM_File)
600 if($self->{MYEXTLIB}) {
602 q{ Library $(MYEXTLIB) }
606 #For now lets comment all the Watcom lib calls
607 #q{ LibPath $(LIBPTH) Library plib3s.lib Library math3s.lib Library clib3s.lib Library emu387.lib Library $(PERL_ARCHIVE) Library $(PERL_INC)\Main.lib}
610 q{ Library $(PERL_ARCHIVE) Library $(PERL_INC)\Main.lib}
611 .q{ Export boot_$(BOOT_SYMBOL) $(BASE_IMPORT) }
612 .q{ FILE $(OBJECT:.obj=,)}
615 # If it is having a short name, rename it
616 if($self->{NLM_SHORT_NAME}) {
618 if exist $(INST_AUTODIR)\\$(BASEEXT).$(DLEXT) del $(INST_AUTODIR)\\$(BASEEXT).$(DLEXT)';
620 rename $(NLM_SHORT_NAME).$(DLEXT) $(BASEEXT).$(DLEXT)';
622 move $(BASEEXT).$(DLEXT) $(INST_AUTODIR)';
629 push @m, $self->dir_target('$(INST_ARCHAUTODIR)');
636 return '$(PERL_INC)\\'.$Config{'libperl'};
642 return "$self->{BASEEXT}.def";
647 No physical check on the filesystem, but a logical cleanup of a
648 path. On UNIX eliminated successive slashes and successive "/.".
653 my($self,$path) = @_;
654 $path =~ s/^([a-z]:)/\u$1/;
656 $path =~ s|(.)\\+|$1\\|g ; # xx////xx -> xx/xx
657 $path =~ s|(\\\.)+\\|\\|g ; # xx/././xx -> xx/xx
658 $path =~ s|^(\.\\)+|| unless $path eq ".\\"; # ./xx -> xx
660 unless $path =~ m#^([a-z]:)?\\#; # xx/ -> xx
661 $path .= '.' if $path =~ m#\\$#;
667 Takes one argument, a file name, and returns the file name, if the
668 argument is likely to be a perl script. On MM_Unix this is true for
669 any ordinary, readable file.
674 my($self,$file) = @_;
675 return $file if -r $file && -f _;
676 return "$file.pl" if -r "$file.pl" && -f _;
677 return "$file.bat" if -r "$file.bat" && -f _;
683 Defines target that copies all files in the hash PM to their
684 destination and autosplits them. See L<ExtUtils::Install/DESCRIPTION>
690 my($autodir) = $self->catdir('$(INST_LIB)','auto');
692 pm_to_blib: $(TO_INST_PM)
693 }.$self->{NOECHO}.q{$(PERL) "-I$(INST_ARCHLIB)" "-I$(INST_LIB)" \
694 "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" -MExtUtils::Install \
696 ($NMAKE ? 'qw[ <<pmfiles.dat ],'
697 : $DMAKE ? 'qw[ $(mktmp,pmfiles.dat $(PM_TO_BLIB:s,\\,\\\\,)\n) ],'
698 : '{ qw[$(PM_TO_BLIB)] },'
699 ).q{'}.$autodir.q{')"
703 } : '') . $self->{NOECHO}.q{$(TOUCH) $@
707 =item test_via_harness (o)
709 Helper method to write the test targets
713 sub test_via_harness {
714 my($self, $perl, $tests) = @_;
715 "\t$perl".q! -Mblib -I$(PERL_ARCHLIB) -I$(PERL_LIB) -e "use Test::Harness qw(&runtests $$verbose); $$verbose=$(TEST_VERBOSE); runtests @ARGV;" !."$tests\n";
719 =item tool_autosplit (override)
721 Use Win32 quoting on command line.
726 my($self, %attribs) = @_;
728 $asl = "\$AutoSplit::Maxlen=$attribs{MAXLEN};" if $attribs{MAXLEN};
730 # Usage: $(AUTOSPLITFILE) FileToSplit AutoDirToSplitInto
731 AUTOSPLITFILE = $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" -MAutoSplit }.$asl.q{ -e "autosplit($$ARGV[0], $$ARGV[1], 0, 1, 1);"
735 =item tools_other (o)
739 Defines SHELL, LD, TOUCH, CP, MV, RM_F, RM_RF, CHMOD, UMASK_NULL in
740 the Makefile. Also defines the perl programs MKPATH,
741 WARN_IF_OLD_PACKLIST, MOD_INSTALL. DOC_INSTALL, and UNINSTALL.
748 my $bin_sh = $Config{sh} || 'cmd /c';
751 } unless $DMAKE; # dmake determines its own shell
753 for (qw/ CHMOD CP LD MV NOOP RM_F RM_RF TEST_F TOUCH UMASK_NULL DEV_NULL/ ) {
754 push @m, "$_ = $self->{$_}\n";
758 # The following is a portable way to say mkdir -p
759 # To see which directories are created, change the if 0 to if 1
760 MKPATH = $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) -MExtUtils::Command -e mkpath
762 # This helps us to minimize the effect of the .exists files A yet
763 # better solution would be to have a stable file in the perl
764 # distribution with a timestamp of zero. But this solution doesn't
765 # need any changes to the core distribution and works with older perls
766 EQUALIZE_TIMESTAMP = $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) -MExtUtils::Command -e eqtime
770 return join "", @m if $self->{PARENT};
773 # Here we warn users that an old packlist file was found somewhere,
774 # and that they should call some uninstall routine
775 WARN_IF_OLD_PACKLIST = $(PERL) -lwe "exit unless -f $$ARGV[0];" \\
776 -e "print 'WARNING: I have found an old package in';" \\
777 -e "print ' ', $$ARGV[0], '.';" \\
778 -e "print 'Please make sure the two installations are not conflicting';"
783 MOD_INSTALL = $(PERL) -I$(INST_LIB) -I$(PERL_LIB) -MExtUtils::Install \
784 -e "install({ @ARGV },'$(VERBINST)',0,'$(UNINST)');"
786 DOC_INSTALL = $(PERL) -e "$$\=\"\n\n\";" \
787 -e "print '=head2 ', scalar(localtime), ': C<', shift, '>', ' L<', shift, '>';" \
788 -e "print '=over 4';" \
789 -e "while (defined($$key = shift) and defined($$val = shift)) { print '=item *';print 'C<', \"$$key: $$val\", '>'; }" \
792 UNINSTALL = $(PERL) -MExtUtils::Install \
793 -e "uninstall($$ARGV[0],1,1); print \"\nUninstall is deprecated. Please check the";" \
794 -e "print \" packlist above carefully.\n There may be errors. Remove the\";" \
795 -e "print \" appropriate files manually.\n Sorry for the inconveniences.\n\""
803 Defines suffix rules to go from XS to object files directly. This is
804 only intended for broken make implementations.
808 sub xs_o { # many makes are too dumb to use xs_c then c_o
813 =item top_targets (o)
815 Defines the targets all, subdirs, config, and O_FILES
820 # --- Target Sections ---
825 #all :: config $(INST_PM) subdirs linkext manifypods
829 all :: pure_all htmlifypods manifypods
830 '.$self->{NOECHO}.'$(NOOP)
832 unless $self->{SKIPHASH}{'all'};
835 pure_all :: config pm_to_blib subdirs linkext
836 '.$self->{NOECHO}.'$(NOOP)
838 subdirs :: $(MYEXTLIB)
839 '.$self->{NOECHO}.'$(NOOP)
841 config :: '.$self->{MAKEFILE}.' $(INST_LIBDIR)\.exists
842 '.$self->{NOECHO}.'$(NOOP)
844 config :: $(INST_ARCHAUTODIR)\.exists
845 '.$self->{NOECHO}.'$(NOOP)
847 config :: $(INST_AUTODIR)\.exists
848 '.$self->{NOECHO}.'$(NOOP)
851 push @m, $self->dir_target(qw[$(INST_AUTODIR) $(INST_LIBDIR) $(INST_ARCHAUTODIR)]);
853 if (%{$self->{HTMLLIBPODS}}) {
855 config :: \$(INST_HTMLLIBDIR)/.exists
856 $self->{NOECHO}\$(NOOP)
859 push @m, $self->dir_target(qw[$(INST_HTMLLIBDIR)]);
862 if (%{$self->{HTMLSCRIPTPODS}}) {
864 config :: \$(INST_HTMLSCRIPTDIR)/.exists
865 $self->{NOECHO}\$(NOOP)
868 push @m, $self->dir_target(qw[$(INST_HTMLSCRIPTDIR)]);
871 if (%{$self->{MAN1PODS}}) {
873 config :: \$(INST_MAN1DIR)\\.exists
874 $self->{NOECHO}\$(NOOP)
877 push @m, $self->dir_target(qw[$(INST_MAN1DIR)]);
879 if (%{$self->{MAN3PODS}}) {
881 config :: \$(INST_MAN3DIR)\\.exists
882 $self->{NOECHO}\$(NOOP)
885 push @m, $self->dir_target(qw[$(INST_MAN3DIR)]);
889 $(O_FILES): $(H_FILES)
890 ' if @{$self->{O_FILES} || []} && @{$self->{H} || []};
894 perldoc ExtUtils::MakeMaker
899 }.$self->{NOECHO}.q{$(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) \
900 -MExtUtils::MakeMaker=Version_check \
901 -e "Version_check('$(MM_VERSION)')"
907 =item htmlifypods (o)
909 Defines targets and routines to translate the pods into HTML manpages
910 and put them into the INST_HTMLLIBDIR and INST_HTMLSCRIPTDIR
913 Same as MM_Unix version (changes command-line quoting).
918 my($self, %attribs) = @_;
919 return "\nhtmlifypods : pure_all\n\t$self->{NOECHO}\$(NOOP)\n" unless
920 %{$self->{HTMLLIBPODS}} || %{$self->{HTMLSCRIPTPODS}};
923 if (defined $self->{PERL_SRC}) {
924 $pod2html_exe = $self->catfile($self->{PERL_SRC},'pod','pod2html');
926 $pod2html_exe = $self->catfile($Config{scriptdirexp},'pod2html');
928 unless ($pod2html_exe = $self->perl_script($pod2html_exe)) {
929 # No pod2html but some HTMLxxxPODS to be installed
932 Warning: I could not locate your pod2html program. Please make sure,
933 your pod2html program is in your PATH before you execute 'make'
936 $pod2html_exe = "-S pod2html";
940 qq[POD2HTML_EXE = $pod2html_exe\n],
941 qq[POD2HTML = \$(PERL) -we "use File::Basename; use File::Path qw(mkpath); %m=\@ARGV;for (keys %m){" \\\n],
942 q[-e "next if -e $$m{$$_} && -M $$m{$$_} < -M $$_ && -M $$m{$$_} < -M '],
943 $self->{MAKEFILE}, q[';" \\
944 -e "print qq(Htmlifying $$m{$$_}\n);" \\
945 -e "$$dir = dirname($$m{$$_}); mkpath($$dir) unless -d $$dir;" \\
946 -e "system(qq[$$^X ].q["-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" $(POD2HTML_EXE) ].qq[$$_>$$m{$$_}])==0 or warn qq(Couldn\\047t install $$m{$$_}\n);" \\
947 -e "chmod(oct($(PERM_RW))), $$m{$$_} or warn qq(chmod $(PERM_RW) $$m{$$_}: $$!\n);}"
949 push @m, "\nhtmlifypods : pure_all ";
950 push @m, join " \\\n\t", keys %{$self->{HTMLLIBPODS}}, keys %{$self->{HTMLSCRIPTPODS}};
953 if (%{$self->{HTMLLIBPODS}} || %{$self->{HTMLSCRIPTPODS}}) {
954 push @m, "\t$self->{NOECHO}\$(POD2HTML) \\\n\t";
955 push @m, join " \\\n\t", %{$self->{HTMLLIBPODS}}, %{$self->{HTMLSCRIPTPODS}};
962 We don't want manpage process.
968 return "\nmanifypods :\n\t$self->{NOECHO}\$(NOOP)\n";
973 Same as MM_Unix version (changes command-line quoting).
982 $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) -MExtUtils::Manifest=maniread \\
983 -e "@all = keys %{ maniread() };" \\
984 -e "print(\"Executing $(CI) @all\n\"); system(\"$(CI) @all\");" \\
985 -e "print(\"Executing $(RCS_LABEL) ...\n\"); system(\"$(RCS_LABEL) @all\");"
992 Same as MM_Unix version (changes command-line quoting).
1000 dist : $(DIST_DEFAULT)
1001 }.$self->{NOECHO}.q{$(PERL) -le "print \"Warning: Makefile possibly out of date with $$vf\" if " \
1002 -e "-e ($$vf=\"$(VERSION_FROM)\") and -M $$vf < -M \"}.$self->{MAKEFILE}.q{\";"
1004 tardist : $(DISTVNAME).tar$(SUFFIX)
1006 zipdist : $(DISTVNAME).zip
1008 $(DISTVNAME).tar$(SUFFIX) : distdir
1011 $(TAR) $(TARFLAGS) $(DISTVNAME).tar $(DISTVNAME)
1012 $(RM_RF) $(DISTVNAME)
1013 $(COMPRESS) $(DISTVNAME).tar
1016 $(DISTVNAME).zip : distdir
1018 $(ZIP) $(ZIPFLAGS) $(DISTVNAME).zip $(DISTVNAME)
1019 $(RM_RF) $(DISTVNAME)
1022 uutardist : $(DISTVNAME).tar$(SUFFIX)
1023 uuencode $(DISTVNAME).tar$(SUFFIX) \\
1024 $(DISTVNAME).tar$(SUFFIX) > \\
1025 $(DISTVNAME).tar$(SUFFIX)_uu
1029 $(SHAR) $(DISTVNAME) > $(DISTVNAME).shar
1030 $(RM_RF) $(DISTVNAME)
1038 Defines the string that is passed to recursive make calls in
1045 return "PASTHRU = " . ($NMAKE ? "-nologo" : "");