d02e0e02b823172cfbef77333a8594576af70f95
[p5sagit/p5-mst-13.2.git] / lib / ExtUtils / MM_NW5.pm
1 package ExtUtils::MM_NW5;
2
3 =head1 NAME
4
5 ExtUtils::MM_NW5 - methods to override UN*X behaviour in ExtUtils::MakeMaker
6
7 =head1 SYNOPSIS
8
9  use ExtUtils::MM_NW5; # Done internally by ExtUtils::MakeMaker if needed
10
11 =head1 DESCRIPTION
12
13 See ExtUtils::MM_Unix for a documentation of the methods provided
14 there. This package overrides the implementation of these methods, not
15 the semantics.
16
17 =over
18
19 =cut 
20
21 use Config;
22 use File::Basename;
23 use vars qw(@ISA $VERSION);
24 $VERSION = '2.01_01';
25
26 require ExtUtils::MM_Win32;
27 @ISA = qw(ExtUtils::MM_Win32);
28
29 use ExtUtils::MakeMaker qw( &neatvalue );
30
31 $ENV{EMXSHELL} = 'sh'; # to run `commands`
32
33 $BORLAND = 1 if $Config{'cc'} =~ /^bcc/i;
34 $GCC     = 1 if $Config{'cc'} =~ /^gcc/i;
35 $DMAKE = 1 if $Config{'make'} =~ /^dmake/i;
36 $NMAKE = 1 if $Config{'make'} =~ /^nmake/i;
37 $PERLMAKE = 1 if $Config{'make'} =~ /^pmake/i;
38
39
40         
41 sub init_others
42 {
43  my ($self) = @_;
44  $self->SUPER::init_others(@_);
45
46  # incpath is copied to makefile var INCLUDE in constants sub, here just make it empty
47  my $libpth = $Config{'libpth'};
48  $libpth =~ s( )(;);
49  $self->{'LIBPTH'} = $libpth;
50  $self->{'BASE_IMPORT'} = $Config{'base_import'};
51  
52  # Additional import file specified from Makefile.pl
53  if($self->{'base_import'}) {
54         $self->{'BASE_IMPORT'} .= ', ' . $self->{'base_import'};
55  }
56  
57  $self->{'NLM_VERSION'} = $Config{'nlm_version'};
58  $self->{'MPKTOOL'}     = $Config{'mpktool'};
59  $self->{'TOOLPATH'}    = $Config{'toolpath'};
60 }
61
62
63 =item constants (o)
64
65 Initializes lots of constants and .SUFFIXES and .PHONY
66
67 =cut
68 # NetWare override
69 sub const_cccmd {
70     my($self,$libperl)=@_;
71     return $self->{CONST_CCCMD} if $self->{CONST_CCCMD};
72     return '' unless $self->needs_linking();
73     return $self->{CONST_CCCMD} = 
74         q{CCCMD = $(CC) $(CCFLAGS) $(INC) $(OPTIMIZE) \\
75         $(PERLTYPE) $(MPOLLUTE) -o $@ \\
76         -DVERSION=\"$(VERSION)\" -DXS_VERSION=\"$(XS_VERSION)\"};
77 }
78
79 sub constants {
80     my($self) = @_;
81     my(@m,$tmp);
82
83 # Added LIBPTH, BASE_IMPORT, ABSTRACT, NLM_VERSION BOOT_SYMBOL, NLM_SHORT_NAME
84 # for NETWARE
85
86     for $tmp (qw/
87
88               AR_STATIC_ARGS NAME DISTNAME NAME_SYM VERSION
89               VERSION_SYM XS_VERSION INST_BIN INST_LIB
90               INST_ARCHLIB INST_SCRIPT PREFIX  INSTALLDIRS
91               INSTALLPRIVLIB INSTALLARCHLIB INSTALLSITELIB
92               INSTALLSITEARCH INSTALLBIN INSTALLSCRIPT PERL_LIB
93               PERL_ARCHLIB SITELIBEXP SITEARCHEXP LIBPERL_A MYEXTLIB
94               FIRST_MAKEFILE MAKE_APERL_FILE PERLMAINCC PERL_SRC
95               PERL_INC PERL FULLPERL LIBPTH BASE_IMPORT PERLRUN FULLPERLRUN PERLRUNINST 
96               FULL_AR PERL_CORE FULLPERLRUNINST NLM_VERSION MPKTOOL TOOLPATH
97                   
98               / ) {
99         next unless defined $self->{$tmp};
100         push @m, "$tmp = $self->{$tmp}\n";
101     }
102
103         (my $boot = $self->{'NAME'}) =~ s/:/_/g;
104         $self->{'BOOT_SYMBOL'}=$boot;
105         push @m, "BOOT_SYMBOL = $self->{'BOOT_SYMBOL'}\n";
106
107         # If the final binary name is greater than 8 chars,
108         # truncate it here and rename it after creation
109         # otherwise, Watcom Linker fails
110         
111         if(length($self->{'BASEEXT'}) > 8) {
112                 $self->{'NLM_SHORT_NAME'} = substr($self->{'BASEEXT'},0,8);
113                 push @m, "NLM_SHORT_NAME = $self->{'NLM_SHORT_NAME'}\n";
114         }
115         
116     push @m, qq{
117 VERSION_MACRO = VERSION
118 DEFINE_VERSION = -D\$(VERSION_MACRO)=\\\"\$(VERSION)\\\"
119 XS_VERSION_MACRO = XS_VERSION
120 XS_DEFINE_VERSION = -D\$(XS_VERSION_MACRO)=\\\"\$(XS_VERSION)\\\"
121 };
122
123         # Get the include path and replace the spaces with ;
124         # Copy this to makefile as INCLUDE = d:\...;d:\;
125         (my $inc = $Config{'incpath'}) =~ s/([ ]*)-I/;/g;
126
127         # Get the additional include path and append to INCLUDE, keep it in
128         # INC will give problems during compilation, hence reset it after getting
129         # the value
130         $self->{'INC'} = '';
131         push @m, qq{
132 INCLUDE = $inc;
133 };
134
135 push @m, qq{
136 INCLUDE = $inc;
137 };
138         # Set the path to CodeWarrior binaries which might not have been set in
139         # any other place
140         push @m, qq{
141 PATH = \$(PATH);\$(TOOLPATH)
142 };
143
144     push @m, qq{
145 MAKEMAKER = $INC{'ExtUtils/MakeMaker.pm'}
146 MM_VERSION = $ExtUtils::MakeMaker::VERSION
147 };
148
149     push @m, q{
150 # FULLEXT = Pathname for extension directory (eg Foo/Bar/Oracle).
151 # BASEEXT = Basename part of FULLEXT. May be just equal FULLEXT. (eg Oracle)
152 # PARENT_NAME = NAME without BASEEXT and no trailing :: (eg Foo::Bar)
153 # DLBASE  = Basename part of dynamic library. May be just equal BASEEXT.
154 };
155
156     for $tmp (qw/
157               FULLEXT BASEEXT PARENT_NAME DLBASE VERSION_FROM INC DEFINE OBJECT
158               LDFROM LINKTYPE
159               / ) {
160         next unless defined $self->{$tmp};
161         push @m, "$tmp = $self->{$tmp}\n";
162     }
163
164     push @m, "
165 # Handy lists of source code files:
166 XS_FILES= ".join(" \\\n\t", sort keys %{$self->{XS}})."
167 C_FILES = ".join(" \\\n\t", @{$self->{C}})."
168 O_FILES = ".join(" \\\n\t", @{$self->{O_FILES}})."
169 H_FILES = ".join(" \\\n\t", @{$self->{H}})."
170 MAN1PODS = ".join(" \\\n\t", sort keys %{$self->{MAN1PODS}})."
171 MAN3PODS = ".join(" \\\n\t", sort keys %{$self->{MAN3PODS}})."
172 ";
173
174     for $tmp (qw/
175               INST_MAN1DIR        INSTALLMAN1DIR MAN1EXT
176               INST_MAN3DIR        INSTALLMAN3DIR MAN3EXT
177               /) {
178         next unless defined $self->{$tmp};
179         push @m, "$tmp = $self->{$tmp}\n";
180     }
181
182     push @m, qq{
183 .USESHELL :
184 } if $DMAKE;
185
186     push @m, q{
187 .NO_CONFIG_REC: Makefile
188 } if $ENV{CLEARCASE_ROOT};
189
190     # why not q{} ? -- emacs
191     push @m, qq{
192 # work around a famous dec-osf make(1) feature(?):
193 makemakerdflt: all
194
195 .SUFFIXES: .xs .c .C .cpp .cxx .cc \$(OBJ_EXT)
196
197 # Nick wanted to get rid of .PRECIOUS. I don't remember why. I seem to recall, that
198 # some make implementations will delete the Makefile when we rebuild it. Because
199 # we call false(1) when we rebuild it. So make(1) is not completely wrong when it
200 # does so. Our milage may vary.
201 # .PRECIOUS: Makefile    # seems to be not necessary anymore
202
203 .PHONY: all config static dynamic test linkext manifest
204
205 # Where is the Config information that we are using/depend on
206 CONFIGDEP = \$(PERL_ARCHLIB)\\Config.pm \$(PERL_INC)\\config.h
207 };
208
209     my @parentdir = split(/::/, $self->{PARENT_NAME});
210     push @m, q{
211 # Where to put things:
212 INST_LIBDIR      = }. File::Spec->catdir('$(INST_LIB)',@parentdir)        .q{
213 INST_ARCHLIBDIR  = }. File::Spec->catdir('$(INST_ARCHLIB)',@parentdir)    .q{
214
215 INST_AUTODIR     = }. File::Spec->catdir('$(INST_LIB)','auto','$(FULLEXT)')       .q{
216 INST_ARCHAUTODIR = }. File::Spec->catdir('$(INST_ARCHLIB)','auto','$(FULLEXT)')   .q{
217 };
218
219     if ($self->has_link_code()) {
220         push @m, '
221 INST_STATIC  = $(INST_ARCHAUTODIR)\$(BASEEXT)$(LIB_EXT)
222 INST_DYNAMIC = $(INST_ARCHAUTODIR)\$(DLBASE).$(DLEXT)
223 INST_BOOT    = $(INST_ARCHAUTODIR)\$(BASEEXT).bs
224 ';
225     } else {
226         push @m, '
227 INST_STATIC  =
228 INST_DYNAMIC =
229 INST_BOOT    =
230 ';
231     }
232
233     $tmp = $self->export_list;
234     push @m, "
235 EXPORT_LIST = $tmp
236 ";
237     $tmp = $self->perl_archive;
238     push @m, "
239 PERL_ARCHIVE = $tmp
240 ";
241
242 #    push @m, q{
243 #INST_PM = }.join(" \\\n\t", sort values %{$self->{PM}}).q{
244 #
245 #PM_TO_BLIB = }.join(" \\\n\t", %{$self->{PM}}).q{
246 #};
247
248     push @m, q{
249 TO_INST_PM = }.join(" \\\n\t", sort keys %{$self->{PM}}).q{
250
251 PM_TO_BLIB = }.join(" \\\n\t", %{$self->{PM}}).q{
252 };
253
254     join('',@m);
255 }
256
257 sub static_lib {
258     my($self) = @_;
259 # Come to think of it, if there are subdirs with linkcode, we still have no INST_STATIC
260 #    return '' unless $self->needs_linking(); #might be because of a subdir
261
262     return '' unless $self->has_link_code;
263
264     my(@m);
265     push(@m, <<'END');
266 $(INST_STATIC): $(OBJECT) $(MYEXTLIB) $(INST_ARCHAUTODIR)\.exists
267         $(RM_RF) $@
268 END
269
270     # If this extension has it's own library (eg SDBM_File)
271     # then copy that to $(INST_STATIC) and add $(OBJECT) into it.
272     push(@m, "\t$self->{CP} \$(MYEXTLIB) \$\@\n") if $self->{MYEXTLIB};
273
274     push @m,
275 q{      $(AR) }.($BORLAND ? '$@ $(OBJECT:^"+")'
276                           : ($GCC ? '-ru $@ $(OBJECT)'
277                                   : '-type library -o $@ $(OBJECT)')).q{
278         }.$self->{NOECHO}.q{echo "$(EXTRALIBS)" > $(INST_ARCHAUTODIR)\extralibs.ld
279         $(CHMOD) 755 $@
280 };
281 # CW change ( -type library ... )
282 # Old mechanism - still available:
283
284     push @m, "\t$self->{NOECHO}".q{echo "$(EXTRALIBS)" >> $(PERL_SRC)\ext.libs}."\n\n"
285         if $self->{PERL_SRC};
286
287     push @m, $self->dir_target('$(INST_ARCHAUTODIR)');
288     join('', "\n",@m);
289 }
290
291
292 =item dynamic_lib (o)
293
294 Defines how to produce the *.so (or equivalent) files.
295
296 =cut
297
298 sub dynamic_lib {
299         my($self, %attribs) = @_;
300     return '' unless $self->needs_linking(); #might be because of a subdir
301
302     return '' unless $self->has_link_code;
303
304     my($otherldflags) = $attribs{OTHERLDFLAGS} || ($BORLAND ? 'c0d32.obj': '');
305     my($inst_dynamic_dep) = $attribs{INST_DYNAMIC_DEP} || "";
306     my($ldfrom) = '$(LDFROM)';
307     my(@m);
308         (my $boot = $self->{NAME}) =~ s/:/_/g;
309         my ($mpk);
310     push(@m,'
311 # This section creates the dynamically loadable $(INST_DYNAMIC)
312 # from $(OBJECT) and possibly $(MYEXTLIB).
313 OTHERLDFLAGS = '.$otherldflags.'
314 INST_DYNAMIC_DEP = '.$inst_dynamic_dep.'
315
316 $(INST_DYNAMIC): $(OBJECT) $(MYEXTLIB) $(BOOTSTRAP)
317 ');
318 #      push(@m,
319 #      q{       $(LD) -out:$@ $(LDDLFLAGS) }.$ldfrom.q{ $(OTHERLDFLAGS) }
320 #      .q{$(MYEXTLIB) $(PERL_ARCHIVE) $(LDLOADLIBS) -def:$(EXPORT_LIST)});
321
322                 # Create xdc data for an MT safe NLM in case of mpk build
323 #       if ( scalar(keys %XS) == 0 ) { return; }
324                 push(@m, 
325                 q{      @echo Export boot_$(BOOT_SYMBOL) > $(BASEEXT).def
326 }); 
327         push(@m, 
328     q{  @echo $(BASE_IMPORT) >> $(BASEEXT).def 
329 });
330         push(@m, 
331     q{  @echo Import @$(PERL_INC)\perl.imp >> $(BASEEXT).def 
332 });  
333
334                 if ( $self->{CCFLAGS} =~ m/ -DMPK_ON /) {
335                         $mpk=1;
336                         push @m, '      $(MPKTOOL) $(XDCFLAGS) $(BASEEXT).xdc
337 ';
338                         push @m, '      @echo xdcdata $(BASEEXT).xdc >> $(BASEEXT).def
339 ';
340                 } else {
341                         $mpk=0;
342                 }
343                 
344                 push(@m,
345                         q{      $(LD) $(LDFLAGS) $(OBJECT:.obj=.obj) } 
346                         );
347
348                 push(@m,
349                         q{      -desc "Perl 5.7.3 Extension ($(BASEEXT))        XS_VERSION: $(XS_VERSION)" -nlmversion $(NLM_VERSION) } 
350                         );
351                         
352                 # Taking care of long names like FileHandle, ByteLoader, SDBM_File etc
353                 if($self->{NLM_SHORT_NAME}) {
354                         # In case of nlms with names exceeding 8 chars, build nlm in the 
355                         # current dir, rename and move to auto\lib.  If we create in auto\lib
356                         # in the first place, we can't rename afterwards.
357                         push(@m,
358                                 q{ -o $(NLM_SHORT_NAME).$(DLEXT)}
359                                 );
360                 } else {
361                         push(@m,
362                                 q{ -o $(INST_AUTODIR)\\$(BASEEXT).$(DLEXT)}
363                                 );
364                 }
365                 # Add additional lib files if any (SDBM_File)
366                 if($self->{MYEXTLIB}) {
367                         push(@m,
368                                 q{ $(MYEXTLIB) }
369                                 );
370                 }
371
372 #For now lets comment all the Watcom lib calls
373 #q{ LibPath $(LIBPTH) Library plib3s.lib Library math3s.lib Library clib3s.lib Library emu387.lib Library $(PERL_ARCHIVE) Library $(PERL_INC)\Main.lib}
374         
375        
376                 push(@m,
377                                 q{ $(PERL_INC)\Main.lib}
378                            .q{ -commandfile $(BASEEXT).def }
379                         );
380
381                 # If it is having a short name, rename it 
382                 if($self->{NLM_SHORT_NAME}) {
383                         push @m, '
384  if exist $(INST_AUTODIR)\\$(BASEEXT).$(DLEXT) del $(INST_AUTODIR)\\$(BASEEXT).$(DLEXT)';
385                         push @m, '
386  rename $(NLM_SHORT_NAME).$(DLEXT) $(BASEEXT).$(DLEXT)';
387                         push @m, '
388  move $(BASEEXT).$(DLEXT) $(INST_AUTODIR)';
389                 }
390
391     push @m, '
392         $(CHMOD) 755 $@
393 ';
394
395     push @m, $self->dir_target('$(INST_ARCHAUTODIR)');
396    join('',@m);
397 }
398
399
400 1;
401 __END__
402
403 =back
404
405 =cut 
406