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