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