Sys::Syslog: hyphens in hostnames
[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) = @_;
8cc95fdb 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');
8cc95fdb 669 # catfile may have adapted syntax of $dir to target OS, so...
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)){
4ecf31dc 1170 next if $name =~ /\#/;
f1387719 1171 next if $name eq $self->curdir or $name eq $self->updir or $ignore{$name};
1172 next unless $self->libscan($name);
1173 if (-d $name){
760ac839 1174 next if -l $name; # We do not support symlinks at all
f1387719 1175 $dir{$name} = $name if (-f $self->catfile($name,"Makefile.PL"));
1176 } elsif ($name =~ /\.xs$/){
1177 my($c); ($c = $name) =~ s/\.xs$/.c/;
1178 $xs{$name} = $c;
1179 $c{$c} = 1;
1180 } elsif ($name =~ /\.c(pp|xx|c)?$/i){ # .c .C .cpp .cxx .cc
1181 $c{$name} = 1
1182 unless $name =~ m/perlmain\.c/; # See MAP_TARGET
1183 } elsif ($name =~ /\.h$/i){
1184 $h{$name} = 1;
1185 } elsif ($name =~ /\.(p[ml]|pod)$/){
1186 $pm{$name} = $self->catfile('$(INST_LIBDIR)',$name);
1187 } elsif ($name =~ /\.PL$/ && $name ne "Makefile.PL") {
1188 ($pl_files{$name} = $name) =~ s/\.PL$// ;
1189 } elsif ($Is_VMS && $name =~ /\.pl$/ && $name ne 'makefile.pl' &&
1190 $name ne 'test.pl') { # case-insensitive filesystem
1191 ($pl_files{$name} = $name) =~ s/\.pl$// ;
1192 }
1193 }
f4ae0f5e 1194
f1387719 1195 # Some larger extensions often wish to install a number of *.pm/pl
1196 # files into the library in various locations.
f4ae0f5e 1197
f1387719 1198 # The attribute PMLIBDIRS holds an array reference which lists
1199 # subdirectories which we should search for library files to
1200 # install. PMLIBDIRS defaults to [ 'lib', $self->{BASEEXT} ]. We
1201 # recursively search through the named directories (skipping any
1202 # which don't exist or contain Makefile.PL files).
f4ae0f5e 1203
f1387719 1204 # For each *.pm or *.pl file found $self->libscan() is called with
1205 # the default installation path in $_[1]. The return value of
1206 # libscan defines the actual installation location. The default
1207 # libscan function simply returns the path. The file is skipped
1208 # if libscan returns false.
f4ae0f5e 1209
f1387719 1210 # The default installation location passed to libscan in $_[1] is:
1211 #
1212 # ./*.pm => $(INST_LIBDIR)/*.pm
1213 # ./xyz/... => $(INST_LIBDIR)/xyz/...
1214 # ./lib/... => $(INST_LIB)/...
1215 #
1216 # In this way the 'lib' directory is seen as the root of the actual
1217 # perl library whereas the others are relative to INST_LIBDIR
1218 # (which includes PARENT_NAME). This is a subtle distinction but one
1219 # that's important for nested modules.
1e44e2bf 1220
f1387719 1221 $self->{PMLIBDIRS} = ['lib', $self->{BASEEXT}]
1222 unless $self->{PMLIBDIRS};
1e44e2bf 1223
f1387719 1224 #only existing directories that aren't in $dir are allowed
1e44e2bf 1225
f1387719 1226 # Avoid $_ wherever possible:
1227 # @{$self->{PMLIBDIRS}} = grep -d && !$dir{$_}, @{$self->{PMLIBDIRS}};
1228 my (@pmlibdirs) = @{$self->{PMLIBDIRS}};
1229 my ($pmlibdir);
1230 @{$self->{PMLIBDIRS}} = ();
1231 foreach $pmlibdir (@pmlibdirs) {
1232 -d $pmlibdir && !$dir{$pmlibdir} && push @{$self->{PMLIBDIRS}}, $pmlibdir;
1e44e2bf 1233 }
1e44e2bf 1234
f1387719 1235 if (@{$self->{PMLIBDIRS}}){
1236 print "Searching PMLIBDIRS: @{$self->{PMLIBDIRS}}\n"
1237 if ($Verbose >= 2);
1238 require File::Find;
1239 File::Find::find(sub {
1240 if (-d $_){
1241 if ($_ eq "CVS" || $_ eq "RCS"){
1242 $File::Find::prune = 1;
1243 }
1244 return;
1245 }
4ecf31dc 1246 return if /\#/;
f1387719 1247 my($path, $prefix) = ($File::Find::name, '$(INST_LIBDIR)');
1248 my($striplibpath,$striplibname);
93f9cb4b 1249 $prefix = '$(INST_LIB)' if (($striplibpath = $path) =~ s:^(\W*)lib\W:$1:i);
f1387719 1250 ($striplibname,$striplibpath) = fileparse($striplibpath);
1251 my($inst) = $self->catfile($prefix,$striplibpath,$striplibname);
1252 local($_) = $inst; # for backwards compatibility
1253 $inst = $self->libscan($inst);
1254 print "libscan($path) => '$inst'\n" if ($Verbose >= 2);
1255 return unless $inst;
1256 $pm{$path} = $inst;
1257 }, @{$self->{PMLIBDIRS}});
1258 }
1e44e2bf 1259
f1387719 1260 $self->{DIR} = [sort keys %dir] unless $self->{DIR};
1261 $self->{XS} = \%xs unless $self->{XS};
1262 $self->{PM} = \%pm unless $self->{PM};
1263 $self->{C} = [sort keys %c] unless $self->{C};
1264 my(@o_files) = @{$self->{C}};
1265 $self->{O_FILES} = [grep s/\.c(pp|xx|c)?$/$self->{OBJ_EXT}/i, @o_files] ;
1266 $self->{H} = [sort keys %h] unless $self->{H};
1267 $self->{PL_FILES} = \%pl_files unless $self->{PL_FILES};
1e44e2bf 1268
f1387719 1269 # Set up names of manual pages to generate from pods
1270 if ($self->{MAN1PODS}) {
1271 } elsif ( $self->{INST_MAN1DIR} =~ /^(none|\s*)$/ ) {
1272 $self->{MAN1PODS} = {};
1273 } else {
1274 my %manifypods = ();
1275 if ( exists $self->{EXE_FILES} ) {
1276 foreach $name (@{$self->{EXE_FILES}}) {
1277# use FileHandle ();
1278# my $fh = new FileHandle;
1279 local *FH;
1280 my($ispod)=0;
1281 # one day test, if $/ can be set to '' safely (is the bug fixed that was in 5.001m?)
1282# if ($fh->open("<$name")) {
1283 if (open(FH,"<$name")) {
1284# while (<$fh>) {
1285 while (<FH>) {
1286 if (/^=head1\s+\w+/) {
1287 $ispod=1;
1288 last;
1289 }
1290 }
1291# $fh->close;
1292 close FH;
1293 } else {
1294 # If it doesn't exist yet, we assume, it has pods in it
1295 $ispod = 1;
1e44e2bf 1296 }
f1387719 1297 if( $ispod ) {
1298 $manifypods{$name} = $self->catfile('$(INST_MAN1DIR)',basename($name).'.$(MAN1EXT)');
1e44e2bf 1299 }
f1387719 1300 }
1e44e2bf 1301 }
f1387719 1302 $self->{MAN1PODS} = \%manifypods;
1e44e2bf 1303 }
f1387719 1304 if ($self->{MAN3PODS}) {
1305 } elsif ( $self->{INST_MAN3DIR} =~ /^(none|\s*)$/ ) {
1306 $self->{MAN3PODS} = {};
1e44e2bf 1307 } else {
f1387719 1308 my %manifypods = (); # we collect the keys first, i.e. the files
1309 # we have to convert to pod
1310 foreach $name (keys %{$self->{PM}}) {
1311 if ($name =~ /\.pod$/ ) {
1312 $manifypods{$name} = $self->{PM}{$name};
1313 } elsif ($name =~ /\.p[ml]$/ ) {
1314# use FileHandle ();
1315# my $fh = new FileHandle;
1316 local *FH;
1317 my($ispod)=0;
1318# $fh->open("<$name");
1319 if (open(FH,"<$name")) {
1320 # while (<$fh>) {
1321 while (<FH>) {
1322 if (/^=head1\s+\w+/) {
1323 $ispod=1;
1324 last;
1325 }
1326 }
1327 # $fh->close;
1328 close FH;
1329 } else {
1330 $ispod = 1;
1331 }
1332 if( $ispod ) {
1333 $manifypods{$name} = $self->{PM}{$name};
1334 }
1335 }
1336 }
1337
1338 # Remove "Configure.pm" and similar, if it's not the only pod listed
1339 # To force inclusion, just name it "Configure.pod", or override MAN3PODS
1340 foreach $name (keys %manifypods) {
1341 if ($name =~ /(config|setup).*\.pm/i) {
1342 delete $manifypods{$name};
1343 next;
1344 }
1345 my($manpagename) = $name;
1346 unless ($manpagename =~ s!^\W*lib\W+!!) { # everything below lib is ok
1347 $manpagename = $self->catfile(split(/::/,$self->{PARENT_NAME}),$manpagename);
1348 }
1349 $manpagename =~ s/\.p(od|m|l)$//;
1350 $manpagename = $self->replace_manpage_separator($manpagename);
1351 $manifypods{$name} = $self->catfile("\$(INST_MAN3DIR)","$manpagename.\$(MAN3EXT)");
1e44e2bf 1352 }
f1387719 1353 $self->{MAN3PODS} = \%manifypods;
1e44e2bf 1354 }
f1387719 1355}
1e44e2bf 1356
f1387719 1357=item init_main
1e44e2bf 1358
f1387719 1359Initializes NAME, FULLEXT, BASEEXT, PARENT_NAME, DLBASE, PERL_SRC,
1360PERL_LIB, PERL_ARCHLIB, PERL_INC, INSTALLDIRS, INST_*, INSTALL*,
8cc95fdb 1361PREFIX, CONFIG, AR, AR_STATIC_ARGS, LD, OBJ_EXT, LIB_EXT, EXE_EXT, MAP_TARGET,
f1387719 1362LIBPERL_A, VERSION_FROM, VERSION, DISTNAME, VERSION_SYM.
f4ae0f5e 1363
f1387719 1364=cut
1e44e2bf 1365
f1387719 1366sub init_main {
1367 my($self) = @_;
1e44e2bf 1368
f1387719 1369 # --- Initialize Module Name and Paths
1e44e2bf 1370
f1387719 1371 # NAME = Foo::Bar::Oracle
1372 # FULLEXT = Foo/Bar/Oracle
1373 # BASEEXT = Oracle
1374 # ROOTEXT = Directory part of FULLEXT with leading /. !!! Deprecated from MM 5.32 !!!
1375 # PARENT_NAME = Foo::Bar
1376### Only UNIX:
1377### ($self->{FULLEXT} =
1378### $self->{NAME}) =~ s!::!/!g ; #eg. BSD/Foo/Socket
1379 $self->{FULLEXT} = $self->catdir(split /::/, $self->{NAME});
1e44e2bf 1380
1e44e2bf 1381
f1387719 1382 # Copied from DynaLoader:
1e44e2bf 1383
f1387719 1384 my(@modparts) = split(/::/,$self->{NAME});
1385 my($modfname) = $modparts[-1];
1e44e2bf 1386
f1387719 1387 # Some systems have restrictions on files names for DLL's etc.
1388 # mod2fname returns appropriate file base name (typically truncated)
1389 # It may also edit @modparts if required.
1390 if (defined &DynaLoader::mod2fname) {
1391 $modfname = &DynaLoader::mod2fname(\@modparts);
bab2b58e 1392 }
1e44e2bf 1393
f1387719 1394 ($self->{PARENT_NAME}, $self->{BASEEXT}) = $self->{NAME} =~ m!([\w:]+::)?(\w+)$! ;
1395
760ac839 1396 if (defined &DynaLoader::mod2fname) {
f1387719 1397 # As of 5.001m, dl_os2 appends '_'
1398 $self->{DLBASE} = $modfname;
1399 } else {
1400 $self->{DLBASE} = '$(BASEEXT)';
1401 }
1402
1e44e2bf 1403
f1387719 1404 ### ROOTEXT deprecated from MM 5.32
1405### ($self->{ROOTEXT} =
1406### $self->{FULLEXT}) =~ s#/?\Q$self->{BASEEXT}\E$## ; #eg. /BSD/Foo
1407### $self->{ROOTEXT} = ($Is_VMS ? '' : '/') . $self->{ROOTEXT} if $self->{ROOTEXT};
1e44e2bf 1408
1e44e2bf 1409
f1387719 1410 # --- Initialize PERL_LIB, INST_LIB, PERL_SRC
1e44e2bf 1411
f1387719 1412 # *Real* information: where did we get these two from? ...
1413 my $inc_config_dir = dirname($INC{'Config.pm'});
1414 my $inc_carp_dir = dirname($INC{'Carp.pm'});
1e44e2bf 1415
f1387719 1416 unless ($self->{PERL_SRC}){
1417 my($dir);
1418 foreach $dir ($self->updir(),$self->catdir($self->updir(),$self->updir()),$self->catdir($self->updir(),$self->updir(),$self->updir())){
1419 if (
1420 -f $self->catfile($dir,"config.sh")
1421 &&
1422 -f $self->catfile($dir,"perl.h")
1423 &&
1424 -f $self->catfile($dir,"lib","Exporter.pm")
1425 ) {
1426 $self->{PERL_SRC}=$dir ;
1427 last;
1428 }
1429 }
1430 }
1431 if ($self->{PERL_SRC}){
1432 $self->{PERL_LIB} ||= $self->catdir("$self->{PERL_SRC}","lib");
1433 $self->{PERL_ARCHLIB} = $self->{PERL_LIB};
1434 $self->{PERL_INC} = $self->{PERL_SRC};
1435 # catch a situation that has occurred a few times in the past:
1e44e2bf 1436
bab2b58e 1437 unless (
1438 -s $self->catfile($self->{PERL_SRC},'cflags')
1439 or
1440 $Is_VMS
1441 &&
1442 -s $self->catfile($self->{PERL_SRC},'perlshr_attr.opt')
1443 or
1444 $Is_Mac
1445 ){
1446 warn qq{
f1387719 1447You cannot build extensions below the perl source tree after executing
1448a 'make clean' in the perl source tree.
1e44e2bf 1449
f1387719 1450To rebuild extensions distributed with the perl source you should
1451simply Configure (to include those extensions) and then build perl as
1452normal. After installing perl the source tree can be deleted. It is
1453not needed for building extensions by running 'perl Makefile.PL'
1454usually without extra arguments.
1e44e2bf 1455
f1387719 1456It is recommended that you unpack and build additional extensions away
1457from the perl source tree.
bab2b58e 1458};
1459 }
f1387719 1460 } else {
1461 # we should also consider $ENV{PERL5LIB} here
1462 $self->{PERL_LIB} ||= $Config::Config{privlibexp};
1463 $self->{PERL_ARCHLIB} ||= $Config::Config{archlibexp};
1464 $self->{PERL_INC} = $self->catdir("$self->{PERL_ARCHLIB}","CORE"); # wild guess for now
1465 my $perl_h;
bab2b58e 1466 unless (-f ($perl_h = $self->catfile($self->{PERL_INC},"perl.h"))){
1467 die qq{
f1387719 1468Error: Unable to locate installed Perl libraries or Perl source code.
f4ae0f5e 1469
f1387719 1470It is recommended that you install perl in a standard location before
bab2b58e 1471building extensions. Some precompiled versions of perl do not contain
1472these header files, so you cannot build extensions. In such a case,
1473please build and install your perl from a fresh perl distribution. It
1474usually solves this kind of problem.
f4ae0f5e 1475
bab2b58e 1476\(You get this message, because MakeMaker could not find "$perl_h"\)
1477};
1478 }
f1387719 1479# print STDOUT "Using header files found in $self->{PERL_INC}\n"
1480# if $Verbose && $self->needs_linking();
1e44e2bf 1481
f1387719 1482 }
1e44e2bf 1483
f1387719 1484 # We get SITELIBEXP and SITEARCHEXP directly via
1485 # Get_from_Config. When we are running standard modules, these
1486 # won't matter, we will set INSTALLDIRS to "perl". Otherwise we
1487 # set it to "site". I prefer that INSTALLDIRS be set from outside
1488 # MakeMaker.
1489 $self->{INSTALLDIRS} ||= "site";
1e44e2bf 1490
f1387719 1491 # INST_LIB typically pre-set if building an extension after
1492 # perl has been built and installed. Setting INST_LIB allows
1493 # you to build directly into, say $Config::Config{privlibexp}.
1494 unless ($self->{INST_LIB}){
1e44e2bf 1495
1e44e2bf 1496
f1387719 1497 ##### XXXXX We have to change this nonsense
1e44e2bf 1498
f1387719 1499 if (defined $self->{PERL_SRC} and $self->{INSTALLDIRS} eq "perl") {
1500 $self->{INST_LIB} = $self->{INST_ARCHLIB} = $self->{PERL_LIB};
1501 } else {
1502 $self->{INST_LIB} = $self->catdir($self->curdir,"blib","lib");
1503 }
1504 }
1505 $self->{INST_ARCHLIB} ||= $self->catdir($self->curdir,"blib","arch");
1506 $self->{INST_BIN} ||= $self->catdir($self->curdir,'blib','bin');
1e44e2bf 1507
93f9cb4b 1508 # We need to set up INST_LIBDIR before init_libscan() for VMS
1509 my @parentdir = split(/::/, $self->{PARENT_NAME});
1510 $self->{INST_LIBDIR} = $self->catdir('$(INST_LIB)',@parentdir);
1511 $self->{INST_ARCHLIBDIR} = $self->catdir('$(INST_ARCHLIB)',@parentdir);
1512 $self->{INST_AUTODIR} = $self->catdir('$(INST_LIB)','auto','$(FULLEXT)');
1513 $self->{INST_ARCHAUTODIR} = $self->catdir('$(INST_ARCHLIB)','auto','$(FULLEXT)');
1514
f1387719 1515 # INST_EXE is deprecated, should go away March '97
1516 $self->{INST_EXE} ||= $self->catdir($self->curdir,'blib','script');
1517 $self->{INST_SCRIPT} ||= $self->catdir($self->curdir,'blib','script');
1e44e2bf 1518
f1387719 1519 # The user who requests an installation directory explicitly
1520 # should not have to tell us a architecture installation directory
bab2b58e 1521 # as well. We look if a directory exists that is named after the
f1387719 1522 # architecture. If not we take it as a sign that it should be the
1523 # same as the requested installation directory. Otherwise we take
1524 # the found one.
1525 # We do the same thing twice: for privlib/archlib and for sitelib/sitearch
1526 my($libpair);
1527 for $libpair ({l=>"privlib", a=>"archlib"}, {l=>"sitelib", a=>"sitearch"}) {
1528 my $lib = "install$libpair->{l}";
1529 my $Lib = uc $lib;
1530 my $Arch = uc "install$libpair->{a}";
1531 if( $self->{$Lib} && ! $self->{$Arch} ){
1532 my($ilib) = $Config{$lib};
1533 $ilib = VMS::Filespec::unixify($ilib) if $Is_VMS;
1e44e2bf 1534
f1387719 1535 $self->prefixify($Arch,$ilib,$self->{$Lib});
1536
1537 unless (-d $self->{$Arch}) {
1538 print STDOUT "Directory $self->{$Arch} not found, thusly\n" if $Verbose;
1539 $self->{$Arch} = $self->{$Lib};
1540 }
1541 print STDOUT "Defaulting $Arch to $self->{$Arch}\n" if $Verbose;
1542 }
1e44e2bf 1543 }
f4ae0f5e 1544
f1387719 1545 # we have to look at the relation between $Config{prefix} and the
1546 # requested values. We're going to set the $Config{prefix} part of
1547 # all the installation path variables to literally $(PREFIX), so
1548 # the user can still say make PREFIX=foo
bab2b58e 1549 my($configure_prefix) = $Config{'prefix'};
8cc95fdb 1550 $configure_prefix = VMS::Filespec::unixify($configure_prefix) if $Is_VMS;
bab2b58e 1551 $self->{PREFIX} ||= $configure_prefix;
1552
1553
1554 my($install_variable,$search_prefix,$replace_prefix);
1555
1556 # The rule, taken from Configure, is that if prefix contains perl,
1557 # we shape the tree
1558 # perlprefix/lib/ INSTALLPRIVLIB
1559 # perlprefix/lib/pod/
1560 # perlprefix/lib/site_perl/ INSTALLSITELIB
1561 # perlprefix/bin/ INSTALLBIN
1562 # perlprefix/man/ INSTALLMAN1DIR
1563 # else
1564 # prefix/lib/perl5/ INSTALLPRIVLIB
1565 # prefix/lib/perl5/pod/
1566 # prefix/lib/perl5/site_perl/ INSTALLSITELIB
1567 # prefix/bin/ INSTALLBIN
1568 # prefix/lib/perl5/man/ INSTALLMAN1DIR
1569
1570 $replace_prefix = qq[\$\(PREFIX\)];
1571 for $install_variable (qw/
1572 INSTALLBIN
1573 INSTALLSCRIPT
1574 /) {
1575 $self->prefixify($install_variable,$configure_prefix,$replace_prefix);
1576 }
1577 $search_prefix = $configure_prefix =~ /perl/ ?
1578 $self->catdir($configure_prefix,"lib") :
1579 $self->catdir($configure_prefix,"lib","perl5");
1580 if ($self->{LIB}) {
1581 $self->{INSTALLPRIVLIB} = $self->{INSTALLSITELIB} = $self->{LIB};
1582 $self->{INSTALLARCHLIB} = $self->{INSTALLSITEARCH} =
1583 $self->catdir($self->{LIB},$Config{'archname'});
1584 } else {
1585 $replace_prefix = $self->{PREFIX} =~ /perl/ ?
1586 $self->catdir(qq[\$\(PREFIX\)],"lib") :
1587 $self->catdir(qq[\$\(PREFIX\)],"lib","perl5");
1588 for $install_variable (qw/
1589 INSTALLPRIVLIB
1590 INSTALLARCHLIB
1591 INSTALLSITELIB
1592 INSTALLSITEARCH
1593 /) {
1594 $self->prefixify($install_variable,$search_prefix,$replace_prefix);
1595 }
f1387719 1596 }
bab2b58e 1597 $search_prefix = $configure_prefix =~ /perl/ ?
1598 $self->catdir($configure_prefix,"man") :
1599 $self->catdir($configure_prefix,"lib","perl5","man");
1600 $replace_prefix = $self->{PREFIX} =~ /perl/ ?
1601 $self->catdir(qq[\$\(PREFIX\)],"man") :
1602 $self->catdir(qq[\$\(PREFIX\)],"lib","perl5","man");
f1387719 1603 for $install_variable (qw/
bab2b58e 1604 INSTALLMAN1DIR
1605 INSTALLMAN3DIR
f1387719 1606 /) {
bab2b58e 1607 $self->prefixify($install_variable,$search_prefix,$replace_prefix);
f1387719 1608 }
1e44e2bf 1609
f1387719 1610 # Now we head at the manpages. Maybe they DO NOT want manpages
1611 # installed
1612 $self->{INSTALLMAN1DIR} = $Config::Config{installman1dir}
1613 unless defined $self->{INSTALLMAN1DIR};
1614 unless (defined $self->{INST_MAN1DIR}){
1615 if ($self->{INSTALLMAN1DIR} =~ /^(none|\s*)$/){
1616 $self->{INST_MAN1DIR} = $self->{INSTALLMAN1DIR};
1617 } else {
1618 $self->{INST_MAN1DIR} = $self->catdir($self->curdir,'blib','man1');
1619 }
1620 }
1621 $self->{MAN1EXT} ||= $Config::Config{man1ext};
1e44e2bf 1622
f1387719 1623 $self->{INSTALLMAN3DIR} = $Config::Config{installman3dir}
1624 unless defined $self->{INSTALLMAN3DIR};
1625 unless (defined $self->{INST_MAN3DIR}){
1626 if ($self->{INSTALLMAN3DIR} =~ /^(none|\s*)$/){
1627 $self->{INST_MAN3DIR} = $self->{INSTALLMAN3DIR};
1628 } else {
1629 $self->{INST_MAN3DIR} = $self->catdir($self->curdir,'blib','man3');
1630 }
1e44e2bf 1631 }
f1387719 1632 $self->{MAN3EXT} ||= $Config::Config{man3ext};
1633
1634
1635 # Get some stuff out of %Config if we haven't yet done so
1636 print STDOUT "CONFIG must be an array ref\n"
1637 if ($self->{CONFIG} and ref $self->{CONFIG} ne 'ARRAY');
1638 $self->{CONFIG} = [] unless (ref $self->{CONFIG});
1639 push(@{$self->{CONFIG}}, @ExtUtils::MakeMaker::Get_from_Config);
1640 push(@{$self->{CONFIG}}, 'shellflags') if $Config::Config{shellflags};
1641 my(%once_only,$m);
1642 foreach $m (@{$self->{CONFIG}}){
1643 next if $once_only{$m};
1644 print STDOUT "CONFIG key '$m' does not exist in Config.pm\n"
1645 unless exists $Config::Config{$m};
1646 $self->{uc $m} ||= $Config::Config{$m};
1647 $once_only{$m} = 1;
1e44e2bf 1648 }
1e44e2bf 1649
f1387719 1650# This is too dangerous:
1651# if ($^O eq "next") {
1652# $self->{AR} = "libtool";
1653# $self->{AR_STATIC_ARGS} = "-o";
1654# }
1655# But I leave it as a placeholder
1e44e2bf 1656
f1387719 1657 $self->{AR_STATIC_ARGS} ||= "cr";
1e44e2bf 1658
f1387719 1659 # These should never be needed
1660 $self->{LD} ||= 'ld';
1661 $self->{OBJ_EXT} ||= '.o';
1662 $self->{LIB_EXT} ||= '.a';
1663
1664 $self->{MAP_TARGET} ||= "perl";
1665
1666 $self->{LIBPERL_A} ||= "libperl$self->{LIB_EXT}";
1667
1668 # make a simple check if we find Exporter
1669 warn "Warning: PERL_LIB ($self->{PERL_LIB}) seems not to be a perl library directory
1670 (Exporter.pm not found)"
1671 unless -f $self->catfile("$self->{PERL_LIB}","Exporter.pm") ||
1672 $self->{NAME} eq "ExtUtils::MakeMaker";
1e44e2bf 1673
f1387719 1674 # Determine VERSION and VERSION_FROM
1675 ($self->{DISTNAME}=$self->{NAME}) =~ s#(::)#-#g unless $self->{DISTNAME};
1676 if ($self->{VERSION_FROM}){
1677 $self->{VERSION} = $self->parse_version($self->{VERSION_FROM}) or
1678 Carp::carp "WARNING: Setting VERSION via file '$self->{VERSION_FROM}' failed\n"
1e44e2bf 1679 }
f1387719 1680
1681 # strip blanks
1682 if ($self->{VERSION}) {
1683 $self->{VERSION} =~ s/^\s+//;
1684 $self->{VERSION} =~ s/\s+$//;
1e44e2bf 1685 }
1e44e2bf 1686
f1387719 1687 $self->{VERSION} ||= "0.10";
1688 ($self->{VERSION_SYM} = $self->{VERSION}) =~ s/\W/_/g;
1e44e2bf 1689
1690
f1387719 1691 # Graham Barr and Paul Marquess had some ideas how to ensure
1692 # version compatibility between the *.pm file and the
1693 # corresponding *.xs file. The bottomline was, that we need an
1694 # XS_VERSION macro that defaults to VERSION:
1695 $self->{XS_VERSION} ||= $self->{VERSION};
1e44e2bf 1696
f1387719 1697 # --- Initialize Perl Binary Locations
1698
1699 # Find Perl 5. The only contract here is that both 'PERL' and 'FULLPERL'
1700 # will be working versions of perl 5. miniperl has priority over perl
1701 # for PERL to ensure that $(PERL) is usable while building ./ext/*
1702 my ($component,@defpath);
1703 foreach $component ($self->{PERL_SRC}, $self->path(), $Config::Config{binexp}) {
1704 push @defpath, $component if defined $component;
1e44e2bf 1705 }
ff0cee69 1706 $self->{PERL} ||=
f1387719 1707 $self->find_perl(5.0, [ $^X, 'miniperl','perl','perl5',"perl$]" ],
ff0cee69 1708 \@defpath, $Verbose );
f1387719 1709 # don't check if perl is executable, maybe they have decided to
1710 # supply switches with perl
1711
1712 # Define 'FULLPERL' to be a non-miniperl (used in test: target)
1713 ($self->{FULLPERL} = $self->{PERL}) =~ s/miniperl/perl/i
1714 unless ($self->{FULLPERL});
1e44e2bf 1715}
1716
f1387719 1717=item init_others
1e44e2bf 1718
f1387719 1719Initializes EXTRALIBS, BSLOADLIBS, LDLOADLIBS, LIBS, LD_RUN_PATH,
1720OBJECT, BOOTDEP, PERLMAINCC, LDFROM, LINKTYPE, NOOP, FIRST_MAKEFILE,
68dc0745 1721MAKEFILE, NOECHO, RM_F, RM_RF, TEST_F, TOUCH, CP, MV, CHMOD, UMASK_NULL
1e44e2bf 1722
1723=cut
1724
f1387719 1725sub init_others { # --- Initialize Other Attributes
1e44e2bf 1726 my($self) = shift;
1e44e2bf 1727
f1387719 1728 # Compute EXTRALIBS, BSLOADLIBS and LDLOADLIBS from $self->{LIBS}
1729 # Lets look at $self->{LIBS} carefully: It may be an anon array, a string or
1730 # undefined. In any case we turn it into an anon array:
1e44e2bf 1731
f1387719 1732 # May check $Config{libs} too, thus not empty.
1733 $self->{LIBS}=[''] unless $self->{LIBS};
f4ae0f5e 1734
a1f8e286 1735 $self->{LIBS}=[$self->{LIBS}] if ref \$self->{LIBS} eq 'SCALAR';
f1387719 1736 $self->{LD_RUN_PATH} = "";
1737 my($libs);
1738 foreach $libs ( @{$self->{LIBS}} ){
1739 $libs =~ s/^\s*(.*\S)\s*$/$1/; # remove leading and trailing whitespace
1740 my(@libs) = $self->extliblist($libs);
1741 if ($libs[0] or $libs[1] or $libs[2]){
1742 # LD_RUN_PATH now computed by ExtUtils::Liblist
1743 ($self->{EXTRALIBS}, $self->{BSLOADLIBS}, $self->{LDLOADLIBS}, $self->{LD_RUN_PATH}) = @libs;
1744 last;
1745 }
1746 }
f4ae0f5e 1747
f1387719 1748 if ( $self->{OBJECT} ) {
1749 $self->{OBJECT} =~ s!\.o(bj)?\b!\$(OBJ_EXT)!g;
1750 } else {
1751 # init_dirscan should have found out, if we have C files
1752 $self->{OBJECT} = "";
1753 $self->{OBJECT} = '$(BASEEXT)$(OBJ_EXT)' if @{$self->{C}||[]};
1e44e2bf 1754 }
f1387719 1755 $self->{OBJECT} =~ s/\n+/ \\\n\t/g;
1756 $self->{BOOTDEP} = (-f "$self->{BASEEXT}_BS") ? "$self->{BASEEXT}_BS" : "";
1757 $self->{PERLMAINCC} ||= '$(CC)';
1758 $self->{LDFROM} = '$(OBJECT)' unless $self->{LDFROM};
1e44e2bf 1759
f1387719 1760 # Sanity check: don't define LINKTYPE = dynamic if we're skipping
1761 # the 'dynamic' section of MM. We don't have this problem with
1762 # 'static', since we either must use it (%Config says we can't
1763 # use dynamic loading) or the caller asked for it explicitly.
1764 if (!$self->{LINKTYPE}) {
1765 $self->{LINKTYPE} = $self->{SKIPHASH}{'dynamic'}
1766 ? 'static'
1767 : ($Config::Config{usedl} ? 'dynamic' : 'static');
1768 };
1769
1770 # These get overridden for VMS and maybe some other systems
55497cff 1771 $self->{NOOP} ||= '$(SHELL) -c true';
f1387719 1772 $self->{FIRST_MAKEFILE} ||= "Makefile";
1773 $self->{MAKEFILE} ||= $self->{FIRST_MAKEFILE};
1774 $self->{MAKE_APERL_FILE} ||= "Makefile.aperl";
1775 $self->{NOECHO} = '@' unless defined $self->{NOECHO};
1776 $self->{RM_F} ||= "rm -f";
1777 $self->{RM_RF} ||= "rm -rf";
1778 $self->{TOUCH} ||= "touch";
68dc0745 1779 $self->{TEST_F} ||= "test -f";
f1387719 1780 $self->{CP} ||= "cp";
1781 $self->{MV} ||= "mv";
1782 $self->{CHMOD} ||= "chmod";
1783 $self->{UMASK_NULL} ||= "umask 0";
68dc0745 1784 $self->{DEV_NULL} ||= "> /dev/null 2>&1";
1e44e2bf 1785}
1786
f1387719 1787=item install (o)
1e44e2bf 1788
f1387719 1789Defines the install target.
1e44e2bf 1790
1791=cut
1792
f1387719 1793sub install {
1794 my($self, %attribs) = @_;
1e44e2bf 1795 my(@m);
a5f75d66 1796
f1387719 1797 push @m, q{
1798install :: all pure_install doc_install
1e44e2bf 1799
f1387719 1800install_perl :: all pure_perl_install doc_perl_install
1e44e2bf 1801
f1387719 1802install_site :: all pure_site_install doc_site_install
1e44e2bf 1803
f1387719 1804install_ :: install_site
1805 @echo INSTALLDIRS not defined, defaulting to INSTALLDIRS=site
1e44e2bf 1806
f1387719 1807pure_install :: pure_$(INSTALLDIRS)_install
1e44e2bf 1808
f1387719 1809doc_install :: doc_$(INSTALLDIRS)_install
1810 }.$self->{NOECHO}.q{echo Appending installation info to $(INSTALLARCHLIB)/perllocal.pod
1e44e2bf 1811
f1387719 1812pure__install : pure_site_install
1813 @echo INSTALLDIRS not defined, defaulting to INSTALLDIRS=site
1e44e2bf 1814
f1387719 1815doc__install : doc_site_install
1816 @echo INSTALLDIRS not defined, defaulting to INSTALLDIRS=site
1e44e2bf 1817
f1387719 1818pure_perl_install ::
1819 }.$self->{NOECHO}.q{$(MOD_INSTALL) \
1820 read }.$self->catfile('$(PERL_ARCHLIB)','auto','$(FULLEXT)','.packlist').q{ \
1821 write }.$self->catfile('$(INSTALLARCHLIB)','auto','$(FULLEXT)','.packlist').q{ \
1822 $(INST_LIB) $(INSTALLPRIVLIB) \
1823 $(INST_ARCHLIB) $(INSTALLARCHLIB) \
1824 $(INST_BIN) $(INSTALLBIN) \
1825 $(INST_SCRIPT) $(INSTALLSCRIPT) \
1826 $(INST_MAN1DIR) $(INSTALLMAN1DIR) \
1827 $(INST_MAN3DIR) $(INSTALLMAN3DIR)
1828 }.$self->{NOECHO}.q{$(WARN_IF_OLD_PACKLIST) \
1829 }.$self->catdir('$(SITEARCHEXP)','auto','$(FULLEXT)').q{
1e44e2bf 1830
1e44e2bf 1831
f1387719 1832pure_site_install ::
1833 }.$self->{NOECHO}.q{$(MOD_INSTALL) \
1834 read }.$self->catfile('$(SITEARCHEXP)','auto','$(FULLEXT)','.packlist').q{ \
1835 write }.$self->catfile('$(INSTALLSITEARCH)','auto','$(FULLEXT)','.packlist').q{ \
1836 $(INST_LIB) $(INSTALLSITELIB) \
1837 $(INST_ARCHLIB) $(INSTALLSITEARCH) \
1838 $(INST_BIN) $(INSTALLBIN) \
1839 $(INST_SCRIPT) $(INSTALLSCRIPT) \
1840 $(INST_MAN1DIR) $(INSTALLMAN1DIR) \
1841 $(INST_MAN3DIR) $(INSTALLMAN3DIR)
1842 }.$self->{NOECHO}.q{$(WARN_IF_OLD_PACKLIST) \
1843 }.$self->catdir('$(PERL_ARCHLIB)','auto','$(FULLEXT)').q{
1e44e2bf 1844
f1387719 1845doc_perl_install ::
1846 }.$self->{NOECHO}.q{$(DOC_INSTALL) \
dbc738d9 1847 "Module" "$(NAME)" \
f1387719 1848 "installed into" "$(INSTALLPRIVLIB)" \
1849 LINKTYPE "$(LINKTYPE)" \
1850 VERSION "$(VERSION)" \
1851 EXE_FILES "$(EXE_FILES)" \
1852 >> }.$self->catfile('$(INSTALLARCHLIB)','perllocal.pod').q{
1e44e2bf 1853
f1387719 1854doc_site_install ::
1855 }.$self->{NOECHO}.q{$(DOC_INSTALL) \
dbc738d9 1856 "Module" "$(NAME)" \
f1387719 1857 "installed into" "$(INSTALLSITELIB)" \
1858 LINKTYPE "$(LINKTYPE)" \
1859 VERSION "$(VERSION)" \
1860 EXE_FILES "$(EXE_FILES)" \
1861 >> }.$self->catfile('$(INSTALLARCHLIB)','perllocal.pod').q{
1e44e2bf 1862
f1387719 1863};
1e44e2bf 1864
f1387719 1865 push @m, q{
1866uninstall :: uninstall_from_$(INSTALLDIRS)dirs
f4ae0f5e 1867
f1387719 1868uninstall_from_perldirs ::
1869 }.$self->{NOECHO}.
1870 q{$(UNINSTALL) }.$self->catfile('$(PERL_ARCHLIB)','auto','$(FULLEXT)','.packlist').q{
1e44e2bf 1871
f1387719 1872uninstall_from_sitedirs ::
1873 }.$self->{NOECHO}.
1874 q{$(UNINSTALL) }.$self->catfile('$(SITEARCHEXP)','auto','$(FULLEXT)','.packlist').q{
1875};
1e44e2bf 1876
f1387719 1877 join("",@m);
1878}
1e44e2bf 1879
f1387719 1880=item installbin (o)
1e44e2bf 1881
f1387719 1882Defines targets to install EXE_FILES.
1e44e2bf 1883
f1387719 1884=cut
1e44e2bf 1885
f1387719 1886sub installbin {
1887 my($self) = shift;
1888 return "" unless $self->{EXE_FILES} && ref $self->{EXE_FILES} eq "ARRAY";
1889 return "" unless @{$self->{EXE_FILES}};
1890 my(@m, $from, $to, %fromto, @to);
1891 push @m, $self->dir_target(qw[$(INST_SCRIPT)]);
1892 for $from (@{$self->{EXE_FILES}}) {
1893 my($path)= $self->catfile('$(INST_SCRIPT)', basename($from));
1894 local($_) = $path; # for backwards compatibility
1895 $to = $self->libscan($path);
1896 print "libscan($from) => '$to'\n" if ($Verbose >=2);
1897 $fromto{$from}=$to;
1898 }
1899 @to = values %fromto;
1900 push(@m, "
1901EXE_FILES = @{$self->{EXE_FILES}}
1e44e2bf 1902
f1387719 1903all :: @to
1e44e2bf 1904
f1387719 1905realclean ::
1906 $self->{RM_F} @to
1907");
1e44e2bf 1908
f1387719 1909 while (($from,$to) = each %fromto) {
1910 last unless defined $from;
1911 my $todir = dirname($to);
1912 push @m, "
1913$to: $from $self->{MAKEFILE} $todir/.exists
1914 $self->{NOECHO}$self->{RM_F} $to
1915 $self->{CP} $from $to
1916";
1e44e2bf 1917 }
f1387719 1918 join "", @m;
1919}
1e44e2bf 1920
f1387719 1921=item libscan (o)
1e44e2bf 1922
f1387719 1923Takes a path to a file that is found by init_dirscan and returns false
1924if we don't want to include this file in the library. Mainly used to
1925exclude RCS, CVS, and SCCS directories from installation.
1e44e2bf 1926
f1387719 1927=cut
1e44e2bf 1928
f1387719 1929# ';
1e44e2bf 1930
f1387719 1931sub libscan {
1932 my($self,$path) = @_;
1933 return '' if $path =~ m:\b(RCS|CVS|SCCS)\b: ;
1934 $path;
1e44e2bf 1935}
1936
f4ae0f5e 1937=item linkext (o)
1e44e2bf 1938
f4ae0f5e 1939Defines the linkext target which in turn defines the LINKTYPE.
1e44e2bf 1940
1941=cut
1942
1943sub linkext {
1944 my($self, %attribs) = @_;
1e44e2bf 1945 # LINKTYPE => static or dynamic or ''
1946 my($linktype) = defined $attribs{LINKTYPE} ?
1947 $attribs{LINKTYPE} : '$(LINKTYPE)';
1948 "
1949linkext :: $linktype
f4ae0f5e 1950 $self->{NOECHO}\$(NOOP)
1e44e2bf 1951";
1952}
1953
f1387719 1954=item lsdir
1e44e2bf 1955
f1387719 1956Takes as arguments a directory name and a regular expression. Returns
1957all entries in the directory that match the regular expression.
1e44e2bf 1958
1959=cut
1960
f1387719 1961sub lsdir {
1962 my($self) = shift;
1963 my($dir, $regex) = @_;
1964 my(@ls);
1965 my $dh = new DirHandle;
1966 $dh->open($dir || ".") or return ();
1967 @ls = $dh->read;
1968 $dh->close;
1969 @ls = grep(/$regex/, @ls) if $regex;
1970 @ls;
1971}
1972
1973=item macro (o)
1974
1975Simple subroutine to insert the macros defined by the macro attribute
1976into the Makefile.
1977
1978=cut
1979
1980sub macro {
1e44e2bf 1981 my($self,%attribs) = @_;
f1387719 1982 my(@m,$key,$val);
1983 while (($key,$val) = each %attribs){
1984 last unless defined $key;
1985 push @m, "$key = $val\n";
1e44e2bf 1986 }
f1387719 1987 join "", @m;
1988}
1e44e2bf 1989
f1387719 1990=item makeaperl (o)
1e44e2bf 1991
f1387719 1992Called by staticmake. Defines how to write the Makefile to produce a
1993static new perl.
1994
55497cff 1995By default the Makefile produced includes all the static extensions in
1996the perl library. (Purified versions of library files, e.g.,
1997DynaLoader_pure_p1_c0_032.a are automatically ignored to avoid link errors.)
1998
f1387719 1999=cut
2000
2001sub makeaperl {
2002 my($self, %attribs) = @_;
2003 my($makefilename, $searchdirs, $static, $extra, $perlinc, $target, $tmp, $libperl) =
2004 @attribs{qw(MAKE DIRS STAT EXTRA INCL TARGET TMP LIBPERL)};
1e44e2bf 2005 my(@m);
f1387719 2006 push @m, "
2007# --- MakeMaker makeaperl section ---
2008MAP_TARGET = $target
2009FULLPERL = $self->{FULLPERL}
2010";
2011 return join '', @m if $self->{PARENT};
1e44e2bf 2012
f1387719 2013 my($dir) = join ":", @{$self->{DIR}};
1e44e2bf 2014
f1387719 2015 unless ($self->{MAKEAPERL}) {
2016 push @m, q{
2017$(MAP_TARGET) :: static $(MAKE_APERL_FILE)
2018 $(MAKE) -f $(MAKE_APERL_FILE) $@
1e44e2bf 2019
f1387719 2020$(MAKE_APERL_FILE) : $(FIRST_MAKEFILE)
2021 }.$self->{NOECHO}.q{echo Writing \"$(MAKE_APERL_FILE)\" for this $(MAP_TARGET)
2022 }.$self->{NOECHO}.q{$(PERL) -I$(INST_ARCHLIB) -I$(INST_LIB) -I$(PERL_ARCHLIB) -I$(PERL_LIB) \
2023 Makefile.PL DIR=}, $dir, q{ \
2024 MAKEFILE=$(MAKE_APERL_FILE) LINKTYPE=static \
2025 MAKEAPERL=1 NORECURS=1 CCCDLFLAGS=};
1e44e2bf 2026
f1387719 2027 foreach (@ARGV){
2028 if( /\s/ ){
2029 s/=(.*)/='$1'/;
2030 }
2031 push @m, " \\\n\t\t$_";
2032 }
2033# push @m, map( " \\\n\t\t$_", @ARGV );
2034 push @m, "\n";
1e44e2bf 2035
f1387719 2036 return join '', @m;
2037 }
1e44e2bf 2038
1e44e2bf 2039
1e44e2bf 2040
f1387719 2041 my($cccmd, $linkcmd, $lperl);
1e44e2bf 2042
1e44e2bf 2043
f1387719 2044 $cccmd = $self->const_cccmd($libperl);
2045 $cccmd =~ s/^CCCMD\s*=\s*//;
2046 $cccmd =~ s/\$\(INC\)/ -I$self->{PERL_INC} /;
bab2b58e 2047 $cccmd .= " $Config::Config{cccdlflags}"
042ade60 2048 if ($Config::Config{useshrplib} eq 'true');
f1387719 2049 $cccmd =~ s/\(CC\)/\(PERLMAINCC\)/;
1e44e2bf 2050
f1387719 2051 # The front matter of the linkcommand...
2052 $linkcmd = join ' ', "\$(CC)",
2053 grep($_, @Config{qw(large split ldflags ccdlflags)});
2054 $linkcmd =~ s/\s+/ /g;
93f9cb4b 2055 $linkcmd =~ s,(perl\.exp),\$(PERL_INC)/$1,;
1e44e2bf 2056
f1387719 2057 # Which *.a files could we make use of...
2058 local(%static);
2059 require File::Find;
2060 File::Find::find(sub {
2061 return unless m/\Q$self->{LIB_EXT}\E$/;
2062 return if m/^libperl/;
55497cff 2063 # Skip purified versions of libraries (e.g., DynaLoader_pure_p1_c0_032.a)
2064 return if m/_pure_\w+_\w+_\w+\.\w+$/ and -f "$File::Find::dir/.pure";
1e44e2bf 2065
f1387719 2066 if( exists $self->{INCLUDE_EXT} ){
2067 my $found = 0;
2068 my $incl;
2069 my $xx;
2070
2071 ($xx = $File::Find::name) =~ s,.*?/auto/,,;
2072 $xx =~ s,/?$_,,;
2073 $xx =~ s,/,::,g;
2074
2075 # Throw away anything not explicitly marked for inclusion.
2076 # DynaLoader is implied.
2077 foreach $incl ((@{$self->{INCLUDE_EXT}},'DynaLoader')){
2078 if( $xx eq $incl ){
2079 $found++;
2080 last;
2081 }
2082 }
2083 return unless $found;
2084 }
2085 elsif( exists $self->{EXCLUDE_EXT} ){
2086 my $excl;
2087 my $xx;
1e44e2bf 2088
f1387719 2089 ($xx = $File::Find::name) =~ s,.*?/auto/,,;
2090 $xx =~ s,/?$_,,;
2091 $xx =~ s,/,::,g;
1e44e2bf 2092
f1387719 2093 # Throw away anything explicitly marked for exclusion
2094 foreach $excl (@{$self->{EXCLUDE_EXT}}){
2095 return if( $xx eq $excl );
2096 }
2097 }
2098
2099 # don't include the installed version of this extension. I
2100 # leave this line here, although it is not necessary anymore:
2101 # I patched minimod.PL instead, so that Miniperl.pm won't
2102 # enclude duplicates
2103
2104 # Once the patch to minimod.PL is in the distribution, I can
2105 # drop it
2106 return if $File::Find::name =~ m:auto/$self->{FULLEXT}/$self->{BASEEXT}$self->{LIB_EXT}$:;
2107 use Cwd 'cwd';
2108 $static{cwd() . "/" . $_}++;
2109 }, grep( -d $_, @{$searchdirs || []}) );
2110
2111 # We trust that what has been handed in as argument, will be buildable
2112 $static = [] unless $static;
2113 @static{@{$static}} = (1) x @{$static};
2114
2115 $extra = [] unless $extra && ref $extra eq 'ARRAY';
2116 for (sort keys %static) {
2117 next unless /\Q$self->{LIB_EXT}\E$/;
2118 $_ = dirname($_) . "/extralibs.ld";
2119 push @$extra, $_;
1e44e2bf 2120 }
1e44e2bf 2121
f1387719 2122 grep(s/^/-I/, @{$perlinc || []});
1e44e2bf 2123
f1387719 2124 $target = "perl" unless $target;
2125 $tmp = "." unless $tmp;
1e44e2bf 2126
f1387719 2127# MAP_STATIC doesn't look into subdirs yet. Once "all" is made and we
2128# regenerate the Makefiles, MAP_STATIC and the dependencies for
2129# extralibs.all are computed correctly
2130 push @m, "
2131MAP_LINKCMD = $linkcmd
2132MAP_PERLINC = @{$perlinc || []}
2133MAP_STATIC = ",
2134join(" \\\n\t", reverse sort keys %static), "
1e44e2bf 2135
f1387719 2136MAP_PRELIBS = $Config::Config{libs} $Config::Config{cryptlib}
2137";
2138
2139 if (defined $libperl) {
2140 ($lperl = $libperl) =~ s/\$\(A\)/$self->{LIB_EXT}/;
2141 }
2142 unless ($libperl && -f $lperl) { # Ilya's code...
2143 my $dir = $self->{PERL_SRC} || "$self->{PERL_ARCHLIB}/CORE";
2144 $libperl ||= "libperl$self->{LIB_EXT}";
2145 $libperl = "$dir/$libperl";
2146 $lperl ||= "libperl$self->{LIB_EXT}";
2147 $lperl = "$dir/$lperl";
ff0cee69 2148
2149 if (! -f $libperl and ! -f $lperl) {
2150 # We did not find a static libperl. Maybe there is a shared one?
2151 if ($^O eq 'solaris' or $^O eq 'sunos') {
2152 $lperl = $libperl = "$dir/$Config::Config{libperl}";
2153 # SUNOS ld does not take the full path to a shared library
2154 $libperl = '' if $^O eq 'sunos';
2155 }
2156 }
2157
f1387719 2158 print STDOUT "Warning: $libperl not found
2159 If you're going to build a static perl binary, make sure perl is installed
2160 otherwise ignore this warning\n"
2161 unless (-f $lperl || defined($self->{PERL_SRC}));
2162 }
1e44e2bf 2163
f1387719 2164 push @m, "
2165MAP_LIBPERL = $libperl
2166";
1e44e2bf 2167
f1387719 2168 push @m, "
2169\$(INST_ARCHAUTODIR)/extralibs.all: \$(INST_ARCHAUTODIR)/.exists ".join(" \\\n\t", @$extra)."
2170 $self->{NOECHO}$self->{RM_F} \$\@
2171 $self->{NOECHO}\$(TOUCH) \$\@
2172";
1e44e2bf 2173
f1387719 2174 my $catfile;
2175 foreach $catfile (@$extra){
2176 push @m, "\tcat $catfile >> \$\@\n";
1e44e2bf 2177 }
ff0cee69 2178 # SUNOS ld does not take the full path to a shared library
2179 my $llibperl = ($libperl)?'$(MAP_LIBPERL)':'-lperl';
1e44e2bf 2180
ff0cee69 2181 # Brain dead solaris linker does not use LD_RUN_PATH?
2182 # This fixes dynamic extensions which need shared libs
2183 my $ldfrom = ($^O eq 'solaris')?
2184 join(' ', map "-R$_", split /:/, $self->{LD_RUN_PATH}):'';
2185
2186push @m, "
f1387719 2187\$(MAP_TARGET) :: $tmp/perlmain\$(OBJ_EXT) \$(MAP_LIBPERL) \$(MAP_STATIC) \$(INST_ARCHAUTODIR)/extralibs.all
ff0cee69 2188 \$(MAP_LINKCMD) -o \$\@ \$(OPTIMIZE) $tmp/perlmain\$(OBJ_EXT) $ldfrom $llibperl \$(MAP_STATIC) `cat \$(INST_ARCHAUTODIR)/extralibs.all` \$(MAP_PRELIBS)
f1387719 2189 $self->{NOECHO}echo 'To install the new \"\$(MAP_TARGET)\" binary, call'
2190 $self->{NOECHO}echo ' make -f $makefilename inst_perl MAP_TARGET=\$(MAP_TARGET)'
2191 $self->{NOECHO}echo 'To remove the intermediate files say'
2192 $self->{NOECHO}echo ' make -f $makefilename map_clean'
1e44e2bf 2193
f1387719 2194$tmp/perlmain\$(OBJ_EXT): $tmp/perlmain.c
2195";
2196 push @m, "\tcd $tmp && $cccmd -I\$(PERL_INC) perlmain.c\n";
1e44e2bf 2197
f1387719 2198 push @m, qq{
2199$tmp/perlmain.c: $makefilename}, q{
2200 }.$self->{NOECHO}.q{echo Writing $@
68dc0745 2201 }.$self->{NOECHO}.q{$(PERL) $(MAP_PERLINC) -MExtUtils::Miniperl \\
2202 -e "writemain(grep s#.*/auto/##, qw|$(MAP_STATIC)|)" > $@t && $(MV) $@t $@
1e44e2bf 2203
f1387719 2204};
1e44e2bf 2205
f1387719 2206 push @m, q{
2207doc_inst_perl:
2208 }.$self->{NOECHO}.q{echo Appending installation info to $(INSTALLARCHLIB)/perllocal.pod
2209 }.$self->{NOECHO}.q{$(DOC_INSTALL) \
dbc738d9 2210 "Perl binary" "$(MAP_TARGET)" \
f1387719 2211 MAP_STATIC "$(MAP_STATIC)" \
2212 MAP_EXTRA "`cat $(INST_ARCHAUTODIR)/extralibs.all`" \
2213 MAP_LIBPERL "$(MAP_LIBPERL)" \
2214 >> }.$self->catfile('$(INSTALLARCHLIB)','perllocal.pod').q{
1e44e2bf 2215
f1387719 2216};
1e44e2bf 2217
f1387719 2218 push @m, q{
2219inst_perl: pure_inst_perl doc_inst_perl
1e44e2bf 2220
f1387719 2221pure_inst_perl: $(MAP_TARGET)
2222 }.$self->{CP}.q{ $(MAP_TARGET) }.$self->catfile('$(INSTALLBIN)','$(MAP_TARGET)').q{
1e44e2bf 2223
f1387719 2224clean :: map_clean
2225
2226map_clean :
2227 }.$self->{RM_F}.qq{ $tmp/perlmain\$(OBJ_EXT) $tmp/perlmain.c \$(MAP_TARGET) $makefilename \$(INST_ARCHAUTODIR)/extralibs.all
2228};
2229
2230 join '', @m;
1e44e2bf 2231}
2232
f1387719 2233=item makefile (o)
1e44e2bf 2234
f1387719 2235Defines how to rewrite the Makefile.
1e44e2bf 2236
2237=cut
2238
f1387719 2239sub makefile {
2240 my($self) = shift;
2241 my @m;
2242 # We do not know what target was originally specified so we
2243 # must force a manual rerun to be sure. But as it should only
2244 # happen very rarely it is not a significant problem.
2245 push @m, '
2246$(OBJECT) : $(FIRST_MAKEFILE)
2247' if $self->{OBJECT};
1e44e2bf 2248
f1387719 2249 push @m, q{
2250# We take a very conservative approach here, but it\'s worth it.
2251# We move Makefile to Makefile.old here to avoid gnu make looping.
2252}.$self->{MAKEFILE}.q{ : Makefile.PL $(CONFIGDEP)
2253 }.$self->{NOECHO}.q{echo "Makefile out-of-date with respect to $?"
2254 }.$self->{NOECHO}.q{echo "Cleaning current config before rebuilding Makefile..."
68dc0745 2255 -}.$self->{NOECHO}.q{$(MV) }."$self->{MAKEFILE} $self->{MAKEFILE}.old".q{
2256 -$(MAKE) -f }.$self->{MAKEFILE}.q{.old clean $(DEV_NULL) || $(NOOP)
f1387719 2257 $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" Makefile.PL }.join(" ",map(qq["$_"],@ARGV)).q{
68dc0745 2258 }.$self->{NOECHO}.q{echo "==> Your Makefile has been rebuilt. <=="
2259 }.$self->{NOECHO}.q{echo "==> Please rerun the make command. <=="
2260 false
1e44e2bf 2261
f1387719 2262# To change behavior to :: would be nice, but would break Tk b9.02
2263# so you find such a warning below the dist target.
2264#}.$self->{MAKEFILE}.q{ :: $(VERSION_FROM)
2265# }.$self->{NOECHO}.q{echo "Warning: Makefile possibly out of date with $(VERSION_FROM)"
1e44e2bf 2266};
2267
f1387719 2268 join "", @m;
1e44e2bf 2269}
2270
f4ae0f5e 2271=item manifypods (o)
1e44e2bf 2272
f4ae0f5e 2273Defines targets and routines to translate the pods into manpages and
2274put them into the INST_* directories.
1e44e2bf 2275
2276=cut
2277
2278sub manifypods {
2279 my($self, %attribs) = @_;
f1387719 2280 return "\nmanifypods :\n\t$self->{NOECHO}\$(NOOP)\n" unless %{$self->{MAN3PODS}} or %{$self->{MAN1PODS}};
1e44e2bf 2281 my($dist);
2282 my($pod2man_exe);
2283 if (defined $self->{PERL_SRC}) {
2284 $pod2man_exe = $self->catfile($self->{PERL_SRC},'pod','pod2man');
2285 } else {
f1387719 2286 $pod2man_exe = $self->catfile($Config{scriptdirexp},'pod2man');
1e44e2bf 2287 }
2288 unless ($self->perl_script($pod2man_exe)) {
2289 # No pod2man but some MAN3PODS to be installed
2290 print <<END;
2291
2292Warning: I could not locate your pod2man program. Please make sure,
2293 your pod2man program is in your PATH before you execute 'make'
2294
2295END
2296 $pod2man_exe = "-S pod2man";
2297 }
2298 my(@m);
2299 push @m,
2300qq[POD2MAN_EXE = $pod2man_exe\n],
2301q[POD2MAN = $(PERL) -we '%m=@ARGV;for (keys %m){' \\
2302-e 'next if -e $$m{$$_} && -M $$m{$$_} < -M $$_ && -M $$m{$$_} < -M "].$self->{MAKEFILE}.q[";' \\
2303-e 'print "Manifying $$m{$$_}\n";' \\
f1387719 2304-e 'system(qq[$$^X ].q["-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" $(POD2MAN_EXE) ].qq[$$_>$$m{$$_}])==0 or warn "Couldn\\047t install $$m{$$_}\n";' \\
1e44e2bf 2305-e 'chmod 0644, $$m{$$_} or warn "chmod 644 $$m{$$_}: $$!\n";}'
2306];
2307 push @m, "\nmanifypods : ";
2308 push @m, join " \\\n\t", keys %{$self->{MAN1PODS}}, keys %{$self->{MAN3PODS}};
f1387719 2309
2310 push(@m,"\n");
2311 if (%{$self->{MAN1PODS}} || %{$self->{MAN3PODS}}) {
2312 push @m, "\t$self->{NOECHO}\$(POD2MAN) \\\n\t";
2313 push @m, join " \\\n\t", %{$self->{MAN1PODS}}, %{$self->{MAN3PODS}};
1e44e2bf 2314 }
f1387719 2315 join('', @m);
1e44e2bf 2316}
2317
f1387719 2318=item maybe_command
1e44e2bf 2319
f1387719 2320Returns true, if the argument is likely to be a command.
1e44e2bf 2321
2322=cut
2323
f1387719 2324sub maybe_command {
2325 my($self,$file) = @_;
2326 return $file if -x $file && ! -d $file;
2327 return;
1e44e2bf 2328}
2329
f1387719 2330=item maybe_command_in_dirs
1e44e2bf 2331
f1387719 2332method under development. Not yet used. Ask Ilya :-)
1e44e2bf 2333
2334=cut
2335
f1387719 2336sub maybe_command_in_dirs { # $ver is optional argument if looking for perl
2337# Ilya's suggestion. Not yet used, want to understand it first, but at least the code is here
2338 my($self, $names, $dirs, $trace, $ver) = @_;
2339 my($name, $dir);
2340 foreach $dir (@$dirs){
2341 next unless defined $dir; # $self->{PERL_SRC} may be undefined
2342 foreach $name (@$names){
2343 my($abs,$tryabs);
2344 if ($self->file_name_is_absolute($name)) { # /foo/bar
2345 $abs = $name;
2346 } elsif ($self->canonpath($name) eq $self->canonpath(basename($name))) { # bar
2347 $abs = $self->catfile($dir, $name);
2348 } else { # foo/bar
2349 $abs = $self->catfile($self->curdir, $name);
2350 }
2351 print "Checking $abs for $name\n" if ($trace >= 2);
2352 next unless $tryabs = $self->maybe_command($abs);
2353 print "Substituting $tryabs instead of $abs\n"
2354 if ($trace >= 2 and $tryabs ne $abs);
2355 $abs = $tryabs;
2356 if (defined $ver) {
2357 print "Executing $abs\n" if ($trace >= 2);
2358 if (`$abs -e 'require $ver; print "VER_OK\n" ' 2>&1` =~ /VER_OK/) {
2359 print "Using PERL=$abs\n" if $trace;
2360 return $abs;
2361 }
2362 } else { # Do not look for perl
2363 return $abs;
2364 }
2365 }
1e44e2bf 2366 }
1e44e2bf 2367}
2368
f1387719 2369=item needs_linking (o)
1e44e2bf 2370
f1387719 2371Does this module need linking? Looks into subdirectory objects (see
2372also has_link_code())
1e44e2bf 2373
2374=cut
2375
f1387719 2376sub needs_linking {
2377 my($self) = shift;
2378 my($child,$caller);
2379 $caller = (caller(0))[3];
2380 Carp::confess("Needs_linking called too early") if $caller =~ /^ExtUtils::MakeMaker::/;
2381 return $self->{NEEDS_LINKING} if defined $self->{NEEDS_LINKING};
2382 if ($self->has_link_code or $self->{MAKEAPERL}){
2383 $self->{NEEDS_LINKING} = 1;
2384 return 1;
1e44e2bf 2385 }
f1387719 2386 foreach $child (keys %{$self->{CHILDREN}}) {
2387 if ($self->{CHILDREN}->{$child}->needs_linking) {
2388 $self->{NEEDS_LINKING} = 1;
2389 return 1;
2390 }
1e44e2bf 2391 }
f1387719 2392 return $self->{NEEDS_LINKING} = 0;
1e44e2bf 2393}
2394
f1387719 2395=item nicetext
1e44e2bf 2396
f1387719 2397misnamed method (will have to be changed). The MM_Unix method just
2398returns the argument without further processing.
2399
2400On VMS used to insure that colons marking targets are preceded by
2401space - most Unix Makes don't need this, but it's necessary under VMS
2402to distinguish the target delimiter from a colon appearing as part of
2403a filespec.
1e44e2bf 2404
2405=cut
2406
f1387719 2407sub nicetext {
2408 my($self,$text) = @_;
2409 $text;
2410}
1e44e2bf 2411
f1387719 2412=item parse_version
1e44e2bf 2413
f1387719 2414parse a file and return what you think is $VERSION in this file set to
1e44e2bf 2415
f1387719 2416=cut
2417
2418sub parse_version {
2419 my($self,$parsefile) = @_;
2420 my $result;
2421 local *FH;
2422 local $/ = "\n";
2423 open(FH,$parsefile) or die "Could not open '$parsefile': $!";
2424 my $inpod = 0;
2425 while (<FH>) {
2426 $inpod = /^=(?!cut)/ ? 1 : /^=cut/ ? 0 : $inpod;
2427 next if $inpod;
2428 chop;
2429 next unless /\$(([\w\:\']*)\bVERSION)\b.*\=/;
dbc738d9 2430 my $eval = qq{
2431 package ExtUtils::MakeMaker::_version;
a1f8e286 2432 no strict;
bab2b58e 2433
2434 \$$1=undef; do {
2435 $_
dbc738d9 2436 }; \$$1
2437 };
2438 local($^W) = 0;
2439 $result = eval($eval) || 0;
f1387719 2440 die "Could not eval '$eval' in $parsefile: $@" if $@;
f1387719 2441 last;
2442 }
2443 close FH;
2444 return $result;
1e44e2bf 2445}
2446
1e44e2bf 2447
f1387719 2448=item pasthru (o)
2449
2450Defines the string that is passed to recursive make calls in
2451subdirectories.
1e44e2bf 2452
2453=cut
2454
f1387719 2455sub pasthru {
1e44e2bf 2456 my($self) = shift;
f1387719 2457 my(@m,$key);
1e44e2bf 2458
f1387719 2459 my(@pasthru);
bbce6d69 2460 my($sep) = $Is_VMS ? ',' : '';
2461 $sep .= "\\\n\t";
1e44e2bf 2462
bab2b58e 2463 foreach $key (qw(LIB LIBPERL_A LINKTYPE PREFIX OPTIMIZE)){
f1387719 2464 push @pasthru, "$key=\"\$($key)\"";
2465 }
f4ae0f5e 2466
bbce6d69 2467 push @m, "\nPASTHRU = ", join ($sep, @pasthru), "\n";
f1387719 2468 join "", @m;
2469}
1e44e2bf 2470
f1387719 2471=item path
f4ae0f5e 2472
f1387719 2473Takes no argument, returns the environment variable PATH as an array.
1e44e2bf 2474
f1387719 2475=cut
2476
2477sub path {
2478 my($self) = @_;
2479 my $path_sep = $Is_OS2 ? ";" : ":";
2480 my $path = $ENV{PATH};
2481 $path =~ s:\\:/:g if $Is_OS2;
2482 my @path = split $path_sep, $path;
93f9cb4b 2483 foreach(@path) { $_ = '.' if $_ eq '' }
2484 @path;
1e44e2bf 2485}
2486
f1387719 2487=item perl_script
1e44e2bf 2488
f1387719 2489Takes one argument, a file name, and returns the file name, if the
2490argument is likely to be a perl script. On MM_Unix this is true for
2491any ordinary, readable file.
1e44e2bf 2492
2493=cut
2494
f1387719 2495sub perl_script {
2496 my($self,$file) = @_;
2497 return $file if -r $file && -f _;
2498 return;
1e44e2bf 2499}
2500
f1387719 2501=item perldepend (o)
1e44e2bf 2502
f1387719 2503Defines the dependency from all *.h files that come with the perl
2504distribution.
1e44e2bf 2505
2506=cut
2507
f1387719 2508sub perldepend {
1e44e2bf 2509 my($self) = shift;
f1387719 2510 my(@m);
2511 push @m, q{
2512# Check for unpropogated config.sh changes. Should never happen.
2513# We do NOT just update config.h because that is not sufficient.
2514# An out of date config.h is not fatal but complains loudly!
2515$(PERL_INC)/config.h: $(PERL_SRC)/config.sh
2516 -}.$self->{NOECHO}.q{echo "Warning: $(PERL_INC)/config.h out of date with $(PERL_SRC)/config.sh"; false
2517
2518$(PERL_ARCHLIB)/Config.pm: $(PERL_SRC)/config.sh
2519 }.$self->{NOECHO}.q{echo "Warning: $(PERL_ARCHLIB)/Config.pm may be out of date with $(PERL_SRC)/config.sh"
2520 cd $(PERL_SRC) && $(MAKE) lib/Config.pm
2521} if $self->{PERL_SRC};
2522
2523 return join "", @m unless $self->needs_linking;
2524
1e44e2bf 2525 push @m, q{
f1387719 2526PERL_HDRS = \
2527$(PERL_INC)/EXTERN.h $(PERL_INC)/gv.h $(PERL_INC)/pp.h \
2528$(PERL_INC)/INTERN.h $(PERL_INC)/handy.h $(PERL_INC)/proto.h \
2529$(PERL_INC)/XSUB.h $(PERL_INC)/hv.h $(PERL_INC)/regcomp.h \
2530$(PERL_INC)/av.h $(PERL_INC)/keywords.h $(PERL_INC)/regexp.h \
2531$(PERL_INC)/config.h $(PERL_INC)/mg.h $(PERL_INC)/scope.h \
2532$(PERL_INC)/cop.h $(PERL_INC)/op.h $(PERL_INC)/sv.h \
2533$(PERL_INC)/cv.h $(PERL_INC)/opcode.h $(PERL_INC)/unixish.h \
2534$(PERL_INC)/dosish.h $(PERL_INC)/patchlevel.h $(PERL_INC)/util.h \
2535$(PERL_INC)/embed.h $(PERL_INC)/perl.h \
2536$(PERL_INC)/form.h $(PERL_INC)/perly.h
2537
2538$(OBJECT) : $(PERL_HDRS)
2539} if $self->{OBJECT};
2540
2541 push @m, join(" ", values %{$self->{XS}})." : \$(XSUBPPDEPS)\n" if %{$self->{XS}};
2542
2543 join "\n", @m;
1e44e2bf 2544}
2545
f1387719 2546=item pm_to_blib
1e44e2bf 2547
f1387719 2548Defines target that copies all files in the hash PM to their
55497cff 2549destination and autosplits them. See L<ExtUtils::Install/DESCRIPTION>
1e44e2bf 2550
2551=cut
2552
f1387719 2553sub pm_to_blib {
2554 my $self = shift;
2555 my($autodir) = $self->catdir('$(INST_LIB)','auto');
2556 return q{
2557pm_to_blib: $(TO_INST_PM)
2558 }.$self->{NOECHO}.q{$(PERL) "-I$(INST_ARCHLIB)" "-I$(INST_LIB)" \
2559 "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" -MExtUtils::Install \
68dc0745 2560 -e "pm_to_blib({qw{$(PM_TO_BLIB)}},'}.$autodir.q{')"
f1387719 2561 }.$self->{NOECHO}.q{$(TOUCH) $@
1e44e2bf 2562};
1e44e2bf 2563}
2564
f1387719 2565=item post_constants (o)
1e44e2bf 2566
f1387719 2567Returns an empty string per default. Dedicated to overrides from
2568within Makefile.PL after all constants have been defined.
1e44e2bf 2569
2570=cut
2571
f1387719 2572sub post_constants{
2573 my($self) = shift;
2574 "";
2575}
1e44e2bf 2576
f1387719 2577=item post_initialize (o)
1e44e2bf 2578
1fef88e7 2579Returns an empty string per default. Used in Makefile.PLs to add some
f1387719 2580chunk of text to the Makefile after the object is initialized.
1e44e2bf 2581
f1387719 2582=cut
1e44e2bf 2583
f1387719 2584sub post_initialize {
2585 my($self) = shift;
2586 "";
2587}
1e44e2bf 2588
f1387719 2589=item postamble (o)
1e44e2bf 2590
f1387719 2591Returns an empty string. Can be used in Makefile.PLs to write some
2592text to the Makefile at the end.
1e44e2bf 2593
f1387719 2594=cut
1e44e2bf 2595
f1387719 2596sub postamble {
2597 my($self) = shift;
2598 "";
2599}
1e44e2bf 2600
f1387719 2601=item prefixify
1e44e2bf 2602
f1387719 2603Check a path variable in $self from %Config, if it contains a prefix,
2604and replace it with another one.
1e44e2bf 2605
f1387719 2606Takes as arguments an attribute name, a search prefix and a
2607replacement prefix. Changes the attribute in the object.
1e44e2bf 2608
f1387719 2609=cut
1e44e2bf 2610
f1387719 2611sub prefixify {
2612 my($self,$var,$sprefix,$rprefix) = @_;
2613 $self->{uc $var} ||= $Config{lc $var};
2614 $self->{uc $var} = VMS::Filespec::unixpath($self->{uc $var}) if $Is_VMS;
2615 $self->{uc $var} =~ s/\Q$sprefix\E/$rprefix/;
2616}
1e44e2bf 2617
f1387719 2618=item processPL (o)
1e44e2bf 2619
f1387719 2620Defines targets to run *.PL files.
1e44e2bf 2621
f1387719 2622=cut
1e44e2bf 2623
f1387719 2624sub processPL {
2625 my($self) = shift;
2626 return "" unless $self->{PL_FILES};
2627 my(@m, $plfile);
2628 foreach $plfile (sort keys %{$self->{PL_FILES}}) {
2629 push @m, "
2630all :: $self->{PL_FILES}->{$plfile}
1e44e2bf 2631
f1387719 2632$self->{PL_FILES}->{$plfile} :: $plfile
2633 \$(PERL) -I\$(INST_ARCHLIB) -I\$(INST_LIB) -I\$(PERL_ARCHLIB) -I\$(PERL_LIB) $plfile
2634";
2635 }
2636 join "", @m;
1e44e2bf 2637}
2638
f1387719 2639=item realclean (o)
1e44e2bf 2640
f1387719 2641Defines the realclean target.
1e44e2bf 2642
2643=cut
2644
f1387719 2645sub realclean {
2646 my($self, %attribs) = @_;
2647 my(@m);
2648 push(@m,'
2649# Delete temporary files (via clean) and also delete installed files
2650realclean purge :: clean
2651');
2652 # realclean subdirectories first (already cleaned)
68dc0745 2653 my $sub = "\t-cd %s && \$(TEST_F) %s && \$(MAKE) %s realclean\n";
f1387719 2654 foreach(@{$self->{DIR}}){
2655 push(@m, sprintf($sub,$_,"$self->{MAKEFILE}.old","-f $self->{MAKEFILE}.old"));
2656 push(@m, sprintf($sub,$_,"$self->{MAKEFILE}",''));
1e44e2bf 2657 }
f1387719 2658 push(@m, " $self->{RM_RF} \$(INST_AUTODIR) \$(INST_ARCHAUTODIR)\n");
2659 if( $self->has_link_code ){
2660 push(@m, " $self->{RM_F} \$(INST_DYNAMIC) \$(INST_BOOT)\n");
2661 push(@m, " $self->{RM_F} \$(INST_STATIC)\n");
2662 }
2663 push(@m, " $self->{RM_F} " . join(" ", values %{$self->{PM}}) . "\n");
2664 my(@otherfiles) = ($self->{MAKEFILE},
2665 "$self->{MAKEFILE}.old"); # Makefiles last
2666 push(@otherfiles, $attribs{FILES}) if $attribs{FILES};
2667 push(@m, " $self->{RM_RF} @otherfiles\n") if @otherfiles;
2668 push(@m, " $attribs{POSTOP}\n") if $attribs{POSTOP};
2669 join("", @m);
1e44e2bf 2670}
2671
f1387719 2672=item replace_manpage_separator
1e44e2bf 2673
f1387719 2674Takes the name of a package, which may be a nested package, in the
2675form Foo/Bar and replaces the slash with C<::>. Returns the replacement.
1e44e2bf 2676
2677=cut
2678
f1387719 2679sub replace_manpage_separator {
2680 my($self,$man) = @_;
2681 $man =~ s,/+,::,g;
2682 $man;
2683}
1e44e2bf 2684
f1387719 2685=item static (o)
1e44e2bf 2686
f1387719 2687Defines the static target.
1e44e2bf 2688
f1387719 2689=cut
1e44e2bf 2690
f1387719 2691sub static {
2692# --- Static Loading Sections ---
1e44e2bf 2693
f1387719 2694 my($self) = shift;
2695 '
2696## $(INST_PM) has been moved to the all: target.
2697## It remains here for awhile to allow for old usage: "make static"
2698#static :: '.$self->{MAKEFILE}.' $(INST_STATIC) $(INST_PM)
2699static :: '.$self->{MAKEFILE}.' $(INST_STATIC)
2700 '.$self->{NOECHO}.'$(NOOP)
2701';
1e44e2bf 2702}
2703
f1387719 2704=item static_lib (o)
1e44e2bf 2705
f1387719 2706Defines how to produce the *.a (or equivalent) files.
1e44e2bf 2707
2708=cut
2709
f1387719 2710sub static_lib {
2711 my($self) = @_;
2712# Come to think of it, if there are subdirs with linkcode, we still have no INST_STATIC
2713# return '' unless $self->needs_linking(); #might be because of a subdir
1e44e2bf 2714
f1387719 2715 return '' unless $self->has_link_code;
2716
2717 my(@m);
2718 push(@m, <<'END');
2719$(INST_STATIC): $(OBJECT) $(MYEXTLIB) $(INST_ARCHAUTODIR)/.exists
760ac839 2720 $(RM_RF) $@
f1387719 2721END
2722 # If this extension has it's own library (eg SDBM_File)
2723 # then copy that to $(INST_STATIC) and add $(OBJECT) into it.
2724 push(@m, "\t$self->{CP} \$(MYEXTLIB) \$\@\n") if $self->{MYEXTLIB};
f4ae0f5e 2725
f1387719 2726 push @m,
760ac839 2727q{ $(AR) $(AR_STATIC_ARGS) $@ $(OBJECT) && $(RANLIB) $@
f1387719 2728 }.$self->{NOECHO}.q{echo "$(EXTRALIBS)" > $(INST_ARCHAUTODIR)/extralibs.ld
2729 $(CHMOD) 755 $@
f4ae0f5e 2730};
1e44e2bf 2731
f1387719 2732# Old mechanism - still available:
2733
2734 push @m, "\t$self->{NOECHO}".q{echo "$(EXTRALIBS)" >> $(PERL_SRC)/ext.libs}."\n\n"
2735 if $self->{PERL_SRC};
2736
2737 push @m, $self->dir_target('$(INST_ARCHAUTODIR)');
2738 join('', "\n",@m);
1e44e2bf 2739}
2740
f4ae0f5e 2741=item staticmake (o)
1e44e2bf 2742
f4ae0f5e 2743Calls makeaperl.
1e44e2bf 2744
2745=cut
2746
2747sub staticmake {
2748 my($self, %attribs) = @_;
1e44e2bf 2749 my(@static);
2750
2751 my(@searchdirs)=($self->{PERL_ARCHLIB}, $self->{SITEARCHEXP}, $self->{INST_ARCHLIB});
2752
2753 # And as it's not yet built, we add the current extension
2754 # but only if it has some C code (or XS code, which implies C code)
2755 if (@{$self->{C}}) {
f4ae0f5e 2756 @static = $self->catfile($self->{INST_ARCHLIB},
2757 "auto",
2758 $self->{FULLEXT},
2759 "$self->{BASEEXT}$self->{LIB_EXT}"
2760 );
1e44e2bf 2761 }
2762
2763 # Either we determine now, which libraries we will produce in the
2764 # subdirectories or we do it at runtime of the make.
2765
2766 # We could ask all subdir objects, but I cannot imagine, why it
2767 # would be necessary.
2768
2769 # Instead we determine all libraries for the new perl at
2770 # runtime.
2771 my(@perlinc) = ($self->{INST_ARCHLIB}, $self->{INST_LIB}, $self->{PERL_ARCHLIB}, $self->{PERL_LIB});
2772
2773 $self->makeaperl(MAKE => $self->{MAKEFILE},
2774 DIRS => \@searchdirs,
2775 STAT => \@static,
2776 INCL => \@perlinc,
2777 TARGET => $self->{MAP_TARGET},
2778 TMP => "",
2779 LIBPERL => $self->{LIBPERL_A}
2780 );
2781}
2782
f1387719 2783=item subdir_x (o)
2784
2785Helper subroutine for subdirs
2786
2787=cut
2788
2789sub subdir_x {
2790 my($self, $subdir) = @_;
2791 my(@m);
2792 qq{
2793
2794subdirs ::
2795 $self->{NOECHO}cd $subdir && \$(MAKE) all \$(PASTHRU)
2796
2797};
2798}
2799
2800=item subdirs (o)
2801
2802Defines targets to process subdirectories.
2803
2804=cut
2805
2806sub subdirs {
2807# --- Sub-directory Sections ---
2808 my($self) = shift;
2809 my(@m,$dir);
2810 # This method provides a mechanism to automatically deal with
2811 # subdirectories containing further Makefile.PL scripts.
2812 # It calls the subdir_x() method for each subdirectory.
2813 foreach $dir (@{$self->{DIR}}){
2814 push(@m, $self->subdir_x($dir));
2815#### print "Including $dir subdirectory\n";
2816 }
2817 if (@m){
2818 unshift(@m, "
2819# The default clean, realclean and test targets in this Makefile
2820# have automatically been given entries for each subdir.
2821
2822");
2823 } else {
2824 push(@m, "\n# none")
2825 }
2826 join('',@m);
2827}
2828
f4ae0f5e 2829=item test (o)
1e44e2bf 2830
f4ae0f5e 2831Defines the test targets.
1e44e2bf 2832
2833=cut
2834
2835sub test {
2836# --- Test and Installation Sections ---
2837
2838 my($self, %attribs) = @_;
1e44e2bf 2839 my($tests) = $attribs{TESTS} || (-d "t" ? "t/*.t" : "");
2840 my(@m);
2841 push(@m,"
2842TEST_VERBOSE=0
2843TEST_TYPE=test_\$(LINKTYPE)
f1387719 2844TEST_FILE = test.pl
2845TESTDB_SW = -d
1e44e2bf 2846
f4ae0f5e 2847testdb :: testdb_\$(LINKTYPE)
f1387719 2848
2849test :: \$(TEST_TYPE)
1e44e2bf 2850");
68dc0745 2851 push(@m, map("\t$self->{NOECHO}cd $_ && \$(TEST_F) $self->{MAKEFILE} && \$(MAKE) test \$(PASTHRU)\n",
1e44e2bf 2852 @{$self->{DIR}}));
2853 push(@m, "\t$self->{NOECHO}echo 'No tests defined for \$(NAME) extension.'\n")
2854 unless $tests or -f "test.pl" or @{$self->{DIR}};
2855 push(@m, "\n");
2856
f4ae0f5e 2857 push(@m, "test_dynamic :: pure_all\n");
1e44e2bf 2858 push(@m, $self->test_via_harness('$(FULLPERL)', $tests)) if $tests;
2859 push(@m, $self->test_via_script('$(FULLPERL)', 'test.pl')) if -f "test.pl";
2860 push(@m, "\n");
2861
f1387719 2862 push(@m, "testdb_dynamic :: pure_all\n");
2863 push(@m, $self->test_via_script('$(FULLPERL) $(TESTDB_SW)', '$(TEST_FILE)'));
2864 push(@m, "\n");
f4ae0f5e 2865
1e44e2bf 2866 # Occasionally we may face this degenerate target:
2867 push @m, "test_ : test_dynamic\n\n";
2868
2869 if ($self->needs_linking()) {
f4ae0f5e 2870 push(@m, "test_static :: pure_all \$(MAP_TARGET)\n");
1e44e2bf 2871 push(@m, $self->test_via_harness('./$(MAP_TARGET)', $tests)) if $tests;
2872 push(@m, $self->test_via_script('./$(MAP_TARGET)', 'test.pl')) if -f "test.pl";
2873 push(@m, "\n");
f1387719 2874 push(@m, "testdb_static :: pure_all \$(MAP_TARGET)\n");
2875 push(@m, $self->test_via_script('./$(MAP_TARGET) $(TESTDB_SW)', '$(TEST_FILE)'));
2876 push(@m, "\n");
1e44e2bf 2877 } else {
2878 push @m, "test_static :: test_dynamic\n";
f4ae0f5e 2879 push @m, "testdb_static :: testdb_dynamic\n";
1e44e2bf 2880 }
2881 join("", @m);
2882}
2883
f4ae0f5e 2884=item test_via_harness (o)
1e44e2bf 2885
f4ae0f5e 2886Helper method to write the test targets
1e44e2bf 2887
2888=cut
2889
2890sub test_via_harness {
2891 my($self, $perl, $tests) = @_;
1e44e2bf 2892 "\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";
2893}
2894
f4ae0f5e 2895=item test_via_script (o)
1e44e2bf 2896
f4ae0f5e 2897Other helper method for test.
1e44e2bf 2898
2899=cut
2900
2901sub test_via_script {
2902 my($self, $perl, $script) = @_;
1e44e2bf 2903 qq{\tPERL_DL_NONLAZY=1 $perl}.q{ -I$(INST_ARCHLIB) -I$(INST_LIB) -I$(PERL_ARCHLIB) -I$(PERL_LIB) }.qq{$script
2904};
2905}
2906
f1387719 2907=item tool_autosplit (o)
1e44e2bf 2908
f1387719 2909Defines a simple perl call that runs autosplit. May be deprecated by
2910pm_to_blib soon.
1e44e2bf 2911
2912=cut
2913
f1387719 2914sub tool_autosplit {
2915# --- Tool Sections ---
2916
2917 my($self, %attribs) = @_;
2918 my($asl) = "";
2919 $asl = "\$AutoSplit::Maxlen=$attribs{MAXLEN};" if $attribs{MAXLEN};
2920 q{
2921# Usage: $(AUTOSPLITFILE) FileToSplit AutoDirToSplitInto
2922AUTOSPLITFILE = $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" -e 'use AutoSplit;}.$asl.q{autosplit($$ARGV[0], $$ARGV[1], 0, 1, 1) ;'
2923};
1e44e2bf 2924}
2925
f1387719 2926=item tools_other (o)
1e44e2bf 2927
f1387719 2928Defines SHELL, LD, TOUCH, CP, MV, RM_F, RM_RF, CHMOD, UMASK_NULL in
2929the Makefile. Also defines the perl programs MKPATH,
2930WARN_IF_OLD_PACKLIST, MOD_INSTALL. DOC_INSTALL, and UNINSTALL.
1e44e2bf 2931
2932=cut
2933
f1387719 2934sub tools_other {
2935 my($self) = shift;
2936 my @m;
2937 my $bin_sh = $Config{sh} || '/bin/sh';
2938 push @m, qq{
2939SHELL = $bin_sh
2940};
2941
68dc0745 2942 for (qw/ CHMOD CP LD MV NOOP RM_F RM_RF TEST_F TOUCH UMASK_NULL DEV_NULL/ ) {
f1387719 2943 push @m, "$_ = $self->{$_}\n";
1e44e2bf 2944 }
1e44e2bf 2945
f1387719 2946 push @m, q{
2947# The following is a portable way to say mkdir -p
2948# To see which directories are created, change the if 0 to if 1
68dc0745 2949MKPATH = $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) -MExtUtils::Command -e mkpath
1e44e2bf 2950
f1387719 2951# This helps us to minimize the effect of the .exists files A yet
2952# better solution would be to have a stable file in the perl
2953# distribution with a timestamp of zero. But this solution doesn't
2954# need any changes to the core distribution and works with older perls
68dc0745 2955EQUALIZE_TIMESTAMP = $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) -MExtUtils::Command -e eqtime
f1387719 2956};
1e44e2bf 2957
68dc0745 2958
f1387719 2959 return join "", @m if $self->{PARENT};
1e44e2bf 2960
f1387719 2961 push @m, q{
2962# Here we warn users that an old packlist file was found somewhere,
2963# and that they should call some uninstall routine
2964WARN_IF_OLD_PACKLIST = $(PERL) -we 'exit unless -f $$ARGV[0];' \\
2965-e 'print "WARNING: I have found an old package in\n";' \\
2966-e 'print "\t$$ARGV[0].\n";' \\
2967-e 'print "Please make sure the two installations are not conflicting\n";'
1e44e2bf 2968
f1387719 2969UNINST=0
2970VERBINST=1
1e44e2bf 2971
f1387719 2972MOD_INSTALL = $(PERL) -I$(INST_LIB) -I$(PERL_LIB) -MExtUtils::Install \
68dc0745 2973-e "install({@ARGV},'$(VERBINST)',0,'$(UNINST)');"
1e44e2bf 2974
dbc738d9 2975DOC_INSTALL = $(PERL) -e '$$\="\n\n";' \
2976-e 'print "=head2 ", scalar(localtime), ": C<", shift, ">", " L<", shift, ">";' \
f1387719 2977-e 'print "=over 4";' \
2978-e 'while (defined($$key = shift) and defined($$val = shift)){print "=item *";print "C<$$key: $$val>";}' \
2979-e 'print "=back";'
1e44e2bf 2980
f1387719 2981UNINSTALL = $(PERL) -MExtUtils::Install \
8fe37c6d 2982-e 'uninstall($$ARGV[0],1,1); print "\nUninstall is deprecated. Please check the";' \
2983-e 'print " packlist above carefully.\n There may be errors. Remove the";' \
2984-e 'print " appropriate files manually.\n Sorry for the inconveniences.\n"'
f1387719 2985};
1e44e2bf 2986
f1387719 2987 return join "", @m;
2988}
1e44e2bf 2989
f1387719 2990=item tool_xsubpp (o)
1e44e2bf 2991
f1387719 2992Determines typemaps, xsubpp version, prototype behaviour.
1e44e2bf 2993
f1387719 2994=cut
1e44e2bf 2995
f1387719 2996sub tool_xsubpp {
2997 my($self) = shift;
2998 return "" unless $self->needs_linking;
2999 my($xsdir) = $self->catdir($self->{PERL_LIB},"ExtUtils");
3000 my(@tmdeps) = $self->catdir('$(XSUBPPDIR)','typemap');
3001 if( $self->{TYPEMAPS} ){
3002 my $typemap;
3003 foreach $typemap (@{$self->{TYPEMAPS}}){
3004 if( ! -f $typemap ){
3005 warn "Typemap $typemap not found.\n";
3006 }
3007 else{
3008 push(@tmdeps, $typemap);
3009 }
3010 }
3011 }
3012 push(@tmdeps, "typemap") if -f "typemap";
3013 my(@tmargs) = map("-typemap $_", @tmdeps);
3014 if( exists $self->{XSOPT} ){
3015 unshift( @tmargs, $self->{XSOPT} );
1e44e2bf 3016 }
3017
1e44e2bf 3018
f1387719 3019 my $xsubpp_version = $self->xsubpp_version($self->catfile($xsdir,"xsubpp"));
1e44e2bf 3020
f1387719 3021 # What are the correct thresholds for version 1 && 2 Paul?
3022 if ( $xsubpp_version > 1.923 ){
3023 $self->{XSPROTOARG} = "" unless defined $self->{XSPROTOARG};
3024 } else {
3025 if (defined $self->{XSPROTOARG} && $self->{XSPROTOARG} =~ /\-prototypes/) {
3026 print STDOUT qq{Warning: This extension wants to pass the switch "-prototypes" to xsubpp.
3027 Your version of xsubpp is $xsubpp_version and cannot handle this.
3028 Please upgrade to a more recent version of xsubpp.
3029};
3030 } else {
3031 $self->{XSPROTOARG} = "";
3032 }
1e44e2bf 3033 }
3034
f1387719 3035 return qq{
3036XSUBPPDIR = $xsdir
3037XSUBPP = \$(XSUBPPDIR)/xsubpp
3038XSPROTOARG = $self->{XSPROTOARG}
3039XSUBPPDEPS = @tmdeps
3040XSUBPPARGS = @tmargs
3041};
3042};
1e44e2bf 3043
f1387719 3044sub xsubpp_version
3045{
3046 my($self,$xsubpp) = @_;
3047 return $Xsubpp_Version if defined $Xsubpp_Version; # global variable
1e44e2bf 3048
f1387719 3049 my ($version) ;
1e44e2bf 3050
f1387719 3051 # try to figure out the version number of the xsubpp on the system
1e44e2bf 3052
f1387719 3053 # first try the -v flag, introduced in 1.921 & 2.000a2
1e44e2bf 3054
f1387719 3055 return "" unless $self->needs_linking;
1e44e2bf 3056
f1387719 3057 my $command = "$self->{PERL} -I$self->{PERL_LIB} $xsubpp -v 2>&1";
3058 print "Running $command\n" if $Verbose >= 2;
3059 $version = `$command` ;
3060 warn "Running '$command' exits with status " . ($?>>8) if $?;
3061 chop $version ;
1e44e2bf 3062
f1387719 3063 return $Xsubpp_Version = $1 if $version =~ /^xsubpp version (.*)/ ;
1e44e2bf 3064
f1387719 3065 # nope, then try something else
1e44e2bf 3066
f1387719 3067 my $counter = '000';
3068 my ($file) = 'temp' ;
3069 $counter++ while -e "$file$counter"; # don't overwrite anything
3070 $file .= $counter;
1e44e2bf 3071
f1387719 3072 open(F, ">$file") or die "Cannot open file '$file': $!\n" ;
3073 print F <<EOM ;
3074MODULE = fred PACKAGE = fred
1e44e2bf 3075
f1387719 3076int
3077fred(a)
3078 int a;
3079EOM
1e44e2bf 3080
f1387719 3081 close F ;
1e44e2bf 3082
f1387719 3083 $command = "$self->{PERL} $xsubpp $file 2>&1";
3084 print "Running $command\n" if $Verbose >= 2;
3085 my $text = `$command` ;
3086 warn "Running '$command' exits with status " . ($?>>8) if $?;
3087 unlink $file ;
3088
3089 # gets 1.2 -> 1.92 and 2.000a1
3090 return $Xsubpp_Version = $1 if $text =~ /automatically by xsubpp version ([\S]+)\s*/ ;
3091
3092 # it is either 1.0 or 1.1
3093 return $Xsubpp_Version = 1.1 if $text =~ /^Warning: ignored semicolon/ ;
3094
3095 # none of the above, so 1.0
3096 return $Xsubpp_Version = "1.0" ;
1e44e2bf 3097}
3098
f1387719 3099=item top_targets (o)
1e44e2bf 3100
f1387719 3101Defines the targets all, subdirs, config, and O_FILES
1e44e2bf 3102
3103=cut
3104
f1387719 3105sub top_targets {
3106# --- Target Sections ---
1e44e2bf 3107
f1387719 3108 my($self) = shift;
3109 my(@m);
3110 push @m, '
3111#all :: config $(INST_PM) subdirs linkext manifypods
68dc0745 3112';
1e44e2bf 3113
68dc0745 3114 push @m, '
f1387719 3115all :: pure_all manifypods
3116 '.$self->{NOECHO}.'$(NOOP)
68dc0745 3117'
3118 unless $self->{SKIPHASH}{'all'};
3119
3120 push @m, '
f1387719 3121pure_all :: config pm_to_blib subdirs linkext
3122 '.$self->{NOECHO}.'$(NOOP)
1e44e2bf 3123
f1387719 3124subdirs :: $(MYEXTLIB)
3125 '.$self->{NOECHO}.'$(NOOP)
1e44e2bf 3126
f1387719 3127config :: '.$self->{MAKEFILE}.' $(INST_LIBDIR)/.exists
3128 '.$self->{NOECHO}.'$(NOOP)
3129
3130config :: $(INST_ARCHAUTODIR)/.exists
3131 '.$self->{NOECHO}.'$(NOOP)
3132
3133config :: $(INST_AUTODIR)/.exists
3134 '.$self->{NOECHO}.'$(NOOP)
3135';
3136
3137 push @m, qq{
3138config :: Version_check
3139 $self->{NOECHO}\$(NOOP)
3140
3141} unless $self->{PARENT} or ($self->{PERL_SRC} && $self->{INSTALLDIRS} eq "perl") or $self->{NO_VC};
3142
3143 push @m, $self->dir_target(qw[$(INST_AUTODIR) $(INST_LIBDIR) $(INST_ARCHAUTODIR)]);
3144
3145 if (%{$self->{MAN1PODS}}) {
3146 push @m, qq[
3147config :: \$(INST_MAN1DIR)/.exists
3148 $self->{NOECHO}\$(NOOP)
3149
3150];
3151 push @m, $self->dir_target(qw[$(INST_MAN1DIR)]);
1e44e2bf 3152 }
f1387719 3153 if (%{$self->{MAN3PODS}}) {
3154 push @m, qq[
3155config :: \$(INST_MAN3DIR)/.exists
3156 $self->{NOECHO}\$(NOOP)
3157
3158];
3159 push @m, $self->dir_target(qw[$(INST_MAN3DIR)]);
1e44e2bf 3160 }
1e44e2bf 3161
f1387719 3162 push @m, '
3163$(O_FILES): $(H_FILES)
3164' if @{$self->{O_FILES} || []} && @{$self->{H} || []};
1e44e2bf 3165
f1387719 3166 push @m, q{
3167help:
3168 perldoc ExtUtils::MakeMaker
3169};
1e44e2bf 3170
f1387719 3171 push @m, q{
3172Version_check:
3173 }.$self->{NOECHO}.q{$(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) \
3174 -MExtUtils::MakeMaker=Version_check \
68dc0745 3175 -e "Version_check('$(MM_VERSION)')"
f1387719 3176};
1e44e2bf 3177
f1387719 3178 join('',@m);
1e44e2bf 3179}
3180
3181=item writedoc
3182
f4ae0f5e 3183Obsolete, depecated method. Not used since Version 5.21.
1e44e2bf 3184
3185=cut
3186
3187sub writedoc {
3188# --- perllocal.pod section ---
3189 my($self,$what,$name,@attribs)=@_;
1e44e2bf 3190 my $time = localtime;
3191 print "=head2 $time: $what C<$name>\n\n=over 4\n\n=item *\n\n";
3192 print join "\n\n=item *\n\n", map("C<$_>",@attribs);
3193 print "\n\n=back\n\n";
3194}
3195
f1387719 3196=item xs_c (o)
3197
3198Defines the suffix rules to compile XS files to C.
3199
3200=cut
3201
3202sub xs_c {
3203 my($self) = shift;
3204 return '' unless $self->needs_linking();
3205 '
3206.xs.c:
68dc0745 3207 $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) $(XSUBPP) $(XSPROTOARG) $(XSUBPPARGS) $*.xs >$*.tc && $(MV) $*.tc $@
f1387719 3208';
3209}
3210
3211=item xs_o (o)
3212
3213Defines suffix rules to go from XS to object files directly. This is
3214only intended for broken make implementations.
3215
3216=cut
3217
3218sub xs_o { # many makes are too dumb to use xs_c then c_o
3219 my($self) = shift;
3220 return '' unless $self->needs_linking();
3221 '
3222.xs$(OBJ_EXT):
68dc0745 3223 $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) $(XSUBPP) $(XSPROTOARG) $(XSUBPPARGS) $*.xs >xstmp.c && $(MV) xstmp.c $*.c
042ade60 3224 $(CCCMD) $(CCCDLFLAGS) -I$(PERL_INC) $(DEFINE) $*.c
f1387719 3225';
3226}
3227
68dc0745 3228=item perl_archive
3229
3230This is internal method that returns path to libperl.a equivalent
3231to be linked to dynamic extensions. UNIX does not have one but OS2
3232and Win32 do.
3233
3234=cut
3235
3236sub perl_archive
3237{
3238 return "";
3239}
3240
3241=item export_list
3242
3243This is internal method that returns name of a file that is
3244passed to linker to define symbols to be exported.
3245UNIX does not have one but OS2 and Win32 do.
3246
3247=cut
3248
3249sub export_list
3250{
3251 return "";
3252}
3253
3254
f4ae0f5e 32551;
3256
bab2b58e 3257=back
f4ae0f5e 3258
1e44e2bf 3259=head1 SEE ALSO
3260
3261L<ExtUtils::MakeMaker>
3262
3263=cut
3264
f4ae0f5e 3265__END__