1 package ExtUtils::MM_Win32;
7 ExtUtils::MM_Win32 - methods to override UN*X behaviour in ExtUtils::MakeMaker
11 use ExtUtils::MM_Win32; # Done internally by ExtUtils::MakeMaker if needed
15 See ExtUtils::MM_Unix for a documentation of the methods provided
16 there. This package overrides the implementation of these methods, not
28 require ExtUtils::MakeMaker;
29 ExtUtils::MakeMaker->import(qw( $Verbose &neatvalue));
31 $ENV{EMXSHELL} = 'sh'; # to run `commands`
32 unshift @MM::ISA, 'ExtUtils::MM_Win32';
34 $BORLAND = 1 if $Config{'cc'} =~ /^bcc/i;
35 $GCC = 1 if $Config{'cc'} =~ /^gcc/i;
36 $DMAKE = 1 if $Config{'make'} =~ /^dmake/i;
37 $NMAKE = 1 if $Config{'make'} =~ /^nmake/i;
38 $PERLMAKE = 1 if $Config{'make'} =~ /^pmake/i;
40 # a few workarounds for command.com (very basic)
42 package ExtUtils::MM_Win95;
44 # the $^O test may be overkill, but we want to be sure Win32::IsWin95()
45 # exists before we try it
47 unshift @MM::ISA, 'ExtUtils::MM_Win95'
48 if ($^O =~ /Win32/ && Win32::IsWin95());
52 return '' unless $self->needs_linking();
55 $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) $(XSUBPP) \\
56 $(XSPROTOARG) $(XSUBPPARGS) $*.xs > $*.c
62 return '' unless $self->needs_linking();
65 $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) $(XSUBPP) \\
66 $(XSPROTOARG) $(XSUBPPARGS) $*.xs > $*.cpp
70 # many makes are too dumb to use xs_c then c_o
73 return '' unless $self->needs_linking();
76 $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) $(XSUBPP) \\
77 $(XSPROTOARG) $(XSUBPPARGS) $*.xs > $*.c
78 $(CCCMD) $(CCCDLFLAGS) -I$(PERL_INC) $(DEFINE) $*.c
81 } # end of command.com workarounds
84 my($self,%attribs) = @_;
86 my($funcs) = $attribs{DL_FUNCS} || $self->{DL_FUNCS} || {};
87 my($vars) = $attribs{DL_VARS} || $self->{DL_VARS} || [];
88 my($funclist) = $attribs{FUNCLIST} || $self->{FUNCLIST} || [];
89 my($imports) = $attribs{IMPORTS} || $self->{IMPORTS} || {};
91 (my $boot = $self->{NAME}) =~ s/:/_/g;
93 if (not $self->{SKIPHASH}{'dynamic'}) {
95 $self->{BASEEXT}.def: Makefile.PL
97 q! $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" -MExtUtils::Mksymlists \\
98 -e "Mksymlists('NAME'=>\"!, $self->{NAME},
99 q!\", 'DLBASE' => '!,$self->{DLBASE},
100 # The above two lines quoted differently to work around
101 # a bug in the 4DOS/4NT command line interpreter. The visible
102 # result of the bug was files named q('extension_name',) *with the
103 # single quotes and the comma* in the extension build directories.
104 q!', 'DL_FUNCS' => !,neatvalue($funcs),
105 q!, 'FUNCLIST' => !,neatvalue($funclist),
106 q!, 'IMPORTS' => !,neatvalue($imports),
107 q!, 'DL_VARS' => !, neatvalue($vars), q!);"
113 sub replace_manpage_separator {
120 my($self,$file) = @_;
121 my @e = exists($ENV{'PATHEXT'})
122 ? split(/;/, $ENV{PATHEXT})
123 : qw(.com .exe .bat .cmd);
125 for (@e) { $e .= "\Q$_\E|" }
127 # see if file ends in one of the known extensions
128 if ($file =~ /($e)$/i) {
129 return $file if -e $file;
133 return "$file$_" if -e "$file$_";
139 sub file_name_is_absolute {
140 my($self,$file) = @_;
141 $file =~ m{^([a-z]:)?[\\/]}i ;
145 my($self, $ver, $names, $dirs, $trace) = @_;
148 print "Looking for perl $ver by these names:
154 foreach $dir (@$dirs){
155 next unless defined $dir; # $self->{PERL_SRC} may be undefined
156 foreach $name (@$names){
158 if ($self->file_name_is_absolute($name)) { # /foo/bar
160 } elsif ($self->canonpath($name) eq $self->canonpath(basename($name))) { # foo
161 $abs = $self->catfile($dir, $name);
163 $abs = $self->canonpath($self->catfile($self->curdir, $name));
165 print "Checking $abs\n" if ($trace >= 2);
166 next unless $self->maybe_command($abs);
167 print "Executing $abs\n" if ($trace >= 2);
168 $val = `$abs -e "require $ver;" 2>&1`;
170 print "Using PERL=$abs\n" if $trace;
172 } elsif ($trace >= 2) {
173 print "Result: `$val'\n";
177 print STDOUT "Unable to find a perl $ver (by these names: @$names, in these dirs: @$dirs)\n";
178 0; # false and not empty
185 # append a slash to each argument unless it has one there
186 $_ .= "\\" if $_ eq '' or substr($_,-1) ne "\\";
188 my $result = $self->canonpath(join('', @args));
194 Concatenate one or more directory names and a filename to form a
195 complete path ending with a filename
202 return $file unless @_;
203 my $dir = $self->catdir(@_);
205 $dir .= "\\" unless substr($dir,length($dir)-1,1) eq "\\";
212 &ExtUtils::MM_Unix::init_others;
213 $self->{'TOUCH'} = '$(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) -MExtUtils::Command -e touch';
214 $self->{'CHMOD'} = '$(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) -MExtUtils::Command -e chmod';
215 $self->{'CP'} = '$(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) -MExtUtils::Command -e cp';
216 $self->{'RM_F'} = '$(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) -MExtUtils::Command -e rm_f';
217 $self->{'RM_RF'} = '$(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) -MExtUtils::Command -e rm_rf';
218 $self->{'MV'} = '$(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) -MExtUtils::Command -e mv';
219 $self->{'NOOP'} = 'rem';
220 $self->{'TEST_F'} = '$(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) -MExtUtils::Command -e test_f';
221 $self->{'LD'} = $Config{'ld'} || 'link';
222 $self->{'AR'} = $Config{'ar'} || 'lib';
223 $self->{'LDLOADLIBS'} ||= $Config{'libs'};
224 # -Lfoo must come first for Borland, so we put it in LDDLFLAGS
226 my $libs = $self->{'LDLOADLIBS'};
228 while ($libs =~ s/(?:^|\s)(("?)-L.+?\2)(?:\s|$)/ /) {
229 $libpath .= ' ' if length $libpath;
232 $self->{'LDLOADLIBS'} = $libs;
233 $self->{'LDDLFLAGS'} ||= $Config{'lddlflags'};
234 $self->{'LDDLFLAGS'} .= " $libpath";
236 $self->{'DEV_NULL'} = '> NUL';
237 # $self->{'NOECHO'} = ''; # till we have it working
243 Initializes lots of constants and .SUFFIXES and .PHONY
253 AR_STATIC_ARGS NAME DISTNAME NAME_SYM VERSION
254 VERSION_SYM XS_VERSION INST_BIN INST_EXE INST_LIB
255 INST_ARCHLIB INST_SCRIPT PREFIX INSTALLDIRS
256 INSTALLPRIVLIB INSTALLARCHLIB INSTALLSITELIB
257 INSTALLSITEARCH INSTALLBIN INSTALLSCRIPT PERL_LIB
258 PERL_ARCHLIB SITELIBEXP SITEARCHEXP LIBPERL_A MYEXTLIB
259 FIRST_MAKEFILE MAKE_APERL_FILE PERLMAINCC PERL_SRC
260 PERL_INC PERL FULLPERL PERLRUN PERLRUNINST TEST_LIBS
264 next unless defined $self->{$tmp};
265 push @m, "$tmp = $self->{$tmp}\n";
269 VERSION_MACRO = VERSION
270 DEFINE_VERSION = -D\$(VERSION_MACRO)=\\\"\$(VERSION)\\\"
271 XS_VERSION_MACRO = XS_VERSION
272 XS_DEFINE_VERSION = -D\$(XS_VERSION_MACRO)=\\\"\$(XS_VERSION)\\\"
276 MAKEMAKER = $INC{'ExtUtils\MakeMaker.pm'}
277 MM_VERSION = $ExtUtils::MakeMaker::VERSION
281 # FULLEXT = Pathname for extension directory (eg Foo/Bar/Oracle).
282 # BASEEXT = Basename part of FULLEXT. May be just equal FULLEXT. (eg Oracle)
283 # ROOTEXT = Directory part of FULLEXT with leading slash (eg /DBD) !!! Deprecated from MM 5.32 !!!
284 # PARENT_NAME = NAME without BASEEXT and no trailing :: (eg Foo::Bar)
285 # DLBASE = Basename part of dynamic library. May be just equal BASEEXT.
289 FULLEXT BASEEXT PARENT_NAME DLBASE VERSION_FROM INC DEFINE OBJECT
292 next unless defined $self->{$tmp};
293 push @m, "$tmp = $self->{$tmp}\n";
297 # Handy lists of source code files:
298 XS_FILES= ".join(" \\\n\t", sort keys %{$self->{XS}})."
299 C_FILES = ".join(" \\\n\t", @{$self->{C}})."
300 O_FILES = ".join(" \\\n\t", @{$self->{O_FILES}})."
301 H_FILES = ".join(" \\\n\t", @{$self->{H}})."
302 HTMLLIBPODS = ".join(" \\\n\t", sort keys %{$self->{HTMLLIBPODS}})."
303 HTMLSCRIPTPODS = ".join(" \\\n\t", sort keys %{$self->{HTMLSCRIPTPODS}})."
304 MAN1PODS = ".join(" \\\n\t", sort keys %{$self->{MAN1PODS}})."
305 MAN3PODS = ".join(" \\\n\t", sort keys %{$self->{MAN3PODS}})."
309 INST_HTMLPRIVLIBDIR INSTALLHTMLPRIVLIBDIR
310 INST_HTMLSITELIBDIR INSTALLHTMLSITELIBDIR
311 INST_HTMLSCRIPTDIR INSTALLHTMLSCRIPTDIR
312 INST_HTMLLIBDIR HTMLEXT
313 INST_MAN1DIR INSTALLMAN1DIR MAN1EXT
314 INST_MAN3DIR INSTALLMAN3DIR MAN3EXT
316 next unless defined $self->{$tmp};
317 push @m, "$tmp = $self->{$tmp}\n";
325 .NO_CONFIG_REC: Makefile
326 } if $ENV{CLEARCASE_ROOT};
328 # why not q{} ? -- emacs
330 # work around a famous dec-osf make(1) feature(?):
333 .SUFFIXES: .xs .c .C .cpp .cxx .cc \$(OBJ_EXT)
335 # Nick wanted to get rid of .PRECIOUS. I don't remember why. I seem to recall, that
336 # some make implementations will delete the Makefile when we rebuild it. Because
337 # we call false(1) when we rebuild it. So make(1) is not completely wrong when it
338 # does so. Our milage may vary.
339 # .PRECIOUS: Makefile # seems to be not necessary anymore
341 .PHONY: all config static dynamic test linkext manifest
343 # Where is the Config information that we are using/depend on
344 CONFIGDEP = \$(PERL_ARCHLIB)\\Config.pm \$(PERL_INC)\\config.h
347 my @parentdir = split(/::/, $self->{PARENT_NAME});
349 # Where to put things:
350 INST_LIBDIR = }. $self->catdir('$(INST_LIB)',@parentdir) .q{
351 INST_ARCHLIBDIR = }. $self->catdir('$(INST_ARCHLIB)',@parentdir) .q{
353 INST_AUTODIR = }. $self->catdir('$(INST_LIB)','auto','$(FULLEXT)') .q{
354 INST_ARCHAUTODIR = }. $self->catdir('$(INST_ARCHLIB)','auto','$(FULLEXT)') .q{
357 if ($self->has_link_code()) {
359 INST_STATIC = $(INST_ARCHAUTODIR)\$(BASEEXT)$(LIB_EXT)
360 INST_DYNAMIC = $(INST_ARCHAUTODIR)\$(DLBASE).$(DLEXT)
361 INST_BOOT = $(INST_ARCHAUTODIR)\$(BASEEXT).bs
371 $tmp = $self->export_list;
375 $tmp = $self->perl_archive;
381 #INST_PM = }.join(" \\\n\t", sort values %{$self->{PM}}).q{
383 #PM_TO_BLIB = }.join(" \\\n\t", %{$self->{PM}}).q{
387 TO_INST_PM = }.join(" \\\n\t", sort keys %{$self->{PM}}).q{
389 PM_TO_BLIB = }.join(" \\\n\t", %{$self->{PM}}).q{
398 my $path = $ENV{'PATH'} || $ENV{'Path'} || $ENV{'path'};
399 my @path = split(';',$path);
400 foreach(@path) { $_ = '.' if $_ eq '' }
406 Defines how to produce the *.a (or equivalent) files.
412 # Come to think of it, if there are subdirs with linkcode, we still have no INST_STATIC
413 # return '' unless $self->needs_linking(); #might be because of a subdir
415 return '' unless $self->has_link_code;
419 $(INST_STATIC): $(OBJECT) $(MYEXTLIB) $(INST_ARCHAUTODIR)\.exists
422 # If this extension has its own library (eg SDBM_File)
423 # then copy that to $(INST_STATIC) and add $(OBJECT) into it.
424 push(@m, "\t$self->{CP} \$(MYEXTLIB) \$\@\n") if $self->{MYEXTLIB};
427 q{ $(AR) }.($BORLAND ? '$@ $(OBJECT:^"+")'
428 : ($GCC ? '-ru $@ $(OBJECT)'
429 : '-out:$@ $(OBJECT)')).q{
430 }.$self->{NOECHO}.q{echo "$(EXTRALIBS)" > $(INST_ARCHAUTODIR)\extralibs.ld
434 # Old mechanism - still available:
436 push @m, "\t$self->{NOECHO}".q{echo "$(EXTRALIBS)" >> $(PERL_SRC)\ext.libs}."\n\n"
437 if $self->{PERL_SRC};
439 push @m, $self->dir_target('$(INST_ARCHAUTODIR)');
445 Defines targets for bootstrap files.
450 my($self, %attribs) = @_;
453 ' unless $self->has_link_code();
456 BOOTSTRAP = '."$self->{BASEEXT}.bs".'
458 # As Mkbootstrap might not write a file (if none is required)
459 # we use touch to prevent make continually trying to remake it.
460 # The DynaLoader only reads a non-empty file.
461 $(BOOTSTRAP): '."$self->{MAKEFILE} $self->{BOOTDEP}".' $(INST_ARCHAUTODIR)\.exists
462 '.$self->{NOECHO}.'echo "Running Mkbootstrap for $(NAME) ($(BSLOADLIBS))"
463 '.$self->{NOECHO}.'$(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" \
464 -MExtUtils::Mkbootstrap \
465 -e "Mkbootstrap(\'$(BASEEXT)\',\'$(BSLOADLIBS)\');"
466 '.$self->{NOECHO}.'$(TOUCH) $(BOOTSTRAP)
469 $(INST_BOOT): $(BOOTSTRAP) $(INST_ARCHAUTODIR)\.exists
470 '."$self->{NOECHO}$self->{RM_RF}".' $(INST_BOOT)
471 -'.$self->{CP}.' $(BOOTSTRAP) $(INST_BOOT)
476 =item dynamic_lib (o)
478 Defines how to produce the *.so (or equivalent) files.
483 my($self, %attribs) = @_;
484 return '' unless $self->needs_linking(); #might be because of a subdir
486 return '' unless $self->has_link_code;
488 my($otherldflags) = $attribs{OTHERLDFLAGS} || ($BORLAND ? 'c0d32.obj': '');
489 my($inst_dynamic_dep) = $attribs{INST_DYNAMIC_DEP} || "";
490 my($ldfrom) = '$(LDFROM)';
493 # one thing for GCC/Mingw32:
494 # we try to overcome non-relocateable-DLL problems by generating
495 # a (hopefully unique) image-base from the dll's name
498 my $dllname = $self->{BASEEXT} . "." . $self->{DLEXT};
499 $dllname =~ /(....)(.{0,4})/;
500 my $baseaddr = unpack("n", $1 ^ $2);
501 $otherldflags .= sprintf("-Wl,--image-base,0x%x0000 ", $baseaddr);
505 # This section creates the dynamically loadable $(INST_DYNAMIC)
506 # from $(OBJECT) and possibly $(MYEXTLIB).
507 OTHERLDFLAGS = '.$otherldflags.'
508 INST_DYNAMIC_DEP = '.$inst_dynamic_dep.'
510 $(INST_DYNAMIC): $(OBJECT) $(MYEXTLIB) $(BOOTSTRAP) $(INST_ARCHAUTODIR)\.exists $(EXPORT_LIST) $(PERL_ARCHIVE) $(INST_DYNAMIC_DEP)
514 q{ dlltool --def $(EXPORT_LIST) --output-exp dll.exp
515 $(LD) -o $@ -Wl,--base-file -Wl,dll.base $(LDDLFLAGS) }.$ldfrom.q{ $(OTHERLDFLAGS) $(MYEXTLIB) $(PERL_ARCHIVE) $(LDLOADLIBS) dll.exp
516 dlltool --def $(EXPORT_LIST) --base-file dll.base --output-exp dll.exp
517 $(LD) -o $@ $(LDDLFLAGS) }.$ldfrom.q{ $(OTHERLDFLAGS) $(MYEXTLIB) $(PERL_ARCHIVE) $(LDLOADLIBS) dll.exp });
520 q{ $(LD) $(LDDLFLAGS) $(OTHERLDFLAGS) }.$ldfrom.q{,$@,,}
521 .($DMAKE ? q{$(PERL_ARCHIVE:s,/,\,) $(LDLOADLIBS:s,/,\,) }
522 .q{$(MYEXTLIB:s,/,\,),$(EXPORT_LIST:s,/,\,)}
523 : q{$(subst /,\,$(PERL_ARCHIVE)) $(subst /,\,$(LDLOADLIBS)) }
524 .q{$(subst /,\,$(MYEXTLIB)),$(subst /,\,$(EXPORT_LIST))})
528 q{ $(LD) -out:$@ $(LDDLFLAGS) }.$ldfrom.q{ $(OTHERLDFLAGS) }
529 .q{$(MYEXTLIB) $(PERL_ARCHIVE) $(LDLOADLIBS) -def:$(EXPORT_LIST)});
535 push @m, $self->dir_target('$(INST_ARCHAUTODIR)');
542 my $s = &ExtUtils::MM_Unix::clean;
543 my $clean = $GCC ? 'dll.base dll.exp' : '*.pdb';
557 return '$(PERL_INC)\\'.$Config{'libperl'};
563 return "$self->{BASEEXT}.def";
568 No physical check on the filesystem, but a logical cleanup of a
569 path. On UNIX eliminated successive slashes and successive "/.".
574 my($self,$path) = @_;
575 $path =~ s/^([a-z]:)/\u$1/;
577 $path =~ s|(.)\\+|$1\\|g ; # xx////xx -> xx/xx
578 $path =~ s|(\\\.)+\\|\\|g ; # xx/././xx -> xx/xx
579 $path =~ s|^(\.\\)+|| unless $path eq ".\\"; # ./xx -> xx
581 unless $path =~ m#^([a-z]:)?\\#; # xx/ -> xx
582 $path .= '.' if $path =~ m#\\$#;
588 Takes one argument, a file name, and returns the file name, if the
589 argument is likely to be a perl script. On MM_Unix this is true for
590 any ordinary, readable file.
595 my($self,$file) = @_;
596 return $file if -r $file && -f _;
597 return "$file.pl" if -r "$file.pl" && -f _;
598 return "$file.bat" if -r "$file.bat" && -f _;
604 Defines target that copies all files in the hash PM to their
605 destination and autosplits them. See L<ExtUtils::Install/DESCRIPTION>
611 my($autodir) = $self->catdir('$(INST_LIB)','auto');
613 pm_to_blib: $(TO_INST_PM)
614 }.$self->{NOECHO}.q{$(PERL) "-I$(INST_ARCHLIB)" "-I$(INST_LIB)" \
615 "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" -MExtUtils::Install \
617 ($NMAKE ? 'qw[ <<pmfiles.dat ],'
618 : $DMAKE ? 'qw[ $(mktmp,pmfiles.dat $(PM_TO_BLIB:s,\\,\\\\,)\n) ],'
619 : '{ qw[$(PM_TO_BLIB)] },'
620 ).q{'}.$autodir.q{','$(PM_FILTER)')"
624 } : '') . $self->{NOECHO}.q{$(TOUCH) $@
628 =item test_via_harness (o)
630 Helper method to write the test targets
634 sub test_via_harness {
635 my($self, $perl, $tests) = @_;
636 "\t$perl".q! -Mblib -I$(PERL_ARCHLIB) -I$(PERL_LIB) -e "use Test::Harness qw(&runtests $$verbose); $$verbose=$(TEST_VERBOSE); runtests @ARGV;" !."$tests\n";
640 =item tool_autosplit (override)
642 Use Win32 quoting on command line.
647 my($self, %attribs) = @_;
649 $asl = "\$AutoSplit::Maxlen=$attribs{MAXLEN};" if $attribs{MAXLEN};
651 # Usage: $(AUTOSPLITFILE) FileToSplit AutoDirToSplitInto
652 AUTOSPLITFILE = $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" -MAutoSplit }.$asl.q{ -e "autosplit($$ARGV[0], $$ARGV[1], 0, 1, 1);"
656 =item tools_other (o)
660 Defines SHELL, LD, TOUCH, CP, MV, RM_F, RM_RF, CHMOD, UMASK_NULL in
661 the Makefile. Also defines the perl programs MKPATH,
662 WARN_IF_OLD_PACKLIST, MOD_INSTALL. DOC_INSTALL, and UNINSTALL.
669 my $bin_sh = $Config{sh} || 'cmd /c';
672 } unless $DMAKE; # dmake determines its own shell
674 for (qw/ CHMOD CP LD MV NOOP RM_F RM_RF TEST_F TOUCH UMASK_NULL DEV_NULL/ ) {
675 push @m, "$_ = $self->{$_}\n";
679 # The following is a portable way to say mkdir -p
680 # To see which directories are created, change the if 0 to if 1
681 MKPATH = $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) -MExtUtils::Command -e mkpath
683 # This helps us to minimize the effect of the .exists files A yet
684 # better solution would be to have a stable file in the perl
685 # distribution with a timestamp of zero. But this solution doesn't
686 # need any changes to the core distribution and works with older perls
687 EQUALIZE_TIMESTAMP = $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) -MExtUtils::Command -e eqtime
691 return join "", @m if $self->{PARENT};
694 # Here we warn users that an old packlist file was found somewhere,
695 # and that they should call some uninstall routine
696 WARN_IF_OLD_PACKLIST = $(PERL) -lwe "exit unless -f $$ARGV[0];" \\
697 -e "print 'WARNING: I have found an old package in';" \\
698 -e "print ' ', $$ARGV[0], '.';" \\
699 -e "print 'Please make sure the two installations are not conflicting';"
704 MOD_INSTALL = $(PERL) -I$(INST_LIB) -I$(PERL_LIB) -MExtUtils::Install \
705 -e "install({ @ARGV },'$(VERBINST)',0,'$(UNINST)');"
707 DOC_INSTALL = $(PERL) -e "$$\=\"\n\n\";" \
708 -e "print '=head2 ', scalar(localtime), ': C<', shift, '>', ' L<', $$arg=shift, '|', $$arg, '>';" \
709 -e "print '=over 4';" \
710 -e "while (defined($$key = shift) and defined($$val = shift)) { print '=item *';print 'C<', \"$$key: $$val\", '>'; }" \
713 UNINSTALL = $(PERL) -MExtUtils::Install \
714 -e "uninstall($$ARGV[0],1,1); print \"\nUninstall is deprecated. Please check the";" \
715 -e "print \" packlist above carefully.\n There may be errors. Remove the\";" \
716 -e "print \" appropriate files manually.\n Sorry for the inconveniences.\n\""
724 Defines suffix rules to go from XS to object files directly. This is
725 only intended for broken make implementations.
729 sub xs_o { # many makes are too dumb to use xs_c then c_o
734 =item top_targets (o)
736 Defines the targets all, subdirs, config, and O_FILES
741 # --- Target Sections ---
746 #all :: config $(INST_PM) subdirs linkext manifypods
750 all :: pure_all htmlifypods manifypods
751 '.$self->{NOECHO}.'$(NOOP)
753 unless $self->{SKIPHASH}{'all'};
756 pure_all :: config pm_to_blib subdirs linkext
757 '.$self->{NOECHO}.'$(NOOP)
759 subdirs :: $(MYEXTLIB)
760 '.$self->{NOECHO}.'$(NOOP)
762 config :: '.$self->{MAKEFILE}.' $(INST_LIBDIR)\.exists
763 '.$self->{NOECHO}.'$(NOOP)
765 config :: $(INST_ARCHAUTODIR)\.exists
766 '.$self->{NOECHO}.'$(NOOP)
768 config :: $(INST_AUTODIR)\.exists
769 '.$self->{NOECHO}.'$(NOOP)
772 push @m, $self->dir_target(qw[$(INST_AUTODIR) $(INST_LIBDIR) $(INST_ARCHAUTODIR)]);
774 if (%{$self->{HTMLLIBPODS}}) {
776 config :: \$(INST_HTMLLIBDIR)/.exists
777 $self->{NOECHO}\$(NOOP)
780 push @m, $self->dir_target(qw[$(INST_HTMLLIBDIR)]);
783 if (%{$self->{HTMLSCRIPTPODS}}) {
785 config :: \$(INST_HTMLSCRIPTDIR)/.exists
786 $self->{NOECHO}\$(NOOP)
789 push @m, $self->dir_target(qw[$(INST_HTMLSCRIPTDIR)]);
792 if (%{$self->{MAN1PODS}}) {
794 config :: \$(INST_MAN1DIR)\\.exists
795 $self->{NOECHO}\$(NOOP)
798 push @m, $self->dir_target(qw[$(INST_MAN1DIR)]);
800 if (%{$self->{MAN3PODS}}) {
802 config :: \$(INST_MAN3DIR)\\.exists
803 $self->{NOECHO}\$(NOOP)
806 push @m, $self->dir_target(qw[$(INST_MAN3DIR)]);
810 $(O_FILES): $(H_FILES)
811 ' if @{$self->{O_FILES} || []} && @{$self->{H} || []};
815 perldoc ExtUtils::MakeMaker
820 }.$self->{NOECHO}.q{$(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) \
821 -MExtUtils::MakeMaker=Version_check \
822 -e "Version_check('$(MM_VERSION)')"
828 =item htmlifypods (o)
830 Defines targets and routines to translate the pods into HTML manpages
831 and put them into the INST_HTMLLIBDIR and INST_HTMLSCRIPTDIR
834 Same as MM_Unix version (changes command-line quoting).
839 my($self, %attribs) = @_;
840 return "\nhtmlifypods : pure_all\n\t$self->{NOECHO}\$(NOOP)\n" unless
841 %{$self->{HTMLLIBPODS}} || %{$self->{HTMLSCRIPTPODS}};
844 if (defined $self->{PERL_SRC}) {
845 $pod2html_exe = $self->catfile($self->{PERL_SRC},'pod','pod2html');
847 $pod2html_exe = $self->catfile($Config{scriptdirexp},'pod2html');
849 unless ($pod2html_exe = $self->perl_script($pod2html_exe)) {
850 # No pod2html but some HTMLxxxPODS to be installed
853 Warning: I could not locate your pod2html program. Please make sure,
854 your pod2html program is in your PATH before you execute 'make'
857 $pod2html_exe = "-S pod2html";
861 qq[POD2HTML_EXE = $pod2html_exe\n],
862 qq[POD2HTML = \$(PERL) -we "use File::Basename; use File::Path qw(mkpath); %m=\@ARGV;for (keys %m){" \\\n],
863 q[-e "next if -e $$m{$$_} && -M $$m{$$_} < -M $$_ && -M $$m{$$_} < -M '],
864 $self->{MAKEFILE}, q[';" \\
865 -e "print qq(Htmlifying $$m{$$_}\n);" \\
866 -e "$$dir = dirname($$m{$$_}); mkpath($$dir) unless -d $$dir;" \\
867 -e "system(qq[$$^X ].q["-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" $(POD2HTML_EXE) ].qq[$$_>$$m{$$_}])==0 or warn qq(Couldn\\047t install $$m{$$_}\n);" \\
868 -e "chmod(oct($(PERM_RW))), $$m{$$_} or warn qq(chmod $(PERM_RW) $$m{$$_}: $$!\n);}"
870 push @m, "\nhtmlifypods : pure_all ";
871 push @m, join " \\\n\t", keys %{$self->{HTMLLIBPODS}}, keys %{$self->{HTMLSCRIPTPODS}};
874 if (%{$self->{HTMLLIBPODS}} || %{$self->{HTMLSCRIPTPODS}}) {
875 push @m, "\t$self->{NOECHO}\$(POD2HTML) \\\n\t";
876 push @m, join " \\\n\t", %{$self->{HTMLLIBPODS}}, %{$self->{HTMLSCRIPTPODS}};
883 We don't want manpage process.
889 return "\nmanifypods :\n\t$self->{NOECHO}\$(NOOP)\n";
894 Same as MM_Unix version (changes command-line quoting).
903 $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) -MExtUtils::Manifest=maniread \\
904 -e "@all = keys %{ maniread() };" \\
905 -e "print(\"Executing $(CI) @all\n\"); system(\"$(CI) @all\");" \\
906 -e "print(\"Executing $(RCS_LABEL) ...\n\"); system(\"$(RCS_LABEL) @all\");"
913 Same as MM_Unix version (changes command-line quoting).
921 dist : $(DIST_DEFAULT)
922 }.$self->{NOECHO}.q{$(PERL) -le "print \"Warning: Makefile possibly out of date with $$vf\" if " \
923 -e "-e ($$vf=\"$(VERSION_FROM)\") and -M $$vf < -M \"}.$self->{MAKEFILE}.q{\";"
925 tardist : $(DISTVNAME).tar$(SUFFIX)
927 zipdist : $(DISTVNAME).zip
929 $(DISTVNAME).tar$(SUFFIX) : distdir
932 $(TAR) $(TARFLAGS) $(DISTVNAME).tar $(DISTVNAME)
933 $(RM_RF) $(DISTVNAME)
934 $(COMPRESS) $(DISTVNAME).tar
937 $(DISTVNAME).zip : distdir
939 $(ZIP) $(ZIPFLAGS) $(DISTVNAME).zip $(DISTVNAME)
940 $(RM_RF) $(DISTVNAME)
943 uutardist : $(DISTVNAME).tar$(SUFFIX)
944 uuencode $(DISTVNAME).tar$(SUFFIX) \\
945 $(DISTVNAME).tar$(SUFFIX) > \\
946 $(DISTVNAME).tar$(SUFFIX)_uu
950 $(SHAR) $(DISTVNAME) > $(DISTVNAME).shar
951 $(RM_RF) $(DISTVNAME)
959 Defines the string that is passed to recursive make calls in
966 return "PASTHRU = " . ($NMAKE ? "-nologo" : "");