1 package ExtUtils::MM_Win32;
6 ExtUtils::MM_Win32 - methods to override UN*X behaviour in ExtUtils::MakeMaker
10 use ExtUtils::MM_Win32; # Done internally by ExtUtils::MakeMaker if needed
14 See ExtUtils::MM_Unix for a documentation of the methods provided
15 there. This package overrides the implementation of these methods, not
25 use ExtUtils::MakeMaker qw( neatvalue );
27 use vars qw(@ISA $VERSION $BORLAND $GCC $DMAKE $NMAKE $PERLMAKE);
29 require ExtUtils::MM_Any;
30 require ExtUtils::MM_Unix;
31 @ISA = qw( ExtUtils::MM_Any ExtUtils::MM_Unix );
34 $ENV{EMXSHELL} = 'sh'; # to run `commands`
36 $BORLAND = 1 if $Config{'cc'} =~ /^bcc/i;
37 $GCC = 1 if $Config{'cc'} =~ /^gcc/i;
38 $DMAKE = 1 if $Config{'make'} =~ /^dmake/i;
39 $NMAKE = 1 if $Config{'make'} =~ /^nmake/i;
40 $PERLMAKE = 1 if $Config{'make'} =~ /^pmake/i;
43 my($self,%attribs) = @_;
45 my($funcs) = $attribs{DL_FUNCS} || $self->{DL_FUNCS} || {};
46 my($vars) = $attribs{DL_VARS} || $self->{DL_VARS} || [];
47 my($funclist) = $attribs{FUNCLIST} || $self->{FUNCLIST} || [];
48 my($imports) = $attribs{IMPORTS} || $self->{IMPORTS} || {};
50 (my $boot = $self->{NAME}) =~ s/:/_/g;
52 if (not $self->{SKIPHASH}{'dynamic'}) {
54 $self->{BASEEXT}.def: Makefile.PL
56 q! $(PERLRUN) -MExtUtils::Mksymlists \\
57 -e "Mksymlists('NAME'=>\"!, $self->{NAME},
58 q!\", 'DLBASE' => '!,$self->{DLBASE},
59 # The above two lines quoted differently to work around
60 # a bug in the 4DOS/4NT command line interpreter. The visible
61 # result of the bug was files named q('extension_name',) *with the
62 # single quotes and the comma* in the extension build directories.
63 q!', 'DL_FUNCS' => !,neatvalue($funcs),
64 q!, 'FUNCLIST' => !,neatvalue($funclist),
65 q!, 'IMPORTS' => !,neatvalue($imports),
66 q!, 'DL_VARS' => !, neatvalue($vars), q!);"
72 sub replace_manpage_separator {
80 my @e = exists($ENV{'PATHEXT'})
81 ? split(/;/, $ENV{PATHEXT})
82 : qw(.com .exe .bat .cmd);
84 for (@e) { $e .= "\Q$_\E|" }
86 # see if file ends in one of the known extensions
87 if ($file =~ /($e)$/i) {
88 return $file if -e $file;
92 return "$file$_" if -e "$file$_";
100 my($self, $ver, $names, $dirs, $trace) = @_;
105 print "Looking for perl $ver by these names:
111 foreach $dir (@$dirs){
112 next unless defined $dir; # $self->{PERL_SRC} may be undefined
113 foreach $name (@$names){
115 if (File::Spec->file_name_is_absolute($name)) { # /foo/bar
117 } elsif (File::Spec->canonpath($name) eq
118 File::Spec->canonpath(basename($name))) # foo
120 $abs = File::Spec->catfile($dir, $name);
122 $abs = File::Spec->canonpath(
123 File::Spec->catfile(File::Spec->curdir, $name)
126 print "Checking $abs\n" if ($trace >= 2);
127 next unless $self->maybe_command($abs);
128 print "Executing $abs\n" if ($trace >= 2);
129 (my($safe_abs) = $abs) =~ s{(\s)}{\\$1}g;
130 $val = `$safe_abs -e "require $ver;" 2>&1`;
132 print "Using PERL=$abs\n" if $trace;
134 } elsif ($trace >= 2) {
135 print "Result: `$val'\n";
139 print STDOUT "Unable to find a perl $ver (by these names: @$names, in these dirs: @$dirs)\n";
140 0; # false and not empty
144 # This code was taken out of MM_Unix to avoid loading File::Glob
147 return join(' ', <t\\*.t>);
154 $self->SUPER::init_others;
155 $self->{'TOUCH'} = '$(PERLRUN) -MExtUtils::Command -e touch';
156 $self->{'CHMOD'} = '$(PERLRUN) -MExtUtils::Command -e chmod';
157 $self->{'CP'} = '$(PERLRUN) -MExtUtils::Command -e cp';
158 $self->{'RM_F'} = '$(PERLRUN) -MExtUtils::Command -e rm_f';
159 $self->{'RM_RF'} = '$(PERLRUN) -MExtUtils::Command -e rm_rf';
160 $self->{'MV'} = '$(PERLRUN) -MExtUtils::Command -e mv';
161 $self->{'NOOP'} = 'rem';
162 $self->{'TEST_F'} = '$(PERLRUN) -MExtUtils::Command -e test_f';
163 $self->{'LD'} = $Config{'ld'} || 'link';
164 $self->{'AR'} = $Config{'ar'} || 'lib';
165 $self->{'LDLOADLIBS'} ||= $Config{'libs'};
166 # -Lfoo must come first for Borland, so we put it in LDDLFLAGS
168 my $libs = $self->{'LDLOADLIBS'};
170 while ($libs =~ s/(?:^|\s)(("?)-L.+?\2)(?:\s|$)/ /) {
171 $libpath .= ' ' if length $libpath;
174 $self->{'LDLOADLIBS'} = $libs;
175 $self->{'LDDLFLAGS'} ||= $Config{'lddlflags'};
176 $self->{'LDDLFLAGS'} .= " $libpath";
178 $self->{'DEV_NULL'} = '> NUL';
184 Initializes lots of constants and .SUFFIXES and .PHONY
193 AR_STATIC_ARGS NAME DISTNAME NAME_SYM VERSION
194 VERSION_SYM XS_VERSION
195 INST_BIN INST_LIB INST_ARCHLIB INST_SCRIPT
197 PREFIX SITEPREFIX VENDORPREFIX
198 INSTALLPRIVLIB INSTALLSITELIB INSTALLVENDORLIB
199 INSTALLARCHLIB INSTALLSITEARCH INSTALLVENDORARCH
200 INSTALLBIN INSTALLSITEBIN INSTALLVENDORBIN INSTALLSCRIPT
201 PERL_LIB PERL_ARCHLIB
202 SITELIBEXP SITEARCHEXP
204 FIRST_MAKEFILE MAKE_APERL_FILE PERLMAINCC PERL_SRC
205 PERL_INC PERL FULLPERL PERLRUN FULLPERLRUN PERLRUNINST
206 FULLPERLRUNINST ABSPERL ABSPERLRUN ABSPERLRUNINST
210 next unless defined $self->{$tmp};
211 push @m, "$tmp = $self->{$tmp}\n";
215 VERSION_MACRO = VERSION
216 DEFINE_VERSION = -D\$(VERSION_MACRO)=\\\"\$(VERSION)\\\"
217 XS_VERSION_MACRO = XS_VERSION
218 XS_DEFINE_VERSION = -D\$(XS_VERSION_MACRO)=\\\"\$(XS_VERSION)\\\"
222 MAKEMAKER = $INC{'ExtUtils/MakeMaker.pm'}
223 MM_VERSION = $ExtUtils::MakeMaker::VERSION
227 # FULLEXT = Pathname for extension directory (eg Foo/Bar/Oracle).
228 # BASEEXT = Basename part of FULLEXT. May be just equal FULLEXT. (eg Oracle)
229 # PARENT_NAME = NAME without BASEEXT and no trailing :: (eg Foo::Bar)
230 # DLBASE = Basename part of dynamic library. May be just equal BASEEXT.
234 FULLEXT BASEEXT PARENT_NAME DLBASE VERSION_FROM INC DEFINE OBJECT
237 next unless defined $self->{$tmp};
238 push @m, "$tmp = $self->{$tmp}\n";
242 # Handy lists of source code files:
243 XS_FILES= ".join(" \\\n\t", sort keys %{$self->{XS}})."
244 C_FILES = ".join(" \\\n\t", @{$self->{C}})."
245 O_FILES = ".join(" \\\n\t", @{$self->{O_FILES}})."
246 H_FILES = ".join(" \\\n\t", @{$self->{H}})."
247 MAN1PODS = ".join(" \\\n\t", sort keys %{$self->{MAN1PODS}})."
248 MAN3PODS = ".join(" \\\n\t", sort keys %{$self->{MAN3PODS}})."
253 INSTALLMAN1DIR INSTALLSITEMAN1DIR INSTALLVENDORMAN1DIR
255 INSTALLMAN3DIR INSTALLSITEMAN3DIR INSTALLVENDORMAN3DIR
257 next unless defined $self->{$tmp};
258 push @m, "$tmp = $self->{$tmp}\n";
266 .NO_CONFIG_REC: Makefile
267 } if $ENV{CLEARCASE_ROOT};
269 # why not q{} ? -- emacs
271 # work around a famous dec-osf make(1) feature(?):
274 .SUFFIXES: .xs .c .C .cpp .cxx .cc \$(OBJ_EXT)
276 # Nick wanted to get rid of .PRECIOUS. I don't remember why. I seem to
277 # recall, that some make implementations will delete the Makefile when we
278 # rebuild it. Because we call false(1) when we rebuild it. So make(1) is
279 # not completely wrong when it does so. Our milage may vary.
280 # .PRECIOUS: Makefile # seems to be not necessary anymore
282 .PHONY: all config static dynamic test linkext manifest
284 # Where is the Config information that we are using/depend on
285 CONFIGDEP = \$(PERL_ARCHLIB)\\Config.pm \$(PERL_INC)\\config.h
288 my @parentdir = split(/::/, $self->{PARENT_NAME});
290 # Where to put things:
291 INST_LIBDIR = }. File::Spec->catdir('$(INST_LIB)',@parentdir) .q{
292 INST_ARCHLIBDIR = }. File::Spec->catdir('$(INST_ARCHLIB)',@parentdir) .q{
294 INST_AUTODIR = }. File::Spec->catdir('$(INST_LIB)','auto','$(FULLEXT)') .q{
295 INST_ARCHAUTODIR = }. File::Spec->catdir('$(INST_ARCHLIB)','auto','$(FULLEXT)') .q{
298 if ($self->has_link_code()) {
300 INST_STATIC = $(INST_ARCHAUTODIR)\$(BASEEXT)$(LIB_EXT)
301 INST_DYNAMIC = $(INST_ARCHAUTODIR)\$(DLBASE).$(DLEXT)
302 INST_BOOT = $(INST_ARCHAUTODIR)\$(BASEEXT).bs
312 $tmp = $self->export_list;
316 $tmp = $self->perl_archive;
322 TO_INST_PM = }.join(" \\\n\t", sort keys %{$self->{PM}}).q{
324 PM_TO_BLIB = }.join(" \\\n\t", %{$self->{PM}}).q{
333 Defines how to produce the *.a (or equivalent) files.
339 # Come to think of it, if there are subdirs with linkcode, we still have no INST_STATIC
340 # return '' unless $self->needs_linking(); #might be because of a subdir
342 return '' unless $self->has_link_code;
346 $(INST_STATIC): $(OBJECT) $(MYEXTLIB) $(INST_ARCHAUTODIR)\.exists
349 # If this extension has its own library (eg SDBM_File)
350 # then copy that to $(INST_STATIC) and add $(OBJECT) into it.
351 push(@m, "\t$self->{CP} \$(MYEXTLIB) \$\@\n") if $self->{MYEXTLIB};
354 q{ $(AR) }.($BORLAND ? '$@ $(OBJECT:^"+")'
355 : ($GCC ? '-ru $@ $(OBJECT)'
356 : '-out:$@ $(OBJECT)')).q{
357 }.$self->{NOECHO}.q{echo "$(EXTRALIBS)" > $(INST_ARCHAUTODIR)\extralibs.ld
361 # Old mechanism - still available:
363 push @m, "\t$self->{NOECHO}".q{echo "$(EXTRALIBS)" >> $(PERL_SRC)\ext.libs}."\n\n"
364 if $self->{PERL_SRC};
366 push @m, $self->dir_target('$(INST_ARCHAUTODIR)');
372 Defines targets for bootstrap files.
377 my($self, %attribs) = @_;
380 ' unless $self->has_link_code();
383 BOOTSTRAP = '."$self->{BASEEXT}.bs".'
385 # As Mkbootstrap might not write a file (if none is required)
386 # we use touch to prevent make continually trying to remake it.
387 # The DynaLoader only reads a non-empty file.
388 $(BOOTSTRAP): '."$self->{MAKEFILE} $self->{BOOTDEP}".' $(INST_ARCHAUTODIR)\.exists
389 '.$self->{NOECHO}.'echo "Running Mkbootstrap for $(NAME) ($(BSLOADLIBS))"
390 '.$self->{NOECHO}.'$(PERLRUN) \
391 -MExtUtils::Mkbootstrap \
392 -e "Mkbootstrap(\'$(BASEEXT)\',\'$(BSLOADLIBS)\');"
393 '.$self->{NOECHO}.'$(TOUCH) $(BOOTSTRAP)
396 $(INST_BOOT): $(BOOTSTRAP) $(INST_ARCHAUTODIR)\.exists
397 '."$self->{NOECHO}$self->{RM_RF}".' $(INST_BOOT)
398 -'.$self->{CP}.' $(BOOTSTRAP) $(INST_BOOT)
403 =item dynamic_lib (o)
405 Defines how to produce the *.so (or equivalent) files.
410 my($self, %attribs) = @_;
411 return '' unless $self->needs_linking(); #might be because of a subdir
413 return '' unless $self->has_link_code;
415 my($otherldflags) = $attribs{OTHERLDFLAGS} || ($BORLAND ? 'c0d32.obj': '');
416 my($inst_dynamic_dep) = $attribs{INST_DYNAMIC_DEP} || "";
417 my($ldfrom) = '$(LDFROM)';
420 # one thing for GCC/Mingw32:
421 # we try to overcome non-relocateable-DLL problems by generating
422 # a (hopefully unique) image-base from the dll's name
425 my $dllname = $self->{BASEEXT} . "." . $self->{DLEXT};
426 $dllname =~ /(....)(.{0,4})/;
427 my $baseaddr = unpack("n", $1 ^ $2);
428 $otherldflags .= sprintf("-Wl,--image-base,0x%x0000 ", $baseaddr);
432 # This section creates the dynamically loadable $(INST_DYNAMIC)
433 # from $(OBJECT) and possibly $(MYEXTLIB).
434 OTHERLDFLAGS = '.$otherldflags.'
435 INST_DYNAMIC_DEP = '.$inst_dynamic_dep.'
437 $(INST_DYNAMIC): $(OBJECT) $(MYEXTLIB) $(BOOTSTRAP) $(INST_ARCHAUTODIR)\.exists $(EXPORT_LIST) $(PERL_ARCHIVE) $(INST_DYNAMIC_DEP)
441 q{ dlltool --def $(EXPORT_LIST) --output-exp dll.exp
442 $(LD) -o $@ -Wl,--base-file -Wl,dll.base $(LDDLFLAGS) }.$ldfrom.q{ $(OTHERLDFLAGS) $(MYEXTLIB) $(PERL_ARCHIVE) $(LDLOADLIBS) dll.exp
443 dlltool --def $(EXPORT_LIST) --base-file dll.base --output-exp dll.exp
444 $(LD) -o $@ $(LDDLFLAGS) }.$ldfrom.q{ $(OTHERLDFLAGS) $(MYEXTLIB) $(PERL_ARCHIVE) $(LDLOADLIBS) dll.exp });
447 q{ $(LD) $(LDDLFLAGS) $(OTHERLDFLAGS) }.$ldfrom.q{,$@,,}
448 .($DMAKE ? q{$(PERL_ARCHIVE:s,/,\,) $(LDLOADLIBS:s,/,\,) }
449 .q{$(MYEXTLIB:s,/,\,),$(EXPORT_LIST:s,/,\,)}
450 : q{$(subst /,\,$(PERL_ARCHIVE)) $(subst /,\,$(LDLOADLIBS)) }
451 .q{$(subst /,\,$(MYEXTLIB)),$(subst /,\,$(EXPORT_LIST))})
455 q{ $(LD) -out:$@ $(LDDLFLAGS) }.$ldfrom.q{ $(OTHERLDFLAGS) }
456 .q{$(MYEXTLIB) $(PERL_ARCHIVE) $(LDLOADLIBS) -def:$(EXPORT_LIST)});
462 push @m, $self->dir_target('$(INST_ARCHAUTODIR)');
469 my $s = $self->SUPER::clean(@_);
470 my $clean = $GCC ? 'dll.base dll.exp' : '*.pdb';
484 return '$(PERL_INC)\\'.$Config{'libperl'};
490 return "$self->{BASEEXT}.def";
496 Takes one argument, a file name, and returns the file name, if the
497 argument is likely to be a perl script. On MM_Unix this is true for
498 any ordinary, readable file.
503 my($self,$file) = @_;
504 return $file if -r $file && -f _;
505 return "$file.pl" if -r "$file.pl" && -f _;
506 return "$file.bat" if -r "$file.bat" && -f _;
512 Defines target that copies all files in the hash PM to their
513 destination and autosplits them. See L<ExtUtils::Install/DESCRIPTION>
519 my($autodir) = File::Spec->catdir('$(INST_LIB)','auto');
521 pm_to_blib: $(TO_INST_PM)
522 }.$self->{NOECHO}.q{$(PERLRUNINST) -MExtUtils::Install \
524 ($NMAKE ? 'qw[ <<pmfiles.dat ],'
525 : $DMAKE ? 'qw[ $(mktmp,pmfiles.dat $(PM_TO_BLIB:s,\\,\\\\,)\n) ],'
526 : '{ qw[$(PM_TO_BLIB)] },'
527 ).q{'}.$autodir.q{','$(PM_FILTER)')"
531 } : '') . "\t".$self->{NOECHO}.q{$(TOUCH) $@
536 =item tool_autosplit (override)
538 Use Win32 quoting on command line.
543 my($self, %attribs) = @_;
545 $asl = "\$AutoSplit::Maxlen=$attribs{MAXLEN};" if $attribs{MAXLEN};
547 # Usage: $(AUTOSPLITFILE) FileToSplit AutoDirToSplitInto
548 AUTOSPLITFILE = $(PERLRUN) -MAutoSplit }.$asl.q{ -e "autosplit($$ARGV[0], $$ARGV[1], 0, 1, 1);"
552 =item tools_other (o)
556 Defines SHELL, LD, TOUCH, CP, MV, RM_F, RM_RF, CHMOD, UMASK_NULL in
557 the Makefile. Also defines the perl programs MKPATH,
558 WARN_IF_OLD_PACKLIST, MOD_INSTALL. DOC_INSTALL, and UNINSTALL.
565 my $bin_sh = $Config{sh} || 'cmd /c';
568 } unless $DMAKE; # dmake determines its own shell
570 for (qw/ CHMOD CP LD MV NOOP RM_F RM_RF TEST_F TOUCH UMASK_NULL DEV_NULL/ ) {
571 push @m, "$_ = $self->{$_}\n";
575 # The following is a portable way to say mkdir -p
576 # To see which directories are created, change the if 0 to if 1
577 MKPATH = $(PERLRUN) -MExtUtils::Command -e mkpath
579 # This helps us to minimize the effect of the .exists files A yet
580 # better solution would be to have a stable file in the perl
581 # distribution with a timestamp of zero. But this solution doesn't
582 # need any changes to the core distribution and works with older perls
583 EQUALIZE_TIMESTAMP = $(PERLRUN) -MExtUtils::Command -e eqtime
587 return join "", @m if $self->{PARENT};
590 # Here we warn users that an old packlist file was found somewhere,
591 # and that they should call some uninstall routine
592 WARN_IF_OLD_PACKLIST = $(PERL) -lwe "exit unless -f $$ARGV[0];" \\
593 -e "print 'WARNING: I have found an old package in';" \\
594 -e "print ' ', $$ARGV[0], '.';" \\
595 -e "print 'Please make sure the two installations are not conflicting';"
600 MOD_INSTALL = $(PERL) -I$(INST_LIB) -I$(PERL_LIB) -MExtUtils::Install \
601 -e "install({ @ARGV },'$(VERBINST)',0,'$(UNINST)');"
603 DOC_INSTALL = $(PERL) -e "$$\=\"\n\n\";" \
604 -e "print '=head2 ', scalar(localtime), ': C<', shift, '>', ' L<', $$arg=shift, '|', $$arg, '>';" \
605 -e "print '=over 4';" \
606 -e "while (defined($$key = shift) and defined($$val = shift)) { print '=item *';print 'C<', \"$$key: $$val\", '>'; }" \
609 UNINSTALL = $(PERL) -MExtUtils::Install \
610 -e "uninstall($$ARGV[0],1,1); print \"\nUninstall is deprecated. Please check the";" \
611 -e "print \" packlist above carefully.\n There may be errors. Remove the\";" \
612 -e "print \" appropriate files manually.\n Sorry for the inconveniences.\n\""
620 Defines suffix rules to go from XS to object files directly. This is
621 only intended for broken make implementations.
625 sub xs_o { # many makes are too dumb to use xs_c then c_o
630 =item top_targets (o)
632 Defines the targets all, subdirs, config, and O_FILES
637 # --- Target Sections ---
643 all :: pure_all manifypods
644 '.$self->{NOECHO}.'$(NOOP)
646 unless $self->{SKIPHASH}{'all'};
649 pure_all :: config pm_to_blib subdirs linkext
650 '.$self->{NOECHO}.'$(NOOP)
652 subdirs :: $(MYEXTLIB)
653 '.$self->{NOECHO}.'$(NOOP)
655 config :: '.$self->{MAKEFILE}.' $(INST_LIBDIR)\.exists
656 '.$self->{NOECHO}.'$(NOOP)
658 config :: $(INST_ARCHAUTODIR)\.exists
659 '.$self->{NOECHO}.'$(NOOP)
661 config :: $(INST_AUTODIR)\.exists
662 '.$self->{NOECHO}.'$(NOOP)
665 push @m, $self->dir_target(qw[$(INST_AUTODIR) $(INST_LIBDIR) $(INST_ARCHAUTODIR)]);
667 if (%{$self->{MAN1PODS}}) {
669 config :: \$(INST_MAN1DIR)\\.exists
670 $self->{NOECHO}\$(NOOP)
673 push @m, $self->dir_target(qw[$(INST_MAN1DIR)]);
675 if (%{$self->{MAN3PODS}}) {
677 config :: \$(INST_MAN3DIR)\\.exists
678 $self->{NOECHO}\$(NOOP)
681 push @m, $self->dir_target(qw[$(INST_MAN3DIR)]);
685 $(O_FILES): $(H_FILES)
686 ' if @{$self->{O_FILES} || []} && @{$self->{H} || []};
690 perldoc ExtUtils::MakeMaker
698 We don't want manpage process.
704 return "\nmanifypods :\n\t$self->{NOECHO}\$(NOOP)\n";
709 Same as MM_Unix version (changes command-line quoting).
718 $(PERLRUN) -MExtUtils::Manifest=maniread \\
719 -e "@all = keys %{ maniread() };" \\
720 -e "print(\"Executing $(CI) @all\n\"); system(\"$(CI) @all\");" \\
721 -e "print(\"Executing $(RCS_LABEL) ...\n\"); system(\"$(RCS_LABEL) @all\");"
728 Same as MM_Unix version (changes command-line quoting).
736 dist : $(DIST_DEFAULT)
737 }.$self->{NOECHO}.q{$(PERL) -le "print \"Warning: Makefile possibly out of date with $$vf\" if " \
738 -e "-e ($$vf=\"$(VERSION_FROM)\") and -M $$vf < -M \"}.$self->{MAKEFILE}.q{\";"
740 tardist : $(DISTVNAME).tar$(SUFFIX)
742 zipdist : $(DISTVNAME).zip
744 $(DISTVNAME).tar$(SUFFIX) : distdir
747 $(TAR) $(TARFLAGS) $(DISTVNAME).tar $(DISTVNAME)
748 $(RM_RF) $(DISTVNAME)
749 $(COMPRESS) $(DISTVNAME).tar
752 $(DISTVNAME).zip : distdir
754 $(ZIP) $(ZIPFLAGS) $(DISTVNAME).zip $(DISTVNAME)
755 $(RM_RF) $(DISTVNAME)
758 uutardist : $(DISTVNAME).tar$(SUFFIX)
759 uuencode $(DISTVNAME).tar$(SUFFIX) \\
760 $(DISTVNAME).tar$(SUFFIX) > \\
761 $(DISTVNAME).tar$(SUFFIX)_uu
765 $(SHAR) $(DISTVNAME) > $(DISTVNAME).shar
766 $(RM_RF) $(DISTVNAME)
774 Defines the string that is passed to recursive make calls in
781 return "PASTHRU = " . ($NMAKE ? "-nologo" : "");