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;
39 $OBJ = 1 if $Config{'ccflags'} =~ /PERL_OBJECT/i;
41 # a few workarounds for command.com (very basic)
43 package ExtUtils::MM_Win95;
45 # the $^O test may be overkill, but we want to be sure Win32::IsWin95()
46 # exists before we try it
48 unshift @MM::ISA, 'ExtUtils::MM_Win95'
49 if ($^O =~ /Win32/ && Win32::IsWin95());
53 return '' unless $self->needs_linking();
56 $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) $(XSUBPP) \\
57 $(XSPROTOARG) $(XSUBPPARGS) $*.xs > $*.c
63 return '' unless $self->needs_linking();
66 $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) $(XSUBPP) \\
67 $(XSPROTOARG) $(XSUBPPARGS) $*.xs > $*.cpp
71 # many makes are too dumb to use xs_c then c_o
74 return '' unless $self->needs_linking();
77 $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) $(XSUBPP) \\
78 $(XSPROTOARG) $(XSUBPPARGS) $*.xs > $*.c
79 $(CCCMD) $(CCCDLFLAGS) -I$(PERL_INC) $(DEFINE) $*.c
82 } # end of command.com workarounds
85 my($self,%attribs) = @_;
87 my($funcs) = $attribs{DL_FUNCS} || $self->{DL_FUNCS} || {};
88 my($vars) = $attribs{DL_VARS} || $self->{DL_VARS} || [];
89 my($funclist) = $attribs{FUNCLIST} || $self->{FUNCLIST} || [];
90 my($imports) = $attribs{IMPORTS} || $self->{IMPORTS} || {};
92 (my $boot = $self->{NAME}) =~ s/:/_/g;
94 if (not $self->{SKIPHASH}{'dynamic'}) {
96 $self->{BASEEXT}.def: Makefile.PL
98 q! $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" -MExtUtils::Mksymlists \\
99 -e "Mksymlists('NAME' => '!, $self->{NAME},
100 q!', 'DLBASE' => '!,$self->{DLBASE},
101 q!', 'DL_FUNCS' => !,neatvalue($funcs),
102 q!, 'FUNCLIST' => !,neatvalue($funclist),
103 q!, 'IMPORTS' => !,neatvalue($imports),
104 q!, 'DL_VARS' => !, neatvalue($vars), q!);"
110 sub replace_manpage_separator {
117 my($self,$file) = @_;
118 my @e = exists($ENV{'PATHEXT'})
119 ? split(/;/, $ENV{PATHEXT})
120 : qw(.com .exe .bat .cmd);
122 for (@e) { $e .= "\Q$_\E|" }
124 # see if file ends in one of the known extensions
125 if ($file =~ /($e)$/i) {
126 return $file if -e $file;
130 return "$file$_" if -e "$file$_";
136 sub file_name_is_absolute {
137 my($self,$file) = @_;
138 $file =~ m{^([a-z]:)?[\\/]}i ;
142 my($self, $ver, $names, $dirs, $trace) = @_;
145 print "Looking for perl $ver by these names:
151 foreach $dir (@$dirs){
152 next unless defined $dir; # $self->{PERL_SRC} may be undefined
153 foreach $name (@$names){
155 if ($self->file_name_is_absolute($name)) { # /foo/bar
157 } elsif ($self->canonpath($name) eq $self->canonpath(basename($name))) { # foo
158 $abs = $self->catfile($dir, $name);
160 $abs = $self->canonpath($self->catfile($self->curdir, $name));
162 print "Checking $abs\n" if ($trace >= 2);
163 next unless $self->maybe_command($abs);
164 print "Executing $abs\n" if ($trace >= 2);
165 $val = `$abs -e "require $ver;" 2>&1`;
167 print "Using PERL=$abs\n" if $trace;
169 } elsif ($trace >= 2) {
170 print "Result: `$val'\n";
174 print STDOUT "Unable to find a perl $ver (by these names: @$names, in these dirs: @$dirs)\n";
175 0; # false and not empty
182 # append a slash to each argument unless it has one there
183 $_ .= "\\" if $_ eq '' or substr($_,-1) ne "\\";
185 my $result = $self->canonpath(join('', @args));
191 Concatenate one or more directory names and a filename to form a
192 complete path ending with a filename
199 return $file unless @_;
200 my $dir = $self->catdir(@_);
202 $dir .= "\\" unless substr($dir,length($dir)-1,1) eq "\\";
209 &ExtUtils::MM_Unix::init_others;
210 $self->{'TOUCH'} = '$(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) -MExtUtils::Command -e touch';
211 $self->{'CHMOD'} = '$(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) -MExtUtils::Command -e chmod';
212 $self->{'CP'} = '$(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) -MExtUtils::Command -e cp';
213 $self->{'RM_F'} = '$(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) -MExtUtils::Command -e rm_f';
214 $self->{'RM_RF'} = '$(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) -MExtUtils::Command -e rm_rf';
215 $self->{'MV'} = '$(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) -MExtUtils::Command -e mv';
216 $self->{'NOOP'} = 'rem';
217 $self->{'TEST_F'} = '$(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) -MExtUtils::Command -e test_f';
218 $self->{'LD'} = $Config{'ld'} || 'link';
219 $self->{'AR'} = $Config{'ar'} || 'lib';
220 $self->{'LDLOADLIBS'} ||= $Config{'libs'};
221 # -Lfoo must come first for Borland, so we put it in LDDLFLAGS
223 my $libs = $self->{'LDLOADLIBS'};
225 while ($libs =~ s/(?:^|\s)(("?)-L.+?\2)(?:\s|$)/ /) {
226 $libpath .= ' ' if length $libpath;
229 $self->{'LDLOADLIBS'} = $libs;
230 $self->{'LDDLFLAGS'} ||= $Config{'lddlflags'};
231 $self->{'LDDLFLAGS'} .= " $libpath";
233 $self->{'DEV_NULL'} = '> NUL';
234 # $self->{'NOECHO'} = ''; # till we have it working
240 Initializes lots of constants and .SUFFIXES and .PHONY
250 AR_STATIC_ARGS NAME DISTNAME NAME_SYM VERSION
251 VERSION_SYM XS_VERSION INST_BIN INST_EXE INST_LIB
252 INST_ARCHLIB INST_SCRIPT PREFIX INSTALLDIRS
253 INSTALLPRIVLIB INSTALLARCHLIB INSTALLSITELIB
254 INSTALLSITEARCH INSTALLBIN INSTALLSCRIPT PERL_LIB
255 PERL_ARCHLIB SITELIBEXP SITEARCHEXP LIBPERL_A MYEXTLIB
256 FIRST_MAKEFILE MAKE_APERL_FILE PERLMAINCC PERL_SRC
257 PERL_INC PERL FULLPERL PERLRUN PERLRUNINST TEST_LIBS
261 next unless defined $self->{$tmp};
262 push @m, "$tmp = $self->{$tmp}\n";
266 VERSION_MACRO = VERSION
267 DEFINE_VERSION = -D\$(VERSION_MACRO)=\\\"\$(VERSION)\\\"
268 XS_VERSION_MACRO = XS_VERSION
269 XS_DEFINE_VERSION = -D\$(XS_VERSION_MACRO)=\\\"\$(XS_VERSION)\\\"
273 MAKEMAKER = $INC{'ExtUtils\MakeMaker.pm'}
274 MM_VERSION = $ExtUtils::MakeMaker::VERSION
278 # FULLEXT = Pathname for extension directory (eg Foo/Bar/Oracle).
279 # BASEEXT = Basename part of FULLEXT. May be just equal FULLEXT. (eg Oracle)
280 # ROOTEXT = Directory part of FULLEXT with leading slash (eg /DBD) !!! Deprecated from MM 5.32 !!!
281 # PARENT_NAME = NAME without BASEEXT and no trailing :: (eg Foo::Bar)
282 # DLBASE = Basename part of dynamic library. May be just equal BASEEXT.
286 FULLEXT BASEEXT PARENT_NAME DLBASE VERSION_FROM INC DEFINE OBJECT
289 next unless defined $self->{$tmp};
290 push @m, "$tmp = $self->{$tmp}\n";
294 # Handy lists of source code files:
295 XS_FILES= ".join(" \\\n\t", sort keys %{$self->{XS}})."
296 C_FILES = ".join(" \\\n\t", @{$self->{C}})."
297 O_FILES = ".join(" \\\n\t", @{$self->{O_FILES}})."
298 H_FILES = ".join(" \\\n\t", @{$self->{H}})."
299 HTMLLIBPODS = ".join(" \\\n\t", sort keys %{$self->{HTMLLIBPODS}})."
300 HTMLSCRIPTPODS = ".join(" \\\n\t", sort keys %{$self->{HTMLSCRIPTPODS}})."
301 MAN1PODS = ".join(" \\\n\t", sort keys %{$self->{MAN1PODS}})."
302 MAN3PODS = ".join(" \\\n\t", sort keys %{$self->{MAN3PODS}})."
306 INST_HTMLPRIVLIBDIR INSTALLHTMLPRIVLIBDIR
307 INST_HTMLSITELIBDIR INSTALLHTMLSITELIBDIR
308 INST_HTMLSCRIPTDIR INSTALLHTMLSCRIPTDIR
309 INST_HTMLLIBDIR HTMLEXT
310 INST_MAN1DIR INSTALLMAN1DIR MAN1EXT
311 INST_MAN3DIR INSTALLMAN3DIR MAN3EXT
313 next unless defined $self->{$tmp};
314 push @m, "$tmp = $self->{$tmp}\n";
322 .NO_CONFIG_REC: Makefile
323 } if $ENV{CLEARCASE_ROOT};
325 # why not q{} ? -- emacs
327 # work around a famous dec-osf make(1) feature(?):
330 .SUFFIXES: .xs .c .C .cpp .cxx .cc \$(OBJ_EXT)
332 # Nick wanted to get rid of .PRECIOUS. I don't remember why. I seem to recall, that
333 # some make implementations will delete the Makefile when we rebuild it. Because
334 # we call false(1) when we rebuild it. So make(1) is not completely wrong when it
335 # does so. Our milage may vary.
336 # .PRECIOUS: Makefile # seems to be not necessary anymore
338 .PHONY: all config static dynamic test linkext manifest
340 # Where is the Config information that we are using/depend on
341 CONFIGDEP = \$(PERL_ARCHLIB)\\Config.pm \$(PERL_INC)\\config.h
344 my @parentdir = split(/::/, $self->{PARENT_NAME});
346 # Where to put things:
347 INST_LIBDIR = }. $self->catdir('$(INST_LIB)',@parentdir) .q{
348 INST_ARCHLIBDIR = }. $self->catdir('$(INST_ARCHLIB)',@parentdir) .q{
350 INST_AUTODIR = }. $self->catdir('$(INST_LIB)','auto','$(FULLEXT)') .q{
351 INST_ARCHAUTODIR = }. $self->catdir('$(INST_ARCHLIB)','auto','$(FULLEXT)') .q{
354 if ($self->has_link_code()) {
356 INST_STATIC = $(INST_ARCHAUTODIR)\$(BASEEXT)$(LIB_EXT)
357 INST_DYNAMIC = $(INST_ARCHAUTODIR)\$(DLBASE).$(DLEXT)
358 INST_BOOT = $(INST_ARCHAUTODIR)\$(BASEEXT).bs
368 $tmp = $self->export_list;
372 $tmp = $self->perl_archive;
378 #INST_PM = }.join(" \\\n\t", sort values %{$self->{PM}}).q{
380 #PM_TO_BLIB = }.join(" \\\n\t", %{$self->{PM}}).q{
384 TO_INST_PM = }.join(" \\\n\t", sort keys %{$self->{PM}}).q{
386 PM_TO_BLIB = }.join(" \\\n\t", %{$self->{PM}}).q{
395 my $path = $ENV{'PATH'} || $ENV{'Path'} || $ENV{'path'};
396 my @path = split(';',$path);
397 foreach(@path) { $_ = '.' if $_ eq '' }
403 Defines how to produce the *.a (or equivalent) files.
409 # Come to think of it, if there are subdirs with linkcode, we still have no INST_STATIC
410 # return '' unless $self->needs_linking(); #might be because of a subdir
412 return '' unless $self->has_link_code;
416 $(INST_STATIC): $(OBJECT) $(MYEXTLIB) $(INST_ARCHAUTODIR)\.exists
419 # If this extension has its own library (eg SDBM_File)
420 # then copy that to $(INST_STATIC) and add $(OBJECT) into it.
421 push(@m, "\t$self->{CP} \$(MYEXTLIB) \$\@\n") if $self->{MYEXTLIB};
424 q{ $(AR) }.($BORLAND ? '$@ $(OBJECT:^"+")'
425 : ($GCC ? '-ru $@ $(OBJECT)'
426 : '-out:$@ $(OBJECT)')).q{
427 }.$self->{NOECHO}.q{echo "$(EXTRALIBS)" > $(INST_ARCHAUTODIR)\extralibs.ld
431 # Old mechanism - still available:
433 push @m, "\t$self->{NOECHO}".q{echo "$(EXTRALIBS)" >> $(PERL_SRC)\ext.libs}."\n\n"
434 if $self->{PERL_SRC};
436 push @m, $self->dir_target('$(INST_ARCHAUTODIR)');
442 Defines targets for bootstrap files.
447 my($self, %attribs) = @_;
450 ' unless $self->has_link_code();
453 BOOTSTRAP = '."$self->{BASEEXT}.bs".'
455 # As Mkbootstrap might not write a file (if none is required)
456 # we use touch to prevent make continually trying to remake it.
457 # The DynaLoader only reads a non-empty file.
458 $(BOOTSTRAP): '."$self->{MAKEFILE} $self->{BOOTDEP}".' $(INST_ARCHAUTODIR)\.exists
459 '.$self->{NOECHO}.'echo "Running Mkbootstrap for $(NAME) ($(BSLOADLIBS))"
460 '.$self->{NOECHO}.'$(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" \
461 -MExtUtils::Mkbootstrap \
462 -e "Mkbootstrap(\'$(BASEEXT)\',\'$(BSLOADLIBS)\');"
463 '.$self->{NOECHO}.'$(TOUCH) $(BOOTSTRAP)
466 $(INST_BOOT): $(BOOTSTRAP) $(INST_ARCHAUTODIR)\.exists
467 '."$self->{NOECHO}$self->{RM_RF}".' $(INST_BOOT)
468 -'.$self->{CP}.' $(BOOTSTRAP) $(INST_BOOT)
473 =item dynamic_lib (o)
475 Defines how to produce the *.so (or equivalent) files.
480 my($self, %attribs) = @_;
481 return '' unless $self->needs_linking(); #might be because of a subdir
483 return '' unless $self->has_link_code;
485 my($otherldflags) = $attribs{OTHERLDFLAGS} || ($BORLAND ? 'c0d32.obj': '');
486 my($inst_dynamic_dep) = $attribs{INST_DYNAMIC_DEP} || "";
487 my($ldfrom) = '$(LDFROM)';
490 # one thing for GCC/Mingw32:
491 # we try to overcome non-relocateable-DLL problems by generating
492 # a (hopefully unique) image-base from the dll's name
495 my $dllname = $self->{BASEEXT} . "." . $self->{DLEXT};
496 $dllname =~ /(....)(.{0,4})/;
497 my $baseaddr = unpack("n", $1 ^ $2);
498 $otherldflags .= sprintf("-Wl,--image-base,0x%x0000 ", $baseaddr);
502 # This section creates the dynamically loadable $(INST_DYNAMIC)
503 # from $(OBJECT) and possibly $(MYEXTLIB).
504 OTHERLDFLAGS = '.$otherldflags.'
505 INST_DYNAMIC_DEP = '.$inst_dynamic_dep.'
507 $(INST_DYNAMIC): $(OBJECT) $(MYEXTLIB) $(BOOTSTRAP) $(INST_ARCHAUTODIR)\.exists $(EXPORT_LIST) $(PERL_ARCHIVE) $(INST_DYNAMIC_DEP)
511 q{ dlltool --def $(EXPORT_LIST) --output-exp dll.exp
512 $(LD) -o $@ -Wl,--base-file -Wl,dll.base $(LDDLFLAGS) }.$ldfrom.q{ $(OTHERLDFLAGS) $(MYEXTLIB) $(PERL_ARCHIVE) $(LDLOADLIBS) dll.exp
513 dlltool --def $(EXPORT_LIST) --base-file dll.base --output-exp dll.exp
514 $(LD) -o $@ $(LDDLFLAGS) }.$ldfrom.q{ $(OTHERLDFLAGS) $(MYEXTLIB) $(PERL_ARCHIVE) $(LDLOADLIBS) dll.exp });
517 q{ $(LD) $(LDDLFLAGS) $(OTHERLDFLAGS) }.$ldfrom.q{,$@,,}
518 .($DMAKE ? q{$(PERL_ARCHIVE:s,/,\,) $(LDLOADLIBS:s,/,\,) }
519 .q{$(MYEXTLIB:s,/,\,),$(EXPORT_LIST:s,/,\,)}
520 : q{$(subst /,\,$(PERL_ARCHIVE)) $(subst /,\,$(LDLOADLIBS)) }
521 .q{$(subst /,\,$(MYEXTLIB)),$(subst /,\,$(EXPORT_LIST))})
525 q{ $(LD) -out:$@ $(LDDLFLAGS) }.$ldfrom.q{ $(OTHERLDFLAGS) }
526 .q{$(MYEXTLIB) $(PERL_ARCHIVE) $(LDLOADLIBS) -def:$(EXPORT_LIST)});
532 push @m, $self->dir_target('$(INST_ARCHAUTODIR)');
539 my $s = &ExtUtils::MM_Unix::clean;
540 my $clean = $GCC ? 'dll.base dll.exp' : '*.pdb';
554 return '$(PERL_INC)\\'.$Config{'libperl'};
560 return "$self->{BASEEXT}.def";
565 No physical check on the filesystem, but a logical cleanup of a
566 path. On UNIX eliminated successive slashes and successive "/.".
571 my($self,$path) = @_;
572 $path =~ s/^([a-z]:)/\u$1/;
574 $path =~ s|(.)\\+|$1\\|g ; # xx////xx -> xx/xx
575 $path =~ s|(\\\.)+\\|\\|g ; # xx/././xx -> xx/xx
576 $path =~ s|^(\.\\)+|| unless $path eq ".\\"; # ./xx -> xx
578 unless $path =~ m#^([a-z]:)?\\#; # xx/ -> xx
579 $path .= '.' if $path =~ m#\\$#;
585 Takes one argument, a file name, and returns the file name, if the
586 argument is likely to be a perl script. On MM_Unix this is true for
587 any ordinary, readable file.
592 my($self,$file) = @_;
593 return $file if -r $file && -f _;
594 return "$file.pl" if -r "$file.pl" && -f _;
595 return "$file.bat" if -r "$file.bat" && -f _;
601 Defines target that copies all files in the hash PM to their
602 destination and autosplits them. See L<ExtUtils::Install/DESCRIPTION>
608 my($autodir) = $self->catdir('$(INST_LIB)','auto');
610 pm_to_blib: $(TO_INST_PM)
611 }.$self->{NOECHO}.q{$(PERL) "-I$(INST_ARCHLIB)" "-I$(INST_LIB)" \
612 "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" -MExtUtils::Install \
614 ($NMAKE ? 'qw[ <<pmfiles.dat ],'
615 : $DMAKE ? 'qw[ $(mktmp,pmfiles.dat $(PM_TO_BLIB:s,\\,\\\\,)\n) ],'
616 : '{ qw[$(PM_TO_BLIB)] },'
617 ).q{'}.$autodir.q{','$(PM_FILTER)')"
621 } : '') . $self->{NOECHO}.q{$(TOUCH) $@
625 =item test_via_harness (o)
627 Helper method to write the test targets
631 sub test_via_harness {
632 my($self, $perl, $tests) = @_;
633 "\t$perl".q! -Mblib -I$(PERL_ARCHLIB) -I$(PERL_LIB) -e "use Test::Harness qw(&runtests $$verbose); $$verbose=$(TEST_VERBOSE); runtests @ARGV;" !."$tests\n";
637 =item tool_autosplit (override)
639 Use Win32 quoting on command line.
644 my($self, %attribs) = @_;
646 $asl = "\$AutoSplit::Maxlen=$attribs{MAXLEN};" if $attribs{MAXLEN};
648 # Usage: $(AUTOSPLITFILE) FileToSplit AutoDirToSplitInto
649 AUTOSPLITFILE = $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" -MAutoSplit }.$asl.q{ -e "autosplit($$ARGV[0], $$ARGV[1], 0, 1, 1);"
653 =item tools_other (o)
657 Defines SHELL, LD, TOUCH, CP, MV, RM_F, RM_RF, CHMOD, UMASK_NULL in
658 the Makefile. Also defines the perl programs MKPATH,
659 WARN_IF_OLD_PACKLIST, MOD_INSTALL. DOC_INSTALL, and UNINSTALL.
666 my $bin_sh = $Config{sh} || 'cmd /c';
669 } unless $DMAKE; # dmake determines its own shell
671 for (qw/ CHMOD CP LD MV NOOP RM_F RM_RF TEST_F TOUCH UMASK_NULL DEV_NULL/ ) {
672 push @m, "$_ = $self->{$_}\n";
676 # The following is a portable way to say mkdir -p
677 # To see which directories are created, change the if 0 to if 1
678 MKPATH = $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) -MExtUtils::Command -e mkpath
680 # This helps us to minimize the effect of the .exists files A yet
681 # better solution would be to have a stable file in the perl
682 # distribution with a timestamp of zero. But this solution doesn't
683 # need any changes to the core distribution and works with older perls
684 EQUALIZE_TIMESTAMP = $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) -MExtUtils::Command -e eqtime
688 return join "", @m if $self->{PARENT};
691 # Here we warn users that an old packlist file was found somewhere,
692 # and that they should call some uninstall routine
693 WARN_IF_OLD_PACKLIST = $(PERL) -lwe "exit unless -f $$ARGV[0];" \\
694 -e "print 'WARNING: I have found an old package in';" \\
695 -e "print ' ', $$ARGV[0], '.';" \\
696 -e "print 'Please make sure the two installations are not conflicting';"
701 MOD_INSTALL = $(PERL) -I$(INST_LIB) -I$(PERL_LIB) -MExtUtils::Install \
702 -e "install({ @ARGV },'$(VERBINST)',0,'$(UNINST)');"
704 DOC_INSTALL = $(PERL) -e "$$\=\"\n\n\";" \
705 -e "print '=head2 ', scalar(localtime), ': C<', shift, '>', ' L<', $$arg=shift, '|', $$arg, '>';" \
706 -e "print '=over 4';" \
707 -e "while (defined($$key = shift) and defined($$val = shift)) { print '=item *';print 'C<', \"$$key: $$val\", '>'; }" \
710 UNINSTALL = $(PERL) -MExtUtils::Install \
711 -e "uninstall($$ARGV[0],1,1); print \"\nUninstall is deprecated. Please check the";" \
712 -e "print \" packlist above carefully.\n There may be errors. Remove the\";" \
713 -e "print \" appropriate files manually.\n Sorry for the inconveniences.\n\""
721 Defines suffix rules to go from XS to object files directly. This is
722 only intended for broken make implementations.
726 sub xs_o { # many makes are too dumb to use xs_c then c_o
731 =item top_targets (o)
733 Defines the targets all, subdirs, config, and O_FILES
738 # --- Target Sections ---
743 #all :: config $(INST_PM) subdirs linkext manifypods
747 all :: pure_all htmlifypods manifypods
748 '.$self->{NOECHO}.'$(NOOP)
750 unless $self->{SKIPHASH}{'all'};
753 pure_all :: config pm_to_blib subdirs linkext
754 '.$self->{NOECHO}.'$(NOOP)
756 subdirs :: $(MYEXTLIB)
757 '.$self->{NOECHO}.'$(NOOP)
759 config :: '.$self->{MAKEFILE}.' $(INST_LIBDIR)\.exists
760 '.$self->{NOECHO}.'$(NOOP)
762 config :: $(INST_ARCHAUTODIR)\.exists
763 '.$self->{NOECHO}.'$(NOOP)
765 config :: $(INST_AUTODIR)\.exists
766 '.$self->{NOECHO}.'$(NOOP)
769 push @m, $self->dir_target(qw[$(INST_AUTODIR) $(INST_LIBDIR) $(INST_ARCHAUTODIR)]);
771 if (%{$self->{HTMLLIBPODS}}) {
773 config :: \$(INST_HTMLLIBDIR)/.exists
774 $self->{NOECHO}\$(NOOP)
777 push @m, $self->dir_target(qw[$(INST_HTMLLIBDIR)]);
780 if (%{$self->{HTMLSCRIPTPODS}}) {
782 config :: \$(INST_HTMLSCRIPTDIR)/.exists
783 $self->{NOECHO}\$(NOOP)
786 push @m, $self->dir_target(qw[$(INST_HTMLSCRIPTDIR)]);
789 if (%{$self->{MAN1PODS}}) {
791 config :: \$(INST_MAN1DIR)\\.exists
792 $self->{NOECHO}\$(NOOP)
795 push @m, $self->dir_target(qw[$(INST_MAN1DIR)]);
797 if (%{$self->{MAN3PODS}}) {
799 config :: \$(INST_MAN3DIR)\\.exists
800 $self->{NOECHO}\$(NOOP)
803 push @m, $self->dir_target(qw[$(INST_MAN3DIR)]);
807 $(O_FILES): $(H_FILES)
808 ' if @{$self->{O_FILES} || []} && @{$self->{H} || []};
812 perldoc ExtUtils::MakeMaker
817 }.$self->{NOECHO}.q{$(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) \
818 -MExtUtils::MakeMaker=Version_check \
819 -e "Version_check('$(MM_VERSION)')"
825 =item htmlifypods (o)
827 Defines targets and routines to translate the pods into HTML manpages
828 and put them into the INST_HTMLLIBDIR and INST_HTMLSCRIPTDIR
831 Same as MM_Unix version (changes command-line quoting).
836 my($self, %attribs) = @_;
837 return "\nhtmlifypods : pure_all\n\t$self->{NOECHO}\$(NOOP)\n" unless
838 %{$self->{HTMLLIBPODS}} || %{$self->{HTMLSCRIPTPODS}};
841 if (defined $self->{PERL_SRC}) {
842 $pod2html_exe = $self->catfile($self->{PERL_SRC},'pod','pod2html');
844 $pod2html_exe = $self->catfile($Config{scriptdirexp},'pod2html');
846 unless ($pod2html_exe = $self->perl_script($pod2html_exe)) {
847 # No pod2html but some HTMLxxxPODS to be installed
850 Warning: I could not locate your pod2html program. Please make sure,
851 your pod2html program is in your PATH before you execute 'make'
854 $pod2html_exe = "-S pod2html";
858 qq[POD2HTML_EXE = $pod2html_exe\n],
859 qq[POD2HTML = \$(PERL) -we "use File::Basename; use File::Path qw(mkpath); %m=\@ARGV;for (keys %m){" \\\n],
860 q[-e "next if -e $$m{$$_} && -M $$m{$$_} < -M $$_ && -M $$m{$$_} < -M '],
861 $self->{MAKEFILE}, q[';" \\
862 -e "print qq(Htmlifying $$m{$$_}\n);" \\
863 -e "$$dir = dirname($$m{$$_}); mkpath($$dir) unless -d $$dir;" \\
864 -e "system(qq[$$^X ].q["-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" $(POD2HTML_EXE) ].qq[$$_>$$m{$$_}])==0 or warn qq(Couldn\\047t install $$m{$$_}\n);" \\
865 -e "chmod(oct($(PERM_RW))), $$m{$$_} or warn qq(chmod $(PERM_RW) $$m{$$_}: $$!\n);}"
867 push @m, "\nhtmlifypods : pure_all ";
868 push @m, join " \\\n\t", keys %{$self->{HTMLLIBPODS}}, keys %{$self->{HTMLSCRIPTPODS}};
871 if (%{$self->{HTMLLIBPODS}} || %{$self->{HTMLSCRIPTPODS}}) {
872 push @m, "\t$self->{NOECHO}\$(POD2HTML) \\\n\t";
873 push @m, join " \\\n\t", %{$self->{HTMLLIBPODS}}, %{$self->{HTMLSCRIPTPODS}};
880 We don't want manpage process.
886 return "\nmanifypods :\n\t$self->{NOECHO}\$(NOOP)\n";
891 Same as MM_Unix version (changes command-line quoting).
900 $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) -MExtUtils::Manifest=maniread \\
901 -e "@all = keys %{ maniread() };" \\
902 -e "print(\"Executing $(CI) @all\n\"); system(\"$(CI) @all\");" \\
903 -e "print(\"Executing $(RCS_LABEL) ...\n\"); system(\"$(RCS_LABEL) @all\");"
910 Same as MM_Unix version (changes command-line quoting).
918 dist : $(DIST_DEFAULT)
919 }.$self->{NOECHO}.q{$(PERL) -le "print \"Warning: Makefile possibly out of date with $$vf\" if " \
920 -e "-e ($$vf=\"$(VERSION_FROM)\") and -M $$vf < -M \"}.$self->{MAKEFILE}.q{\";"
922 tardist : $(DISTVNAME).tar$(SUFFIX)
924 zipdist : $(DISTVNAME).zip
926 $(DISTVNAME).tar$(SUFFIX) : distdir
929 $(TAR) $(TARFLAGS) $(DISTVNAME).tar $(DISTVNAME)
930 $(RM_RF) $(DISTVNAME)
931 $(COMPRESS) $(DISTVNAME).tar
934 $(DISTVNAME).zip : distdir
936 $(ZIP) $(ZIPFLAGS) $(DISTVNAME).zip $(DISTVNAME)
937 $(RM_RF) $(DISTVNAME)
940 uutardist : $(DISTVNAME).tar$(SUFFIX)
941 uuencode $(DISTVNAME).tar$(SUFFIX) \\
942 $(DISTVNAME).tar$(SUFFIX) > \\
943 $(DISTVNAME).tar$(SUFFIX)_uu
947 $(SHAR) $(DISTVNAME) > $(DISTVNAME).shar
948 $(RM_RF) $(DISTVNAME)
956 Defines the string that is passed to recursive make calls in
963 return "PASTHRU = " . ($NMAKE ? "-nologo" : "");