1 package ExtUtils::MM_Win32;
5 ExtUtils::MM_Win32 - methods to override UN*X behaviour in ExtUtils::MakeMaker
9 use ExtUtils::MM_Win32; # 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_Win32';
32 $BORLAND = 1 if $Config{'cc'} =~ /^bcc/i;
33 $DMAKE = 1 if $Config{'make'} =~ /^dmake/i;
34 $NMAKE = 1 if $Config{'make'} =~ /^nmake/i;
37 my($self,%attribs) = @_;
39 my($funcs) = $attribs{DL_FUNCS} || $self->{DL_FUNCS} || {};
40 my($vars) = $attribs{DL_VARS} || $self->{DL_VARS} || [];
41 my($imports) = $attribs{IMPORTS} || $self->{IMPORTS} || {};
43 (my $boot = $self->{NAME}) =~ s/:/_/g;
45 if (not $self->{SKIPHASH}{'dynamic'}) {
47 $self->{BASEEXT}.def: Makefile.PL
49 q! $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" -MExtUtils::Mksymlists \\
50 -e "Mksymlists('NAME' => '!, $self->{NAME},
51 q!', 'DLBASE' => '!,$self->{DLBASE},
52 q!', 'DL_FUNCS' => !,neatvalue($funcs),
53 q!, 'IMPORTS' => !,neatvalue($imports),
54 q!, 'DL_VARS' => !, neatvalue($vars), q!);"
60 sub replace_manpage_separator {
68 return "$file.exe" if -e "$file.exe";
72 sub file_name_is_absolute {
74 $file =~ m{^([a-z]:)?[\\/]}i ;
78 my($self, $ver, $names, $dirs, $trace) = @_;
81 print "Looking for perl $ver by these names:
87 foreach $dir (@$dirs){
88 next unless defined $dir; # $self->{PERL_SRC} may be undefined
89 foreach $name (@$names){
91 if ($self->file_name_is_absolute($name)) { # /foo/bar
93 } elsif ($self->canonpath($name) eq $self->canonpath(basename($name))) { # foo
94 $abs = $self->catfile($dir, $name);
96 $abs = $self->canonpath($self->catfile($self->curdir, $name));
98 print "Checking $abs\n" if ($trace >= 2);
99 next unless $self->maybe_command($abs);
100 print "Executing $abs\n" if ($trace >= 2);
101 $val = `$abs -e "require $ver;" 2>&1`;
103 print "Using PERL=$abs\n" if $trace;
105 } elsif ($trace >= 2) {
106 print "Result: `$val'\n";
110 print STDOUT "Unable to find a perl $ver (by these names: @$names, in these dirs: @$dirs)\n";
111 0; # false and not empty
118 # append a slash to each argument unless it has one there
119 $_ .= "\\" if $_ eq '' or substr($_,-1) ne "\\";
121 my $result = $self->canonpath(join('', @args));
127 Concatenate one or more directory names and a filename to form a
128 complete path ending with a filename
135 return $file unless @_;
136 my $dir = $self->catdir(@_);
138 $dir .= "\\" unless substr($dir,length($dir)-1,1) eq "\\";
145 &ExtUtils::MM_Unix::init_others;
146 $self->{'TOUCH'} = '$(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) -MExtUtils::Command -e touch';
147 $self->{'CHMOD'} = '$(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) -MExtUtils::Command -e chmod';
148 $self->{'CP'} = '$(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) -MExtUtils::Command -e cp';
149 $self->{'RM_F'} = '$(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) -MExtUtils::Command -e rm_f';
150 $self->{'RM_RF'} = '$(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) -MExtUtils::Command -e rm_rf';
151 $self->{'MV'} = '$(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) -MExtUtils::Command -e mv';
152 $self->{'NOOP'} = 'rem';
153 $self->{'TEST_F'} = '$(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) -MExtUtils::Command -e test_f';
154 $self->{'LD'} = $Config{'ld'} || 'link';
155 $self->{'AR'} = $Config{'ar'} || 'lib';
156 $self->{'LDLOADLIBS'}
158 ? 'import32.lib cw32mti.lib '
159 : 'msvcrt.lib oldnames.lib kernel32.lib comdlg32.lib winspool.lib gdi32.lib '
160 .'advapi32.lib user32.lib shell32.lib netapi32.lib ole32.lib '
161 .'oleaut32.lib uuid.lib wsock32.lib mpr.lib winmm.lib version.lib '
162 ) . ' odbc32.lib odbccp32.lib';
163 $self->{'DEV_NULL'} = '> NUL';
164 # $self->{'NOECHO'} = ''; # till we have it working
170 Initializes lots of constants and .SUFFIXES and .PHONY
180 AR_STATIC_ARGS NAME DISTNAME NAME_SYM VERSION
181 VERSION_SYM XS_VERSION INST_BIN INST_EXE INST_LIB
182 INST_ARCHLIB INST_SCRIPT PREFIX INSTALLDIRS
183 INSTALLPRIVLIB INSTALLARCHLIB INSTALLSITELIB
184 INSTALLSITEARCH INSTALLBIN INSTALLSCRIPT PERL_LIB
185 PERL_ARCHLIB SITELIBEXP SITEARCHEXP LIBPERL_A MYEXTLIB
186 FIRST_MAKEFILE MAKE_APERL_FILE PERLMAINCC PERL_SRC
187 PERL_INC PERL FULLPERL
190 next unless defined $self->{$tmp};
191 push @m, "$tmp = $self->{$tmp}\n";
195 VERSION_MACRO = VERSION
196 DEFINE_VERSION = -D\$(VERSION_MACRO)=\\\"\$(VERSION)\\\"
197 XS_VERSION_MACRO = XS_VERSION
198 XS_DEFINE_VERSION = -D\$(XS_VERSION_MACRO)=\\\"\$(XS_VERSION)\\\"
202 MAKEMAKER = $INC{'ExtUtils\MakeMaker.pm'}
203 MM_VERSION = $ExtUtils::MakeMaker::VERSION
207 # FULLEXT = Pathname for extension directory (eg Foo/Bar/Oracle).
208 # BASEEXT = Basename part of FULLEXT. May be just equal FULLEXT. (eg Oracle)
209 # ROOTEXT = Directory part of FULLEXT with leading slash (eg /DBD) !!! Deprecated from MM 5.32 !!!
210 # PARENT_NAME = NAME without BASEEXT and no trailing :: (eg Foo::Bar)
211 # DLBASE = Basename part of dynamic library. May be just equal BASEEXT.
215 FULLEXT BASEEXT PARENT_NAME DLBASE VERSION_FROM INC DEFINE OBJECT
218 next unless defined $self->{$tmp};
219 push @m, "$tmp = $self->{$tmp}\n";
223 # Handy lists of source code files:
224 XS_FILES= ".join(" \\\n\t", sort keys %{$self->{XS}})."
225 C_FILES = ".join(" \\\n\t", @{$self->{C}})."
226 O_FILES = ".join(" \\\n\t", @{$self->{O_FILES}})."
227 H_FILES = ".join(" \\\n\t", @{$self->{H}})."
228 MAN1PODS = ".join(" \\\n\t", sort keys %{$self->{MAN1PODS}})."
229 MAN3PODS = ".join(" \\\n\t", sort keys %{$self->{MAN3PODS}})."
233 INST_MAN1DIR INSTALLMAN1DIR MAN1EXT INST_MAN3DIR INSTALLMAN3DIR MAN3EXT
235 next unless defined $self->{$tmp};
236 push @m, "$tmp = $self->{$tmp}\n";
244 .NO_CONFIG_REC: Makefile
245 } if $ENV{CLEARCASE_ROOT};
247 # why not q{} ? -- emacs
249 # work around a famous dec-osf make(1) feature(?):
252 .SUFFIXES: .xs .c .C .cpp .cxx .cc \$(OBJ_EXT)
254 # Nick wanted to get rid of .PRECIOUS. I don't remember why. I seem to recall, that
255 # some make implementations will delete the Makefile when we rebuild it. Because
256 # we call false(1) when we rebuild it. So make(1) is not completely wrong when it
257 # does so. Our milage may vary.
258 # .PRECIOUS: Makefile # seems to be not necessary anymore
260 .PHONY: all config static dynamic test linkext manifest
262 # Where is the Config information that we are using/depend on
263 CONFIGDEP = \$(PERL_ARCHLIB)\\Config.pm \$(PERL_INC)\\config.h
266 my @parentdir = split(/::/, $self->{PARENT_NAME});
268 # Where to put things:
269 INST_LIBDIR = }. $self->catdir('$(INST_LIB)',@parentdir) .q{
270 INST_ARCHLIBDIR = }. $self->catdir('$(INST_ARCHLIB)',@parentdir) .q{
272 INST_AUTODIR = }. $self->catdir('$(INST_LIB)','auto','$(FULLEXT)') .q{
273 INST_ARCHAUTODIR = }. $self->catdir('$(INST_ARCHLIB)','auto','$(FULLEXT)') .q{
276 if ($self->has_link_code()) {
278 INST_STATIC = $(INST_ARCHAUTODIR)\$(BASEEXT)$(LIB_EXT)
279 INST_DYNAMIC = $(INST_ARCHAUTODIR)\$(DLBASE).$(DLEXT)
280 INST_BOOT = $(INST_ARCHAUTODIR)\$(BASEEXT).bs
290 $tmp = $self->export_list;
294 $tmp = $self->perl_archive;
300 #INST_PM = }.join(" \\\n\t", sort values %{$self->{PM}}).q{
302 #PM_TO_BLIB = }.join(" \\\n\t", %{$self->{PM}}).q{
306 TO_INST_PM = }.join(" \\\n\t", sort keys %{$self->{PM}}).q{
308 PM_TO_BLIB = }.join(" \\\n\t", %{$self->{PM}}).q{
318 my $path = $ENV{'PATH'} || $ENV{'Path'} || $ENV{'path'};
319 my @path = split(';',$path);
320 foreach(@path) { $_ = '.' if $_ eq '' }
326 Defines how to produce the *.a (or equivalent) files.
332 # Come to think of it, if there are subdirs with linkcode, we still have no INST_STATIC
333 # return '' unless $self->needs_linking(); #might be because of a subdir
335 return '' unless $self->has_link_code;
339 $(INST_STATIC): $(OBJECT) $(MYEXTLIB) $(INST_ARCHAUTODIR)\.exists
342 # If this extension has it's own library (eg SDBM_File)
343 # then copy that to $(INST_STATIC) and add $(OBJECT) into it.
344 push(@m, "\t$self->{CP} \$(MYEXTLIB) \$\@\n") if $self->{MYEXTLIB};
347 q{ $(AR) }.($BORLAND ? '$@ $(OBJECT:^"+")' : '-out:$@ $(OBJECT)').q{
348 }.$self->{NOECHO}.q{echo "$(EXTRALIBS)" > $(INST_ARCHAUTODIR)\extralibs.ld
352 # Old mechanism - still available:
354 push @m, "\t$self->{NOECHO}".q{echo "$(EXTRALIBS)" >> $(PERL_SRC)\ext.libs}."\n\n"
355 if $self->{PERL_SRC};
357 push @m, $self->dir_target('$(INST_ARCHAUTODIR)');
363 Defines targets for bootstrap files.
368 my($self, %attribs) = @_;
371 ' unless $self->has_link_code();
374 BOOTSTRAP = '."$self->{BASEEXT}.bs".'
376 # As Mkbootstrap might not write a file (if none is required)
377 # we use touch to prevent make continually trying to remake it.
378 # The DynaLoader only reads a non-empty file.
379 $(BOOTSTRAP): '."$self->{MAKEFILE} $self->{BOOTDEP}".' $(INST_ARCHAUTODIR)\.exists
380 '.$self->{NOECHO}.'echo "Running Mkbootstrap for $(NAME) ($(BSLOADLIBS))"
381 '.$self->{NOECHO}.'$(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" \
382 -MExtUtils::Mkbootstrap \
383 -e "Mkbootstrap(\'$(BASEEXT)\',\'$(BSLOADLIBS)\');"
384 '.$self->{NOECHO}.'$(TOUCH) $(BOOTSTRAP)
387 $(INST_BOOT): $(BOOTSTRAP) $(INST_ARCHAUTODIR)\.exists
388 '."$self->{NOECHO}$self->{RM_RF}".' $(INST_BOOT)
389 -'.$self->{CP}.' $(BOOTSTRAP) $(INST_BOOT)
394 =item dynamic_lib (o)
396 Defines how to produce the *.so (or equivalent) files.
401 my($self, %attribs) = @_;
402 return '' unless $self->needs_linking(); #might be because of a subdir
404 return '' unless $self->has_link_code;
406 my($otherldflags) = $attribs{OTHERLDFLAGS} || ($BORLAND ? 'c0d32.obj': '');
407 my($inst_dynamic_dep) = $attribs{INST_DYNAMIC_DEP} || "";
408 my($ldfrom) = '$(LDFROM)';
411 # This section creates the dynamically loadable $(INST_DYNAMIC)
412 # from $(OBJECT) and possibly $(MYEXTLIB).
413 OTHERLDFLAGS = '.$otherldflags.'
414 INST_DYNAMIC_DEP = '.$inst_dynamic_dep.'
416 $(INST_DYNAMIC): $(OBJECT) $(MYEXTLIB) $(BOOTSTRAP) $(INST_ARCHAUTODIR)\.exists $(EXPORT_LIST) $(PERL_ARCHIVE) $(INST_DYNAMIC_DEP)
420 q{ $(LD) $(LDDLFLAGS) $(OTHERLDFLAGS) }.$ldfrom.q{,$@,,$(PERL_ARCHIVE:s,/,\,) $(LDLOADLIBS:s,/,\,) $(MYEXTLIB:s,/,\,),$(EXPORT_LIST:s,/,\,),$(RESFILES)} :
421 q{ $(LD) -out:$@ $(LDDLFLAGS) }.$ldfrom.q{ $(OTHERLDFLAGS) $(MYEXTLIB) $(PERL_ARCHIVE) $(LDLOADLIBS) -def:$(EXPORT_LIST)}
427 push @m, $self->dir_target('$(INST_ARCHAUTODIR)');
433 return '$(PERL_INC)\perl$(LIB_EXT)';
439 return "$self->{BASEEXT}.def";
444 No physical check on the filesystem, but a logical cleanup of a
445 path. On UNIX eliminated successive slashes and successive "/.".
450 my($self,$path) = @_;
451 $path =~ s/^([a-z]:)/\u$1/;
453 $path =~ s|(.)\\+|$1\\|g ; # xx////xx -> xx/xx
454 $path =~ s|(\\\.)+\\|\\|g ; # xx/././xx -> xx/xx
455 $path =~ s|^(\.\\)+|| unless $path eq ".\\"; # ./xx -> xx
457 unless $path =~ m#^([a-z]:)?\\#; # xx/ -> xx
458 $path .= '.' if $path =~ m#\\$#;
464 Takes one argument, a file name, and returns the file name, if the
465 argument is likely to be a perl script. On MM_Unix this is true for
466 any ordinary, readable file.
471 my($self,$file) = @_;
472 return "$file.pl" if -r "$file.pl" && -f _;
478 Defines target that copies all files in the hash PM to their
479 destination and autosplits them. See L<ExtUtils::Install/DESCRIPTION>
485 my($autodir) = $self->catdir('$(INST_LIB)','auto');
487 pm_to_blib: $(TO_INST_PM)
488 }.$self->{NOECHO}.q{$(PERL) "-I$(INST_ARCHLIB)" "-I$(INST_LIB)" \
489 "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" -MExtUtils::Install \
490 -e "pm_to_blib(qw[ }.
491 ($NMAKE ? '<<pmfiles.dat'
492 : '$(mktmp,pmfiles.dat $(PM_TO_BLIB:s,\\,\\\\,)\n)').
493 q{ ],'}.$autodir.q{')"
497 } : '') . $self->{NOECHO}.q{$(TOUCH) $@
501 =item test_via_harness (o)
503 Helper method to write the test targets
507 sub test_via_harness {
508 my($self, $perl, $tests) = @_;
509 "\t$perl".q! -Mblib -I$(PERL_ARCHLIB) -I$(PERL_LIB) -e "use Test::Harness qw(&runtests $$verbose); $$verbose=$(TEST_VERBOSE); runtests @ARGV;" !."$tests\n";
513 =item tool_autosplit (override)
515 Use Win32 quoting on command line.
520 my($self, %attribs) = @_;
522 $asl = "\$AutoSplit::Maxlen=$attribs{MAXLEN};" if $attribs{MAXLEN};
524 # Usage: $(AUTOSPLITFILE) FileToSplit AutoDirToSplitInto
525 AUTOSPLITFILE = $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" -MAutoSplit }.$asl.q{ -e "autosplit($$ARGV[0], $$ARGV[1], 0, 1, 1);"
529 =item tools_other (o)
533 Defines SHELL, LD, TOUCH, CP, MV, RM_F, RM_RF, CHMOD, UMASK_NULL in
534 the Makefile. Also defines the perl programs MKPATH,
535 WARN_IF_OLD_PACKLIST, MOD_INSTALL. DOC_INSTALL, and UNINSTALL.
542 my $bin_sh = $Config{sh} || 'cmd /c';
545 } unless $DMAKE; # dmake determines its own shell
547 for (qw/ CHMOD CP LD MV NOOP RM_F RM_RF TEST_F TOUCH UMASK_NULL DEV_NULL/ ) {
548 push @m, "$_ = $self->{$_}\n";
552 # The following is a portable way to say mkdir -p
553 # To see which directories are created, change the if 0 to if 1
554 MKPATH = $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) -MExtUtils::Command -e mkpath
556 # This helps us to minimize the effect of the .exists files A yet
557 # better solution would be to have a stable file in the perl
558 # distribution with a timestamp of zero. But this solution doesn't
559 # need any changes to the core distribution and works with older perls
560 EQUALIZE_TIMESTAMP = $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) -MExtUtils::Command -e eqtime
564 return join "", @m if $self->{PARENT};
567 # Here we warn users that an old packlist file was found somewhere,
568 # and that they should call some uninstall routine
569 WARN_IF_OLD_PACKLIST = $(PERL) -lwe "exit unless -f $$ARGV[0];" \\
570 -e "print 'WARNING: I have found an old package in';" \\
571 -e "print ' ', $$ARGV[0], '.';" \\
572 -e "print 'Please make sure the two installations are not conflicting';"
577 MOD_INSTALL = $(PERL) -I$(INST_LIB) -I$(PERL_LIB) -MExtUtils::Install \
578 -e "install({ @ARGV },'$(VERBINST)',0,'$(UNINST)');"
580 DOC_INSTALL = $(PERL) -e "$$\=\"\n\n\";" \
581 -e "print '=head2 ', scalar(localtime), ': C<', shift, '>', ' L<', shift, '>';" \
582 -e "print '=over 4';" \
583 -e "while (defined($$key = shift) and defined($$val = shift)) { print '=item *';print 'C<', \"$$key: $$val\", '>'; }" \
586 UNINSTALL = $(PERL) -MExtUtils::Install \
587 -e "uninstall($$ARGV[0],1,1); print \"\nUninstall is deprecated. Please check the";" \
588 -e "print \" packlist above carefully.\n There may be errors. Remove the\";" \
589 -e "print \" appropriate files manually.\n Sorry for the inconveniences.\n\""
597 Defines suffix rules to go from XS to object files directly. This is
598 only intended for broken make implementations.
602 sub xs_o { # many makes are too dumb to use xs_c then c_o
607 =item top_targets (o)
609 Defines the targets all, subdirs, config, and O_FILES
614 # --- Target Sections ---
619 #all :: config $(INST_PM) subdirs linkext manifypods
623 all :: pure_all manifypods
624 '.$self->{NOECHO}.'$(NOOP)
626 unless $self->{SKIPHASH}{'all'};
629 pure_all :: config pm_to_blib subdirs linkext
630 '.$self->{NOECHO}.'$(NOOP)
632 subdirs :: $(MYEXTLIB)
633 '.$self->{NOECHO}.'$(NOOP)
635 config :: '.$self->{MAKEFILE}.' $(INST_LIBDIR)\.exists
636 '.$self->{NOECHO}.'$(NOOP)
638 config :: $(INST_ARCHAUTODIR)\.exists
639 '.$self->{NOECHO}.'$(NOOP)
641 config :: $(INST_AUTODIR)\.exists
642 '.$self->{NOECHO}.'$(NOOP)
646 config :: Version_check
647 $self->{NOECHO}\$(NOOP)
649 } unless $self->{PARENT} or ($self->{PERL_SRC} && $self->{INSTALLDIRS} eq "perl") or $self->{NO_VC};
651 push @m, $self->dir_target(qw[$(INST_AUTODIR) $(INST_LIBDIR) $(INST_ARCHAUTODIR)]);
653 if (%{$self->{MAN1PODS}}) {
655 config :: \$(INST_MAN1DIR)\\.exists
656 $self->{NOECHO}\$(NOOP)
659 push @m, $self->dir_target(qw[$(INST_MAN1DIR)]);
661 if (%{$self->{MAN3PODS}}) {
663 config :: \$(INST_MAN3DIR)\\.exists
664 $self->{NOECHO}\$(NOOP)
667 push @m, $self->dir_target(qw[$(INST_MAN3DIR)]);
671 $(O_FILES): $(H_FILES)
672 ' if @{$self->{O_FILES} || []} && @{$self->{H} || []};
676 perldoc ExtUtils::MakeMaker
681 }.$self->{NOECHO}.q{$(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) \
682 -MExtUtils::MakeMaker=Version_check \
683 -e "Version_check('$(MM_VERSION)')"
691 We don't want manpage process. XXX add pod2html support later.
696 return "\nmanifypods :\n\t$self->{NOECHO}\$(NOOP)\n";
701 Same as MM_Unix version (changes command-line quoting).
710 $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) -MExtUtils::Manifest=maniread \\
711 -e "@all = keys %{ maniread() };" \\
712 -e "print(\"Executing $(CI) @all\n\"); system(\"$(CI) @all\");" \\
713 -e "print(\"Executing $(RCS_LABEL) ...\n\"); system(\"$(RCS_LABEL) @all\");"
720 Same as MM_Unix version (changes command-line quoting).
728 dist : $(DIST_DEFAULT)
729 }.$self->{NOECHO}.q{$(PERL) -le "print \"Warning: Makefile possibly out of date with $$vf\" if " \
730 -e "-e ($$vf=\"$(VERSION_FROM)\") and -M $$vf < -M \"}.$self->{MAKEFILE}.q{\";"
732 tardist : $(DISTVNAME).tar$(SUFFIX)
734 zipdist : $(DISTVNAME).zip
736 $(DISTVNAME).tar$(SUFFIX) : distdir
739 $(TAR) $(TARFLAGS) $(DISTVNAME).tar $(DISTVNAME)
740 $(RM_RF) $(DISTVNAME)
741 $(COMPRESS) $(DISTVNAME).tar
744 $(DISTVNAME).zip : distdir
746 $(ZIP) $(ZIPFLAGS) $(DISTVNAME).zip $(DISTVNAME)
747 $(RM_RF) $(DISTVNAME)
750 uutardist : $(DISTVNAME).tar$(SUFFIX)
751 uuencode $(DISTVNAME).tar$(SUFFIX) \\
752 $(DISTVNAME).tar$(SUFFIX) > \\
753 $(DISTVNAME).tar$(SUFFIX)_uu
757 $(SHAR) $(DISTVNAME) > $(DISTVNAME).shar
758 $(RM_RF) $(DISTVNAME)
766 Defines the string that is passed to recursive make calls in
773 return "PASTHRU = " . ($NMAKE ? "-nologo" : "");