1 package ExtUtils::MM_Win32;
8 ExtUtils::MM_Win32 - methods to override UN*X behaviour in ExtUtils::MakeMaker
12 use ExtUtils::MM_Win32; # Done internally by ExtUtils::MakeMaker if needed
16 See ExtUtils::MM_Unix for a documentation of the methods provided
17 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);
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;
42 =head2 Overridden methods
51 my($self,%attribs) = @_;
53 my($funcs) = $attribs{DL_FUNCS} || $self->{DL_FUNCS} || {};
54 my($vars) = $attribs{DL_VARS} || $self->{DL_VARS} || [];
55 my($funclist) = $attribs{FUNCLIST} || $self->{FUNCLIST} || [];
56 my($imports) = $attribs{IMPORTS} || $self->{IMPORTS} || {};
59 if (not $self->{SKIPHASH}{'dynamic'}) {
61 $self->{BASEEXT}.def: Makefile.PL
63 q! $(PERLRUN) -MExtUtils::Mksymlists \\
64 -e "Mksymlists('NAME'=>\"!, $self->{NAME},
65 q!\", 'DLBASE' => '!,$self->{DLBASE},
66 # The above two lines quoted differently to work around
67 # a bug in the 4DOS/4NT command line interpreter. The visible
68 # result of the bug was files named q('extension_name',) *with the
69 # single quotes and the comma* in the extension build directories.
70 q!', 'DL_FUNCS' => !,neatvalue($funcs),
71 q!, 'FUNCLIST' => !,neatvalue($funclist),
72 q!, 'IMPORTS' => !,neatvalue($imports),
73 q!, 'DL_VARS' => !, neatvalue($vars), q!);"
79 =item replace_manpage_separator
81 Changes the path separator with .
85 sub replace_manpage_separator {
92 =item B<maybe_command>
94 Since Windows has nothing as simple as an executable bit, we check the
97 The PATHEXT env variable will be used to get a list of extensions that
98 might indicate a command, otherwise .com, .exe, .bat and .cmd will be
104 my($self,$file) = @_;
105 my @e = exists($ENV{'PATHEXT'})
106 ? split(/;/, $ENV{PATHEXT})
107 : qw(.com .exe .bat .cmd);
109 for (@e) { $e .= "\Q$_\E|" }
111 # see if file ends in one of the known extensions
112 if ($file =~ /($e)$/i) {
113 return $file if -e $file;
117 return "$file$_" if -e "$file$_";
126 The Win9x shell does not expand globs and I'll play it safe and assume
127 other Windows variants don't either.
129 So we do it for them.
134 return join(' ', <t\\*.t>);
138 =item B<init_DIRFILESEP>
144 sub init_DIRFILESEP {
147 # The ^ makes sure its not interpreted as an escape in nmake
148 $self->{DIRFILESEP} = $NMAKE ? '^\\' :
155 Override some of the Unix specific commands with portable
156 ExtUtils::Command ones.
158 Also provide defaults for LD and AR in case the %Config values aren't
161 LDLOADLIBS's default is changed to $Config{libs}.
163 Adjustments are made for Borland's quirks needing -L to come first.
170 # Used in favor of echo because echo won't strip quotes. :(
171 $self->{ECHO} ||= $self->oneliner('print qq{@ARGV}', ['-l']);
172 $self->{ECHO_N} ||= $self->oneliner('print qq{@ARGV}');
174 $self->{TOUCH} ||= '$(PERLRUN) -MExtUtils::Command -e touch';
175 $self->{CHMOD} ||= '$(PERLRUN) -MExtUtils::Command -e chmod';
176 $self->{CP} ||= '$(PERLRUN) -MExtUtils::Command -e cp';
177 $self->{RM_F} ||= '$(PERLRUN) -MExtUtils::Command -e rm_f';
178 $self->{RM_RF} ||= '$(PERLRUN) -MExtUtils::Command -e rm_rf';
179 $self->{MV} ||= '$(PERLRUN) -MExtUtils::Command -e mv';
180 $self->{NOOP} ||= 'rem';
181 $self->{TEST_F} ||= '$(PERLRUN) -MExtUtils::Command -e test_f';
182 $self->{DEV_NULL} ||= '> NUL';
184 # technically speaking, these should be in init_main()
185 $self->{LD} ||= $Config{ld} || 'link';
186 $self->{AR} ||= $Config{ar} || 'lib';
188 $self->SUPER::init_others;
190 # Setting SHELL from $Config{sh} can break dmake. Its ok without it.
191 delete $self->{SHELL};
193 $self->{LDLOADLIBS} ||= $Config{libs};
194 # -Lfoo must come first for Borland, so we put it in LDDLFLAGS
196 my $libs = $self->{LDLOADLIBS};
198 while ($libs =~ s/(?:^|\s)(("?)-L.+?\2)(?:\s|$)/ /) {
199 $libpath .= ' ' if length $libpath;
202 $self->{LDLOADLIBS} = $libs;
203 $self->{LDDLFLAGS} ||= $Config{lddlflags};
204 $self->{LDDLFLAGS} .= " $libpath";
211 =item init_platform (o)
213 Add MM_Win32_VERSION.
215 =item platform_constants (o)
222 $self->{MM_Win32_VERSION} = $VERSION;
225 sub platform_constants {
229 foreach my $macro (qw(MM_Win32_VERSION))
231 next unless defined $self->{$macro};
232 $make_frag .= "$macro = $self->{$macro}\n";
239 =item special_targets (o)
241 Add .USESHELL target for dmake.
245 sub special_targets {
248 my $make_frag = $self->SUPER::special_targets;
250 $make_frag .= <<'MAKE_FRAG' if $DMAKE;
260 Changes how to run the linker.
262 The rest is duplicate code from MM_Unix. Should move the linker code
269 return '' unless $self->has_link_code;
273 $(INST_STATIC): $(OBJECT) $(MYEXTLIB) $(INST_ARCHAUTODIR)$(DIRFILESEP).exists
277 # If this extension has its own library (eg SDBM_File)
278 # then copy that to $(INST_STATIC) and add $(OBJECT) into it.
279 push @m, <<'MAKE_FRAG' if $self->{MYEXTLIB};
284 q{ $(AR) }.($BORLAND ? '$@ $(OBJECT:^"+")'
285 : ($GCC ? '-ru $@ $(OBJECT)'
286 : '-out:$@ $(OBJECT)')).q{
287 $(CHMOD) $(PERM_RWX) $@
288 $(NOECHO) $(ECHO) "$(EXTRALIBS)" > $(INST_ARCHAUTODIR)\extralibs.ld
291 # Old mechanism - still available:
292 push @m, <<'MAKE_FRAG' if $self->{PERL_SRC} && $self->{EXTRALIBS};
293 $(NOECHO) $(ECHO) "$(EXTRALIBS)" >> $(PERL_SRC)\ext.libs
296 push @m, "\n", $self->dir_target('$(INST_ARCHAUTODIR)');
301 =item dynamic_lib (o)
303 Complicated stuff for Win32 that I don't understand. :(
308 my($self, %attribs) = @_;
309 return '' unless $self->needs_linking(); #might be because of a subdir
311 return '' unless $self->has_link_code;
313 my($otherldflags) = $attribs{OTHERLDFLAGS} || ($BORLAND ? 'c0d32.obj': '');
314 my($inst_dynamic_dep) = $attribs{INST_DYNAMIC_DEP} || "";
315 my($ldfrom) = '$(LDFROM)';
318 # one thing for GCC/Mingw32:
319 # we try to overcome non-relocateable-DLL problems by generating
320 # a (hopefully unique) image-base from the dll's name
323 my $dllname = $self->{BASEEXT} . "." . $self->{DLEXT};
324 $dllname =~ /(....)(.{0,4})/;
325 my $baseaddr = unpack("n", $1 ^ $2);
326 $otherldflags .= sprintf("-Wl,--image-base,0x%x0000 ", $baseaddr);
330 # This section creates the dynamically loadable $(INST_DYNAMIC)
331 # from $(OBJECT) and possibly $(MYEXTLIB).
332 OTHERLDFLAGS = '.$otherldflags.'
333 INST_DYNAMIC_DEP = '.$inst_dynamic_dep.'
335 $(INST_DYNAMIC): $(OBJECT) $(MYEXTLIB) $(BOOTSTRAP) $(INST_ARCHAUTODIR)$(DIRFILESEP).exists $(EXPORT_LIST) $(PERL_ARCHIVE) $(INST_DYNAMIC_DEP)
339 q{ dlltool --def $(EXPORT_LIST) --output-exp dll.exp
340 $(LD) -o $@ -Wl,--base-file -Wl,dll.base $(LDDLFLAGS) }.$ldfrom.q{ $(OTHERLDFLAGS) $(MYEXTLIB) $(PERL_ARCHIVE) $(LDLOADLIBS) dll.exp
341 dlltool --def $(EXPORT_LIST) --base-file dll.base --output-exp dll.exp
342 $(LD) -o $@ $(LDDLFLAGS) }.$ldfrom.q{ $(OTHERLDFLAGS) $(MYEXTLIB) $(PERL_ARCHIVE) $(LDLOADLIBS) dll.exp });
345 q{ $(LD) $(LDDLFLAGS) $(OTHERLDFLAGS) }.$ldfrom.q{,$@,,}
346 .($DMAKE ? q{$(PERL_ARCHIVE:s,/,\,) $(LDLOADLIBS:s,/,\,) }
347 .q{$(MYEXTLIB:s,/,\,),$(EXPORT_LIST:s,/,\,)}
348 : q{$(subst /,\,$(PERL_ARCHIVE)) $(subst /,\,$(LDLOADLIBS)) }
349 .q{$(subst /,\,$(MYEXTLIB)),$(subst /,\,$(EXPORT_LIST))})
353 q{ $(LD) -out:$@ $(LDDLFLAGS) }.$ldfrom.q{ $(OTHERLDFLAGS) }
354 .q{$(MYEXTLIB) $(PERL_ARCHIVE) $(LDLOADLIBS) -def:$(EXPORT_LIST)});
357 $(CHMOD) $(PERM_RWX) $@
360 push @m, $self->dir_target('$(INST_ARCHAUTODIR)');
366 Clean out some extra dll.{base,exp} files which might be generated by
367 gcc. Otherwise, take out all *.pdb files.
374 my $s = $self->SUPER::clean(@_);
375 my $clean = $GCC ? 'dll.base dll.exp' : '*.pdb';
391 $self->{PERL_ARCHIVE} = "\$(PERL_INC)\\$Config{libperl}";
392 $self->{PERL_ARCHIVE_AFTER} = '';
393 $self->{EXPORT_LIST} = '$(BASEEXT).def';
399 Checks for the perl program under several common perl extensions.
404 my($self,$file) = @_;
405 return $file if -r $file && -f _;
406 return "$file.pl" if -r "$file.pl" && -f _;
407 return "$file.plx" if -r "$file.plx" && -f _;
408 return "$file.bat" if -r "$file.bat" && -f _;
415 This target is stubbed out. Not sure why.
426 All we send is -nologo to nmake to prevent it from printing its damned
433 return "PASTHRU = " . ($NMAKE ? "-nologo" : "");
439 These are based on what command.com does on Win98. They may be wrong
440 for other Windows shells, I don't know.
445 my($self, $cmd, $switches) = @_;
446 $switches = [] unless defined $switches;
448 # Strip leading and trailing newlines
452 $cmd = $self->quote_literal($cmd);
453 $cmd = $self->escape_newlines($cmd);
455 $switches = join ' ', @$switches;
457 return qq{\$(PERLRUN) $switches -e $cmd};
462 my($self, $text) = @_;
464 # I don't know if this is correct, but it seems to work on
465 # Win98's command.com
468 # dmake eats '{' inside double quotes and leaves alone { outside double
469 # quotes; however it transforms {{ into { either inside and outside double
470 # quotes. It also translates }} into }. The escaping below is not
481 sub escape_newlines {
482 my($self, $text) = @_;
485 $text =~ s{\n}{\\\n}g;
493 Using 31K, a safe number gotten from Windows 2000.
500 return $self->{_MAX_EXEC_LEN} ||= 31 * 1024;