Commit | Line | Data |
2986a63f |
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 | |
3e9ffe50 |
21 | use strict; |
2986a63f |
22 | use Config; |
2986a63f |
23 | use File::Basename; |
f582e489 |
24 | |
f6d6199c |
25 | use vars qw(@ISA $VERSION); |
69ff8adf |
26 | $VERSION = '2.05'; |
2986a63f |
27 | |
f6d6199c |
28 | require ExtUtils::MM_Win32; |
29 | @ISA = qw(ExtUtils::MM_Win32); |
2986a63f |
30 | |
f6d6199c |
31 | use ExtUtils::MakeMaker qw( &neatvalue ); |
2986a63f |
32 | |
f6d6199c |
33 | $ENV{EMXSHELL} = 'sh'; # to run `commands` |
2986a63f |
34 | |
f582e489 |
35 | my $BORLAND = 1 if $Config{'cc'} =~ /^bcc/i; |
36 | my $GCC = 1 if $Config{'cc'} =~ /^gcc/i; |
37 | my $DMAKE = 1 if $Config{'make'} =~ /^dmake/i; |
2986a63f |
38 | |
2986a63f |
39 | |
f582e489 |
40 | sub init_others { |
41 | my ($self) = @_; |
42 | $self->SUPER::init_others(@_); |
2986a63f |
43 | |
f582e489 |
44 | # incpath is copied to makefile var INCLUDE in constants sub, here just |
45 | # make it empty |
46 | my $libpth = $Config{'libpth'}; |
47 | $libpth =~ s( )(;); |
48 | $self->{'LIBPTH'} = $libpth; |
49 | $self->{'BASE_IMPORT'} = $Config{'base_import'}; |
2986a63f |
50 | |
f582e489 |
51 | # Additional import file specified from Makefile.pl |
52 | if($self->{'base_import'}) { |
53 | $self->{'BASE_IMPORT'} .= ', ' . $self->{'base_import'}; |
54 | } |
2986a63f |
55 | |
f582e489 |
56 | $self->{'NLM_VERSION'} = $Config{'nlm_version'}; |
57 | $self->{'MPKTOOL'} = $Config{'mpktool'}; |
58 | $self->{'TOOLPATH'} = $Config{'toolpath'}; |
2986a63f |
59 | } |
60 | |
61 | |
62 | =item constants (o) |
63 | |
64 | Initializes lots of constants and .SUFFIXES and .PHONY |
65 | |
66 | =cut |
f582e489 |
67 | |
2986a63f |
68 | sub const_cccmd { |
69 | my($self,$libperl)=@_; |
70 | return $self->{CONST_CCCMD} if $self->{CONST_CCCMD}; |
71 | return '' unless $self->needs_linking(); |
f582e489 |
72 | return $self->{CONST_CCCMD} = <<'MAKE_FRAG'; |
73 | CCCMD = $(CC) $(CCFLAGS) $(INC) $(OPTIMIZE) \ |
74 | $(PERLTYPE) $(MPOLLUTE) -o $@ \ |
57b1a898 |
75 | -DVERSION=\"$(VERSION)\" -DXS_VERSION=\"$(XS_VERSION)\" |
f582e489 |
76 | MAKE_FRAG |
77 | |
2986a63f |
78 | } |
79 | |
80 | sub constants { |
81 | my($self) = @_; |
82 | my(@m,$tmp); |
83 | |
84 | # Added LIBPTH, BASE_IMPORT, ABSTRACT, NLM_VERSION BOOT_SYMBOL, NLM_SHORT_NAME |
85 | # for NETWARE |
86 | |
87 | for $tmp (qw/ |
88 | |
89 | AR_STATIC_ARGS NAME DISTNAME NAME_SYM VERSION |
e0678a30 |
90 | VERSION_SYM XS_VERSION INST_BIN INST_LIB |
2986a63f |
91 | INST_ARCHLIB INST_SCRIPT PREFIX INSTALLDIRS |
92 | INSTALLPRIVLIB INSTALLARCHLIB INSTALLSITELIB |
93 | INSTALLSITEARCH INSTALLBIN INSTALLSCRIPT PERL_LIB |
94 | PERL_ARCHLIB SITELIBEXP SITEARCHEXP LIBPERL_A MYEXTLIB |
95 | FIRST_MAKEFILE MAKE_APERL_FILE PERLMAINCC PERL_SRC |
f582e489 |
96 | PERL_INC PERL FULLPERL LIBPTH BASE_IMPORT PERLRUN |
97 | FULLPERLRUN PERLRUNINST FULLPERLRUNINST |
98 | FULL_AR PERL_CORE NLM_VERSION MPKTOOL TOOLPATH |
99 | |
2986a63f |
100 | / ) { |
101 | next unless defined $self->{$tmp}; |
102 | push @m, "$tmp = $self->{$tmp}\n"; |
103 | } |
104 | |
f582e489 |
105 | (my $boot = $self->{'NAME'}) =~ s/:/_/g; |
106 | $self->{'BOOT_SYMBOL'}=$boot; |
107 | push @m, "BOOT_SYMBOL = $self->{'BOOT_SYMBOL'}\n"; |
108 | |
109 | # If the final binary name is greater than 8 chars, |
f355267c |
110 | # truncate it here. |
f582e489 |
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 | |
2986a63f |
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 | |
f582e489 |
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; |
2986a63f |
126 | |
1a95e36d |
127 | # Get the additional include path from the user through the command prompt |
128 | # and append to INCLUDE |
129 | # $self->{INC} = ''; |
130 | push @m, "INC = $self->{'INC'}\n"; |
3c7fc81c |
131 | |
f582e489 |
132 | push @m, qq{ |
011f1a1a |
133 | INCLUDE = $inc; |
134 | }; |
f582e489 |
135 | |
136 | # Set the path to CodeWarrior binaries which might not have been set in |
137 | # any other place |
138 | push @m, qq{ |
2986a63f |
139 | PATH = \$(PATH);\$(TOOLPATH) |
140 | }; |
141 | |
142 | push @m, qq{ |
f6d6199c |
143 | MAKEMAKER = $INC{'ExtUtils/MakeMaker.pm'} |
2986a63f |
144 | MM_VERSION = $ExtUtils::MakeMaker::VERSION |
145 | }; |
146 | |
147 | push @m, q{ |
148 | # FULLEXT = Pathname for extension directory (eg Foo/Bar/Oracle). |
149 | # BASEEXT = Basename part of FULLEXT. May be just equal FULLEXT. (eg Oracle) |
2986a63f |
150 | # PARENT_NAME = NAME without BASEEXT and no trailing :: (eg Foo::Bar) |
151 | # DLBASE = Basename part of dynamic library. May be just equal BASEEXT. |
152 | }; |
153 | |
154 | for $tmp (qw/ |
155 | FULLEXT BASEEXT PARENT_NAME DLBASE VERSION_FROM INC DEFINE OBJECT |
156 | LDFROM LINKTYPE |
157 | / ) { |
158 | next unless defined $self->{$tmp}; |
159 | push @m, "$tmp = $self->{$tmp}\n"; |
160 | } |
161 | |
162 | push @m, " |
163 | # Handy lists of source code files: |
164 | XS_FILES= ".join(" \\\n\t", sort keys %{$self->{XS}})." |
165 | C_FILES = ".join(" \\\n\t", @{$self->{C}})." |
166 | O_FILES = ".join(" \\\n\t", @{$self->{O_FILES}})." |
167 | H_FILES = ".join(" \\\n\t", @{$self->{H}})." |
2986a63f |
168 | MAN1PODS = ".join(" \\\n\t", sort keys %{$self->{MAN1PODS}})." |
169 | MAN3PODS = ".join(" \\\n\t", sort keys %{$self->{MAN3PODS}})." |
170 | "; |
171 | |
172 | for $tmp (qw/ |
2986a63f |
173 | INST_MAN1DIR INSTALLMAN1DIR MAN1EXT |
174 | INST_MAN3DIR INSTALLMAN3DIR MAN3EXT |
175 | /) { |
176 | next unless defined $self->{$tmp}; |
177 | push @m, "$tmp = $self->{$tmp}\n"; |
178 | } |
179 | |
180 | push @m, qq{ |
181 | .USESHELL : |
182 | } if $DMAKE; |
183 | |
184 | push @m, q{ |
185 | .NO_CONFIG_REC: Makefile |
186 | } if $ENV{CLEARCASE_ROOT}; |
187 | |
188 | # why not q{} ? -- emacs |
189 | push @m, qq{ |
190 | # work around a famous dec-osf make(1) feature(?): |
191 | makemakerdflt: all |
192 | |
193 | .SUFFIXES: .xs .c .C .cpp .cxx .cc \$(OBJ_EXT) |
194 | |
2986a63f |
195 | .PHONY: all config static dynamic test linkext manifest |
196 | |
197 | # Where is the Config information that we are using/depend on |
198 | CONFIGDEP = \$(PERL_ARCHLIB)\\Config.pm \$(PERL_INC)\\config.h |
199 | }; |
200 | |
201 | my @parentdir = split(/::/, $self->{PARENT_NAME}); |
202 | push @m, q{ |
203 | # Where to put things: |
ecf68df6 |
204 | INST_LIBDIR = }. File::Spec->catdir('$(INST_LIB)',@parentdir) .q{ |
205 | INST_ARCHLIBDIR = }. File::Spec->catdir('$(INST_ARCHLIB)',@parentdir) .q{ |
2986a63f |
206 | |
ecf68df6 |
207 | INST_AUTODIR = }. File::Spec->catdir('$(INST_LIB)','auto','$(FULLEXT)') .q{ |
208 | INST_ARCHAUTODIR = }. File::Spec->catdir('$(INST_ARCHLIB)','auto','$(FULLEXT)') .q{ |
2986a63f |
209 | }; |
210 | |
211 | if ($self->has_link_code()) { |
212 | push @m, ' |
213 | INST_STATIC = $(INST_ARCHAUTODIR)\$(BASEEXT)$(LIB_EXT) |
214 | INST_DYNAMIC = $(INST_ARCHAUTODIR)\$(DLBASE).$(DLEXT) |
215 | INST_BOOT = $(INST_ARCHAUTODIR)\$(BASEEXT).bs |
216 | '; |
217 | } else { |
218 | push @m, ' |
219 | INST_STATIC = |
220 | INST_DYNAMIC = |
221 | INST_BOOT = |
222 | '; |
223 | } |
224 | |
225 | $tmp = $self->export_list; |
226 | push @m, " |
227 | EXPORT_LIST = $tmp |
228 | "; |
229 | $tmp = $self->perl_archive; |
230 | push @m, " |
231 | PERL_ARCHIVE = $tmp |
232 | "; |
233 | |
2986a63f |
234 | push @m, q{ |
235 | TO_INST_PM = }.join(" \\\n\t", sort keys %{$self->{PM}}).q{ |
236 | |
237 | PM_TO_BLIB = }.join(" \\\n\t", %{$self->{PM}}).q{ |
238 | }; |
239 | |
240 | join('',@m); |
241 | } |
242 | |
f582e489 |
243 | |
244 | =item static_lib (o) |
245 | |
246 | =cut |
247 | |
cd340a5d |
248 | sub static_lib { |
3c7fc81c |
249 | my($self) = @_; |
cd340a5d |
250 | |
251 | return '' unless $self->has_link_code; |
252 | |
3e9ffe50 |
253 | my $m = <<'END'; |
3c7fc81c |
254 | $(INST_STATIC): $(OBJECT) $(MYEXTLIB) $(INST_ARCHAUTODIR)\.exists |
255 | $(RM_RF) $@ |
256 | END |
257 | |
258 | # If this extension has it's own library (eg SDBM_File) |
259 | # then copy that to $(INST_STATIC) and add $(OBJECT) into it. |
3e9ffe50 |
260 | $m .= <<'END' if $self->{MYEXTLIB}; |
57b1a898 |
261 | $self->{CP} $(MYEXTLIB) $@ |
3e9ffe50 |
262 | END |
263 | |
264 | my $ar_arg; |
265 | if( $BORLAND ) { |
266 | $ar_arg = '$@ $(OBJECT:^"+")'; |
267 | } |
268 | elsif( $GCC ) { |
269 | $ar_arg = '-ru $@ $(OBJECT)'; |
270 | } |
271 | else { |
272 | $ar_arg = '-type library -o $@ $(OBJECT)'; |
273 | } |
3c7fc81c |
274 | |
3e9ffe50 |
275 | $m .= sprintf <<'END', $ar_arg; |
276 | $(AR) %s |
277 | $(NOECHO)echo "$(EXTRALIBS)" > $(INST_ARCHAUTODIR)\extralibs.ld |
cd340a5d |
278 | $(CHMOD) 755 $@ |
3e9ffe50 |
279 | END |
3c7fc81c |
280 | |
3e9ffe50 |
281 | $m .= <<'END' if $self->{PERL_SRC}; |
282 | $(NOECHO)echo "$(EXTRALIBS)" >> $(PERL_SRC)\ext.libs |
8213a98b |
283 | |
284 | |
3e9ffe50 |
285 | END |
57b1a898 |
286 | $m .= $self->dir_target('$(INST_ARCHAUTODIR)'); |
3e9ffe50 |
287 | return $m; |
cd340a5d |
288 | } |
289 | |
2986a63f |
290 | =item dynamic_lib (o) |
291 | |
292 | Defines how to produce the *.so (or equivalent) files. |
293 | |
294 | =cut |
295 | |
296 | sub dynamic_lib { |
f582e489 |
297 | my($self, %attribs) = @_; |
2986a63f |
298 | return '' unless $self->needs_linking(); #might be because of a subdir |
299 | |
300 | return '' unless $self->has_link_code; |
301 | |
302 | my($otherldflags) = $attribs{OTHERLDFLAGS} || ($BORLAND ? 'c0d32.obj': ''); |
303 | my($inst_dynamic_dep) = $attribs{INST_DYNAMIC_DEP} || ""; |
304 | my($ldfrom) = '$(LDFROM)'; |
f582e489 |
305 | |
306 | (my $boot = $self->{NAME}) =~ s/:/_/g; |
307 | |
308 | my $m = <<'MAKE_FRAG'; |
2986a63f |
309 | # This section creates the dynamically loadable $(INST_DYNAMIC) |
310 | # from $(OBJECT) and possibly $(MYEXTLIB). |
311 | OTHERLDFLAGS = '.$otherldflags.' |
312 | INST_DYNAMIC_DEP = '.$inst_dynamic_dep.' |
313 | |
f582e489 |
314 | # Create xdc data for an MT safe NLM in case of mpk build |
2986a63f |
315 | $(INST_DYNAMIC): $(OBJECT) $(MYEXTLIB) $(BOOTSTRAP) |
f582e489 |
316 | @echo Export boot_$(BOOT_SYMBOL) > $(BASEEXT).def |
317 | @echo $(BASE_IMPORT) >> $(BASEEXT).def |
318 | @echo Import @$(PERL_INC)\perl.imp >> $(BASEEXT).def |
319 | MAKE_FRAG |
320 | |
321 | |
322 | if ( $self->{CCFLAGS} =~ m/ -DMPK_ON /) { |
323 | $m .= <<'MAKE_FRAG'; |
324 | $(MPKTOOL) $(XDCFLAGS) $(BASEEXT).xdc |
325 | @echo xdcdata $(BASEEXT).xdc >> $(BASEEXT).def |
326 | MAKE_FRAG |
327 | } |
328 | |
69ff8adf |
329 | # Reconstruct the X.Y.Z version. |
330 | my $version = join '.', map { sprintf "%d", $_ } |
331 | $] =~ /(\d)\.(\d{3})(\d{2})/; |
332 | $m .= sprintf ' $(LD) $(LDFLAGS) $(OBJECT:.obj=.obj) -desc "Perl %s Extension ($(BASEEXT)) XS_VERSION: $(XS_VERSION)" -nlmversion $(NLM_VERSION)', $version; |
f582e489 |
333 | |
334 | # Taking care of long names like FileHandle, ByteLoader, SDBM_File etc |
335 | if($self->{NLM_SHORT_NAME}) { |
336 | # In case of nlms with names exceeding 8 chars, build nlm in the |
f355267c |
337 | # current dir, rename and move to auto\lib. |
f582e489 |
338 | $m .= q{ -o $(NLM_SHORT_NAME).$(DLEXT)} |
339 | } else { |
340 | $m .= q{ -o $(INST_AUTODIR)\\$(BASEEXT).$(DLEXT)} |
341 | } |
342 | |
343 | # Add additional lib files if any (SDBM_File) |
344 | $m .= q{ $(MYEXTLIB) } if $self->{MYEXTLIB}; |
345 | |
346 | $m .= q{ $(PERL_INC)\Main.lib -commandfile $(BASEEXT).def}."\n"; |
347 | |
f582e489 |
348 | if($self->{NLM_SHORT_NAME}) { |
349 | $m .= <<'MAKE_FRAG'; |
f355267c |
350 | if exist $(INST_AUTODIR)\$(NLM_SHORT_NAME).$(DLEXT) del $(INST_AUTODIR)\$(NLM_SHORT_NAME).$(DLEXT) |
351 | move $(NLM_SHORT_NAME).$(DLEXT) $(INST_AUTODIR) |
f582e489 |
352 | MAKE_FRAG |
353 | } |
354 | |
355 | $m .= <<'MAKE_FRAG'; |
356 | |
2986a63f |
357 | $(CHMOD) 755 $@ |
f582e489 |
358 | MAKE_FRAG |
359 | |
360 | $m .= $self->dir_target('$(INST_ARCHAUTODIR)'); |
2986a63f |
361 | |
f582e489 |
362 | return $m; |
2986a63f |
363 | } |
364 | |
2986a63f |
365 | |
366 | 1; |
367 | __END__ |
368 | |
369 | =back |
370 | |
371 | =cut |
372 | |
f582e489 |
373 | |