This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Fix formatting in perldiag
[perl5.git] / lib / ExtUtils / MM_Unix.pm
CommitLineData
1e44e2bf
PP
1package ExtUtils::MM_Unix;
2
dbc738d9 3use Exporter ();
f1387719
PP
4use Config;
5use File::Basename qw(basename dirname fileparse);
6use DirHandle;
dbc738d9 7use strict;
bab2b58e 8use vars qw($VERSION $Is_Mac $Is_OS2 $Is_VMS
a1f8e286 9 $Verbose %pm %static $Xsubpp_Version);
dbc738d9 10
8fe37c6d 11$VERSION = substr q$Revision: 1.109_01 $, 10;
bab2b58e 12# $Id: MM_Unix.pm,v 1.109 1996/12/17 00:42:32 k Exp k $
1e44e2bf
PP
13
14Exporter::import('ExtUtils::MakeMaker',
15 qw( $Verbose &neatvalue));
16
bab2b58e 17$Is_OS2 = $^O eq 'os2';
f1387719
PP
18$Is_Mac = $^O eq "MacOS";
19
20if ($Is_VMS = $^O eq 'VMS') {
21 require VMS::Filespec;
22 import VMS::Filespec qw( &vmsify );
23}
1e44e2bf
PP
24
25=head1 NAME
26
27ExtUtils::MM_Unix - methods used by ExtUtils::MakeMaker
28
29=head1 SYNOPSIS
30
31C<require ExtUtils::MM_Unix;>
32
33=head1 DESCRIPTION
34
35The methods provided by this package are designed to be used in
36conjunction with ExtUtils::MakeMaker. When MakeMaker writes a
37Makefile, it creates one or more objects that inherit their methods
38from a package C<MM>. MM itself doesn't provide any methods, but it
39ISA ExtUtils::MM_Unix class. The inheritance tree of MM lets operating
40specific packages take the responsibility for all the methods provided
41by MM_Unix. We are trying to reduce the number of the necessary
42overrides by defining rather primitive operations within
43ExtUtils::MM_Unix.
44
45If you are going to write a platform specific MM package, please try
1fef88e7
JM
46to limit the necessary overrides to primitive methods, and if it is not
47possible to do so, let's work out how to achieve that gain.
1e44e2bf 48
f4ae0f5e
PP
49If you are overriding any of these methods in your Makefile.PL (in the
50MY class), please report that to the makemaker mailing list. We are
51trying to minimize the necessary method overrides and switch to data
52driven Makefile.PLs wherever possible. In the long run less methods
53will be overridable via the MY class.
54
1e44e2bf
PP
55=head1 METHODS
56
57The following description of methods is still under
58development. Please refer to the code for not suitably documented
59sections and complain loudly to the makemaker mailing list.
60
f1387719 61Not all of the methods below are overridable in a
f4ae0f5e
PP
62Makefile.PL. Overridable methods are marked as (o). All methods are
63overridable by a platform specific MM_*.pm file (See
bab2b58e 64L<ExtUtils::MM_VMS>) and L<ExtUtils::MM_OS2>).
f4ae0f5e 65
1e44e2bf
PP
66=head2 Preloaded methods
67
68=over 2
69
f1387719
PP
70=item canonpath
71
72No physical check on the filesystem, but a logical cleanup of a
73path. On UNIX eliminated successive slashes and successive "/.".
74
75=cut
76
77sub canonpath {
78 my($self,$path) = @_;
79 $path =~ s|/+|/|g ; # xx////xx -> xx/xx
80 $path =~ s|(/\.)+/|/|g ; # xx/././xx -> xx/xx
81 $path =~ s|^(\./)+|| unless $path eq "./"; # ./xx -> xx
82 $path =~ s|/$|| unless $path eq "/"; # xx/ -> xx
83 $path;
84}
85
1e44e2bf
PP
86=item catdir
87
88Concatenate two or more directory names to form a complete path ending
f1387719
PP
89with a directory. But remove the trailing slash from the resulting
90string, because it doesn't look good, isn't necessary and confuses
91OS2. Of course, if this is the root directory, don't cut off the
92trailing slash :-)
1e44e2bf
PP
93
94=cut
95
96# ';
97
f1387719 98sub catdir {
1e44e2bf 99 shift;
f1387719
PP
100 my @args = @_;
101 for (@args) {
102 # append a slash to each argument unless it has one there
93f9cb4b 103 $_ .= "/" if $_ eq '' or substr($_,-1) ne "/";
f1387719
PP
104 }
105 my $result = join('', @args);
106 # remove a trailing slash unless we are root
93f9cb4b
PP
107 substr($result,-1) = ""
108 if length($result) > 1 && substr($result,-1) eq "/";
1e44e2bf
PP
109 $result;
110}
111
112=item catfile
113
f1387719 114Concatenate one or more directory names and a filename to form a
1e44e2bf
PP
115complete path ending with a filename
116
117=cut
118
119sub catfile {
f1387719
PP
120 my $self = shift @_;
121 my $file = pop @_;
122 return $file unless @_;
123 my $dir = $self->catdir(@_);
124 for ($dir) {
125 $_ .= "/" unless substr($_,length($_)-1,1) eq "/";
126 }
127 return $dir.$file;
1e44e2bf
PP
128}
129
f1387719
PP
130=item curdir
131
132Returns a string representing of the current directory. "." on UNIX.
133
134=cut
135
136sub curdir {
137 return "." ;
138}
139
140=item rootdir
141
142Returns a string representing of the root directory. "/" on UNIX.
143
144=cut
145
146sub rootdir {
147 return "/";
148}
149
150=item updir
151
152Returns a string representing of the parent directory. ".." on UNIX.
153
154=cut
155
156sub updir {
157 return "..";
158}
159
160sub ExtUtils::MM_Unix::c_o ;
161sub ExtUtils::MM_Unix::clean ;
162sub ExtUtils::MM_Unix::const_cccmd ;
f4ae0f5e 163sub ExtUtils::MM_Unix::const_config ;
f4ae0f5e 164sub ExtUtils::MM_Unix::const_loadlibs ;
f1387719 165sub ExtUtils::MM_Unix::constants ;
f4ae0f5e 166sub ExtUtils::MM_Unix::depend ;
f1387719
PP
167sub ExtUtils::MM_Unix::dir_target ;
168sub ExtUtils::MM_Unix::dist ;
169sub ExtUtils::MM_Unix::dist_basics ;
170sub ExtUtils::MM_Unix::dist_ci ;
171sub ExtUtils::MM_Unix::dist_core ;
172sub ExtUtils::MM_Unix::dist_dir ;
173sub ExtUtils::MM_Unix::dist_test ;
f4ae0f5e
PP
174sub ExtUtils::MM_Unix::dlsyms ;
175sub ExtUtils::MM_Unix::dynamic ;
176sub ExtUtils::MM_Unix::dynamic_bs ;
177sub ExtUtils::MM_Unix::dynamic_lib ;
f1387719
PP
178sub ExtUtils::MM_Unix::exescan ;
179sub ExtUtils::MM_Unix::extliblist ;
180sub ExtUtils::MM_Unix::file_name_is_absolute ;
181sub ExtUtils::MM_Unix::find_perl ;
182sub ExtUtils::MM_Unix::force ;
183sub ExtUtils::MM_Unix::guess_name ;
184sub ExtUtils::MM_Unix::has_link_code ;
185sub ExtUtils::MM_Unix::init_dirscan ;
186sub ExtUtils::MM_Unix::init_main ;
187sub ExtUtils::MM_Unix::init_others ;
188sub ExtUtils::MM_Unix::install ;
189sub ExtUtils::MM_Unix::installbin ;
190sub ExtUtils::MM_Unix::libscan ;
191sub ExtUtils::MM_Unix::linkext ;
192sub ExtUtils::MM_Unix::lsdir ;
193sub ExtUtils::MM_Unix::macro ;
194sub ExtUtils::MM_Unix::makeaperl ;
195sub ExtUtils::MM_Unix::makefile ;
f4ae0f5e 196sub ExtUtils::MM_Unix::manifypods ;
f1387719
PP
197sub ExtUtils::MM_Unix::maybe_command ;
198sub ExtUtils::MM_Unix::maybe_command_in_dirs ;
199sub ExtUtils::MM_Unix::needs_linking ;
200sub ExtUtils::MM_Unix::nicetext ;
201sub ExtUtils::MM_Unix::parse_version ;
202sub ExtUtils::MM_Unix::pasthru ;
203sub ExtUtils::MM_Unix::path ;
204sub ExtUtils::MM_Unix::perl_script ;
205sub ExtUtils::MM_Unix::perldepend ;
206sub ExtUtils::MM_Unix::pm_to_blib ;
207sub ExtUtils::MM_Unix::post_constants ;
208sub ExtUtils::MM_Unix::post_initialize ;
209sub ExtUtils::MM_Unix::postamble ;
210sub ExtUtils::MM_Unix::prefixify ;
f4ae0f5e 211sub ExtUtils::MM_Unix::processPL ;
f4ae0f5e 212sub ExtUtils::MM_Unix::realclean ;
f1387719
PP
213sub ExtUtils::MM_Unix::replace_manpage_separator ;
214sub ExtUtils::MM_Unix::static ;
215sub ExtUtils::MM_Unix::static_lib ;
f4ae0f5e 216sub ExtUtils::MM_Unix::staticmake ;
f1387719
PP
217sub ExtUtils::MM_Unix::subdir_x ;
218sub ExtUtils::MM_Unix::subdirs ;
f4ae0f5e
PP
219sub ExtUtils::MM_Unix::test ;
220sub ExtUtils::MM_Unix::test_via_harness ;
221sub ExtUtils::MM_Unix::test_via_script ;
f1387719
PP
222sub ExtUtils::MM_Unix::tool_autosplit ;
223sub ExtUtils::MM_Unix::tool_xsubpp ;
224sub ExtUtils::MM_Unix::tools_other ;
225sub ExtUtils::MM_Unix::top_targets ;
f4ae0f5e 226sub ExtUtils::MM_Unix::writedoc ;
f1387719
PP
227sub ExtUtils::MM_Unix::xs_c ;
228sub ExtUtils::MM_Unix::xs_o ;
229sub ExtUtils::MM_Unix::xsubpp_version ;
f4ae0f5e
PP
230
231package ExtUtils::MM_Unix;
232
93f9cb4b 233use SelfLoader;
f4ae0f5e
PP
234
2351;
93f9cb4b
PP
236
237__DATA__
f4ae0f5e 238
bab2b58e
AK
239=back
240
f4ae0f5e
PP
241=head2 SelfLoaded methods
242
bab2b58e
AK
243=over 2
244
f1387719 245=item c_o (o)
1e44e2bf 246
f1387719
PP
247Defines the suffix rules to compile different flavors of C files to
248object files.
1e44e2bf
PP
249
250=cut
251
f1387719
PP
252sub c_o {
253# --- Translation Sections ---
1e44e2bf 254
f1387719
PP
255 my($self) = shift;
256 return '' unless $self->needs_linking();
257 my(@m);
258 push @m, '
259.c$(OBJ_EXT):
042ade60 260 $(CCCMD) $(CCCDLFLAGS) -I$(PERL_INC) $(DEFINE) $*.c
a0d6894c
PP
261';
262 push @m, '
f1387719
PP
263.C$(OBJ_EXT):
264 $(CCCMD) $(CCCDLFLAGS) -I$(PERL_INC) $(DEFINE) $*.C
a0d6894c
PP
265' if $^O ne 'os2'; # Case-specific
266 push @m, '
f1387719
PP
267.cpp$(OBJ_EXT):
268 $(CCCMD) $(CCCDLFLAGS) -I$(PERL_INC) $(DEFINE) $*.cpp
1e44e2bf 269
f1387719
PP
270.cxx$(OBJ_EXT):
271 $(CCCMD) $(CCCDLFLAGS) -I$(PERL_INC) $(DEFINE) $*.cxx
1e44e2bf 272
f1387719
PP
273.cc$(OBJ_EXT):
274 $(CCCMD) $(CCCDLFLAGS) -I$(PERL_INC) $(DEFINE) $*.cc
275';
276 join "", @m;
1e44e2bf
PP
277}
278
f1387719 279=item cflags (o)
1e44e2bf 280
f1387719
PP
281Does very much the same as the cflags script in the perl
282distribution. It doesn't return the whole compiler command line, but
283initializes all of its parts. The const_cccmd method then actually
284returns the definition of the CCCMD macro which uses these parts.
1e44e2bf
PP
285
286=cut
287
f1387719 288#'
1e44e2bf 289
f1387719
PP
290sub cflags {
291 my($self,$libperl)=@_;
292 return $self->{CFLAGS} if $self->{CFLAGS};
293 return '' unless $self->needs_linking();
1e44e2bf 294
f1387719
PP
295 my($prog, $uc, $perltype, %cflags);
296 $libperl ||= $self->{LIBPERL_A} || "libperl$self->{LIB_EXT}" ;
297 $libperl =~ s/\.\$\(A\)$/$self->{LIB_EXT}/;
1e44e2bf 298
f1387719
PP
299 @cflags{qw(cc ccflags optimize large split shellflags)}
300 = @Config{qw(cc ccflags optimize large split shellflags)};
301 my($optdebug) = "";
1e44e2bf 302
f1387719 303 $cflags{shellflags} ||= '';
1e44e2bf 304
f1387719
PP
305 my(%map) = (
306 D => '-DDEBUGGING',
307 E => '-DEMBED',
308 DE => '-DDEBUGGING -DEMBED',
309 M => '-DEMBED -DMULTIPLICITY',
310 DM => '-DDEBUGGING -DEMBED -DMULTIPLICITY',
311 );
1e44e2bf 312
f1387719
PP
313 if ($libperl =~ /libperl(\w*)\Q$self->{LIB_EXT}/){
314 $uc = uc($1);
315 } else {
316 $uc = ""; # avoid warning
317 }
318 $perltype = $map{$uc} ? $map{$uc} : "";
1e44e2bf 319
f1387719
PP
320 if ($uc =~ /^D/) {
321 $optdebug = "-g";
322 }
1e44e2bf 323
1e44e2bf 324
f1387719
PP
325 my($name);
326 ( $name = $self->{NAME} . "_cflags" ) =~ s/:/_/g ;
327 if ($prog = $Config::Config{$name}) {
328 # Expand hints for this extension via the shell
329 print STDOUT "Processing $name hint:\n" if $Verbose;
330 my(@o)=`cc=\"$cflags{cc}\"
331 ccflags=\"$cflags{ccflags}\"
332 optimize=\"$cflags{optimize}\"
333 perltype=\"$cflags{perltype}\"
334 optdebug=\"$cflags{optdebug}\"
335 large=\"$cflags{large}\"
336 split=\"$cflags{'split'}\"
337 eval '$prog'
338 echo cc=\$cc
339 echo ccflags=\$ccflags
340 echo optimize=\$optimize
341 echo perltype=\$perltype
342 echo optdebug=\$optdebug
343 echo large=\$large
344 echo split=\$split
345 `;
346 my($line);
347 foreach $line (@o){
348 chomp $line;
349 if ($line =~ /(.*?)=\s*(.*)\s*$/){
350 $cflags{$1} = $2;
351 print STDOUT " $1 = $2\n" if $Verbose;
352 } else {
353 print STDOUT "Unrecognised result from hint: '$line'\n";
354 }
355 }
356 }
1e44e2bf 357
f1387719
PP
358 if ($optdebug) {
359 $cflags{optimize} = $optdebug;
360 }
1e44e2bf 361
f1387719
PP
362 for (qw(ccflags optimize perltype large split)) {
363 $cflags{$_} =~ s/^\s+//;
364 $cflags{$_} =~ s/\s+/ /g;
365 $cflags{$_} =~ s/\s+$//;
366 $self->{uc $_} ||= $cflags{$_}
367 }
1e44e2bf 368
f1387719
PP
369 return $self->{CFLAGS} = qq{
370CCFLAGS = $self->{CCFLAGS}
371OPTIMIZE = $self->{OPTIMIZE}
372PERLTYPE = $self->{PERLTYPE}
373LARGE = $self->{LARGE}
374SPLIT = $self->{SPLIT}
375};
1e44e2bf 376
1e44e2bf
PP
377}
378
f1387719 379=item clean (o)
1e44e2bf 380
f1387719 381Defines the clean target.
1e44e2bf
PP
382
383=cut
384
f1387719
PP
385sub clean {
386# --- Cleanup and Distribution Sections ---
1e44e2bf 387
f1387719
PP
388 my($self, %attribs) = @_;
389 my(@m,$dir);
390 push(@m, '
391# Delete temporary files but do not touch installed files. We don\'t delete
392# the Makefile here so a later make realclean still has a makefile to use.
1e44e2bf 393
f1387719
PP
394clean ::
395');
396 # clean subdirectories first
397 for $dir (@{$self->{DIR}}) {
398 push @m, "\t-cd $dir && test -f $self->{MAKEFILE} && \$(MAKE) clean\n";
1e44e2bf 399 }
f1387719
PP
400
401 my(@otherfiles) = values %{$self->{XS}}; # .c files from *.xs files
402 push(@otherfiles, $attribs{FILES}) if $attribs{FILES};
403 push(@otherfiles, qw[./blib $(MAKE_APERL_FILE) $(INST_ARCHAUTODIR)/extralibs.all
404 perlmain.c mon.out core so_locations pm_to_blib
405 *~ */*~ */*/*~ *$(OBJ_EXT) *$(LIB_EXT) perl.exe
406 $(BOOTSTRAP) $(BASEEXT).bso $(BASEEXT).def
407 $(BASEEXT).exp
408 ]);
409 push @m, "\t-$self->{RM_RF} @otherfiles\n";
410 # See realclean and ext/utils/make_ext for usage of Makefile.old
411 push(@m,
412 "\t-$self->{MV} $self->{MAKEFILE} $self->{MAKEFILE}.old 2>/dev/null\n");
413 push(@m,
414 "\t$attribs{POSTOP}\n") if $attribs{POSTOP};
415 join("", @m);
1e44e2bf
PP
416}
417
f1387719 418=item const_cccmd (o)
1e44e2bf 419
f1387719
PP
420Returns the full compiler call for C programs and stores the
421definition in CONST_CCCMD.
1e44e2bf
PP
422
423=cut
424
f1387719
PP
425sub const_cccmd {
426 my($self,$libperl)=@_;
427 return $self->{CONST_CCCMD} if $self->{CONST_CCCMD};
428 return '' unless $self->needs_linking();
429 return $self->{CONST_CCCMD} =
430 q{CCCMD = $(CC) -c $(INC) $(CCFLAGS) $(OPTIMIZE) \\
431 $(PERLTYPE) $(LARGE) $(SPLIT) $(DEFINE_VERSION) \\
432 $(XS_DEFINE_VERSION)};
1e44e2bf
PP
433}
434
f1387719 435=item const_config (o)
1e44e2bf 436
f1387719
PP
437Defines a couple of constants in the Makefile that are imported from
438%Config.
1e44e2bf
PP
439
440=cut
441
f1387719
PP
442sub const_config {
443# --- Constants Sections ---
444
445 my($self) = shift;
446 my(@m,$m);
447 push(@m,"\n# These definitions are from config.sh (via $INC{'Config.pm'})\n");
448 push(@m,"\n# They may have been overridden via Makefile.PL or on the command line\n");
449 my(%once_only);
450 foreach $m (@{$self->{CONFIG}}){
451 # SITE*EXP macros are defined in &constants; avoid duplicates here
452 next if $once_only{$m} or $m eq 'sitelibexp' or $m eq 'sitearchexp';
453 push @m, "\U$m\E = ".$self->{uc $m}."\n";
454 $once_only{$m} = 1;
455 }
456 join('', @m);
1e44e2bf
PP
457}
458
f1387719 459=item const_loadlibs (o)
1e44e2bf 460
f1387719
PP
461Defines EXTRALIBS, LDLOADLIBS, BSLOADLIBS, LD_RUN_PATH. See
462L<ExtUtils::Liblist> for details.
1e44e2bf
PP
463
464=cut
465
f1387719
PP
466sub const_loadlibs {
467 my($self) = shift;
468 return "" unless $self->needs_linking;
469 my @m;
470 push @m, qq{
471# $self->{NAME} might depend on some other libraries:
472# See ExtUtils::Liblist for details
473#
474};
475 my($tmp);
476 for $tmp (qw/
477 EXTRALIBS LDLOADLIBS BSLOADLIBS LD_RUN_PATH
478 /) {
479 next unless defined $self->{$tmp};
480 push @m, "$tmp = $self->{$tmp}\n";
481 }
482 return join "", @m;
1e44e2bf
PP
483}
484
f1387719 485=item constants (o)
1e44e2bf 486
f1387719 487Initializes lots of constants and .SUFFIXES and .PHONY
1e44e2bf
PP
488
489=cut
490
f1387719 491sub constants {
1e44e2bf 492 my($self) = @_;
f1387719 493 my(@m,$tmp);
1e44e2bf 494
f1387719 495 for $tmp (qw/
1e44e2bf 496
f1387719
PP
497 AR_STATIC_ARGS NAME DISTNAME NAME_SYM VERSION
498 VERSION_SYM XS_VERSION INST_BIN INST_EXE INST_LIB
bab2b58e 499 INST_ARCHLIB INST_SCRIPT PREFIX INSTALLDIRS
f1387719
PP
500 INSTALLPRIVLIB INSTALLARCHLIB INSTALLSITELIB
501 INSTALLSITEARCH INSTALLBIN INSTALLSCRIPT PERL_LIB
502 PERL_ARCHLIB SITELIBEXP SITEARCHEXP LIBPERL_A MYEXTLIB
503 FIRST_MAKEFILE MAKE_APERL_FILE PERLMAINCC PERL_SRC
504 PERL_INC PERL FULLPERL
1e44e2bf 505
f1387719
PP
506 / ) {
507 next unless defined $self->{$tmp};
508 push @m, "$tmp = $self->{$tmp}\n";
1e44e2bf
PP
509 }
510
f1387719
PP
511 push @m, qq{
512VERSION_MACRO = VERSION
513DEFINE_VERSION = -D\$(VERSION_MACRO)=\\\"\$(VERSION)\\\"
514XS_VERSION_MACRO = XS_VERSION
515XS_DEFINE_VERSION = -D\$(XS_VERSION_MACRO)=\\\"\$(XS_VERSION)\\\"
516};
1e44e2bf 517
f1387719
PP
518 push @m, qq{
519MAKEMAKER = $INC{'ExtUtils/MakeMaker.pm'}
520MM_VERSION = $ExtUtils::MakeMaker::VERSION
521};
1e44e2bf 522
f1387719
PP
523 push @m, q{
524# FULLEXT = Pathname for extension directory (eg Foo/Bar/Oracle).
525# BASEEXT = Basename part of FULLEXT. May be just equal FULLEXT. (eg Oracle)
526# ROOTEXT = Directory part of FULLEXT with leading slash (eg /DBD) !!! Deprecated from MM 5.32 !!!
527# PARENT_NAME = NAME without BASEEXT and no trailing :: (eg Foo::Bar)
528# DLBASE = Basename part of dynamic library. May be just equal BASEEXT.
529};
1e44e2bf 530
f1387719
PP
531 for $tmp (qw/
532 FULLEXT BASEEXT PARENT_NAME DLBASE VERSION_FROM INC DEFINE OBJECT
533 LDFROM LINKTYPE
534 / ) {
535 next unless defined $self->{$tmp};
536 push @m, "$tmp = $self->{$tmp}\n";
537 }
1e44e2bf 538
f1387719
PP
539 push @m, "
540# Handy lists of source code files:
541XS_FILES= ".join(" \\\n\t", sort keys %{$self->{XS}})."
542C_FILES = ".join(" \\\n\t", @{$self->{C}})."
543O_FILES = ".join(" \\\n\t", @{$self->{O_FILES}})."
544H_FILES = ".join(" \\\n\t", @{$self->{H}})."
545MAN1PODS = ".join(" \\\n\t", sort keys %{$self->{MAN1PODS}})."
546MAN3PODS = ".join(" \\\n\t", sort keys %{$self->{MAN3PODS}})."
547";
1e44e2bf 548
f1387719
PP
549 for $tmp (qw/
550 INST_MAN1DIR INSTALLMAN1DIR MAN1EXT INST_MAN3DIR INSTALLMAN3DIR MAN3EXT
551 /) {
552 next unless defined $self->{$tmp};
553 push @m, "$tmp = $self->{$tmp}\n";
554 }
1e44e2bf 555
f1387719
PP
556 push @m, q{
557.NO_CONFIG_REC: Makefile
558} if $ENV{CLEARCASE_ROOT};
1e44e2bf 559
f1387719
PP
560 # why not q{} ? -- emacs
561 push @m, qq{
562# work around a famous dec-osf make(1) feature(?):
563makemakerdflt: all
1e44e2bf 564
f1387719 565.SUFFIXES: .xs .c .C .cpp .cxx .cc \$(OBJ_EXT)
1e44e2bf 566
f1387719
PP
567# Nick wanted to get rid of .PRECIOUS. I don't remember why. I seem to recall, that
568# some make implementations will delete the Makefile when we rebuild it. Because
569# we call false(1) when we rebuild it. So make(1) is not completely wrong when it
570# does so. Our milage may vary.
571# .PRECIOUS: Makefile # seems to be not necessary anymore
1e44e2bf 572
f1387719 573.PHONY: all config static dynamic test linkext manifest
1e44e2bf 574
f1387719
PP
575# Where is the Config information that we are using/depend on
576CONFIGDEP = \$(PERL_ARCHLIB)/Config.pm \$(PERL_INC)/config.h
dbc738d9 577};
1e44e2bf 578
dbc738d9
PP
579 my @parentdir = split(/::/, $self->{PARENT_NAME});
580 push @m, q{
f1387719 581# Where to put things:
dbc738d9
PP
582INST_LIBDIR = }. $self->catdir('$(INST_LIB)',@parentdir) .q{
583INST_ARCHLIBDIR = }. $self->catdir('$(INST_ARCHLIB)',@parentdir) .q{
1e44e2bf 584
dbc738d9
PP
585INST_AUTODIR = }. $self->catdir('$(INST_LIB)','auto','$(FULLEXT)') .q{
586INST_ARCHAUTODIR = }. $self->catdir('$(INST_ARCHLIB)','auto','$(FULLEXT)') .q{
f1387719 587};
1e44e2bf 588
f1387719
PP
589 if ($self->has_link_code()) {
590 push @m, '
591INST_STATIC = $(INST_ARCHAUTODIR)/$(BASEEXT)$(LIB_EXT)
592INST_DYNAMIC = $(INST_ARCHAUTODIR)/$(DLBASE).$(DLEXT)
593INST_BOOT = $(INST_ARCHAUTODIR)/$(BASEEXT).bs
594';
595 } else {
596 push @m, '
597INST_STATIC =
598INST_DYNAMIC =
599INST_BOOT =
600';
1e44e2bf
PP
601 }
602
f1387719
PP
603 if ($Is_OS2) {
604 $tmp = "$self->{BASEEXT}.def";
605 } else {
606 $tmp = "";
607 }
608 push @m, "
609EXPORT_LIST = $tmp
610";
1e44e2bf 611
f1387719
PP
612 if ($Is_OS2) {
613 $tmp = "\$(PERL_INC)/libperl\$(LIB_EXT)";
614 } else {
615 $tmp = "";
616 }
617 push @m, "
618PERL_ARCHIVE = $tmp
619";
1e44e2bf 620
f1387719
PP
621# push @m, q{
622#INST_PM = }.join(" \\\n\t", sort values %{$self->{PM}}).q{
623#
624#PM_TO_BLIB = }.join(" \\\n\t", %{$self->{PM}}).q{
625#};
1e44e2bf 626
f1387719
PP
627 push @m, q{
628TO_INST_PM = }.join(" \\\n\t", sort keys %{$self->{PM}}).q{
1e44e2bf 629
f1387719
PP
630PM_TO_BLIB = }.join(" \\\n\t", %{$self->{PM}}).q{
631};
1e44e2bf 632
f1387719
PP
633 join('',@m);
634}
1e44e2bf 635
f1387719 636=item depend (o)
1e44e2bf 637
f1387719 638Same as macro for the depend attribute.
1e44e2bf 639
f1387719 640=cut
1e44e2bf 641
f1387719
PP
642sub depend {
643 my($self,%attribs) = @_;
644 my(@m,$key,$val);
645 while (($key,$val) = each %attribs){
646 last unless defined $key;
647 push @m, "$key: $val\n";
1e44e2bf 648 }
f1387719
PP
649 join "", @m;
650}
1e44e2bf 651
f1387719 652=item dir_target (o)
1e44e2bf 653
f1387719
PP
654Takes an array of directories that need to exist and returns a
655Makefile entry for a .exists file in these directories. Returns
656nothing, if the entry has already been processed. We're helpless
657though, if the same directory comes as $(FOO) _and_ as "bar". Both of
658them get an entry, that's why we use "::".
1e44e2bf 659
f1387719 660=cut
1e44e2bf 661
f1387719
PP
662sub dir_target {
663# --- Make-Directories section (internal method) ---
664# dir_target(@array) returns a Makefile entry for the file .exists in each
665# named directory. Returns nothing, if the entry has already been processed.
666# We're helpless though, if the same directory comes as $(FOO) _and_ as "bar".
667# Both of them get an entry, that's why we use "::". I chose '$(PERL)' as the
668# prerequisite, because there has to be one, something that doesn't change
669# too often :)
1e44e2bf 670
f1387719
PP
671 my($self,@dirs) = @_;
672 my(@m,$dir);
673 foreach $dir (@dirs) {
674 my($src) = $self->catfile($self->{PERL_INC},'perl.h');
675 my($targ) = $self->catfile($dir,'.exists');
676 my($targdir) = $targ; # Necessary because catfile may have
677 $targdir =~ s:/?.exists$::; # adapted syntax of $dir to target OS
678 next if $self->{DIR_TARGET}{$self}{$targdir}++;
679 push @m, qq{
680$targ :: $src
681 $self->{NOECHO}\$(MKPATH) $targdir
682 $self->{NOECHO}\$(EQUALIZE_TIMESTAMP) $src $targ
683};
684 push(@m,qq{
685 -$self->{NOECHO}\$(CHMOD) 755 $targdir
686}) unless $Is_VMS;
687 }
688 join "", @m;
689}
1e44e2bf 690
f1387719 691=item dist (o)
1e44e2bf 692
f1387719 693Defines a lot of macros for distribution support.
1e44e2bf 694
f1387719 695=cut
1e44e2bf 696
f1387719
PP
697sub dist {
698 my($self, %attribs) = @_;
1e44e2bf 699
f1387719
PP
700 my(@m);
701 # VERSION should be sanitised before use as a file name
702 my($version) = $attribs{VERSION} || '$(VERSION)';
703 my($name) = $attribs{NAME} || '$(DISTNAME)';
704 my($tar) = $attribs{TAR} || 'tar'; # eg /usr/bin/gnutar
705 my($tarflags) = $attribs{TARFLAGS} || 'cvf';
706 my($zip) = $attribs{ZIP} || 'zip'; # eg pkzip Yuck!
707 my($zipflags) = $attribs{ZIPFLAGS} || '-r';
708 my($compress) = $attribs{COMPRESS} || 'compress'; # eg gzip
709 my($suffix) = $attribs{SUFFIX} || '.Z'; # eg .gz
710 my($shar) = $attribs{SHAR} || 'shar'; # eg "shar --gzip"
711 my($preop) = $attribs{PREOP} || "$self->{NOECHO}\$(NOOP)"; # eg update MANIFEST
712 my($postop) = $attribs{POSTOP} || "$self->{NOECHO}\$(NOOP)"; # eg remove the distdir
1e44e2bf 713
f1387719
PP
714 my($to_unix) = $attribs{TO_UNIX} || ($Is_OS2
715 ? "$self->{NOECHO}"
716 . 'test -f tmp.zip && $(RM) tmp.zip;'
717 . ' $(ZIP) -ll -mr tmp.zip $(DISTVNAME) && unzip -o tmp.zip && $(RM) tmp.zip'
718 : "$self->{NOECHO}\$(NOOP)");
1e44e2bf 719
f1387719
PP
720 my($ci) = $attribs{CI} || 'ci -u';
721 my($rcs_label)= $attribs{RCS_LABEL}|| 'rcs -Nv$(VERSION_SYM): -q';
722 my($dist_cp) = $attribs{DIST_CP} || 'best';
723 my($dist_default) = $attribs{DIST_DEFAULT} || 'tardist';
1e44e2bf 724
f1387719
PP
725 push @m, "
726DISTVNAME = ${name}-$version
727TAR = $tar
728TARFLAGS = $tarflags
729ZIP = $zip
730ZIPFLAGS = $zipflags
731COMPRESS = $compress
732SUFFIX = $suffix
733SHAR = $shar
734PREOP = $preop
735POSTOP = $postop
736TO_UNIX = $to_unix
737CI = $ci
738RCS_LABEL = $rcs_label
739DIST_CP = $dist_cp
740DIST_DEFAULT = $dist_default
741";
742 join "", @m;
1e44e2bf
PP
743}
744
f1387719 745=item dist_basics (o)
1e44e2bf 746
f1387719 747Defines the targets distclean, distcheck, skipcheck, manifest.
1e44e2bf
PP
748
749=cut
750
f1387719
PP
751sub dist_basics {
752 my($self) = shift;
753 my @m;
754 push @m, q{
755distclean :: realclean distcheck
756};
1e44e2bf 757
f1387719
PP
758 push @m, q{
759distcheck :
760 $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) -e 'use ExtUtils::Manifest "&fullcheck";' \\
761 -e 'fullcheck();'
762};
1e44e2bf 763
f1387719
PP
764 push @m, q{
765skipcheck :
766 $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) -e 'use ExtUtils::Manifest "&skipcheck";' \\
767 -e 'skipcheck();'
768};
1e44e2bf 769
f1387719
PP
770 push @m, q{
771manifest :
772 $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) -e 'use ExtUtils::Manifest "&mkmanifest";' \\
773 -e 'mkmanifest();'
774};
775 join "", @m;
1e44e2bf
PP
776}
777
f1387719 778=item dist_ci (o)
1e44e2bf 779
f1387719 780Defines a check in target for RCS.
1e44e2bf
PP
781
782=cut
783
f1387719 784sub dist_ci {
1e44e2bf 785 my($self) = shift;
f1387719
PP
786 my @m;
787 push @m, q{
788ci :
789 $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) -e 'use ExtUtils::Manifest "&maniread";' \\
790 -e '@all = keys %{ maniread() };' \\
791 -e 'print("Executing $(CI) @all\n"); system("$(CI) @all");' \\
792 -e 'print("Executing $(RCS_LABEL) ...\n"); system("$(RCS_LABEL) @all");'
793};
794 join "", @m;
795}
1e44e2bf 796
f1387719 797=item dist_core (o)
1e44e2bf 798
f1387719 799Defeines the targets dist, tardist, zipdist, uutardist, shdist
1e44e2bf 800
f1387719 801=cut
1e44e2bf 802
f1387719
PP
803sub dist_core {
804 my($self) = shift;
805 my @m;
806 push @m, q{
807dist : $(DIST_DEFAULT)
808 }.$self->{NOECHO}.q{$(PERL) -le 'print "Warning: Makefile possibly out of date with $$vf" if ' \
809 -e '-e ($$vf="$(VERSION_FROM)") and -M $$vf < -M "}.$self->{MAKEFILE}.q{";'
1e44e2bf 810
f1387719 811tardist : $(DISTVNAME).tar$(SUFFIX)
1e44e2bf 812
f1387719 813zipdist : $(DISTVNAME).zip
1e44e2bf 814
f1387719
PP
815$(DISTVNAME).tar$(SUFFIX) : distdir
816 $(PREOP)
817 $(TO_UNIX)
818 $(TAR) $(TARFLAGS) $(DISTVNAME).tar $(DISTVNAME)
819 $(RM_RF) $(DISTVNAME)
820 $(COMPRESS) $(DISTVNAME).tar
821 $(POSTOP)
1e44e2bf 822
f1387719
PP
823$(DISTVNAME).zip : distdir
824 $(PREOP)
825 $(ZIP) $(ZIPFLAGS) $(DISTVNAME).zip $(DISTVNAME)
826 $(RM_RF) $(DISTVNAME)
827 $(POSTOP)
1e44e2bf 828
f1387719
PP
829uutardist : $(DISTVNAME).tar$(SUFFIX)
830 uuencode $(DISTVNAME).tar$(SUFFIX) \\
831 $(DISTVNAME).tar$(SUFFIX) > \\
832 $(DISTVNAME).tar$(SUFFIX)_uu
f4ae0f5e 833
f1387719
PP
834shdist : distdir
835 $(PREOP)
836 $(SHAR) $(DISTVNAME) > $(DISTVNAME).shar
837 $(RM_RF) $(DISTVNAME)
838 $(POSTOP)
839};
840 join "", @m;
f4ae0f5e
PP
841}
842
f1387719 843=item dist_dir (o)
f4ae0f5e 844
f1387719
PP
845Defines the scratch directory target that will hold the distribution
846before tar-ing (or shar-ing).
1e44e2bf
PP
847
848=cut
849
f1387719
PP
850sub dist_dir {
851 my($self) = shift;
852 my @m;
853 push @m, q{
854distdir :
855 $(RM_RF) $(DISTVNAME)
856 $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) -MExtUtils::Manifest=manicopy,maniread \\
857 -e 'manicopy(maniread(),"$(DISTVNAME)", "$(DIST_CP)");'
858};
859 join "", @m;
1e44e2bf
PP
860}
861
f1387719 862=item dist_test (o)
1e44e2bf 863
f1387719
PP
864Defines a target that produces the distribution in the
865scratchdirectory, and runs 'perl Makefile.PL; make ;make test' in that
866subdirectory.
1e44e2bf
PP
867
868=cut
869
f1387719 870sub dist_test {
1e44e2bf 871 my($self) = shift;
f1387719
PP
872 my @m;
873 push @m, q{
874disttest : distdir
875 cd $(DISTVNAME) && $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) Makefile.PL
876 cd $(DISTVNAME) && $(MAKE)
877 cd $(DISTVNAME) && $(MAKE) test
878};
879 join "", @m;
1e44e2bf
PP
880}
881
f1387719 882=item dlsyms (o)
1e44e2bf 883
f1387719
PP
884Used by AIX and VMS to define DL_FUNCS and DL_VARS and write the *.exp
885files.
1e44e2bf
PP
886
887=cut
888
f1387719
PP
889sub dlsyms {
890 my($self,%attribs) = @_;
1e44e2bf 891
f1387719 892 return '' unless ($^O eq 'aix' && $self->needs_linking() );
1e44e2bf 893
f1387719
PP
894 my($funcs) = $attribs{DL_FUNCS} || $self->{DL_FUNCS} || {};
895 my($vars) = $attribs{DL_VARS} || $self->{DL_VARS} || [];
896 my(@m);
1e44e2bf 897
f1387719
PP
898 push(@m,"
899dynamic :: $self->{BASEEXT}.exp
1e44e2bf 900
f1387719 901") unless $self->{SKIPHASH}{'dynamic'}; # dynamic and static are subs, so...
1e44e2bf 902
f1387719
PP
903 push(@m,"
904static :: $self->{BASEEXT}.exp
1e44e2bf 905
f1387719 906") unless $self->{SKIPHASH}{'static'}; # we avoid a warning if we tick them
1e44e2bf 907
f1387719
PP
908 push(@m,"
909$self->{BASEEXT}.exp: Makefile.PL
910",' $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" -e \'use ExtUtils::Mksymlists; \\
911 Mksymlists("NAME" => "',$self->{NAME},'", "DL_FUNCS" => ',
912 neatvalue($funcs),', "DL_VARS" => ', neatvalue($vars), ');\'
913');
1e44e2bf 914
f1387719
PP
915 join('',@m);
916}
1e44e2bf 917
f1387719 918=item dynamic (o)
1e44e2bf 919
f1387719 920Defines the dynamic target.
1e44e2bf 921
f1387719 922=cut
1e44e2bf 923
f1387719
PP
924sub dynamic {
925# --- Dynamic Loading Sections ---
1e44e2bf 926
f1387719
PP
927 my($self) = shift;
928 '
929## $(INST_PM) has been moved to the all: target.
930## It remains here for awhile to allow for old usage: "make dynamic"
931#dynamic :: '.$self->{MAKEFILE}.' $(INST_DYNAMIC) $(INST_BOOT) $(INST_PM)
932dynamic :: '.$self->{MAKEFILE}.' $(INST_DYNAMIC) $(INST_BOOT)
933 '.$self->{NOECHO}.'$(NOOP)
934';
935}
1e44e2bf 936
f1387719 937=item dynamic_bs (o)
1e44e2bf 938
f1387719 939Defines targets for bootstrap files.
1e44e2bf 940
f1387719 941=cut
1e44e2bf 942
f1387719
PP
943sub dynamic_bs {
944 my($self, %attribs) = @_;
945 return '
946BOOTSTRAP =
947' unless $self->has_link_code();
1e44e2bf 948
f1387719
PP
949 return '
950BOOTSTRAP = '."$self->{BASEEXT}.bs".'
1e44e2bf 951
f1387719
PP
952# As Mkbootstrap might not write a file (if none is required)
953# we use touch to prevent make continually trying to remake it.
954# The DynaLoader only reads a non-empty file.
955$(BOOTSTRAP): '."$self->{MAKEFILE} $self->{BOOTDEP}".' $(INST_ARCHAUTODIR)/.exists
956 '.$self->{NOECHO}.'echo "Running Mkbootstrap for $(NAME) ($(BSLOADLIBS))"
957 '.$self->{NOECHO}.'$(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" \
958 -e \'use ExtUtils::Mkbootstrap;\' \
959 -e \'Mkbootstrap("$(BASEEXT)","$(BSLOADLIBS)");\'
960 '.$self->{NOECHO}.'$(TOUCH) $(BOOTSTRAP)
961 $(CHMOD) 644 $@
1e44e2bf 962
f1387719
PP
963$(INST_BOOT): $(BOOTSTRAP) $(INST_ARCHAUTODIR)/.exists
964 '."$self->{NOECHO}$self->{RM_RF}".' $(INST_BOOT)
965 -'.$self->{CP}.' $(BOOTSTRAP) $(INST_BOOT)
966 $(CHMOD) 644 $@
1e44e2bf 967';
f1387719 968}
1e44e2bf 969
f1387719 970=item dynamic_lib (o)
1e44e2bf 971
f1387719
PP
972Defines how to produce the *.so (or equivalent) files.
973
974=cut
975
976sub dynamic_lib {
977 my($self, %attribs) = @_;
978 return '' unless $self->needs_linking(); #might be because of a subdir
1e44e2bf 979
f1387719 980 return '' unless $self->has_link_code;
f4ae0f5e 981
f1387719
PP
982 my($otherldflags) = $attribs{OTHERLDFLAGS} || "";
983 my($inst_dynamic_dep) = $attribs{INST_DYNAMIC_DEP} || "";
984 my($armaybe) = $attribs{ARMAYBE} || $self->{ARMAYBE} || ":";
985 my($ldfrom) = '$(LDFROM)';
986 $armaybe = 'ar' if ($^O eq 'dec_osf' and $armaybe eq ':');
987 my(@m);
988 push(@m,'
989# This section creates the dynamically loadable $(INST_DYNAMIC)
990# from $(OBJECT) and possibly $(MYEXTLIB).
991ARMAYBE = '.$armaybe.'
992OTHERLDFLAGS = '.$otherldflags.'
993INST_DYNAMIC_DEP = '.$inst_dynamic_dep.'
f4ae0f5e 994
f1387719
PP
995$(INST_DYNAMIC): $(OBJECT) $(MYEXTLIB) $(BOOTSTRAP) $(INST_ARCHAUTODIR)/.exists $(EXPORT_LIST) $(PERL_ARCHIVE) $(INST_DYNAMIC_DEP)
996');
997 if ($armaybe ne ':'){
998 $ldfrom = 'tmp$(LIB_EXT)';
999 push(@m,' $(ARMAYBE) cr '.$ldfrom.' $(OBJECT)'."\n");
1000 push(@m,' $(RANLIB) '."$ldfrom\n");
1001 }
1002 $ldfrom = "-all $ldfrom -none" if ($^O eq 'dec_osf');
1003 push(@m,' LD_RUN_PATH="$(LD_RUN_PATH)" $(LD) -o $@ $(LDDLFLAGS) '.$ldfrom.
042ade60 1004 ' $(OTHERLDFLAGS) $(MYEXTLIB) $(PERL_ARCHIVE) $(LDLOADLIBS) $(EXPORT_LIST)');
f1387719
PP
1005 push @m, '
1006 $(CHMOD) 755 $@
1007';
1e44e2bf 1008
f1387719 1009 push @m, $self->dir_target('$(INST_ARCHAUTODIR)');
1e44e2bf
PP
1010 join('',@m);
1011}
1012
f1387719 1013=item exescan
1e44e2bf 1014
f1387719 1015Deprecated method. Use libscan instead.
1e44e2bf
PP
1016
1017=cut
1018
f1387719
PP
1019sub exescan {
1020 my($self,$path) = @_;
1021 $path;
1e44e2bf
PP
1022}
1023
f1387719 1024=item extliblist
1e44e2bf 1025
f1387719
PP
1026Called by init_others, and calls ext ExtUtils::Liblist. See
1027L<ExtUtils::Liblist> for details.
1e44e2bf
PP
1028
1029=cut
1030
f1387719
PP
1031sub extliblist {
1032 my($self,$libs) = @_;
1033 require ExtUtils::Liblist;
1034 $self->ext($libs, $Verbose);
1035}
f4ae0f5e 1036
f1387719 1037=item file_name_is_absolute
f4ae0f5e 1038
1fef88e7 1039Takes as argument a path and returns true, if it is an absolute path.
1e44e2bf 1040
f1387719 1041=cut
1e44e2bf 1042
f1387719
PP
1043sub file_name_is_absolute {
1044 my($self,$file) = @_;
1045 $file =~ m:^/: ;
1046}
1e44e2bf 1047
f1387719 1048=item find_perl
1e44e2bf 1049
f1387719 1050Finds the executables PERL and FULLPERL
1e44e2bf 1051
f1387719 1052=cut
1e44e2bf 1053
f1387719
PP
1054sub find_perl {
1055 my($self, $ver, $names, $dirs, $trace) = @_;
1056 my($name, $dir);
1057 if ($trace >= 2){
1058 print "Looking for perl $ver by these names:
1059@$names
1060in these dirs:
1061@$dirs
1062";
1063 }
1064 foreach $dir (@$dirs){
1065 next unless defined $dir; # $self->{PERL_SRC} may be undefined
1066 foreach $name (@$names){
a1f8e286 1067 my ($abs, $val);
f1387719
PP
1068 if ($self->file_name_is_absolute($name)) { # /foo/bar
1069 $abs = $name;
1070 } elsif ($self->canonpath($name) eq $self->canonpath(basename($name))) { # foo
1071 $abs = $self->catfile($dir, $name);
1072 } else { # foo/bar
1073 $abs = $self->canonpath($self->catfile($self->curdir, $name));
1074 }
1075 print "Checking $abs\n" if ($trace >= 2);
1076 next unless $self->maybe_command($abs);
1077 print "Executing $abs\n" if ($trace >= 2);
a1f8e286
IZ
1078 $val = `$abs -e 'require $ver; print "VER_OK\n" ' 2>&1`;
1079 if ($val =~ /VER_OK/) {
f1387719
PP
1080 print "Using PERL=$abs\n" if $trace;
1081 return $abs;
a1f8e286
IZ
1082 } elsif ($trace >= 2) {
1083 print "Result: `$val'\n";
1e44e2bf
PP
1084 }
1085 }
1e44e2bf 1086 }
f1387719
PP
1087 print STDOUT "Unable to find a perl $ver (by these names: @$names, in these dirs: @$dirs)\n";
1088 0; # false and not empty
1089}
1e44e2bf 1090
bab2b58e
AK
1091=back
1092
f1387719 1093=head2 Methods to actually produce chunks of text for the Makefile
1e44e2bf 1094
bab2b58e
AK
1095The methods here are called for each MakeMaker object in the order
1096specified by @ExtUtils::MakeMaker::MM_Sections.
1097
1098=over 2
f4ae0f5e 1099
f1387719
PP
1100=item force (o)
1101
1102Just writes FORCE:
1103
1104=cut
1e44e2bf 1105
f1387719
PP
1106sub force {
1107 my($self) = shift;
1108 '# Phony target to force checking subdirectories.
1109FORCE:
1110';
1e44e2bf
PP
1111}
1112
f1387719 1113=item guess_name
1e44e2bf 1114
f1387719
PP
1115Guess the name of this package by examining the working directory's
1116name. MakeMaker calls this only if the developer has not supplied a
1117NAME attribute.
1e44e2bf 1118
f1387719 1119=cut
f4ae0f5e 1120
f1387719
PP
1121# ';
1122
1123sub guess_name {
1124 my($self) = @_;
1125 use Cwd 'cwd';
1126 my $name = basename(cwd());
1127 $name =~ s|[\-_][\d\.\-]+$||; # this is new with MM 5.00, we
1128 # strip minus or underline
1129 # followed by a float or some such
1130 print "Warning: Guessing NAME [$name] from current directory name.\n";
1131 $name;
1132}
1133
1134=item has_link_code
1135
1136Returns true if C, XS, MYEXTLIB or similar objects exist within this
1137object that need a compiler. Does not descend into subdirectories as
1138needs_linking() does.
f4ae0f5e
PP
1139
1140=cut
1141
f1387719
PP
1142sub has_link_code {
1143 my($self) = shift;
1144 return $self->{HAS_LINK_CODE} if defined $self->{HAS_LINK_CODE};
1145 if ($self->{OBJECT} or @{$self->{C} || []} or $self->{MYEXTLIB}){
1146 $self->{HAS_LINK_CODE} = 1;
1147 return 1;
f4ae0f5e 1148 }
f1387719 1149 return $self->{HAS_LINK_CODE} = 0;
f4ae0f5e
PP
1150}
1151
f1387719 1152=item init_dirscan
f4ae0f5e 1153
f1387719
PP
1154Initializes DIR, XS, PM, C, O_FILES, H, PL_FILES, MAN*PODS, EXE_FILES.
1155
1156=cut
1157
1158sub init_dirscan { # --- File and Directory Lists (.xs .pm .pod etc)
1159 my($self) = @_;
1160 my($name, %dir, %xs, %c, %h, %ignore, %pl_files, %manifypods);
1161 local(%pm); #the sub in find() has to see this hash
1162 $ignore{'test.pl'} = 1;
1163 $ignore{'makefile.pl'} = 1 if $Is_VMS;
1164 foreach $name ($self->lsdir($self->curdir)){
1165 next if $name eq $self->curdir or $name eq $self->updir or $ignore{$name};
1166 next unless $self->libscan($name);
1167 if (-d $name){
760ac839 1168 next if -l $name; # We do not support symlinks at all
f1387719
PP
1169 $dir{$name} = $name if (-f $self->catfile($name,"Makefile.PL"));
1170 } elsif ($name =~ /\.xs$/){
1171 my($c); ($c = $name) =~ s/\.xs$/.c/;
1172 $xs{$name} = $c;
1173 $c{$c} = 1;
1174 } elsif ($name =~ /\.c(pp|xx|c)?$/i){ # .c .C .cpp .cxx .cc
1175 $c{$name} = 1
1176 unless $name =~ m/perlmain\.c/; # See MAP_TARGET
1177 } elsif ($name =~ /\.h$/i){
1178 $h{$name} = 1;
1179 } elsif ($name =~ /\.(p[ml]|pod)$/){
1180 $pm{$name} = $self->catfile('$(INST_LIBDIR)',$name);
1181 } elsif ($name =~ /\.PL$/ && $name ne "Makefile.PL") {
1182 ($pl_files{$name} = $name) =~ s/\.PL$// ;
1183 } elsif ($Is_VMS && $name =~ /\.pl$/ && $name ne 'makefile.pl' &&
1184 $name ne 'test.pl') { # case-insensitive filesystem
1185 ($pl_files{$name} = $name) =~ s/\.pl$// ;
1186 }
1187 }
f4ae0f5e 1188
f1387719
PP
1189 # Some larger extensions often wish to install a number of *.pm/pl
1190 # files into the library in various locations.
f4ae0f5e 1191
f1387719
PP
1192 # The attribute PMLIBDIRS holds an array reference which lists
1193 # subdirectories which we should search for library files to
1194 # install. PMLIBDIRS defaults to [ 'lib', $self->{BASEEXT} ]. We
1195 # recursively search through the named directories (skipping any
1196 # which don't exist or contain Makefile.PL files).
f4ae0f5e 1197
f1387719
PP
1198 # For each *.pm or *.pl file found $self->libscan() is called with
1199 # the default installation path in $_[1]. The return value of
1200 # libscan defines the actual installation location. The default
1201 # libscan function simply returns the path. The file is skipped
1202 # if libscan returns false.
f4ae0f5e 1203
f1387719
PP
1204 # The default installation location passed to libscan in $_[1] is:
1205 #
1206 # ./*.pm => $(INST_LIBDIR)/*.pm
1207 # ./xyz/... => $(INST_LIBDIR)/xyz/...
1208 # ./lib/... => $(INST_LIB)/...
1209 #
1210 # In this way the 'lib' directory is seen as the root of the actual
1211 # perl library whereas the others are relative to INST_LIBDIR
1212 # (which includes PARENT_NAME). This is a subtle distinction but one
1213 # that's important for nested modules.
1e44e2bf 1214
f1387719
PP
1215 $self->{PMLIBDIRS} = ['lib', $self->{BASEEXT}]
1216 unless $self->{PMLIBDIRS};
1e44e2bf 1217
f1387719 1218 #only existing directories that aren't in $dir are allowed
1e44e2bf 1219
f1387719
PP
1220 # Avoid $_ wherever possible:
1221 # @{$self->{PMLIBDIRS}} = grep -d && !$dir{$_}, @{$self->{PMLIBDIRS}};
1222 my (@pmlibdirs) = @{$self->{PMLIBDIRS}};
1223 my ($pmlibdir);
1224 @{$self->{PMLIBDIRS}} = ();
1225 foreach $pmlibdir (@pmlibdirs) {
1226 -d $pmlibdir && !$dir{$pmlibdir} && push @{$self->{PMLIBDIRS}}, $pmlibdir;
1e44e2bf 1227 }
1e44e2bf 1228
f1387719
PP
1229 if (@{$self->{PMLIBDIRS}}){
1230 print "Searching PMLIBDIRS: @{$self->{PMLIBDIRS}}\n"
1231 if ($Verbose >= 2);
1232 require File::Find;
1233 File::Find::find(sub {
1234 if (-d $_){
1235 if ($_ eq "CVS" || $_ eq "RCS"){
1236 $File::Find::prune = 1;
1237 }
1238 return;
1239 }
1240 my($path, $prefix) = ($File::Find::name, '$(INST_LIBDIR)');
1241 my($striplibpath,$striplibname);
93f9cb4b 1242 $prefix = '$(INST_LIB)' if (($striplibpath = $path) =~ s:^(\W*)lib\W:$1:i);
f1387719
PP
1243 ($striplibname,$striplibpath) = fileparse($striplibpath);
1244 my($inst) = $self->catfile($prefix,$striplibpath,$striplibname);
1245 local($_) = $inst; # for backwards compatibility
1246 $inst = $self->libscan($inst);
1247 print "libscan($path) => '$inst'\n" if ($Verbose >= 2);
1248 return unless $inst;
1249 $pm{$path} = $inst;
1250 }, @{$self->{PMLIBDIRS}});
1251 }
1e44e2bf 1252
f1387719
PP
1253 $self->{DIR} = [sort keys %dir] unless $self->{DIR};
1254 $self->{XS} = \%xs unless $self->{XS};
1255 $self->{PM} = \%pm unless $self->{PM};
1256 $self->{C} = [sort keys %c] unless $self->{C};
1257 my(@o_files) = @{$self->{C}};
1258 $self->{O_FILES} = [grep s/\.c(pp|xx|c)?$/$self->{OBJ_EXT}/i, @o_files] ;
1259 $self->{H} = [sort keys %h] unless $self->{H};
1260 $self->{PL_FILES} = \%pl_files unless $self->{PL_FILES};
1e44e2bf 1261
f1387719
PP
1262 # Set up names of manual pages to generate from pods
1263 if ($self->{MAN1PODS}) {
1264 } elsif ( $self->{INST_MAN1DIR} =~ /^(none|\s*)$/ ) {
1265 $self->{MAN1PODS} = {};
1266 } else {
1267 my %manifypods = ();
1268 if ( exists $self->{EXE_FILES} ) {
1269 foreach $name (@{$self->{EXE_FILES}}) {
1270# use FileHandle ();
1271# my $fh = new FileHandle;
1272 local *FH;
1273 my($ispod)=0;
1274 # one day test, if $/ can be set to '' safely (is the bug fixed that was in 5.001m?)
1275# if ($fh->open("<$name")) {
1276 if (open(FH,"<$name")) {
1277# while (<$fh>) {
1278 while (<FH>) {
1279 if (/^=head1\s+\w+/) {
1280 $ispod=1;
1281 last;
1282 }
1283 }
1284# $fh->close;
1285 close FH;
1286 } else {
1287 # If it doesn't exist yet, we assume, it has pods in it
1288 $ispod = 1;
1e44e2bf 1289 }
f1387719
PP
1290 if( $ispod ) {
1291 $manifypods{$name} = $self->catfile('$(INST_MAN1DIR)',basename($name).'.$(MAN1EXT)');
1e44e2bf 1292 }
f1387719 1293 }
1e44e2bf 1294 }
f1387719 1295 $self->{MAN1PODS} = \%manifypods;
1e44e2bf 1296 }
f1387719
PP
1297 if ($self->{MAN3PODS}) {
1298 } elsif ( $self->{INST_MAN3DIR} =~ /^(none|\s*)$/ ) {
1299 $self->{MAN3PODS} = {};
1e44e2bf 1300 } else {
f1387719
PP
1301 my %manifypods = (); # we collect the keys first, i.e. the files
1302 # we have to convert to pod
1303 foreach $name (keys %{$self->{PM}}) {
1304 if ($name =~ /\.pod$/ ) {
1305 $manifypods{$name} = $self->{PM}{$name};
1306 } elsif ($name =~ /\.p[ml]$/ ) {
1307# use FileHandle ();
1308# my $fh = new FileHandle;
1309 local *FH;
1310 my($ispod)=0;
1311# $fh->open("<$name");
1312 if (open(FH,"<$name")) {
1313 # while (<$fh>) {
1314 while (<FH>) {
1315 if (/^=head1\s+\w+/) {
1316 $ispod=1;
1317 last;
1318 }
1319 }
1320 # $fh->close;
1321 close FH;
1322 } else {
1323 $ispod = 1;
1324 }
1325 if( $ispod ) {
1326 $manifypods{$name} = $self->{PM}{$name};
1327 }
1328 }
1329 }
1330
1331 # Remove "Configure.pm" and similar, if it's not the only pod listed
1332 # To force inclusion, just name it "Configure.pod", or override MAN3PODS
1333 foreach $name (keys %manifypods) {
1334 if ($name =~ /(config|setup).*\.pm/i) {
1335 delete $manifypods{$name};
1336 next;
1337 }
1338 my($manpagename) = $name;
1339 unless ($manpagename =~ s!^\W*lib\W+!!) { # everything below lib is ok
1340 $manpagename = $self->catfile(split(/::/,$self->{PARENT_NAME}),$manpagename);
1341 }
1342 $manpagename =~ s/\.p(od|m|l)$//;
1343 $manpagename = $self->replace_manpage_separator($manpagename);
1344 $manifypods{$name} = $self->catfile("\$(INST_MAN3DIR)","$manpagename.\$(MAN3EXT)");
1e44e2bf 1345 }
f1387719 1346 $self->{MAN3PODS} = \%manifypods;
1e44e2bf 1347 }
f1387719 1348}
1e44e2bf 1349
f1387719 1350=item init_main
1e44e2bf 1351
f1387719
PP
1352Initializes NAME, FULLEXT, BASEEXT, PARENT_NAME, DLBASE, PERL_SRC,
1353PERL_LIB, PERL_ARCHLIB, PERL_INC, INSTALLDIRS, INST_*, INSTALL*,
1354PREFIX, CONFIG, AR, AR_STATIC_ARGS, LD, OBJ_EXT, LIB_EXT, MAP_TARGET,
1355LIBPERL_A, VERSION_FROM, VERSION, DISTNAME, VERSION_SYM.
f4ae0f5e 1356
f1387719 1357=cut
1e44e2bf 1358
f1387719
PP
1359sub init_main {
1360 my($self) = @_;
1e44e2bf 1361
f1387719 1362 # --- Initialize Module Name and Paths
1e44e2bf 1363
f1387719
PP
1364 # NAME = Foo::Bar::Oracle
1365 # FULLEXT = Foo/Bar/Oracle
1366 # BASEEXT = Oracle
1367 # ROOTEXT = Directory part of FULLEXT with leading /. !!! Deprecated from MM 5.32 !!!
1368 # PARENT_NAME = Foo::Bar
1369### Only UNIX:
1370### ($self->{FULLEXT} =
1371### $self->{NAME}) =~ s!::!/!g ; #eg. BSD/Foo/Socket
1372 $self->{FULLEXT} = $self->catdir(split /::/, $self->{NAME});
1e44e2bf 1373
1e44e2bf 1374
f1387719 1375 # Copied from DynaLoader:
1e44e2bf 1376
f1387719
PP
1377 my(@modparts) = split(/::/,$self->{NAME});
1378 my($modfname) = $modparts[-1];
1e44e2bf 1379
f1387719
PP
1380 # Some systems have restrictions on files names for DLL's etc.
1381 # mod2fname returns appropriate file base name (typically truncated)
1382 # It may also edit @modparts if required.
1383 if (defined &DynaLoader::mod2fname) {
1384 $modfname = &DynaLoader::mod2fname(\@modparts);
bab2b58e 1385 }
1e44e2bf 1386
f1387719
PP
1387 ($self->{PARENT_NAME}, $self->{BASEEXT}) = $self->{NAME} =~ m!([\w:]+::)?(\w+)$! ;
1388
760ac839 1389 if (defined &DynaLoader::mod2fname) {
f1387719
PP
1390 # As of 5.001m, dl_os2 appends '_'
1391 $self->{DLBASE} = $modfname;
1392 } else {
1393 $self->{DLBASE} = '$(BASEEXT)';
1394 }
1395
1e44e2bf 1396
f1387719
PP
1397 ### ROOTEXT deprecated from MM 5.32
1398### ($self->{ROOTEXT} =
1399### $self->{FULLEXT}) =~ s#/?\Q$self->{BASEEXT}\E$## ; #eg. /BSD/Foo
1400### $self->{ROOTEXT} = ($Is_VMS ? '' : '/') . $self->{ROOTEXT} if $self->{ROOTEXT};
1e44e2bf 1401
1e44e2bf 1402
f1387719 1403 # --- Initialize PERL_LIB, INST_LIB, PERL_SRC
1e44e2bf 1404
f1387719
PP
1405 # *Real* information: where did we get these two from? ...
1406 my $inc_config_dir = dirname($INC{'Config.pm'});
1407 my $inc_carp_dir = dirname($INC{'Carp.pm'});
1e44e2bf 1408
f1387719
PP
1409 unless ($self->{PERL_SRC}){
1410 my($dir);
1411 foreach $dir ($self->updir(),$self->catdir($self->updir(),$self->updir()),$self->catdir($self->updir(),$self->updir(),$self->updir())){
1412 if (
1413 -f $self->catfile($dir,"config.sh")
1414 &&
1415 -f $self->catfile($dir,"perl.h")
1416 &&
1417 -f $self->catfile($dir,"lib","Exporter.pm")
1418 ) {
1419 $self->{PERL_SRC}=$dir ;
1420 last;
1421 }
1422 }
1423 }
1424 if ($self->{PERL_SRC}){
1425 $self->{PERL_LIB} ||= $self->catdir("$self->{PERL_SRC}","lib");
1426 $self->{PERL_ARCHLIB} = $self->{PERL_LIB};
1427 $self->{PERL_INC} = $self->{PERL_SRC};
1428 # catch a situation that has occurred a few times in the past:
1e44e2bf 1429
bab2b58e
AK
1430 unless (
1431 -s $self->catfile($self->{PERL_SRC},'cflags')
1432 or
1433 $Is_VMS
1434 &&
1435 -s $self->catfile($self->{PERL_SRC},'perlshr_attr.opt')
1436 or
1437 $Is_Mac
1438 ){
1439 warn qq{
f1387719
PP
1440You cannot build extensions below the perl source tree after executing
1441a 'make clean' in the perl source tree.
1e44e2bf 1442
f1387719
PP
1443To rebuild extensions distributed with the perl source you should
1444simply Configure (to include those extensions) and then build perl as
1445normal. After installing perl the source tree can be deleted. It is
1446not needed for building extensions by running 'perl Makefile.PL'
1447usually without extra arguments.
1e44e2bf 1448
f1387719
PP
1449It is recommended that you unpack and build additional extensions away
1450from the perl source tree.
bab2b58e
AK
1451};
1452 }
f1387719
PP
1453 } else {
1454 # we should also consider $ENV{PERL5LIB} here
1455 $self->{PERL_LIB} ||= $Config::Config{privlibexp};
1456 $self->{PERL_ARCHLIB} ||= $Config::Config{archlibexp};
1457 $self->{PERL_INC} = $self->catdir("$self->{PERL_ARCHLIB}","CORE"); # wild guess for now
1458 my $perl_h;
bab2b58e
AK
1459 unless (-f ($perl_h = $self->catfile($self->{PERL_INC},"perl.h"))){
1460 die qq{
f1387719 1461Error: Unable to locate installed Perl libraries or Perl source code.
f4ae0f5e 1462
f1387719 1463It is recommended that you install perl in a standard location before
bab2b58e
AK
1464building extensions. Some precompiled versions of perl do not contain
1465these header files, so you cannot build extensions. In such a case,
1466please build and install your perl from a fresh perl distribution. It
1467usually solves this kind of problem.
f4ae0f5e 1468
bab2b58e
AK
1469\(You get this message, because MakeMaker could not find "$perl_h"\)
1470};
1471 }
f1387719
PP
1472# print STDOUT "Using header files found in $self->{PERL_INC}\n"
1473# if $Verbose && $self->needs_linking();
1e44e2bf 1474
f1387719 1475 }
1e44e2bf 1476
f1387719
PP
1477 # We get SITELIBEXP and SITEARCHEXP directly via
1478 # Get_from_Config. When we are running standard modules, these
1479 # won't matter, we will set INSTALLDIRS to "perl". Otherwise we
1480 # set it to "site". I prefer that INSTALLDIRS be set from outside
1481 # MakeMaker.
1482 $self->{INSTALLDIRS} ||= "site";
1e44e2bf 1483
f1387719
PP
1484 # INST_LIB typically pre-set if building an extension after
1485 # perl has been built and installed. Setting INST_LIB allows
1486 # you to build directly into, say $Config::Config{privlibexp}.
1487 unless ($self->{INST_LIB}){
1e44e2bf 1488
1e44e2bf 1489
f1387719 1490 ##### XXXXX We have to change this nonsense
1e44e2bf 1491
f1387719
PP
1492 if (defined $self->{PERL_SRC} and $self->{INSTALLDIRS} eq "perl") {
1493 $self->{INST_LIB} = $self->{INST_ARCHLIB} = $self->{PERL_LIB};
1494 } else {
1495 $self->{INST_LIB} = $self->catdir($self->curdir,"blib","lib");
1496 }
1497 }
1498 $self->{INST_ARCHLIB} ||= $self->catdir($self->curdir,"blib","arch");
1499 $self->{INST_BIN} ||= $self->catdir($self->curdir,'blib','bin');
1e44e2bf 1500
93f9cb4b
PP
1501 # We need to set up INST_LIBDIR before init_libscan() for VMS
1502 my @parentdir = split(/::/, $self->{PARENT_NAME});
1503 $self->{INST_LIBDIR} = $self->catdir('$(INST_LIB)',@parentdir);
1504 $self->{INST_ARCHLIBDIR} = $self->catdir('$(INST_ARCHLIB)',@parentdir);
1505 $self->{INST_AUTODIR} = $self->catdir('$(INST_LIB)','auto','$(FULLEXT)');
1506 $self->{INST_ARCHAUTODIR} = $self->catdir('$(INST_ARCHLIB)','auto','$(FULLEXT)');
1507
f1387719
PP
1508 # INST_EXE is deprecated, should go away March '97
1509 $self->{INST_EXE} ||= $self->catdir($self->curdir,'blib','script');
1510 $self->{INST_SCRIPT} ||= $self->catdir($self->curdir,'blib','script');
1e44e2bf 1511
f1387719
PP
1512 # The user who requests an installation directory explicitly
1513 # should not have to tell us a architecture installation directory
bab2b58e 1514 # as well. We look if a directory exists that is named after the
f1387719
PP
1515 # architecture. If not we take it as a sign that it should be the
1516 # same as the requested installation directory. Otherwise we take
1517 # the found one.
1518 # We do the same thing twice: for privlib/archlib and for sitelib/sitearch
1519 my($libpair);
1520 for $libpair ({l=>"privlib", a=>"archlib"}, {l=>"sitelib", a=>"sitearch"}) {
1521 my $lib = "install$libpair->{l}";
1522 my $Lib = uc $lib;
1523 my $Arch = uc "install$libpair->{a}";
1524 if( $self->{$Lib} && ! $self->{$Arch} ){
1525 my($ilib) = $Config{$lib};
1526 $ilib = VMS::Filespec::unixify($ilib) if $Is_VMS;
1e44e2bf 1527
f1387719
PP
1528 $self->prefixify($Arch,$ilib,$self->{$Lib});
1529
1530 unless (-d $self->{$Arch}) {
1531 print STDOUT "Directory $self->{$Arch} not found, thusly\n" if $Verbose;
1532 $self->{$Arch} = $self->{$Lib};
1533 }
1534 print STDOUT "Defaulting $Arch to $self->{$Arch}\n" if $Verbose;
1535 }
1e44e2bf 1536 }
f4ae0f5e 1537
f1387719
PP
1538 # we have to look at the relation between $Config{prefix} and the
1539 # requested values. We're going to set the $Config{prefix} part of
1540 # all the installation path variables to literally $(PREFIX), so
1541 # the user can still say make PREFIX=foo
bab2b58e 1542 my($configure_prefix) = $Config{'prefix'};
f1387719 1543 $prefix = VMS::Filespec::unixify($prefix) if $Is_VMS;
bab2b58e
AK
1544 $self->{PREFIX} ||= $configure_prefix;
1545
1546
1547 my($install_variable,$search_prefix,$replace_prefix);
1548
1549 # The rule, taken from Configure, is that if prefix contains perl,
1550 # we shape the tree
1551 # perlprefix/lib/ INSTALLPRIVLIB
1552 # perlprefix/lib/pod/
1553 # perlprefix/lib/site_perl/ INSTALLSITELIB
1554 # perlprefix/bin/ INSTALLBIN
1555 # perlprefix/man/ INSTALLMAN1DIR
1556 # else
1557 # prefix/lib/perl5/ INSTALLPRIVLIB
1558 # prefix/lib/perl5/pod/
1559 # prefix/lib/perl5/site_perl/ INSTALLSITELIB
1560 # prefix/bin/ INSTALLBIN
1561 # prefix/lib/perl5/man/ INSTALLMAN1DIR
1562
1563 $replace_prefix = qq[\$\(PREFIX\)];
1564 for $install_variable (qw/
1565 INSTALLBIN
1566 INSTALLSCRIPT
1567 /) {
1568 $self->prefixify($install_variable,$configure_prefix,$replace_prefix);
1569 }
1570 $search_prefix = $configure_prefix =~ /perl/ ?
1571 $self->catdir($configure_prefix,"lib") :
1572 $self->catdir($configure_prefix,"lib","perl5");
1573 if ($self->{LIB}) {
1574 $self->{INSTALLPRIVLIB} = $self->{INSTALLSITELIB} = $self->{LIB};
1575 $self->{INSTALLARCHLIB} = $self->{INSTALLSITEARCH} =
1576 $self->catdir($self->{LIB},$Config{'archname'});
1577 } else {
1578 $replace_prefix = $self->{PREFIX} =~ /perl/ ?
1579 $self->catdir(qq[\$\(PREFIX\)],"lib") :
1580 $self->catdir(qq[\$\(PREFIX\)],"lib","perl5");
1581 for $install_variable (qw/
1582 INSTALLPRIVLIB
1583 INSTALLARCHLIB
1584 INSTALLSITELIB
1585 INSTALLSITEARCH
1586 /) {
1587 $self->prefixify($install_variable,$search_prefix,$replace_prefix);
1588 }
f1387719 1589 }
bab2b58e
AK
1590 $search_prefix = $configure_prefix =~ /perl/ ?
1591 $self->catdir($configure_prefix,"man") :
1592 $self->catdir($configure_prefix,"lib","perl5","man");
1593 $replace_prefix = $self->{PREFIX} =~ /perl/ ?
1594 $self->catdir(qq[\$\(PREFIX\)],"man") :
1595 $self->catdir(qq[\$\(PREFIX\)],"lib","perl5","man");
f1387719 1596 for $install_variable (qw/
bab2b58e
AK
1597 INSTALLMAN1DIR
1598 INSTALLMAN3DIR
f1387719 1599 /) {
bab2b58e 1600 $self->prefixify($install_variable,$search_prefix,$replace_prefix);
f1387719 1601 }
1e44e2bf 1602
f1387719
PP
1603 # Now we head at the manpages. Maybe they DO NOT want manpages
1604 # installed
1605 $self->{INSTALLMAN1DIR} = $Config::Config{installman1dir}
1606 unless defined $self->{INSTALLMAN1DIR};
1607 unless (defined $self->{INST_MAN1DIR}){
1608 if ($self->{INSTALLMAN1DIR} =~ /^(none|\s*)$/){
1609 $self->{INST_MAN1DIR} = $self->{INSTALLMAN1DIR};
1610 } else {
1611 $self->{INST_MAN1DIR} = $self->catdir($self->curdir,'blib','man1');
1612 }
1613 }
1614 $self->{MAN1EXT} ||= $Config::Config{man1ext};
1e44e2bf 1615
f1387719
PP
1616 $self->{INSTALLMAN3DIR} = $Config::Config{installman3dir}
1617 unless defined $self->{INSTALLMAN3DIR};
1618 unless (defined $self->{INST_MAN3DIR}){
1619 if ($self->{INSTALLMAN3DIR} =~ /^(none|\s*)$/){
1620 $self->{INST_MAN3DIR} = $self->{INSTALLMAN3DIR};
1621 } else {
1622 $self->{INST_MAN3DIR} = $self->catdir($self->curdir,'blib','man3');
1623 }
1e44e2bf 1624 }
f1387719
PP
1625 $self->{MAN3EXT} ||= $Config::Config{man3ext};
1626
1627
1628 # Get some stuff out of %Config if we haven't yet done so
1629 print STDOUT "CONFIG must be an array ref\n"
1630 if ($self->{CONFIG} and ref $self->{CONFIG} ne 'ARRAY');
1631 $self->{CONFIG} = [] unless (ref $self->{CONFIG});
1632 push(@{$self->{CONFIG}}, @ExtUtils::MakeMaker::Get_from_Config);
1633 push(@{$self->{CONFIG}}, 'shellflags') if $Config::Config{shellflags};
1634 my(%once_only,$m);
1635 foreach $m (@{$self->{CONFIG}}){
1636 next if $once_only{$m};
1637 print STDOUT "CONFIG key '$m' does not exist in Config.pm\n"
1638 unless exists $Config::Config{$m};
1639 $self->{uc $m} ||= $Config::Config{$m};
1640 $once_only{$m} = 1;
1e44e2bf 1641 }
1e44e2bf 1642
f1387719
PP
1643# This is too dangerous:
1644# if ($^O eq "next") {
1645# $self->{AR} = "libtool";
1646# $self->{AR_STATIC_ARGS} = "-o";
1647# }
1648# But I leave it as a placeholder
1e44e2bf 1649
f1387719 1650 $self->{AR_STATIC_ARGS} ||= "cr";
1e44e2bf 1651
f1387719
PP
1652 # These should never be needed
1653 $self->{LD} ||= 'ld';
1654 $self->{OBJ_EXT} ||= '.o';
1655 $self->{LIB_EXT} ||= '.a';
1656
1657 $self->{MAP_TARGET} ||= "perl";
1658
1659 $self->{LIBPERL_A} ||= "libperl$self->{LIB_EXT}";
1660
1661 # make a simple check if we find Exporter
1662 warn "Warning: PERL_LIB ($self->{PERL_LIB}) seems not to be a perl library directory
1663 (Exporter.pm not found)"
1664 unless -f $self->catfile("$self->{PERL_LIB}","Exporter.pm") ||
1665 $self->{NAME} eq "ExtUtils::MakeMaker";
1e44e2bf 1666
f1387719
PP
1667 # Determine VERSION and VERSION_FROM
1668 ($self->{DISTNAME}=$self->{NAME}) =~ s#(::)#-#g unless $self->{DISTNAME};
1669 if ($self->{VERSION_FROM}){
1670 $self->{VERSION} = $self->parse_version($self->{VERSION_FROM}) or
1671 Carp::carp "WARNING: Setting VERSION via file '$self->{VERSION_FROM}' failed\n"
1e44e2bf 1672 }
f1387719
PP
1673
1674 # strip blanks
1675 if ($self->{VERSION}) {
1676 $self->{VERSION} =~ s/^\s+//;
1677 $self->{VERSION} =~ s/\s+$//;
1e44e2bf 1678 }
1e44e2bf 1679
f1387719
PP
1680 $self->{VERSION} ||= "0.10";
1681 ($self->{VERSION_SYM} = $self->{VERSION}) =~ s/\W/_/g;
1e44e2bf
PP
1682
1683
f1387719
PP
1684 # Graham Barr and Paul Marquess had some ideas how to ensure
1685 # version compatibility between the *.pm file and the
1686 # corresponding *.xs file. The bottomline was, that we need an
1687 # XS_VERSION macro that defaults to VERSION:
1688 $self->{XS_VERSION} ||= $self->{VERSION};
1e44e2bf 1689
f1387719
PP
1690 # --- Initialize Perl Binary Locations
1691
1692 # Find Perl 5. The only contract here is that both 'PERL' and 'FULLPERL'
1693 # will be working versions of perl 5. miniperl has priority over perl
1694 # for PERL to ensure that $(PERL) is usable while building ./ext/*
1695 my ($component,@defpath);
1696 foreach $component ($self->{PERL_SRC}, $self->path(), $Config::Config{binexp}) {
1697 push @defpath, $component if defined $component;
1e44e2bf 1698 }
f1387719
PP
1699 $self->{PERL} =
1700 $self->find_perl(5.0, [ $^X, 'miniperl','perl','perl5',"perl$]" ],
1701 \@defpath, $Verbose ) unless ($self->{PERL});
1702 # don't check if perl is executable, maybe they have decided to
1703 # supply switches with perl
1704
1705 # Define 'FULLPERL' to be a non-miniperl (used in test: target)
1706 ($self->{FULLPERL} = $self->{PERL}) =~ s/miniperl/perl/i
1707 unless ($self->{FULLPERL});
1e44e2bf
PP
1708}
1709
f1387719 1710=item init_others
1e44e2bf 1711
f1387719
PP
1712Initializes EXTRALIBS, BSLOADLIBS, LDLOADLIBS, LIBS, LD_RUN_PATH,
1713OBJECT, BOOTDEP, PERLMAINCC, LDFROM, LINKTYPE, NOOP, FIRST_MAKEFILE,
1714MAKEFILE, NOECHO, RM_F, RM_RF, TOUCH, CP, MV, CHMOD, UMASK_NULL
1e44e2bf
PP
1715
1716=cut
1717
f1387719 1718sub init_others { # --- Initialize Other Attributes
1e44e2bf 1719 my($self) = shift;
1e44e2bf 1720
f1387719
PP
1721 # Compute EXTRALIBS, BSLOADLIBS and LDLOADLIBS from $self->{LIBS}
1722 # Lets look at $self->{LIBS} carefully: It may be an anon array, a string or
1723 # undefined. In any case we turn it into an anon array:
1e44e2bf 1724
f1387719
PP
1725 # May check $Config{libs} too, thus not empty.
1726 $self->{LIBS}=[''] unless $self->{LIBS};
f4ae0f5e 1727
a1f8e286 1728 $self->{LIBS}=[$self->{LIBS}] if ref \$self->{LIBS} eq 'SCALAR';
f1387719
PP
1729 $self->{LD_RUN_PATH} = "";
1730 my($libs);
1731 foreach $libs ( @{$self->{LIBS}} ){
1732 $libs =~ s/^\s*(.*\S)\s*$/$1/; # remove leading and trailing whitespace
1733 my(@libs) = $self->extliblist($libs);
1734 if ($libs[0] or $libs[1] or $libs[2]){
1735 # LD_RUN_PATH now computed by ExtUtils::Liblist
1736 ($self->{EXTRALIBS}, $self->{BSLOADLIBS}, $self->{LDLOADLIBS}, $self->{LD_RUN_PATH}) = @libs;
1737 last;
1738 }
1739 }
f4ae0f5e 1740
f1387719
PP
1741 if ( $self->{OBJECT} ) {
1742 $self->{OBJECT} =~ s!\.o(bj)?\b!\$(OBJ_EXT)!g;
1743 } else {
1744 # init_dirscan should have found out, if we have C files
1745 $self->{OBJECT} = "";
1746 $self->{OBJECT} = '$(BASEEXT)$(OBJ_EXT)' if @{$self->{C}||[]};
1e44e2bf 1747 }
f1387719
PP
1748 $self->{OBJECT} =~ s/\n+/ \\\n\t/g;
1749 $self->{BOOTDEP} = (-f "$self->{BASEEXT}_BS") ? "$self->{BASEEXT}_BS" : "";
1750 $self->{PERLMAINCC} ||= '$(CC)';
1751 $self->{LDFROM} = '$(OBJECT)' unless $self->{LDFROM};
1e44e2bf 1752
f1387719
PP
1753 # Sanity check: don't define LINKTYPE = dynamic if we're skipping
1754 # the 'dynamic' section of MM. We don't have this problem with
1755 # 'static', since we either must use it (%Config says we can't
1756 # use dynamic loading) or the caller asked for it explicitly.
1757 if (!$self->{LINKTYPE}) {
1758 $self->{LINKTYPE} = $self->{SKIPHASH}{'dynamic'}
1759 ? 'static'
1760 : ($Config::Config{usedl} ? 'dynamic' : 'static');
1761 };
1762
1763 # These get overridden for VMS and maybe some other systems
55497cff 1764 $self->{NOOP} ||= '$(SHELL) -c true';
f1387719
PP
1765 $self->{FIRST_MAKEFILE} ||= "Makefile";
1766 $self->{MAKEFILE} ||= $self->{FIRST_MAKEFILE};
1767 $self->{MAKE_APERL_FILE} ||= "Makefile.aperl";
1768 $self->{NOECHO} = '@' unless defined $self->{NOECHO};
1769 $self->{RM_F} ||= "rm -f";
1770 $self->{RM_RF} ||= "rm -rf";
1771 $self->{TOUCH} ||= "touch";
1772 $self->{CP} ||= "cp";
1773 $self->{MV} ||= "mv";
1774 $self->{CHMOD} ||= "chmod";
1775 $self->{UMASK_NULL} ||= "umask 0";
1e44e2bf
PP
1776}
1777
f1387719 1778=item install (o)
1e44e2bf 1779
f1387719 1780Defines the install target.
1e44e2bf
PP
1781
1782=cut
1783
f1387719
PP
1784sub install {
1785 my($self, %attribs) = @_;
1e44e2bf 1786 my(@m);
a5f75d66 1787
f1387719
PP
1788 push @m, q{
1789install :: all pure_install doc_install
1e44e2bf 1790
f1387719 1791install_perl :: all pure_perl_install doc_perl_install
1e44e2bf 1792
f1387719 1793install_site :: all pure_site_install doc_site_install
1e44e2bf 1794
f1387719
PP
1795install_ :: install_site
1796 @echo INSTALLDIRS not defined, defaulting to INSTALLDIRS=site
1e44e2bf 1797
f1387719 1798pure_install :: pure_$(INSTALLDIRS)_install
1e44e2bf 1799
f1387719
PP
1800doc_install :: doc_$(INSTALLDIRS)_install
1801 }.$self->{NOECHO}.q{echo Appending installation info to $(INSTALLARCHLIB)/perllocal.pod
1e44e2bf 1802
f1387719
PP
1803pure__install : pure_site_install
1804 @echo INSTALLDIRS not defined, defaulting to INSTALLDIRS=site
1e44e2bf 1805
f1387719
PP
1806doc__install : doc_site_install
1807 @echo INSTALLDIRS not defined, defaulting to INSTALLDIRS=site
1e44e2bf 1808
f1387719
PP
1809pure_perl_install ::
1810 }.$self->{NOECHO}.q{$(MOD_INSTALL) \
1811 read }.$self->catfile('$(PERL_ARCHLIB)','auto','$(FULLEXT)','.packlist').q{ \
1812 write }.$self->catfile('$(INSTALLARCHLIB)','auto','$(FULLEXT)','.packlist').q{ \
1813 $(INST_LIB) $(INSTALLPRIVLIB) \
1814 $(INST_ARCHLIB) $(INSTALLARCHLIB) \
1815 $(INST_BIN) $(INSTALLBIN) \
1816 $(INST_SCRIPT) $(INSTALLSCRIPT) \
1817 $(INST_MAN1DIR) $(INSTALLMAN1DIR) \
1818 $(INST_MAN3DIR) $(INSTALLMAN3DIR)
1819 }.$self->{NOECHO}.q{$(WARN_IF_OLD_PACKLIST) \
1820 }.$self->catdir('$(SITEARCHEXP)','auto','$(FULLEXT)').q{
1e44e2bf 1821
1e44e2bf 1822
f1387719
PP
1823pure_site_install ::
1824 }.$self->{NOECHO}.q{$(MOD_INSTALL) \
1825 read }.$self->catfile('$(SITEARCHEXP)','auto','$(FULLEXT)','.packlist').q{ \
1826 write }.$self->catfile('$(INSTALLSITEARCH)','auto','$(FULLEXT)','.packlist').q{ \
1827 $(INST_LIB) $(INSTALLSITELIB) \
1828 $(INST_ARCHLIB) $(INSTALLSITEARCH) \
1829 $(INST_BIN) $(INSTALLBIN) \
1830 $(INST_SCRIPT) $(INSTALLSCRIPT) \
1831 $(INST_MAN1DIR) $(INSTALLMAN1DIR) \
1832 $(INST_MAN3DIR) $(INSTALLMAN3DIR)
1833 }.$self->{NOECHO}.q{$(WARN_IF_OLD_PACKLIST) \
1834 }.$self->catdir('$(PERL_ARCHLIB)','auto','$(FULLEXT)').q{
1e44e2bf 1835
f1387719
PP
1836doc_perl_install ::
1837 }.$self->{NOECHO}.q{$(DOC_INSTALL) \
dbc738d9 1838 "Module" "$(NAME)" \
f1387719
PP
1839 "installed into" "$(INSTALLPRIVLIB)" \
1840 LINKTYPE "$(LINKTYPE)" \
1841 VERSION "$(VERSION)" \
1842 EXE_FILES "$(EXE_FILES)" \
1843 >> }.$self->catfile('$(INSTALLARCHLIB)','perllocal.pod').q{
1e44e2bf 1844
f1387719
PP
1845doc_site_install ::
1846 }.$self->{NOECHO}.q{$(DOC_INSTALL) \
dbc738d9 1847 "Module" "$(NAME)" \
f1387719
PP
1848 "installed into" "$(INSTALLSITELIB)" \
1849 LINKTYPE "$(LINKTYPE)" \
1850 VERSION "$(VERSION)" \
1851 EXE_FILES "$(EXE_FILES)" \
1852 >> }.$self->catfile('$(INSTALLARCHLIB)','perllocal.pod').q{
1e44e2bf 1853
f1387719 1854};
1e44e2bf 1855
f1387719
PP
1856 push @m, q{
1857uninstall :: uninstall_from_$(INSTALLDIRS)dirs
f4ae0f5e 1858
f1387719
PP
1859uninstall_from_perldirs ::
1860 }.$self->{NOECHO}.
1861 q{$(UNINSTALL) }.$self->catfile('$(PERL_ARCHLIB)','auto','$(FULLEXT)','.packlist').q{
1e44e2bf 1862
f1387719
PP
1863uninstall_from_sitedirs ::
1864 }.$self->{NOECHO}.
1865 q{$(UNINSTALL) }.$self->catfile('$(SITEARCHEXP)','auto','$(FULLEXT)','.packlist').q{
1866};
1e44e2bf 1867
f1387719
PP
1868 join("",@m);
1869}
1e44e2bf 1870
f1387719 1871=item installbin (o)
1e44e2bf 1872
f1387719 1873Defines targets to install EXE_FILES.
1e44e2bf 1874
f1387719 1875=cut
1e44e2bf 1876
f1387719
PP
1877sub installbin {
1878 my($self) = shift;
1879 return "" unless $self->{EXE_FILES} && ref $self->{EXE_FILES} eq "ARRAY";
1880 return "" unless @{$self->{EXE_FILES}};
1881 my(@m, $from, $to, %fromto, @to);
1882 push @m, $self->dir_target(qw[$(INST_SCRIPT)]);
1883 for $from (@{$self->{EXE_FILES}}) {
1884 my($path)= $self->catfile('$(INST_SCRIPT)', basename($from));
1885 local($_) = $path; # for backwards compatibility
1886 $to = $self->libscan($path);
1887 print "libscan($from) => '$to'\n" if ($Verbose >=2);
1888 $fromto{$from}=$to;
1889 }
1890 @to = values %fromto;
1891 push(@m, "
1892EXE_FILES = @{$self->{EXE_FILES}}
1e44e2bf 1893
f1387719 1894all :: @to
1e44e2bf 1895
f1387719
PP
1896realclean ::
1897 $self->{RM_F} @to
1898");
1e44e2bf 1899
f1387719
PP
1900 while (($from,$to) = each %fromto) {
1901 last unless defined $from;
1902 my $todir = dirname($to);
1903 push @m, "
1904$to: $from $self->{MAKEFILE} $todir/.exists
1905 $self->{NOECHO}$self->{RM_F} $to
1906 $self->{CP} $from $to
1907";
1e44e2bf 1908 }
f1387719
PP
1909 join "", @m;
1910}
1e44e2bf 1911
f1387719 1912=item libscan (o)
1e44e2bf 1913
f1387719
PP
1914Takes a path to a file that is found by init_dirscan and returns false
1915if we don't want to include this file in the library. Mainly used to
1916exclude RCS, CVS, and SCCS directories from installation.
1e44e2bf 1917
f1387719 1918=cut
1e44e2bf 1919
f1387719 1920# ';
1e44e2bf 1921
f1387719
PP
1922sub libscan {
1923 my($self,$path) = @_;
1924 return '' if $path =~ m:\b(RCS|CVS|SCCS)\b: ;
1925 $path;
1e44e2bf
PP
1926}
1927
f4ae0f5e 1928=item linkext (o)
1e44e2bf 1929
f4ae0f5e 1930Defines the linkext target which in turn defines the LINKTYPE.
1e44e2bf
PP
1931
1932=cut
1933
1934sub linkext {
1935 my($self, %attribs) = @_;
1e44e2bf
PP
1936 # LINKTYPE => static or dynamic or ''
1937 my($linktype) = defined $attribs{LINKTYPE} ?
1938 $attribs{LINKTYPE} : '$(LINKTYPE)';
1939 "
1940linkext :: $linktype
f4ae0f5e 1941 $self->{NOECHO}\$(NOOP)
1e44e2bf
PP
1942";
1943}
1944
f1387719 1945=item lsdir
1e44e2bf 1946
f1387719
PP
1947Takes as arguments a directory name and a regular expression. Returns
1948all entries in the directory that match the regular expression.
1e44e2bf
PP
1949
1950=cut
1951
f1387719
PP
1952sub lsdir {
1953 my($self) = shift;
1954 my($dir, $regex) = @_;
1955 my(@ls);
1956 my $dh = new DirHandle;
1957 $dh->open($dir || ".") or return ();
1958 @ls = $dh->read;
1959 $dh->close;
1960 @ls = grep(/$regex/, @ls) if $regex;
1961 @ls;
1962}
1963
1964=item macro (o)
1965
1966Simple subroutine to insert the macros defined by the macro attribute
1967into the Makefile.
1968
1969=cut
1970
1971sub macro {
1e44e2bf 1972 my($self,%attribs) = @_;
f1387719
PP
1973 my(@m,$key,$val);
1974 while (($key,$val) = each %attribs){
1975 last unless defined $key;
1976 push @m, "$key = $val\n";
1e44e2bf 1977 }
f1387719
PP
1978 join "", @m;
1979}
1e44e2bf 1980
f1387719 1981=item makeaperl (o)
1e44e2bf 1982
f1387719
PP
1983Called by staticmake. Defines how to write the Makefile to produce a
1984static new perl.
1985
55497cff
PP
1986By default the Makefile produced includes all the static extensions in
1987the perl library. (Purified versions of library files, e.g.,
1988DynaLoader_pure_p1_c0_032.a are automatically ignored to avoid link errors.)
1989
f1387719
PP
1990=cut
1991
1992sub makeaperl {
1993 my($self, %attribs) = @_;
1994 my($makefilename, $searchdirs, $static, $extra, $perlinc, $target, $tmp, $libperl) =
1995 @attribs{qw(MAKE DIRS STAT EXTRA INCL TARGET TMP LIBPERL)};
1e44e2bf 1996 my(@m);
f1387719
PP
1997 push @m, "
1998# --- MakeMaker makeaperl section ---
1999MAP_TARGET = $target
2000FULLPERL = $self->{FULLPERL}
2001";
2002 return join '', @m if $self->{PARENT};
1e44e2bf 2003
f1387719 2004 my($dir) = join ":", @{$self->{DIR}};
1e44e2bf 2005
f1387719
PP
2006 unless ($self->{MAKEAPERL}) {
2007 push @m, q{
2008$(MAP_TARGET) :: static $(MAKE_APERL_FILE)
2009 $(MAKE) -f $(MAKE_APERL_FILE) $@
1e44e2bf 2010
f1387719
PP
2011$(MAKE_APERL_FILE) : $(FIRST_MAKEFILE)
2012 }.$self->{NOECHO}.q{echo Writing \"$(MAKE_APERL_FILE)\" for this $(MAP_TARGET)
2013 }.$self->{NOECHO}.q{$(PERL) -I$(INST_ARCHLIB) -I$(INST_LIB) -I$(PERL_ARCHLIB) -I$(PERL_LIB) \
2014 Makefile.PL DIR=}, $dir, q{ \
2015 MAKEFILE=$(MAKE_APERL_FILE) LINKTYPE=static \
2016 MAKEAPERL=1 NORECURS=1 CCCDLFLAGS=};
1e44e2bf 2017
f1387719
PP
2018 foreach (@ARGV){
2019 if( /\s/ ){
2020 s/=(.*)/='$1'/;
2021 }
2022 push @m, " \\\n\t\t$_";
2023 }
2024# push @m, map( " \\\n\t\t$_", @ARGV );
2025 push @m, "\n";
1e44e2bf 2026
f1387719
PP
2027 return join '', @m;
2028 }
1e44e2bf 2029
1e44e2bf 2030
1e44e2bf 2031
f1387719 2032 my($cccmd, $linkcmd, $lperl);
1e44e2bf 2033
1e44e2bf 2034
f1387719
PP
2035 $cccmd = $self->const_cccmd($libperl);
2036 $cccmd =~ s/^CCCMD\s*=\s*//;
2037 $cccmd =~ s/\$\(INC\)/ -I$self->{PERL_INC} /;
bab2b58e 2038 $cccmd .= " $Config::Config{cccdlflags}"
042ade60 2039 if ($Config::Config{useshrplib} eq 'true');
f1387719 2040 $cccmd =~ s/\(CC\)/\(PERLMAINCC\)/;
1e44e2bf 2041
f1387719
PP
2042 # The front matter of the linkcommand...
2043 $linkcmd = join ' ', "\$(CC)",
2044 grep($_, @Config{qw(large split ldflags ccdlflags)});
2045 $linkcmd =~ s/\s+/ /g;
93f9cb4b 2046 $linkcmd =~ s,(perl\.exp),\$(PERL_INC)/$1,;
1e44e2bf 2047
f1387719
PP
2048 # Which *.a files could we make use of...
2049 local(%static);
2050 require File::Find;
2051 File::Find::find(sub {
2052 return unless m/\Q$self->{LIB_EXT}\E$/;
2053 return if m/^libperl/;
55497cff
PP
2054 # Skip purified versions of libraries (e.g., DynaLoader_pure_p1_c0_032.a)
2055 return if m/_pure_\w+_\w+_\w+\.\w+$/ and -f "$File::Find::dir/.pure";
1e44e2bf 2056
f1387719
PP
2057 if( exists $self->{INCLUDE_EXT} ){
2058 my $found = 0;
2059 my $incl;
2060 my $xx;
2061
2062 ($xx = $File::Find::name) =~ s,.*?/auto/,,;
2063 $xx =~ s,/?$_,,;
2064 $xx =~ s,/,::,g;
2065
2066 # Throw away anything not explicitly marked for inclusion.
2067 # DynaLoader is implied.
2068 foreach $incl ((@{$self->{INCLUDE_EXT}},'DynaLoader')){
2069 if( $xx eq $incl ){
2070 $found++;
2071 last;
2072 }
2073 }
2074 return unless $found;
2075 }
2076 elsif( exists $self->{EXCLUDE_EXT} ){
2077 my $excl;
2078 my $xx;
1e44e2bf 2079
f1387719
PP
2080 ($xx = $File::Find::name) =~ s,.*?/auto/,,;
2081 $xx =~ s,/?$_,,;
2082 $xx =~ s,/,::,g;
1e44e2bf 2083
f1387719
PP
2084 # Throw away anything explicitly marked for exclusion
2085 foreach $excl (@{$self->{EXCLUDE_EXT}}){
2086 return if( $xx eq $excl );
2087 }
2088 }
2089
2090 # don't include the installed version of this extension. I
2091 # leave this line here, although it is not necessary anymore:
2092 # I patched minimod.PL instead, so that Miniperl.pm won't
2093 # enclude duplicates
2094
2095 # Once the patch to minimod.PL is in the distribution, I can
2096 # drop it
2097 return if $File::Find::name =~ m:auto/$self->{FULLEXT}/$self->{BASEEXT}$self->{LIB_EXT}$:;
2098 use Cwd 'cwd';
2099 $static{cwd() . "/" . $_}++;
2100 }, grep( -d $_, @{$searchdirs || []}) );
2101
2102 # We trust that what has been handed in as argument, will be buildable
2103 $static = [] unless $static;
2104 @static{@{$static}} = (1) x @{$static};
2105
2106 $extra = [] unless $extra && ref $extra eq 'ARRAY';
2107 for (sort keys %static) {
2108 next unless /\Q$self->{LIB_EXT}\E$/;
2109 $_ = dirname($_) . "/extralibs.ld";
2110 push @$extra, $_;
1e44e2bf 2111 }
1e44e2bf 2112
f1387719 2113 grep(s/^/-I/, @{$perlinc || []});
1e44e2bf 2114
f1387719
PP
2115 $target = "perl" unless $target;
2116 $tmp = "." unless $tmp;
1e44e2bf 2117
f1387719
PP
2118# MAP_STATIC doesn't look into subdirs yet. Once "all" is made and we
2119# regenerate the Makefiles, MAP_STATIC and the dependencies for
2120# extralibs.all are computed correctly
2121 push @m, "
2122MAP_LINKCMD = $linkcmd
2123MAP_PERLINC = @{$perlinc || []}
2124MAP_STATIC = ",
2125join(" \\\n\t", reverse sort keys %static), "
1e44e2bf 2126
f1387719
PP
2127MAP_PRELIBS = $Config::Config{libs} $Config::Config{cryptlib}
2128";
2129
2130 if (defined $libperl) {
2131 ($lperl = $libperl) =~ s/\$\(A\)/$self->{LIB_EXT}/;
2132 }
2133 unless ($libperl && -f $lperl) { # Ilya's code...
2134 my $dir = $self->{PERL_SRC} || "$self->{PERL_ARCHLIB}/CORE";
2135 $libperl ||= "libperl$self->{LIB_EXT}";
2136 $libperl = "$dir/$libperl";
2137 $lperl ||= "libperl$self->{LIB_EXT}";
2138 $lperl = "$dir/$lperl";
2139 print STDOUT "Warning: $libperl not found
2140 If you're going to build a static perl binary, make sure perl is installed
2141 otherwise ignore this warning\n"
2142 unless (-f $lperl || defined($self->{PERL_SRC}));
2143 }
1e44e2bf 2144
f1387719
PP
2145 push @m, "
2146MAP_LIBPERL = $libperl
2147";
1e44e2bf 2148
f1387719
PP
2149 push @m, "
2150\$(INST_ARCHAUTODIR)/extralibs.all: \$(INST_ARCHAUTODIR)/.exists ".join(" \\\n\t", @$extra)."
2151 $self->{NOECHO}$self->{RM_F} \$\@
2152 $self->{NOECHO}\$(TOUCH) \$\@
2153";
1e44e2bf 2154
f1387719
PP
2155 my $catfile;
2156 foreach $catfile (@$extra){
2157 push @m, "\tcat $catfile >> \$\@\n";
1e44e2bf 2158 }
1e44e2bf 2159
f1387719
PP
2160 push @m, "
2161\$(MAP_TARGET) :: $tmp/perlmain\$(OBJ_EXT) \$(MAP_LIBPERL) \$(MAP_STATIC) \$(INST_ARCHAUTODIR)/extralibs.all
2162 \$(MAP_LINKCMD) -o \$\@ \$(OPTIMIZE) $tmp/perlmain\$(OBJ_EXT) \$(MAP_LIBPERL) \$(MAP_STATIC) `cat \$(INST_ARCHAUTODIR)/extralibs.all` \$(MAP_PRELIBS)
2163 $self->{NOECHO}echo 'To install the new \"\$(MAP_TARGET)\" binary, call'
2164 $self->{NOECHO}echo ' make -f $makefilename inst_perl MAP_TARGET=\$(MAP_TARGET)'
2165 $self->{NOECHO}echo 'To remove the intermediate files say'
2166 $self->{NOECHO}echo ' make -f $makefilename map_clean'
1e44e2bf 2167
f1387719
PP
2168$tmp/perlmain\$(OBJ_EXT): $tmp/perlmain.c
2169";
2170 push @m, "\tcd $tmp && $cccmd -I\$(PERL_INC) perlmain.c\n";
1e44e2bf 2171
f1387719
PP
2172 push @m, qq{
2173$tmp/perlmain.c: $makefilename}, q{
2174 }.$self->{NOECHO}.q{echo Writing $@
2175 }.$self->{NOECHO}.q{$(PERL) $(MAP_PERLINC) -e 'use ExtUtils::Miniperl; \\
55497cff 2176 writemain(grep s#.*/auto/##, qw|$(MAP_STATIC)|)' > $@t && mv $@t $@
1e44e2bf 2177
f1387719 2178};
1e44e2bf 2179
f1387719
PP
2180 push @m, q{
2181doc_inst_perl:
2182 }.$self->{NOECHO}.q{echo Appending installation info to $(INSTALLARCHLIB)/perllocal.pod
2183 }.$self->{NOECHO}.q{$(DOC_INSTALL) \
dbc738d9 2184 "Perl binary" "$(MAP_TARGET)" \
f1387719
PP
2185 MAP_STATIC "$(MAP_STATIC)" \
2186 MAP_EXTRA "`cat $(INST_ARCHAUTODIR)/extralibs.all`" \
2187 MAP_LIBPERL "$(MAP_LIBPERL)" \
2188 >> }.$self->catfile('$(INSTALLARCHLIB)','perllocal.pod').q{
1e44e2bf 2189
f1387719 2190};
1e44e2bf 2191
f1387719
PP
2192 push @m, q{
2193inst_perl: pure_inst_perl doc_inst_perl
1e44e2bf 2194
f1387719
PP
2195pure_inst_perl: $(MAP_TARGET)
2196 }.$self->{CP}.q{ $(MAP_TARGET) }.$self->catfile('$(INSTALLBIN)','$(MAP_TARGET)').q{
1e44e2bf 2197
f1387719
PP
2198clean :: map_clean
2199
2200map_clean :
2201 }.$self->{RM_F}.qq{ $tmp/perlmain\$(OBJ_EXT) $tmp/perlmain.c \$(MAP_TARGET) $makefilename \$(INST_ARCHAUTODIR)/extralibs.all
2202};
2203
2204 join '', @m;
1e44e2bf
PP
2205}
2206
f1387719 2207=item makefile (o)
1e44e2bf 2208
f1387719 2209Defines how to rewrite the Makefile.
1e44e2bf
PP
2210
2211=cut
2212
f1387719
PP
2213sub makefile {
2214 my($self) = shift;
2215 my @m;
2216 # We do not know what target was originally specified so we
2217 # must force a manual rerun to be sure. But as it should only
2218 # happen very rarely it is not a significant problem.
2219 push @m, '
2220$(OBJECT) : $(FIRST_MAKEFILE)
2221' if $self->{OBJECT};
1e44e2bf 2222
f1387719
PP
2223 push @m, q{
2224# We take a very conservative approach here, but it\'s worth it.
2225# We move Makefile to Makefile.old here to avoid gnu make looping.
2226}.$self->{MAKEFILE}.q{ : Makefile.PL $(CONFIGDEP)
2227 }.$self->{NOECHO}.q{echo "Makefile out-of-date with respect to $?"
2228 }.$self->{NOECHO}.q{echo "Cleaning current config before rebuilding Makefile..."
2229 -}.$self->{NOECHO}.q{mv }."$self->{MAKEFILE} $self->{MAKEFILE}.old".q{
2230 -$(MAKE) -f }.$self->{MAKEFILE}.q{.old clean >/dev/null 2>&1 || true
2231 $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" Makefile.PL }.join(" ",map(qq["$_"],@ARGV)).q{
2232 }.$self->{NOECHO}.q{echo ">>> Your Makefile has been rebuilt. <<<"
2233 }.$self->{NOECHO}.q{echo ">>> Please rerun the make command. <<<"; false
1e44e2bf 2234
f1387719
PP
2235# To change behavior to :: would be nice, but would break Tk b9.02
2236# so you find such a warning below the dist target.
2237#}.$self->{MAKEFILE}.q{ :: $(VERSION_FROM)
2238# }.$self->{NOECHO}.q{echo "Warning: Makefile possibly out of date with $(VERSION_FROM)"
1e44e2bf
PP
2239};
2240
f1387719 2241 join "", @m;
1e44e2bf
PP
2242}
2243
f4ae0f5e 2244=item manifypods (o)
1e44e2bf 2245
f4ae0f5e
PP
2246Defines targets and routines to translate the pods into manpages and
2247put them into the INST_* directories.
1e44e2bf
PP
2248
2249=cut
2250
2251sub manifypods {
2252 my($self, %attribs) = @_;
f1387719 2253 return "\nmanifypods :\n\t$self->{NOECHO}\$(NOOP)\n" unless %{$self->{MAN3PODS}} or %{$self->{MAN1PODS}};
1e44e2bf
PP
2254 my($dist);
2255 my($pod2man_exe);
2256 if (defined $self->{PERL_SRC}) {
2257 $pod2man_exe = $self->catfile($self->{PERL_SRC},'pod','pod2man');
2258 } else {
f1387719 2259 $pod2man_exe = $self->catfile($Config{scriptdirexp},'pod2man');
1e44e2bf
PP
2260 }
2261 unless ($self->perl_script($pod2man_exe)) {
2262 # No pod2man but some MAN3PODS to be installed
2263 print <<END;
2264
2265Warning: I could not locate your pod2man program. Please make sure,
2266 your pod2man program is in your PATH before you execute 'make'
2267
2268END
2269 $pod2man_exe = "-S pod2man";
2270 }
2271 my(@m);
2272 push @m,
2273qq[POD2MAN_EXE = $pod2man_exe\n],
2274q[POD2MAN = $(PERL) -we '%m=@ARGV;for (keys %m){' \\
2275-e 'next if -e $$m{$$_} && -M $$m{$$_} < -M $$_ && -M $$m{$$_} < -M "].$self->{MAKEFILE}.q[";' \\
2276-e 'print "Manifying $$m{$$_}\n";' \\
f1387719 2277-e 'system(qq[$$^X ].q["-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" $(POD2MAN_EXE) ].qq[$$_>$$m{$$_}])==0 or warn "Couldn\\047t install $$m{$$_}\n";' \\
1e44e2bf
PP
2278-e 'chmod 0644, $$m{$$_} or warn "chmod 644 $$m{$$_}: $$!\n";}'
2279];
2280 push @m, "\nmanifypods : ";
2281 push @m, join " \\\n\t", keys %{$self->{MAN1PODS}}, keys %{$self->{MAN3PODS}};
f1387719
PP
2282
2283 push(@m,"\n");
2284 if (%{$self->{MAN1PODS}} || %{$self->{MAN3PODS}}) {
2285 push @m, "\t$self->{NOECHO}\$(POD2MAN) \\\n\t";
2286 push @m, join " \\\n\t", %{$self->{MAN1PODS}}, %{$self->{MAN3PODS}};
1e44e2bf 2287 }
f1387719 2288 join('', @m);
1e44e2bf
PP
2289}
2290
f1387719 2291=item maybe_command
1e44e2bf 2292
f1387719 2293Returns true, if the argument is likely to be a command.
1e44e2bf
PP
2294
2295=cut
2296
f1387719
PP
2297sub maybe_command {
2298 my($self,$file) = @_;
2299 return $file if -x $file && ! -d $file;
2300 return;
1e44e2bf
PP
2301}
2302
f1387719 2303=item maybe_command_in_dirs
1e44e2bf 2304
f1387719 2305method under development. Not yet used. Ask Ilya :-)
1e44e2bf
PP
2306
2307=cut
2308
f1387719
PP
2309sub maybe_command_in_dirs { # $ver is optional argument if looking for perl
2310# Ilya's suggestion. Not yet used, want to understand it first, but at least the code is here
2311 my($self, $names, $dirs, $trace, $ver) = @_;
2312 my($name, $dir);
2313 foreach $dir (@$dirs){
2314 next unless defined $dir; # $self->{PERL_SRC} may be undefined
2315 foreach $name (@$names){
2316 my($abs,$tryabs);
2317 if ($self->file_name_is_absolute($name)) { # /foo/bar
2318 $abs = $name;
2319 } elsif ($self->canonpath($name) eq $self->canonpath(basename($name))) { # bar
2320 $abs = $self->catfile($dir, $name);
2321 } else { # foo/bar
2322 $abs = $self->catfile($self->curdir, $name);
2323 }
2324 print "Checking $abs for $name\n" if ($trace >= 2);
2325 next unless $tryabs = $self->maybe_command($abs);
2326 print "Substituting $tryabs instead of $abs\n"
2327 if ($trace >= 2 and $tryabs ne $abs);
2328 $abs = $tryabs;
2329 if (defined $ver) {
2330 print "Executing $abs\n" if ($trace >= 2);
2331 if (`$abs -e 'require $ver; print "VER_OK\n" ' 2>&1` =~ /VER_OK/) {
2332 print "Using PERL=$abs\n" if $trace;
2333 return $abs;
2334 }
2335 } else { # Do not look for perl
2336 return $abs;
2337 }
2338 }
1e44e2bf 2339 }
1e44e2bf
PP
2340}
2341
f1387719 2342=item needs_linking (o)
1e44e2bf 2343
f1387719
PP
2344Does this module need linking? Looks into subdirectory objects (see
2345also has_link_code())
1e44e2bf
PP
2346
2347=cut
2348
f1387719
PP
2349sub needs_linking {
2350 my($self) = shift;
2351 my($child,$caller);
2352 $caller = (caller(0))[3];
2353 Carp::confess("Needs_linking called too early") if $caller =~ /^ExtUtils::MakeMaker::/;
2354 return $self->{NEEDS_LINKING} if defined $self->{NEEDS_LINKING};
2355 if ($self->has_link_code or $self->{MAKEAPERL}){
2356 $self->{NEEDS_LINKING} = 1;
2357 return 1;
1e44e2bf 2358 }
f1387719
PP
2359 foreach $child (keys %{$self->{CHILDREN}}) {
2360 if ($self->{CHILDREN}->{$child}->needs_linking) {
2361 $self->{NEEDS_LINKING} = 1;
2362 return 1;
2363 }
1e44e2bf 2364 }
f1387719 2365 return $self->{NEEDS_LINKING} = 0;
1e44e2bf
PP
2366}
2367
f1387719 2368=item nicetext
1e44e2bf 2369
f1387719
PP
2370misnamed method (will have to be changed). The MM_Unix method just
2371returns the argument without further processing.
2372
2373On VMS used to insure that colons marking targets are preceded by
2374space - most Unix Makes don't need this, but it's necessary under VMS
2375to distinguish the target delimiter from a colon appearing as part of
2376a filespec.
1e44e2bf
PP
2377
2378=cut
2379
f1387719
PP
2380sub nicetext {
2381 my($self,$text) = @_;
2382 $text;
2383}
1e44e2bf 2384
f1387719 2385=item parse_version
1e44e2bf 2386
f1387719 2387parse a file and return what you think is $VERSION in this file set to
1e44e2bf 2388
f1387719
PP
2389=cut
2390
2391sub parse_version {
2392 my($self,$parsefile) = @_;
2393 my $result;
2394 local *FH;
2395 local $/ = "\n";
2396 open(FH,$parsefile) or die "Could not open '$parsefile': $!";
2397 my $inpod = 0;
2398 while (<FH>) {
2399 $inpod = /^=(?!cut)/ ? 1 : /^=cut/ ? 0 : $inpod;
2400 next if $inpod;
2401 chop;
2402 next unless /\$(([\w\:\']*)\bVERSION)\b.*\=/;
dbc738d9
PP
2403 my $eval = qq{
2404 package ExtUtils::MakeMaker::_version;
a1f8e286 2405 no strict;
bab2b58e
AK
2406
2407 \$$1=undef; do {
2408 $_
dbc738d9
PP
2409 }; \$$1
2410 };
2411 local($^W) = 0;
2412 $result = eval($eval) || 0;
f1387719 2413 die "Could not eval '$eval' in $parsefile: $@" if $@;
f1387719
PP
2414 last;
2415 }
2416 close FH;
2417 return $result;
1e44e2bf
PP
2418}
2419
1e44e2bf 2420
f1387719
PP
2421=item pasthru (o)
2422
2423Defines the string that is passed to recursive make calls in
2424subdirectories.
1e44e2bf
PP
2425
2426=cut
2427
f1387719 2428sub pasthru {
1e44e2bf 2429 my($self) = shift;
f1387719 2430 my(@m,$key);
1e44e2bf 2431
f1387719 2432 my(@pasthru);
bbce6d69
PP
2433 my($sep) = $Is_VMS ? ',' : '';
2434 $sep .= "\\\n\t";
1e44e2bf 2435
bab2b58e 2436 foreach $key (qw(LIB LIBPERL_A LINKTYPE PREFIX OPTIMIZE)){
f1387719
PP
2437 push @pasthru, "$key=\"\$($key)\"";
2438 }
f4ae0f5e 2439
bbce6d69 2440 push @m, "\nPASTHRU = ", join ($sep, @pasthru), "\n";
f1387719
PP
2441 join "", @m;
2442}
1e44e2bf 2443
f1387719 2444=item path
f4ae0f5e 2445
f1387719 2446Takes no argument, returns the environment variable PATH as an array.
1e44e2bf 2447
f1387719
PP
2448=cut
2449
2450sub path {
2451 my($self) = @_;
2452 my $path_sep = $Is_OS2 ? ";" : ":";
2453 my $path = $ENV{PATH};
2454 $path =~ s:\\:/:g if $Is_OS2;
2455 my @path = split $path_sep, $path;
93f9cb4b
PP
2456 foreach(@path) { $_ = '.' if $_ eq '' }
2457 @path;
1e44e2bf
PP
2458}
2459
f1387719 2460=item perl_script
1e44e2bf 2461
f1387719
PP
2462Takes one argument, a file name, and returns the file name, if the
2463argument is likely to be a perl script. On MM_Unix this is true for
2464any ordinary, readable file.
1e44e2bf
PP
2465
2466=cut
2467
f1387719
PP
2468sub perl_script {
2469 my($self,$file) = @_;
2470 return $file if -r $file && -f _;
2471 return;
1e44e2bf
PP
2472}
2473
f1387719 2474=item perldepend (o)
1e44e2bf 2475
f1387719
PP
2476Defines the dependency from all *.h files that come with the perl
2477distribution.
1e44e2bf
PP
2478
2479=cut
2480
f1387719 2481sub perldepend {
1e44e2bf 2482 my($self) = shift;
f1387719
PP
2483 my(@m);
2484 push @m, q{
2485# Check for unpropogated config.sh changes. Should never happen.
2486# We do NOT just update config.h because that is not sufficient.
2487# An out of date config.h is not fatal but complains loudly!
2488$(PERL_INC)/config.h: $(PERL_SRC)/config.sh
2489 -}.$self->{NOECHO}.q{echo "Warning: $(PERL_INC)/config.h out of date with $(PERL_SRC)/config.sh"; false
2490
2491$(PERL_ARCHLIB)/Config.pm: $(PERL_SRC)/config.sh
2492 }.$self->{NOECHO}.q{echo "Warning: $(PERL_ARCHLIB)/Config.pm may be out of date with $(PERL_SRC)/config.sh"
2493 cd $(PERL_SRC) && $(MAKE) lib/Config.pm
2494} if $self->{PERL_SRC};
2495
2496 return join "", @m unless $self->needs_linking;
2497
1e44e2bf 2498 push @m, q{
f1387719
PP
2499PERL_HDRS = \
2500$(PERL_INC)/EXTERN.h $(PERL_INC)/gv.h $(PERL_INC)/pp.h \
2501$(PERL_INC)/INTERN.h $(PERL_INC)/handy.h $(PERL_INC)/proto.h \
2502$(PERL_INC)/XSUB.h $(PERL_INC)/hv.h $(PERL_INC)/regcomp.h \
2503$(PERL_INC)/av.h $(PERL_INC)/keywords.h $(PERL_INC)/regexp.h \
2504$(PERL_INC)/config.h $(PERL_INC)/mg.h $(PERL_INC)/scope.h \
2505$(PERL_INC)/cop.h $(PERL_INC)/op.h $(PERL_INC)/sv.h \
2506$(PERL_INC)/cv.h $(PERL_INC)/opcode.h $(PERL_INC)/unixish.h \
2507$(PERL_INC)/dosish.h $(PERL_INC)/patchlevel.h $(PERL_INC)/util.h \
2508$(PERL_INC)/embed.h $(PERL_INC)/perl.h \
2509$(PERL_INC)/form.h $(PERL_INC)/perly.h
2510
2511$(OBJECT) : $(PERL_HDRS)
2512} if $self->{OBJECT};
2513
2514 push @m, join(" ", values %{$self->{XS}})." : \$(XSUBPPDEPS)\n" if %{$self->{XS}};
2515
2516 join "\n", @m;
1e44e2bf
PP
2517}
2518
f1387719 2519=item pm_to_blib
1e44e2bf 2520
f1387719 2521Defines target that copies all files in the hash PM to their
55497cff 2522destination and autosplits them. See L<ExtUtils::Install/DESCRIPTION>
1e44e2bf
PP
2523
2524=cut
2525
f1387719
PP
2526sub pm_to_blib {
2527 my $self = shift;
2528 my($autodir) = $self->catdir('$(INST_LIB)','auto');
2529 return q{
2530pm_to_blib: $(TO_INST_PM)
2531 }.$self->{NOECHO}.q{$(PERL) "-I$(INST_ARCHLIB)" "-I$(INST_LIB)" \
2532 "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" -MExtUtils::Install \
2533 -e 'pm_to_blib({qw{$(PM_TO_BLIB)}},"}.$autodir.q{")'
2534 }.$self->{NOECHO}.q{$(TOUCH) $@
1e44e2bf 2535};
1e44e2bf
PP
2536}
2537
f1387719 2538=item post_constants (o)
1e44e2bf 2539
f1387719
PP
2540Returns an empty string per default. Dedicated to overrides from
2541within Makefile.PL after all constants have been defined.
1e44e2bf
PP
2542
2543=cut
2544
f1387719
PP
2545sub post_constants{
2546 my($self) = shift;
2547 "";
2548}
1e44e2bf 2549
f1387719 2550=item post_initialize (o)
1e44e2bf 2551
1fef88e7 2552Returns an empty string per default. Used in Makefile.PLs to add some
f1387719 2553chunk of text to the Makefile after the object is initialized.
1e44e2bf 2554
f1387719 2555=cut
1e44e2bf 2556
f1387719
PP
2557sub post_initialize {
2558 my($self) = shift;
2559 "";
2560}
1e44e2bf 2561
f1387719 2562=item postamble (o)
1e44e2bf 2563
f1387719
PP
2564Returns an empty string. Can be used in Makefile.PLs to write some
2565text to the Makefile at the end.
1e44e2bf 2566
f1387719 2567=cut
1e44e2bf 2568
f1387719
PP
2569sub postamble {
2570 my($self) = shift;
2571 "";
2572}
1e44e2bf 2573
f1387719 2574=item prefixify
1e44e2bf 2575
f1387719
PP
2576Check a path variable in $self from %Config, if it contains a prefix,
2577and replace it with another one.
1e44e2bf 2578
f1387719
PP
2579Takes as arguments an attribute name, a search prefix and a
2580replacement prefix. Changes the attribute in the object.
1e44e2bf 2581
f1387719 2582=cut
1e44e2bf 2583
f1387719
PP
2584sub prefixify {
2585 my($self,$var,$sprefix,$rprefix) = @_;
2586 $self->{uc $var} ||= $Config{lc $var};
2587 $self->{uc $var} = VMS::Filespec::unixpath($self->{uc $var}) if $Is_VMS;
2588 $self->{uc $var} =~ s/\Q$sprefix\E/$rprefix/;
2589}
1e44e2bf 2590
f1387719 2591=item processPL (o)
1e44e2bf 2592
f1387719 2593Defines targets to run *.PL files.
1e44e2bf 2594
f1387719 2595=cut
1e44e2bf 2596
f1387719
PP
2597sub processPL {
2598 my($self) = shift;
2599 return "" unless $self->{PL_FILES};
2600 my(@m, $plfile);
2601 foreach $plfile (sort keys %{$self->{PL_FILES}}) {
2602 push @m, "
2603all :: $self->{PL_FILES}->{$plfile}
1e44e2bf 2604
f1387719
PP
2605$self->{PL_FILES}->{$plfile} :: $plfile
2606 \$(PERL) -I\$(INST_ARCHLIB) -I\$(INST_LIB) -I\$(PERL_ARCHLIB) -I\$(PERL_LIB) $plfile
2607";
2608 }
2609 join "", @m;
1e44e2bf
PP
2610}
2611
f1387719 2612=item realclean (o)
1e44e2bf 2613
f1387719 2614Defines the realclean target.
1e44e2bf
PP
2615
2616=cut
2617
f1387719
PP
2618sub realclean {
2619 my($self, %attribs) = @_;
2620 my(@m);
2621 push(@m,'
2622# Delete temporary files (via clean) and also delete installed files
2623realclean purge :: clean
2624');
2625 # realclean subdirectories first (already cleaned)
2626 my $sub = "\t-cd %s && test -f %s && \$(MAKE) %s realclean\n";
2627 foreach(@{$self->{DIR}}){
2628 push(@m, sprintf($sub,$_,"$self->{MAKEFILE}.old","-f $self->{MAKEFILE}.old"));
2629 push(@m, sprintf($sub,$_,"$self->{MAKEFILE}",''));
1e44e2bf 2630 }
f1387719
PP
2631 push(@m, " $self->{RM_RF} \$(INST_AUTODIR) \$(INST_ARCHAUTODIR)\n");
2632 if( $self->has_link_code ){
2633 push(@m, " $self->{RM_F} \$(INST_DYNAMIC) \$(INST_BOOT)\n");
2634 push(@m, " $self->{RM_F} \$(INST_STATIC)\n");
2635 }
2636 push(@m, " $self->{RM_F} " . join(" ", values %{$self->{PM}}) . "\n");
2637 my(@otherfiles) = ($self->{MAKEFILE},
2638 "$self->{MAKEFILE}.old"); # Makefiles last
2639 push(@otherfiles, $attribs{FILES}) if $attribs{FILES};
2640 push(@m, " $self->{RM_RF} @otherfiles\n") if @otherfiles;
2641 push(@m, " $attribs{POSTOP}\n") if $attribs{POSTOP};
2642 join("", @m);
1e44e2bf
PP
2643}
2644
f1387719 2645=item replace_manpage_separator
1e44e2bf 2646
f1387719
PP
2647Takes the name of a package, which may be a nested package, in the
2648form Foo/Bar and replaces the slash with C<::>. Returns the replacement.
1e44e2bf
PP
2649
2650=cut
2651
f1387719
PP
2652sub replace_manpage_separator {
2653 my($self,$man) = @_;
2654 $man =~ s,/+,::,g;
2655 $man;
2656}
1e44e2bf 2657
f1387719 2658=item static (o)
1e44e2bf 2659
f1387719 2660Defines the static target.
1e44e2bf 2661
f1387719 2662=cut
1e44e2bf 2663
f1387719
PP
2664sub static {
2665# --- Static Loading Sections ---
1e44e2bf 2666
f1387719
PP
2667 my($self) = shift;
2668 '
2669## $(INST_PM) has been moved to the all: target.
2670## It remains here for awhile to allow for old usage: "make static"
2671#static :: '.$self->{MAKEFILE}.' $(INST_STATIC) $(INST_PM)
2672static :: '.$self->{MAKEFILE}.' $(INST_STATIC)
2673 '.$self->{NOECHO}.'$(NOOP)
2674';
1e44e2bf
PP
2675}
2676
f1387719 2677=item static_lib (o)
1e44e2bf 2678
f1387719 2679Defines how to produce the *.a (or equivalent) files.
1e44e2bf
PP
2680
2681=cut
2682
f1387719
PP
2683sub static_lib {
2684 my($self) = @_;
2685# Come to think of it, if there are subdirs with linkcode, we still have no INST_STATIC
2686# return '' unless $self->needs_linking(); #might be because of a subdir
1e44e2bf 2687
f1387719
PP
2688 return '' unless $self->has_link_code;
2689
2690 my(@m);
2691 push(@m, <<'END');
2692$(INST_STATIC): $(OBJECT) $(MYEXTLIB) $(INST_ARCHAUTODIR)/.exists
760ac839 2693 $(RM_RF) $@
f1387719
PP
2694END
2695 # If this extension has it's own library (eg SDBM_File)
2696 # then copy that to $(INST_STATIC) and add $(OBJECT) into it.
2697 push(@m, "\t$self->{CP} \$(MYEXTLIB) \$\@\n") if $self->{MYEXTLIB};
f4ae0f5e 2698
f1387719 2699 push @m,
760ac839 2700q{ $(AR) $(AR_STATIC_ARGS) $@ $(OBJECT) && $(RANLIB) $@
f1387719
PP
2701 }.$self->{NOECHO}.q{echo "$(EXTRALIBS)" > $(INST_ARCHAUTODIR)/extralibs.ld
2702 $(CHMOD) 755 $@
f4ae0f5e 2703};
1e44e2bf 2704
f1387719
PP
2705# Old mechanism - still available:
2706
2707 push @m, "\t$self->{NOECHO}".q{echo "$(EXTRALIBS)" >> $(PERL_SRC)/ext.libs}."\n\n"
2708 if $self->{PERL_SRC};
2709
2710 push @m, $self->dir_target('$(INST_ARCHAUTODIR)');
2711 join('', "\n",@m);
1e44e2bf
PP
2712}
2713
f4ae0f5e 2714=item staticmake (o)
1e44e2bf 2715
f4ae0f5e 2716Calls makeaperl.
1e44e2bf
PP
2717
2718=cut
2719
2720sub staticmake {
2721 my($self, %attribs) = @_;
1e44e2bf
PP
2722 my(@static);
2723
2724 my(@searchdirs)=($self->{PERL_ARCHLIB}, $self->{SITEARCHEXP}, $self->{INST_ARCHLIB});
2725
2726 # And as it's not yet built, we add the current extension
2727 # but only if it has some C code (or XS code, which implies C code)
2728 if (@{$self->{C}}) {
f4ae0f5e
PP
2729 @static = $self->catfile($self->{INST_ARCHLIB},
2730 "auto",
2731 $self->{FULLEXT},
2732 "$self->{BASEEXT}$self->{LIB_EXT}"
2733 );
1e44e2bf
PP
2734 }
2735
2736 # Either we determine now, which libraries we will produce in the
2737 # subdirectories or we do it at runtime of the make.
2738
2739 # We could ask all subdir objects, but I cannot imagine, why it
2740 # would be necessary.
2741
2742 # Instead we determine all libraries for the new perl at
2743 # runtime.
2744 my(@perlinc) = ($self->{INST_ARCHLIB}, $self->{INST_LIB}, $self->{PERL_ARCHLIB}, $self->{PERL_LIB});
2745
2746 $self->makeaperl(MAKE => $self->{MAKEFILE},
2747 DIRS => \@searchdirs,
2748 STAT => \@static,
2749 INCL => \@perlinc,
2750 TARGET => $self->{MAP_TARGET},
2751 TMP => "",
2752 LIBPERL => $self->{LIBPERL_A}
2753 );
2754}
2755
f1387719
PP
2756=item subdir_x (o)
2757
2758Helper subroutine for subdirs
2759
2760=cut
2761
2762sub subdir_x {
2763 my($self, $subdir) = @_;
2764 my(@m);
2765 qq{
2766
2767subdirs ::
2768 $self->{NOECHO}cd $subdir && \$(MAKE) all \$(PASTHRU)
2769
2770};
2771}
2772
2773=item subdirs (o)
2774
2775Defines targets to process subdirectories.
2776
2777=cut
2778
2779sub subdirs {
2780# --- Sub-directory Sections ---
2781 my($self) = shift;
2782 my(@m,$dir);
2783 # This method provides a mechanism to automatically deal with
2784 # subdirectories containing further Makefile.PL scripts.
2785 # It calls the subdir_x() method for each subdirectory.
2786 foreach $dir (@{$self->{DIR}}){
2787 push(@m, $self->subdir_x($dir));
2788#### print "Including $dir subdirectory\n";
2789 }
2790 if (@m){
2791 unshift(@m, "
2792# The default clean, realclean and test targets in this Makefile
2793# have automatically been given entries for each subdir.
2794
2795");
2796 } else {
2797 push(@m, "\n# none")
2798 }
2799 join('',@m);
2800}
2801
f4ae0f5e 2802=item test (o)
1e44e2bf 2803
f4ae0f5e 2804Defines the test targets.
1e44e2bf
PP
2805
2806=cut
2807
2808sub test {
2809# --- Test and Installation Sections ---
2810
2811 my($self, %attribs) = @_;
1e44e2bf
PP
2812 my($tests) = $attribs{TESTS} || (-d "t" ? "t/*.t" : "");
2813 my(@m);
2814 push(@m,"
2815TEST_VERBOSE=0
2816TEST_TYPE=test_\$(LINKTYPE)
f1387719
PP
2817TEST_FILE = test.pl
2818TESTDB_SW = -d
1e44e2bf 2819
f4ae0f5e 2820testdb :: testdb_\$(LINKTYPE)
f1387719
PP
2821
2822test :: \$(TEST_TYPE)
1e44e2bf
PP
2823");
2824 push(@m, map("\t$self->{NOECHO}cd $_ && test -f $self->{MAKEFILE} && \$(MAKE) test \$(PASTHRU)\n",
2825 @{$self->{DIR}}));
2826 push(@m, "\t$self->{NOECHO}echo 'No tests defined for \$(NAME) extension.'\n")
2827 unless $tests or -f "test.pl" or @{$self->{DIR}};
2828 push(@m, "\n");
2829
f4ae0f5e 2830 push(@m, "test_dynamic :: pure_all\n");
1e44e2bf
PP
2831 push(@m, $self->test_via_harness('$(FULLPERL)', $tests)) if $tests;
2832 push(@m, $self->test_via_script('$(FULLPERL)', 'test.pl')) if -f "test.pl";
2833 push(@m, "\n");
2834
f1387719
PP
2835 push(@m, "testdb_dynamic :: pure_all\n");
2836 push(@m, $self->test_via_script('$(FULLPERL) $(TESTDB_SW)', '$(TEST_FILE)'));
2837 push(@m, "\n");
f4ae0f5e 2838
1e44e2bf
PP
2839 # Occasionally we may face this degenerate target:
2840 push @m, "test_ : test_dynamic\n\n";
2841
2842 if ($self->needs_linking()) {
f4ae0f5e 2843 push(@m, "test_static :: pure_all \$(MAP_TARGET)\n");
1e44e2bf
PP
2844 push(@m, $self->test_via_harness('./$(MAP_TARGET)', $tests)) if $tests;
2845 push(@m, $self->test_via_script('./$(MAP_TARGET)', 'test.pl')) if -f "test.pl";
2846 push(@m, "\n");
f1387719
PP
2847 push(@m, "testdb_static :: pure_all \$(MAP_TARGET)\n");
2848 push(@m, $self->test_via_script('./$(MAP_TARGET) $(TESTDB_SW)', '$(TEST_FILE)'));
2849 push(@m, "\n");
1e44e2bf
PP
2850 } else {
2851 push @m, "test_static :: test_dynamic\n";
f4ae0f5e 2852 push @m, "testdb_static :: testdb_dynamic\n";
1e44e2bf
PP
2853 }
2854 join("", @m);
2855}
2856
f4ae0f5e 2857=item test_via_harness (o)
1e44e2bf 2858
f4ae0f5e 2859Helper method to write the test targets
1e44e2bf
PP
2860
2861=cut
2862
2863sub test_via_harness {
2864 my($self, $perl, $tests) = @_;
1e44e2bf
PP
2865 "\tPERL_DL_NONLAZY=1 $perl".q! -I$(INST_ARCHLIB) -I$(INST_LIB) -I$(PERL_ARCHLIB) -I$(PERL_LIB) -e 'use Test::Harness qw(&runtests $$verbose); $$verbose=$(TEST_VERBOSE); runtests @ARGV;' !."$tests\n";
2866}
2867
f4ae0f5e 2868=item test_via_script (o)
1e44e2bf 2869
f4ae0f5e 2870Other helper method for test.
1e44e2bf
PP
2871
2872=cut
2873
2874sub test_via_script {
2875 my($self, $perl, $script) = @_;
1e44e2bf
PP
2876 qq{\tPERL_DL_NONLAZY=1 $perl}.q{ -I$(INST_ARCHLIB) -I$(INST_LIB) -I$(PERL_ARCHLIB) -I$(PERL_LIB) }.qq{$script
2877};
2878}
2879
f1387719 2880=item tool_autosplit (o)
1e44e2bf 2881
f1387719
PP
2882Defines a simple perl call that runs autosplit. May be deprecated by
2883pm_to_blib soon.
1e44e2bf
PP
2884
2885=cut
2886
f1387719
PP
2887sub tool_autosplit {
2888# --- Tool Sections ---
2889
2890 my($self, %attribs) = @_;
2891 my($asl) = "";
2892 $asl = "\$AutoSplit::Maxlen=$attribs{MAXLEN};" if $attribs{MAXLEN};
2893 q{
2894# Usage: $(AUTOSPLITFILE) FileToSplit AutoDirToSplitInto
2895AUTOSPLITFILE = $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" -e 'use AutoSplit;}.$asl.q{autosplit($$ARGV[0], $$ARGV[1], 0, 1, 1) ;'
2896};
1e44e2bf
PP
2897}
2898
f1387719 2899=item tools_other (o)
1e44e2bf 2900
f1387719
PP
2901Defines SHELL, LD, TOUCH, CP, MV, RM_F, RM_RF, CHMOD, UMASK_NULL in
2902the Makefile. Also defines the perl programs MKPATH,
2903WARN_IF_OLD_PACKLIST, MOD_INSTALL. DOC_INSTALL, and UNINSTALL.
1e44e2bf
PP
2904
2905=cut
2906
f1387719
PP
2907sub tools_other {
2908 my($self) = shift;
2909 my @m;
2910 my $bin_sh = $Config{sh} || '/bin/sh';
2911 push @m, qq{
2912SHELL = $bin_sh
2913};
2914
2915 for (qw/ CHMOD CP LD MV NOOP RM_F RM_RF TOUCH UMASK_NULL / ) {
2916 push @m, "$_ = $self->{$_}\n";
1e44e2bf 2917 }
1e44e2bf 2918
1e44e2bf 2919
f1387719
PP
2920 push @m, q{
2921# The following is a portable way to say mkdir -p
2922# To see which directories are created, change the if 0 to if 1
2923MKPATH = $(PERL) -wle '$$"="/"; foreach $$p (@ARGV){' \\
2924-e 'next if -d $$p; my(@p); foreach(split(/\//,$$p)){' \\
2925-e 'push(@p,$$_); next if -d "@p/"; print "mkdir @p" if 0;' \\
2926-e 'mkdir("@p",0777)||die $$! } } exit 0;'
1e44e2bf 2927
f1387719
PP
2928# This helps us to minimize the effect of the .exists files A yet
2929# better solution would be to have a stable file in the perl
2930# distribution with a timestamp of zero. But this solution doesn't
2931# need any changes to the core distribution and works with older perls
2932EQUALIZE_TIMESTAMP = $(PERL) -we 'open F, ">$$ARGV[1]"; close F;' \\
2933-e 'utime ((stat("$$ARGV[0]"))[8,9], $$ARGV[1])'
2934};
1e44e2bf 2935
f1387719 2936 return join "", @m if $self->{PARENT};
1e44e2bf 2937
f1387719
PP
2938 push @m, q{
2939# Here we warn users that an old packlist file was found somewhere,
2940# and that they should call some uninstall routine
2941WARN_IF_OLD_PACKLIST = $(PERL) -we 'exit unless -f $$ARGV[0];' \\
2942-e 'print "WARNING: I have found an old package in\n";' \\
2943-e 'print "\t$$ARGV[0].\n";' \\
2944-e 'print "Please make sure the two installations are not conflicting\n";'
1e44e2bf 2945
f1387719
PP
2946UNINST=0
2947VERBINST=1
1e44e2bf 2948
f1387719
PP
2949MOD_INSTALL = $(PERL) -I$(INST_LIB) -I$(PERL_LIB) -MExtUtils::Install \
2950-e 'install({@ARGV},"$(VERBINST)",0,"$(UNINST)");'
1e44e2bf 2951
dbc738d9
PP
2952DOC_INSTALL = $(PERL) -e '$$\="\n\n";' \
2953-e 'print "=head2 ", scalar(localtime), ": C<", shift, ">", " L<", shift, ">";' \
f1387719
PP
2954-e 'print "=over 4";' \
2955-e 'while (defined($$key = shift) and defined($$val = shift)){print "=item *";print "C<$$key: $$val>";}' \
2956-e 'print "=back";'
1e44e2bf 2957
f1387719 2958UNINSTALL = $(PERL) -MExtUtils::Install \
8fe37c6d
CS
2959-e 'uninstall($$ARGV[0],1,1); print "\nUninstall is deprecated. Please check the";' \
2960-e 'print " packlist above carefully.\n There may be errors. Remove the";' \
2961-e 'print " appropriate files manually.\n Sorry for the inconveniences.\n"'
f1387719 2962};
1e44e2bf 2963
f1387719
PP
2964 return join "", @m;
2965}
1e44e2bf 2966
f1387719 2967=item tool_xsubpp (o)
1e44e2bf 2968
f1387719 2969Determines typemaps, xsubpp version, prototype behaviour.
1e44e2bf 2970
f1387719 2971=cut
1e44e2bf 2972
f1387719
PP
2973sub tool_xsubpp {
2974 my($self) = shift;
2975 return "" unless $self->needs_linking;
2976 my($xsdir) = $self->catdir($self->{PERL_LIB},"ExtUtils");
2977 my(@tmdeps) = $self->catdir('$(XSUBPPDIR)','typemap');
2978 if( $self->{TYPEMAPS} ){
2979 my $typemap;
2980 foreach $typemap (@{$self->{TYPEMAPS}}){
2981 if( ! -f $typemap ){
2982 warn "Typemap $typemap not found.\n";
2983 }
2984 else{
2985 push(@tmdeps, $typemap);
2986 }
2987 }
2988 }
2989 push(@tmdeps, "typemap") if -f "typemap";
2990 my(@tmargs) = map("-typemap $_", @tmdeps);
2991 if( exists $self->{XSOPT} ){
2992 unshift( @tmargs, $self->{XSOPT} );
1e44e2bf
PP
2993 }
2994
1e44e2bf 2995
f1387719 2996 my $xsubpp_version = $self->xsubpp_version($self->catfile($xsdir,"xsubpp"));
1e44e2bf 2997
f1387719
PP
2998 # What are the correct thresholds for version 1 && 2 Paul?
2999 if ( $xsubpp_version > 1.923 ){
3000 $self->{XSPROTOARG} = "" unless defined $self->{XSPROTOARG};
3001 } else {
3002 if (defined $self->{XSPROTOARG} && $self->{XSPROTOARG} =~ /\-prototypes/) {
3003 print STDOUT qq{Warning: This extension wants to pass the switch "-prototypes" to xsubpp.
3004 Your version of xsubpp is $xsubpp_version and cannot handle this.
3005 Please upgrade to a more recent version of xsubpp.
3006};
3007 } else {
3008 $self->{XSPROTOARG} = "";
3009 }
1e44e2bf
PP
3010 }
3011
f1387719
PP
3012 return qq{
3013XSUBPPDIR = $xsdir
3014XSUBPP = \$(XSUBPPDIR)/xsubpp
3015XSPROTOARG = $self->{XSPROTOARG}
3016XSUBPPDEPS = @tmdeps
3017XSUBPPARGS = @tmargs
3018};
3019};
1e44e2bf 3020
f1387719
PP
3021sub xsubpp_version
3022{
3023 my($self,$xsubpp) = @_;
3024 return $Xsubpp_Version if defined $Xsubpp_Version; # global variable
1e44e2bf 3025
f1387719 3026 my ($version) ;
1e44e2bf 3027
f1387719 3028 # try to figure out the version number of the xsubpp on the system
1e44e2bf 3029
f1387719 3030 # first try the -v flag, introduced in 1.921 & 2.000a2
1e44e2bf 3031
f1387719 3032 return "" unless $self->needs_linking;
1e44e2bf 3033
f1387719
PP
3034 my $command = "$self->{PERL} -I$self->{PERL_LIB} $xsubpp -v 2>&1";
3035 print "Running $command\n" if $Verbose >= 2;
3036 $version = `$command` ;
3037 warn "Running '$command' exits with status " . ($?>>8) if $?;
3038 chop $version ;
1e44e2bf 3039
f1387719 3040 return $Xsubpp_Version = $1 if $version =~ /^xsubpp version (.*)/ ;
1e44e2bf 3041
f1387719 3042 # nope, then try something else
1e44e2bf 3043
f1387719
PP
3044 my $counter = '000';
3045 my ($file) = 'temp' ;
3046 $counter++ while -e "$file$counter"; # don't overwrite anything
3047 $file .= $counter;
1e44e2bf 3048
f1387719
PP
3049 open(F, ">$file") or die "Cannot open file '$file': $!\n" ;
3050 print F <<EOM ;
3051MODULE = fred PACKAGE = fred
1e44e2bf 3052
f1387719
PP
3053int
3054fred(a)
3055 int a;
3056EOM
1e44e2bf 3057
f1387719 3058 close F ;
1e44e2bf 3059
f1387719
PP
3060 $command = "$self->{PERL} $xsubpp $file 2>&1";
3061 print "Running $command\n" if $Verbose >= 2;
3062 my $text = `$command` ;
3063 warn "Running '$command' exits with status " . ($?>>8) if $?;
3064 unlink $file ;
3065
3066 # gets 1.2 -> 1.92 and 2.000a1
3067 return $Xsubpp_Version = $1 if $text =~ /automatically by xsubpp version ([\S]+)\s*/ ;
3068
3069 # it is either 1.0 or 1.1
3070 return $Xsubpp_Version = 1.1 if $text =~ /^Warning: ignored semicolon/ ;
3071
3072 # none of the above, so 1.0
3073 return $Xsubpp_Version = "1.0" ;
1e44e2bf
PP
3074}
3075
f1387719 3076=item top_targets (o)
1e44e2bf 3077
f1387719 3078Defines the targets all, subdirs, config, and O_FILES
1e44e2bf
PP
3079
3080=cut
3081
f1387719
PP
3082sub top_targets {
3083# --- Target Sections ---
1e44e2bf 3084
f1387719
PP
3085 my($self) = shift;
3086 my(@m);
3087 push @m, '
3088#all :: config $(INST_PM) subdirs linkext manifypods
1e44e2bf 3089
f1387719
PP
3090all :: pure_all manifypods
3091 '.$self->{NOECHO}.'$(NOOP)
1e44e2bf 3092
f1387719
PP
3093pure_all :: config pm_to_blib subdirs linkext
3094 '.$self->{NOECHO}.'$(NOOP)
1e44e2bf 3095
f1387719
PP
3096subdirs :: $(MYEXTLIB)
3097 '.$self->{NOECHO}.'$(NOOP)
1e44e2bf 3098
f1387719
PP
3099config :: '.$self->{MAKEFILE}.' $(INST_LIBDIR)/.exists
3100 '.$self->{NOECHO}.'$(NOOP)
3101
3102config :: $(INST_ARCHAUTODIR)/.exists
3103 '.$self->{NOECHO}.'$(NOOP)
3104
3105config :: $(INST_AUTODIR)/.exists
3106 '.$self->{NOECHO}.'$(NOOP)
3107';
3108
3109 push @m, qq{
3110config :: Version_check
3111 $self->{NOECHO}\$(NOOP)
3112
3113} unless $self->{PARENT} or ($self->{PERL_SRC} && $self->{INSTALLDIRS} eq "perl") or $self->{NO_VC};
3114
3115 push @m, $self->dir_target(qw[$(INST_AUTODIR) $(INST_LIBDIR) $(INST_ARCHAUTODIR)]);
3116
3117 if (%{$self->{MAN1PODS}}) {
3118 push @m, qq[
3119config :: \$(INST_MAN1DIR)/.exists
3120 $self->{NOECHO}\$(NOOP)
3121
3122];
3123 push @m, $self->dir_target(qw[$(INST_MAN1DIR)]);
1e44e2bf 3124 }
f1387719
PP
3125 if (%{$self->{MAN3PODS}}) {
3126 push @m, qq[
3127config :: \$(INST_MAN3DIR)/.exists
3128 $self->{NOECHO}\$(NOOP)
3129
3130];
3131 push @m, $self->dir_target(qw[$(INST_MAN3DIR)]);
1e44e2bf 3132 }
1e44e2bf 3133
f1387719
PP
3134 push @m, '
3135$(O_FILES): $(H_FILES)
3136' if @{$self->{O_FILES} || []} && @{$self->{H} || []};
1e44e2bf 3137
f1387719
PP
3138 push @m, q{
3139help:
3140 perldoc ExtUtils::MakeMaker
3141};
1e44e2bf 3142
f1387719
PP
3143 push @m, q{
3144Version_check:
3145 }.$self->{NOECHO}.q{$(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) \
3146 -MExtUtils::MakeMaker=Version_check \
3147 -e 'Version_check("$(MM_VERSION)")'
3148};
1e44e2bf 3149
f1387719 3150 join('',@m);
1e44e2bf
PP
3151}
3152
3153=item writedoc
3154
f4ae0f5e 3155Obsolete, depecated method. Not used since Version 5.21.
1e44e2bf
PP
3156
3157=cut
3158
3159sub writedoc {
3160# --- perllocal.pod section ---
3161 my($self,$what,$name,@attribs)=@_;
1e44e2bf
PP
3162 my $time = localtime;
3163 print "=head2 $time: $what C<$name>\n\n=over 4\n\n=item *\n\n";
3164 print join "\n\n=item *\n\n", map("C<$_>",@attribs);
3165 print "\n\n=back\n\n";
3166}
3167
f1387719
PP
3168=item xs_c (o)
3169
3170Defines the suffix rules to compile XS files to C.
3171
3172=cut
3173
3174sub xs_c {
3175 my($self) = shift;
3176 return '' unless $self->needs_linking();
3177 '
3178.xs.c:
3179 $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) $(XSUBPP) $(XSPROTOARG) $(XSUBPPARGS) $*.xs >$*.tc && mv $*.tc $@
3180';
3181}
3182
3183=item xs_o (o)
3184
3185Defines suffix rules to go from XS to object files directly. This is
3186only intended for broken make implementations.
3187
3188=cut
3189
3190sub xs_o { # many makes are too dumb to use xs_c then c_o
3191 my($self) = shift;
3192 return '' unless $self->needs_linking();
3193 '
3194.xs$(OBJ_EXT):
3195 $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) $(XSUBPP) $(XSPROTOARG) $(XSUBPPARGS) $*.xs >xstmp.c && mv xstmp.c $*.c
042ade60 3196 $(CCCMD) $(CCCDLFLAGS) -I$(PERL_INC) $(DEFINE) $*.c
f1387719
PP
3197';
3198}
3199
f4ae0f5e
PP
32001;
3201
bab2b58e 3202=back
f4ae0f5e 3203
1e44e2bf
PP
3204=head1 SEE ALSO
3205
3206L<ExtUtils::MakeMaker>
3207
3208=cut
3209
f4ae0f5e 3210__END__