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
146 $self->SUPER::init_others;
147 $self->{'TOUCH'} = '$(PERLRUN) -MExtUtils::Command -e touch';
148 $self->{'CHMOD'} = '$(PERLRUN) -MExtUtils::Command -e chmod';
149 $self->{'CP'} = '$(PERLRUN) -MExtUtils::Command -e cp';
150 $self->{'RM_F'} = '$(PERLRUN) -MExtUtils::Command -e rm_f';
151 $self->{'RM_RF'} = '$(PERLRUN) -MExtUtils::Command -e rm_rf';
152 $self->{'MV'} = '$(PERLRUN) -MExtUtils::Command -e mv';
153 $self->{'NOOP'} = 'rem';
154 $self->{'TEST_F'} = '$(PERLRUN) -MExtUtils::Command -e test_f';
155 $self->{'LD'} = $Config{'ld'} || 'link';
156 $self->{'AR'} = $Config{'ar'} || 'lib';
157 $self->{'LDLOADLIBS'} ||= $Config{'libs'};
158 # -Lfoo must come first for Borland, so we put it in LDDLFLAGS
160 my $libs = $self->{'LDLOADLIBS'};
162 while ($libs =~ s/(?:^|\s)(("?)-L.+?\2)(?:\s|$)/ /) {
163 $libpath .= ' ' if length $libpath;
166 $self->{'LDLOADLIBS'} = $libs;
167 $self->{'LDDLFLAGS'} ||= $Config{'lddlflags'};
168 $self->{'LDDLFLAGS'} .= " $libpath";
170 $self->{'DEV_NULL'} = '> NUL';
176 Initializes lots of constants and .SUFFIXES and .PHONY
186 AR_STATIC_ARGS NAME DISTNAME NAME_SYM VERSION
187 VERSION_SYM XS_VERSION INST_BIN INST_EXE INST_LIB
188 INST_ARCHLIB INST_SCRIPT PREFIX INSTALLDIRS
189 INSTALLPRIVLIB INSTALLARCHLIB INSTALLSITELIB
190 INSTALLSITEARCH INSTALLBIN INSTALLSCRIPT PERL_LIB
191 PERL_ARCHLIB SITELIBEXP SITEARCHEXP LIBPERL_A MYEXTLIB
192 FIRST_MAKEFILE MAKE_APERL_FILE PERLMAINCC PERL_SRC
193 PERL_INC PERL FULLPERL PERLRUN FULLPERLRUN PERLRUNINST
194 FULLPERLRUNINST TEST_LIBS FULL_AR PERL_CORE
197 next unless defined $self->{$tmp};
198 push @m, "$tmp = $self->{$tmp}\n";
202 VERSION_MACRO = VERSION
203 DEFINE_VERSION = -D\$(VERSION_MACRO)=\\\"\$(VERSION)\\\"
204 XS_VERSION_MACRO = XS_VERSION
205 XS_DEFINE_VERSION = -D\$(XS_VERSION_MACRO)=\\\"\$(XS_VERSION)\\\"
209 MAKEMAKER = $INC{'ExtUtils/MakeMaker.pm'}
210 MM_VERSION = $ExtUtils::MakeMaker::VERSION
214 # FULLEXT = Pathname for extension directory (eg Foo/Bar/Oracle).
215 # BASEEXT = Basename part of FULLEXT. May be just equal FULLEXT. (eg Oracle)
216 # PARENT_NAME = NAME without BASEEXT and no trailing :: (eg Foo::Bar)
217 # DLBASE = Basename part of dynamic library. May be just equal BASEEXT.
221 FULLEXT BASEEXT PARENT_NAME DLBASE VERSION_FROM INC DEFINE OBJECT
224 next unless defined $self->{$tmp};
225 push @m, "$tmp = $self->{$tmp}\n";
229 # Handy lists of source code files:
230 XS_FILES= ".join(" \\\n\t", sort keys %{$self->{XS}})."
231 C_FILES = ".join(" \\\n\t", @{$self->{C}})."
232 O_FILES = ".join(" \\\n\t", @{$self->{O_FILES}})."
233 H_FILES = ".join(" \\\n\t", @{$self->{H}})."
234 MAN1PODS = ".join(" \\\n\t", sort keys %{$self->{MAN1PODS}})."
235 MAN3PODS = ".join(" \\\n\t", sort keys %{$self->{MAN3PODS}})."
239 INST_MAN1DIR INSTALLMAN1DIR MAN1EXT
240 INST_MAN3DIR INSTALLMAN3DIR MAN3EXT
242 next unless defined $self->{$tmp};
243 push @m, "$tmp = $self->{$tmp}\n";
251 .NO_CONFIG_REC: Makefile
252 } if $ENV{CLEARCASE_ROOT};
254 # why not q{} ? -- emacs
256 # work around a famous dec-osf make(1) feature(?):
259 .SUFFIXES: .xs .c .C .cpp .cxx .cc \$(OBJ_EXT)
261 # Nick wanted to get rid of .PRECIOUS. I don't remember why. I seem to
262 # recall, that some make implementations will delete the Makefile when we
263 # rebuild it. Because we call false(1) when we rebuild it. So make(1) is
264 # not completely wrong when it does so. Our milage may vary.
265 # .PRECIOUS: Makefile # seems to be not necessary anymore
267 .PHONY: all config static dynamic test linkext manifest
269 # Where is the Config information that we are using/depend on
270 CONFIGDEP = \$(PERL_ARCHLIB)\\Config.pm \$(PERL_INC)\\config.h
273 my @parentdir = split(/::/, $self->{PARENT_NAME});
275 # Where to put things:
276 INST_LIBDIR = }. File::Spec->catdir('$(INST_LIB)',@parentdir) .q{
277 INST_ARCHLIBDIR = }. File::Spec->catdir('$(INST_ARCHLIB)',@parentdir) .q{
279 INST_AUTODIR = }. File::Spec->catdir('$(INST_LIB)','auto','$(FULLEXT)') .q{
280 INST_ARCHAUTODIR = }. File::Spec->catdir('$(INST_ARCHLIB)','auto','$(FULLEXT)') .q{
283 if ($self->has_link_code()) {
285 INST_STATIC = $(INST_ARCHAUTODIR)\$(BASEEXT)$(LIB_EXT)
286 INST_DYNAMIC = $(INST_ARCHAUTODIR)\$(DLBASE).$(DLEXT)
287 INST_BOOT = $(INST_ARCHAUTODIR)\$(BASEEXT).bs
297 $tmp = $self->export_list;
301 $tmp = $self->perl_archive;
307 TO_INST_PM = }.join(" \\\n\t", sort keys %{$self->{PM}}).q{
309 PM_TO_BLIB = }.join(" \\\n\t", %{$self->{PM}}).q{
318 Defines how to produce the *.a (or equivalent) files.
324 # Come to think of it, if there are subdirs with linkcode, we still have no INST_STATIC
325 # return '' unless $self->needs_linking(); #might be because of a subdir
327 return '' unless $self->has_link_code;
331 $(INST_STATIC): $(OBJECT) $(MYEXTLIB) $(INST_ARCHAUTODIR)\.exists
334 # If this extension has its own library (eg SDBM_File)
335 # then copy that to $(INST_STATIC) and add $(OBJECT) into it.
336 push(@m, "\t$self->{CP} \$(MYEXTLIB) \$\@\n") if $self->{MYEXTLIB};
339 q{ $(AR) }.($BORLAND ? '$@ $(OBJECT:^"+")'
340 : ($GCC ? '-ru $@ $(OBJECT)'
341 : '-out:$@ $(OBJECT)')).q{
342 }.$self->{NOECHO}.q{echo "$(EXTRALIBS)" > $(INST_ARCHAUTODIR)\extralibs.ld
346 # Old mechanism - still available:
348 push @m, "\t$self->{NOECHO}".q{echo "$(EXTRALIBS)" >> $(PERL_SRC)\ext.libs}."\n\n"
349 if $self->{PERL_SRC};
351 push @m, $self->dir_target('$(INST_ARCHAUTODIR)');
357 Defines targets for bootstrap files.
362 my($self, %attribs) = @_;
365 ' unless $self->has_link_code();
368 BOOTSTRAP = '."$self->{BASEEXT}.bs".'
370 # As Mkbootstrap might not write a file (if none is required)
371 # we use touch to prevent make continually trying to remake it.
372 # The DynaLoader only reads a non-empty file.
373 $(BOOTSTRAP): '."$self->{MAKEFILE} $self->{BOOTDEP}".' $(INST_ARCHAUTODIR)\.exists
374 '.$self->{NOECHO}.'echo "Running Mkbootstrap for $(NAME) ($(BSLOADLIBS))"
375 '.$self->{NOECHO}.'$(PERLRUN) \
376 -MExtUtils::Mkbootstrap \
377 -e "Mkbootstrap(\'$(BASEEXT)\',\'$(BSLOADLIBS)\');"
378 '.$self->{NOECHO}.'$(TOUCH) $(BOOTSTRAP)
381 $(INST_BOOT): $(BOOTSTRAP) $(INST_ARCHAUTODIR)\.exists
382 '."$self->{NOECHO}$self->{RM_RF}".' $(INST_BOOT)
383 -'.$self->{CP}.' $(BOOTSTRAP) $(INST_BOOT)
388 =item dynamic_lib (o)
390 Defines how to produce the *.so (or equivalent) files.
395 my($self, %attribs) = @_;
396 return '' unless $self->needs_linking(); #might be because of a subdir
398 return '' unless $self->has_link_code;
400 my($otherldflags) = $attribs{OTHERLDFLAGS} || ($BORLAND ? 'c0d32.obj': '');
401 my($inst_dynamic_dep) = $attribs{INST_DYNAMIC_DEP} || "";
402 my($ldfrom) = '$(LDFROM)';
405 # one thing for GCC/Mingw32:
406 # we try to overcome non-relocateable-DLL problems by generating
407 # a (hopefully unique) image-base from the dll's name
410 my $dllname = $self->{BASEEXT} . "." . $self->{DLEXT};
411 $dllname =~ /(....)(.{0,4})/;
412 my $baseaddr = unpack("n", $1 ^ $2);
413 $otherldflags .= sprintf("-Wl,--image-base,0x%x0000 ", $baseaddr);
417 # This section creates the dynamically loadable $(INST_DYNAMIC)
418 # from $(OBJECT) and possibly $(MYEXTLIB).
419 OTHERLDFLAGS = '.$otherldflags.'
420 INST_DYNAMIC_DEP = '.$inst_dynamic_dep.'
422 $(INST_DYNAMIC): $(OBJECT) $(MYEXTLIB) $(BOOTSTRAP) $(INST_ARCHAUTODIR)\.exists $(EXPORT_LIST) $(PERL_ARCHIVE) $(INST_DYNAMIC_DEP)
426 q{ dlltool --def $(EXPORT_LIST) --output-exp dll.exp
427 $(LD) -o $@ -Wl,--base-file -Wl,dll.base $(LDDLFLAGS) }.$ldfrom.q{ $(OTHERLDFLAGS) $(MYEXTLIB) $(PERL_ARCHIVE) $(LDLOADLIBS) dll.exp
428 dlltool --def $(EXPORT_LIST) --base-file dll.base --output-exp dll.exp
429 $(LD) -o $@ $(LDDLFLAGS) }.$ldfrom.q{ $(OTHERLDFLAGS) $(MYEXTLIB) $(PERL_ARCHIVE) $(LDLOADLIBS) dll.exp });
432 q{ $(LD) $(LDDLFLAGS) $(OTHERLDFLAGS) }.$ldfrom.q{,$@,,}
433 .($DMAKE ? q{$(PERL_ARCHIVE:s,/,\,) $(LDLOADLIBS:s,/,\,) }
434 .q{$(MYEXTLIB:s,/,\,),$(EXPORT_LIST:s,/,\,)}
435 : q{$(subst /,\,$(PERL_ARCHIVE)) $(subst /,\,$(LDLOADLIBS)) }
436 .q{$(subst /,\,$(MYEXTLIB)),$(subst /,\,$(EXPORT_LIST))})
440 q{ $(LD) -out:$@ $(LDDLFLAGS) }.$ldfrom.q{ $(OTHERLDFLAGS) }
441 .q{$(MYEXTLIB) $(PERL_ARCHIVE) $(LDLOADLIBS) -def:$(EXPORT_LIST)});
447 push @m, $self->dir_target('$(INST_ARCHAUTODIR)');
454 my $s = $self->SUPER::clean(@_);
455 my $clean = $GCC ? 'dll.base dll.exp' : '*.pdb';
469 return '$(PERL_INC)\\'.$Config{'libperl'};
475 return "$self->{BASEEXT}.def";
480 No physical check on the filesystem, but a logical cleanup of a
481 path. On UNIX eliminated successive slashes and successive "/.".
486 my($self,$path) = @_;
487 $path =~ s/^([a-z]:)/\u$1/;
489 $path =~ s|(.)\\+|$1\\|g ; # xx////xx -> xx/xx
490 $path =~ s|(\\\.)+\\|\\|g ; # xx/././xx -> xx/xx
491 $path =~ s|^(\.\\)+|| unless $path eq ".\\"; # ./xx -> xx
493 unless $path =~ m#^([a-z]:)?\\#; # xx/ -> xx
494 $path .= '.' if $path =~ m#\\$#;
500 Takes one argument, a file name, and returns the file name, if the
501 argument is likely to be a perl script. On MM_Unix this is true for
502 any ordinary, readable file.
507 my($self,$file) = @_;
508 return $file if -r $file && -f _;
509 return "$file.pl" if -r "$file.pl" && -f _;
510 return "$file.bat" if -r "$file.bat" && -f _;
516 Defines target that copies all files in the hash PM to their
517 destination and autosplits them. See L<ExtUtils::Install/DESCRIPTION>
523 my($autodir) = File::Spec->catdir('$(INST_LIB)','auto');
525 pm_to_blib: $(TO_INST_PM)
526 }.$self->{NOECHO}.q{$(PERLRUNINST) -MExtUtils::Install \
528 ($NMAKE ? 'qw[ <<pmfiles.dat ],'
529 : $DMAKE ? 'qw[ $(mktmp,pmfiles.dat $(PM_TO_BLIB:s,\\,\\\\,)\n) ],'
530 : '{ qw[$(PM_TO_BLIB)] },'
531 ).q{'}.$autodir.q{','$(PM_FILTER)')"
535 } : '') . $self->{NOECHO}.q{$(TOUCH) $@
540 =item tool_autosplit (override)
542 Use Win32 quoting on command line.
547 my($self, %attribs) = @_;
549 $asl = "\$AutoSplit::Maxlen=$attribs{MAXLEN};" if $attribs{MAXLEN};
551 # Usage: $(AUTOSPLITFILE) FileToSplit AutoDirToSplitInto
552 AUTOSPLITFILE = $(PERLRUN) -MAutoSplit }.$asl.q{ -e "autosplit($$ARGV[0], $$ARGV[1], 0, 1, 1);"
556 =item tools_other (o)
560 Defines SHELL, LD, TOUCH, CP, MV, RM_F, RM_RF, CHMOD, UMASK_NULL in
561 the Makefile. Also defines the perl programs MKPATH,
562 WARN_IF_OLD_PACKLIST, MOD_INSTALL. DOC_INSTALL, and UNINSTALL.
569 my $bin_sh = $Config{sh} || 'cmd /c';
572 } unless $DMAKE; # dmake determines its own shell
574 for (qw/ CHMOD CP LD MV NOOP RM_F RM_RF TEST_F TOUCH UMASK_NULL DEV_NULL/ ) {
575 push @m, "$_ = $self->{$_}\n";
579 # The following is a portable way to say mkdir -p
580 # To see which directories are created, change the if 0 to if 1
581 MKPATH = $(PERLRUN) -MExtUtils::Command -e mkpath
583 # This helps us to minimize the effect of the .exists files A yet
584 # better solution would be to have a stable file in the perl
585 # distribution with a timestamp of zero. But this solution doesn't
586 # need any changes to the core distribution and works with older perls
587 EQUALIZE_TIMESTAMP = $(PERLRUN) -MExtUtils::Command -e eqtime
591 return join "", @m if $self->{PARENT};
594 # Here we warn users that an old packlist file was found somewhere,
595 # and that they should call some uninstall routine
596 WARN_IF_OLD_PACKLIST = $(PERL) -lwe "exit unless -f $$ARGV[0];" \\
597 -e "print 'WARNING: I have found an old package in';" \\
598 -e "print ' ', $$ARGV[0], '.';" \\
599 -e "print 'Please make sure the two installations are not conflicting';"
604 MOD_INSTALL = $(PERL) -I$(INST_LIB) -I$(PERL_LIB) -MExtUtils::Install \
605 -e "install({ @ARGV },'$(VERBINST)',0,'$(UNINST)');"
607 DOC_INSTALL = $(PERL) -e "$$\=\"\n\n\";" \
608 -e "print '=head2 ', scalar(localtime), ': C<', shift, '>', ' L<', $$arg=shift, '|', $$arg, '>';" \
609 -e "print '=over 4';" \
610 -e "while (defined($$key = shift) and defined($$val = shift)) { print '=item *';print 'C<', \"$$key: $$val\", '>'; }" \
613 UNINSTALL = $(PERL) -MExtUtils::Install \
614 -e "uninstall($$ARGV[0],1,1); print \"\nUninstall is deprecated. Please check the";" \
615 -e "print \" packlist above carefully.\n There may be errors. Remove the\";" \
616 -e "print \" appropriate files manually.\n Sorry for the inconveniences.\n\""
624 Defines suffix rules to go from XS to object files directly. This is
625 only intended for broken make implementations.
629 sub xs_o { # many makes are too dumb to use xs_c then c_o
634 =item top_targets (o)
636 Defines the targets all, subdirs, config, and O_FILES
641 # --- Target Sections ---
647 all :: pure_all manifypods
648 '.$self->{NOECHO}.'$(NOOP)
650 unless $self->{SKIPHASH}{'all'};
653 pure_all :: config pm_to_blib subdirs linkext
654 '.$self->{NOECHO}.'$(NOOP)
656 subdirs :: $(MYEXTLIB)
657 '.$self->{NOECHO}.'$(NOOP)
659 config :: '.$self->{MAKEFILE}.' $(INST_LIBDIR)\.exists
660 '.$self->{NOECHO}.'$(NOOP)
662 config :: $(INST_ARCHAUTODIR)\.exists
663 '.$self->{NOECHO}.'$(NOOP)
665 config :: $(INST_AUTODIR)\.exists
666 '.$self->{NOECHO}.'$(NOOP)
669 push @m, $self->dir_target(qw[$(INST_AUTODIR) $(INST_LIBDIR) $(INST_ARCHAUTODIR)]);
671 if (%{$self->{MAN1PODS}}) {
673 config :: \$(INST_MAN1DIR)\\.exists
674 $self->{NOECHO}\$(NOOP)
677 push @m, $self->dir_target(qw[$(INST_MAN1DIR)]);
679 if (%{$self->{MAN3PODS}}) {
681 config :: \$(INST_MAN3DIR)\\.exists
682 $self->{NOECHO}\$(NOOP)
685 push @m, $self->dir_target(qw[$(INST_MAN3DIR)]);
689 $(O_FILES): $(H_FILES)
690 ' if @{$self->{O_FILES} || []} && @{$self->{H} || []};
694 perldoc ExtUtils::MakeMaker
702 We don't want manpage process.
708 return "\nmanifypods :\n\t$self->{NOECHO}\$(NOOP)\n";
713 Same as MM_Unix version (changes command-line quoting).
722 $(PERLRUN) -MExtUtils::Manifest=maniread \\
723 -e "@all = keys %{ maniread() };" \\
724 -e "print(\"Executing $(CI) @all\n\"); system(\"$(CI) @all\");" \\
725 -e "print(\"Executing $(RCS_LABEL) ...\n\"); system(\"$(RCS_LABEL) @all\");"
732 Same as MM_Unix version (changes command-line quoting).
740 dist : $(DIST_DEFAULT)
741 }.$self->{NOECHO}.q{$(PERL) -le "print \"Warning: Makefile possibly out of date with $$vf\" if " \
742 -e "-e ($$vf=\"$(VERSION_FROM)\") and -M $$vf < -M \"}.$self->{MAKEFILE}.q{\";"
744 tardist : $(DISTVNAME).tar$(SUFFIX)
746 zipdist : $(DISTVNAME).zip
748 $(DISTVNAME).tar$(SUFFIX) : distdir
751 $(TAR) $(TARFLAGS) $(DISTVNAME).tar $(DISTVNAME)
752 $(RM_RF) $(DISTVNAME)
753 $(COMPRESS) $(DISTVNAME).tar
756 $(DISTVNAME).zip : distdir
758 $(ZIP) $(ZIPFLAGS) $(DISTVNAME).zip $(DISTVNAME)
759 $(RM_RF) $(DISTVNAME)
762 uutardist : $(DISTVNAME).tar$(SUFFIX)
763 uuencode $(DISTVNAME).tar$(SUFFIX) \\
764 $(DISTVNAME).tar$(SUFFIX) > \\
765 $(DISTVNAME).tar$(SUFFIX)_uu
769 $(SHAR) $(DISTVNAME) > $(DISTVNAME).shar
770 $(RM_RF) $(DISTVNAME)
778 Defines the string that is passed to recursive make calls in
785 return "PASTHRU = " . ($NMAKE ? "-nologo" : "");