Time::HiRes: Do not create files in blib directories under core
[p5sagit/p5-mst-13.2.git] / lib / ExtUtils / MM_MacOS.pm
CommitLineData
f582e489 1# MM_MacOS.pm
2# MakeMaker default methods for MacOS
3# This package is inserted into @ISA of MakeMaker's MM before the
4# built-in ExtUtils::MM_Unix methods if MakeMaker.pm is run under MacOS.
5#
6# Author: Matthias Neeracher <neeracher@mac.com>
69ff8adf 7# Maintainer: Chris Nandor <pudge@pobox.com>
f582e489 8
9package ExtUtils::MM_MacOS;
10require ExtUtils::MM_Any;
11require ExtUtils::MM_Unix;
12@ISA = qw( ExtUtils::MM_Any ExtUtils::MM_Unix );
13
d0843067 14use vars qw($VERSION);
479d2113 15$VERSION = '1.04';
d0843067 16
f582e489 17use Config;
18use Cwd 'cwd';
19require Exporter;
20use File::Basename;
f582e489 21use vars qw(%make_data);
22
d5201bd2 23my $Mac_FS = eval { require Mac::FileSpec::Unixish };
24
f582e489 25use ExtUtils::MakeMaker qw($Verbose &neatvalue);
26
27=head1 NAME
28
29ExtUtils::MM_MacOS - methods to override UN*X behaviour in ExtUtils::MakeMaker
30
31=head1 SYNOPSIS
32
33 use ExtUtils::MM_MacOS; # Done internally by ExtUtils::MakeMaker if needed
34
35=head1 DESCRIPTION
36
37MM_MacOS currently only produces an approximation to the correct Makefile.
38
479d2113 39=over 4
40
f582e489 41=cut
42
43sub new {
44 my($class,$self) = @_;
45 my($key);
46 my($cwd) = cwd();
47
48 print STDOUT "Mac MakeMaker (v$ExtUtils::MakeMaker::VERSION)\n" if $Verbose;
49 if (-f "MANIFEST" && ! -f "Makefile.mk"){
50 ExtUtils::MakeMaker::check_manifest();
51 }
52
53 mkdir("Obj", 0777) unless -d "Obj";
d5d4ec93 54
479d2113 55 $self = {} unless defined $self;
f582e489 56
943b127a 57 check_hints($self);
58
f582e489 59 my(%initial_att) = %$self; # record initial attributes
60
61 if (defined $self->{CONFIGURE}) {
62 if (ref $self->{CONFIGURE} eq 'CODE') {
63 $self = { %$self, %{&{$self->{CONFIGURE}}}};
64 } else {
479d2113 65 require Carp;
66 Carp::croak("Attribute 'CONFIGURE' to WriteMakefile() not a code reference\n");
f582e489 67 }
68 }
69
69ff8adf 70 my $newclass = ++$ExtUtils::MakeMaker::PACKNAME;
71 local @ExtUtils::MakeMaker::Parent = @ExtUtils::MakeMaker::Parent; # Protect against non-local exits
f582e489 72 {
69ff8adf 73 no strict 'refs';
74 print "Blessing Object into class [$newclass]\n" if $Verbose>=2;
75 ExtUtils::MakeMaker::mv_all_methods("MY",$newclass);
76 bless $self, $newclass;
77 push @Parent, $self;
78 require ExtUtils::MY;
79 @{"$newclass\:\:ISA"} = 'MM';
80 }
81
943b127a 82 $ExtUtils::MakeMaker::Recognized_Att_Keys{$_} = 1
479d2113 83 for map { $_ . 'Optimize' } qw(MWC MWCPPC MWC68K MPW MRC MRC SC);
943b127a 84
69ff8adf 85 if (defined $ExtUtils::MakeMaker::Parent[-2]){
86 $self->{PARENT} = $ExtUtils::MakeMaker::Parent[-2];
87 my $key;
88 for $key (@ExtUtils::MakeMaker::Prepend_parent) {
89 next unless defined $self->{PARENT}{$key};
90 $self->{$key} = $self->{PARENT}{$key};
479d2113 91 if ($key !~ /PERL$/) {
69ff8adf 92 $self->{$key} = $self->catdir("..",$self->{$key})
93 unless $self->file_name_is_absolute($self->{$key});
94 } else {
95 # PERL or FULLPERL will be a command verb or even a
96 # command with an argument instead of a full file
97 # specification under VMS. So, don't turn the command
98 # into a filespec, but do add a level to the path of
99 # the argument if not already absolute.
100 my @cmd = split /\s+/, $self->{$key};
101 $cmd[1] = $self->catfile('[-]',$cmd[1])
102 unless (@cmd < 2) || $self->file_name_is_absolute($cmd[1]);
103 $self->{$key} = join(' ', @cmd);
104 }
105 }
106 if ($self->{PARENT}) {
107 $self->{PARENT}->{CHILDREN}->{$newclass} = $self;
108 foreach my $opt (qw(POLLUTE PERL_CORE)) {
109 if (exists $self->{PARENT}->{$opt}
110 and not exists $self->{$opt})
111 {
112 # inherit, but only if already unspecified
113 $self->{$opt} = $self->{PARENT}->{$opt};
114 }
115 }
116 }
117 my @fm = grep /^FIRST_MAKEFILE=/, @ARGV;
118 $self->parse_args(@fm) if @fm;
f582e489 119 } else {
69ff8adf 120 $self->parse_args(split(' ', $ENV{PERL_MM_OPT} || ''),@ARGV);
f582e489 121 }
122
123 $self->{NAME} ||= $self->guess_name;
124
125 ($self->{NAME_SYM} = $self->{NAME}) =~ s/\W+/_/g;
126
127 $self->init_main();
128 $self->init_dirscan();
129 $self->init_others();
130
131 push @{$self->{RESULT}}, <<END;
132# This Makefile is for the $self->{NAME} extension to perl.
133#
134# It was generated automatically by MakeMaker version
479d2113 135# $ExtUtils::MakeMaker::VERSION (Revision: $ExtUtils::MakeMaker::Revision) from the contents of
f582e489 136# Makefile.PL. Don't edit this file, edit Makefile.PL instead.
137#
138# ANY CHANGES MADE HERE WILL BE LOST!
139#
140# MakeMaker Parameters:
141END
142
143 foreach $key (sort keys %initial_att){
144 my($v) = neatvalue($initial_att{$key});
145 $v =~ s/(CODE|HASH|ARRAY|SCALAR)\([\dxa-f]+\)/$1\(...\)/;
146 $v =~ tr/\n/ /s;
147 push @{$self->{RESULT}}, "# $key => $v";
148 }
149
150 # turn the SKIP array into a SKIPHASH hash
151 my (%skip,$skip);
152 for $skip (@{$self->{SKIP} || []}) {
153 $self->{SKIPHASH}{$skip} = 1;
154 }
155 delete $self->{SKIP}; # free memory
156
157 # We skip many sections for MacOS, but we don't say anything about it in the Makefile
69ff8adf 158 for (qw/ const_config tool_autosplit
f582e489 159 tool_xsubpp tools_other dist macro depend post_constants
160 pasthru c_o xs_c xs_o top_targets linkext
161 dynamic_bs dynamic_lib static_lib manifypods
162 installbin subdirs dist_basics dist_core
479d2113 163 distdir dist_test dist_ci install force perldepend makefile
164 staticmake test pm_to_blib selfdocument
f582e489 165 const_loadlibs const_cccmd
479d2113 166 /)
f582e489 167 {
168 $self->{SKIPHASH}{$_} = 2;
169 }
170 push @ExtUtils::MakeMaker::MM_Sections, "rulez"
171 unless grep /rulez/, @ExtUtils::MakeMaker::MM_Sections;
943b127a 172
f582e489 173 if ($self->{PARENT}) {
479d2113 174 for (qw/install dist dist_basics dist_core distdir dist_test dist_ci/) {
f582e489 175 $self->{SKIPHASH}{$_} = 1;
176 }
177 }
178
179 # We run all the subdirectories now. They don't have much to query
180 # from the parent, but the parent has to query them: if they need linking!
181 unless ($self->{NORECURS}) {
182 $self->eval_in_subdirs if @{$self->{DIR}};
183 }
184
185 my $section;
186 foreach $section ( @ExtUtils::MakeMaker::MM_Sections ){
479d2113 187 next if defined $self->{SKIPHASH}{$section} &&
188 $self->{SKIPHASH}{$section} == 2;
f582e489 189 print "Processing Makefile '$section' section\n" if ($Verbose >= 2);
190 $self->{ABSTRACT_FROM} = macify($self->{ABSTRACT_FROM})
191 if $self->{ABSTRACT_FROM};
192 my($skipit) = $self->skipcheck($section);
193 if ($skipit){
194 push @{$self->{RESULT}}, "\n# --- MakeMaker $section section $skipit.";
195 } else {
196 my(%a) = %{$self->{$section} || {}};
197 push @{$self->{RESULT}}, "\n# --- MakeMaker $section section:";
198 push @{$self->{RESULT}}, "# " . join ", ", %a if $Verbose && %a;
199 push @{$self->{RESULT}}, $self->nicetext($self->$section( %a ));
200 }
201 }
202
203 push @{$self->{RESULT}}, "\n# End.";
204 pop @Parent;
205
206 $ExtUtils::MM_MacOS::make_data{$cwd} = $self;
207 $self;
208}
209
210sub skipcheck {
211 my($self) = shift;
212 my($section) = @_;
213 return 'skipped' if $self->{SKIPHASH}{$section};
214 return '';
215}
216
217=item maybe_command
218
219Returns true, if the argument is likely to be a command.
220
221=cut
222
223sub maybe_command {
224 my($self,$file) = @_;
225 return $file if ! -d $file;
226 return;
227}
228
229=item guess_name
230
231Guess the name of this package by examining the working directory's
232name. MakeMaker calls this only if the developer has not supplied a
233NAME attribute.
234
235=cut
236
237sub guess_name {
238 my($self) = @_;
239 my $name = cwd();
240 $name =~ s/.*:// unless ($name =~ s/^.*:ext://);
241 $name =~ s#:#::#g;
242 $name =~ s#[\-_][\d.\-]+$##; # this is new with MM 5.00
243 $name;
244}
245
246=item macify
247
479d2113 248Translate relative Unix filepaths into Mac names.
f582e489 249
250=cut
251
252sub macify {
f582e489 253 my($unix) = @_;
254 my(@mac);
255
f582e489 256 foreach (split(/[ \t\n]+/, $unix)) {
257 if (m|/|) {
5b865721 258 if ($Mac_FS) { # should always be true
259 $_ = Mac::FileSpec::Unixish::nativize($_);
260 } else {
261 s|^\./||;
262 s|/|:|g;
263 $_ = ":$_";
264 }
265 }
f582e489 266 push(@mac, $_);
267 }
268
269 return "@mac";
270}
271
272=item patternify
273
479d2113 274Translate Unix filepaths and shell globs to Mac style.
f582e489 275
276=cut
277
278sub patternify {
279 my($unix) = @_;
280 my(@mac);
281
282 foreach (split(/[ \t\n]+/, $unix)) {
283 if (m|/|) {
284 $_ = ":$_";
285 s|/|:|g;
286 s|\*|Ã…|g;
287 $_ = "'$_'" if /[?Ã…]/;
288 push(@mac, $_);
289 }
290 }
291
292 return "@mac";
293}
294
295=item init_main
296
479d2113 297Initializes some of NAME, FULLEXT, BASEEXT, DLBASE, PERL_SRC,
f582e489 298PERL_LIB, PERL_ARCHLIB, PERL_INC, INSTALLDIRS, INST_*, INSTALL*,
299PREFIX, CONFIG, AR, AR_STATIC_ARGS, LD, OBJ_EXT, LIB_EXT, MAP_TARGET,
300LIBPERL_A, VERSION_FROM, VERSION, DISTNAME, VERSION_SYM.
301
302=cut
303
304sub init_main {
305 my($self) = @_;
f582e489 306
307 # --- Initialize Module Name and Paths
308
309 # NAME = The perl module name for this extension (eg DBD::Oracle).
310 # FULLEXT = Pathname for extension directory (eg DBD/Oracle).
311 # BASEEXT = Basename part of FULLEXT. May be just equal FULLEXT.
f582e489 312 ($self->{FULLEXT} =
313 $self->{NAME}) =~ s!::!:!g ; #eg. BSD:Foo:Socket
314 ($self->{BASEEXT} =
315 $self->{NAME}) =~ s!.*::!! ; #eg. Socket
f582e489 316
317 # --- Initialize PERL_LIB, INST_LIB, PERL_SRC
318
319 # *Real* information: where did we get these two from? ...
320 my $inc_config_dir = dirname($INC{'Config.pm'});
321 my $inc_carp_dir = dirname($INC{'Carp.pm'});
322
323 unless ($self->{PERL_SRC}){
324 my($dir);
325 foreach $dir (qw(:: ::: :::: ::::: ::::::)){
326 if (-f "${dir}perl.h") {
327 $self->{PERL_SRC}=$dir ;
328 last;
329 }
330 }
331 if (!$self->{PERL_SRC} && -f "$ENV{MACPERL}CORE:perl:perl.h") {
332 # Mac pathnames may be very nasty, so we'll install symlinks
333 unlink(":PerlCore", ":PerlLib");
334 symlink("$ENV{MACPERL}CORE:", "PerlCore");
335 symlink("$ENV{MACPERL}lib:", "PerlLib");
336 $self->{PERL_SRC} = ":PerlCore:perl:" ;
337 $self->{PERL_LIB} = ":PerlLib:";
338 }
339 }
340 if ($self->{PERL_SRC}){
479d2113 341 $self->{PERL_LIB} ||= $self->catdir("$self->{PERL_SRC}","lib");
f582e489 342 $self->{PERL_ARCHLIB} = $self->{PERL_LIB};
343 $self->{PERL_INC} = $self->{PERL_SRC};
f582e489 344 } else {
345# hmmmmmmm ... ?
479d2113 346 $self->{PERL_LIB} ||= "$ENV{MACPERL}site_perl";
347 $self->{PERL_ARCHLIB} = $self->{PERL_LIB};
348 $self->{PERL_INC} = $ENV{MACPERL};
349 $self->{PERL_SRC} = '';
f582e489 350 }
351
352 $self->{INSTALLDIRS} = "perl";
353 $self->{INST_LIB} = $self->{INST_ARCHLIB} = $self->{PERL_LIB};
354 $self->{INST_MAN1DIR} = $self->{INSTALLMAN1DIR} = "none";
355 $self->{MAN1EXT} ||= $Config::Config{man1ext};
356 $self->{INST_MAN3DIR} = $self->{INSTALLMAN3DIR} = "none";
357 $self->{MAN3EXT} ||= $Config::Config{man3ext};
358 $self->{MAP_TARGET} ||= "perl";
359
360 # make a simple check if we find Exporter
361 # hm ... do we really care? at all?
362# warn "Warning: PERL_LIB ($self->{PERL_LIB}) seems not to be a perl library directory
363# (Exporter.pm not found)"
479d2113 364# unless -f $self->catfile("$self->{PERL_LIB}","Exporter.pm") ||
f582e489 365# $self->{NAME} eq "ExtUtils::MakeMaker";
366
367 # Determine VERSION and VERSION_FROM
368 ($self->{DISTNAME}=$self->{NAME}) =~ s#(::)#-#g unless $self->{DISTNAME};
369 if ($self->{VERSION_FROM}){
479d2113 370 # XXX replace with parse_version() override
f582e489 371 local *FH;
372 open(FH,macify($self->{VERSION_FROM})) or
373 die "Could not open '$self->{VERSION_FROM}' (attribute VERSION_FROM): $!";
374 while (<FH>) {
375 chop;
376 next unless /\$([\w:]*\bVERSION)\b.*=/;
377 local $ExtUtils::MakeMaker::module_version_variable = $1;
378 my($eval) = "$_;";
379 eval $eval;
380 die "Could not eval '$eval': $@" if $@;
381 if ($self->{VERSION} = $ {$ExtUtils::MakeMaker::module_version_variable}){
382 print "$self->{NAME} VERSION is $self->{VERSION} (from $self->{VERSION_FROM})\n" if $Verbose;
383 } else {
384 # XXX this should probably croak
385 print "WARNING: Setting VERSION via file '$self->{VERSION_FROM}' failed\n";
386 }
387 last;
388 }
389 close FH;
390 }
391
392 if ($self->{VERSION}) {
393 $self->{VERSION} =~ s/^\s+//;
394 $self->{VERSION} =~ s/\s+$//;
395 }
396
397 $self->{VERSION} = "0.10" unless $self->{VERSION};
398 ($self->{VERSION_SYM} = $self->{VERSION}) =~ s/\W/_/g;
399
400
401 # Graham Barr and Paul Marquess had some ideas how to ensure
402 # version compatibility between the *.pm file and the
403 # corresponding *.xs file. The bottomline was, that we need an
404 # XS_VERSION macro that defaults to VERSION:
405 $self->{XS_VERSION} ||= $self->{VERSION};
406
479d2113 407
408 $self->{DEFINE} .= " \$(XS_DEFINE_VERSION) \$(DEFINE_VERSION)";
409
410 # Preprocessor definitions may be useful
411 $self->{DEFINE} =~ s/-D/-d /g;
412
413 # UN*X includes probably are not useful
414 $self->{DEFINE} =~ s/-I\S+/_include($1)/eg;
415
416
417 if ($self->{INC}) {
418 # UN*X includes probably are not useful
419 $self->{INC} =~ s/-I(\S+)/_include($1)/eg;
420 }
421
422
f582e489 423 # --- Initialize Perl Binary Locations
424
425 # Find Perl 5. The only contract here is that both 'PERL' and 'FULLPERL'
426 # will be working versions of perl 5. miniperl has priority over perl
427 # for PERL to ensure that $(PERL) is usable while building ./ext/*
428 my ($component,@defpath);
479d2113 429 foreach $component ($self->{PERL_SRC}, $self->path(), $Config::Config{binexp}) {
f582e489 430 push @defpath, $component if defined $component;
431 }
432 $self->{PERL} = "$self->{PERL_SRC}miniperl";
f582e489 433}
434
435=item init_others
436
437Initializes LDLOADLIBS, LIBS
438
439=cut
440
441sub init_others { # --- Initialize Other Attributes
442 my($self) = shift;
f582e489 443
444 if ( !$self->{OBJECT} ) {
445 # init_dirscan should have found out, if we have C files
446 $self->{OBJECT} = "";
447 $self->{OBJECT} = "$self->{BASEEXT}.c" if @{$self->{C}||[]};
448 } else {
449 $self->{OBJECT} =~ s/\$\(O_FILES\)/@{$self->{C}||[]}/;
450 }
451 my($src);
452 foreach (split(/[ \t\n]+/, $self->{OBJECT})) {
453 if (/^$self->{BASEEXT}\.o(bj)?$/) {
454 $src .= " $self->{BASEEXT}.c";
455 } elsif (/^(.*\..*)\.o$/) {
456 $src .= " $1";
457 } elsif (/^(.*)(\.o(bj)?|\$\(OBJ_EXT\))$/) {
458 if (-f "$1.cp") {
459 $src .= " $1.cp";
460 } else {
461 $src .= " $1.c";
462 }
463 } else {
464 $src .= " $_";
465 }
466 }
467 $self->{SOURCE} = $src;
479d2113 468 $self->{FULLPERL} = "$self->{PERL_SRC}perl";
469 $self->{MAKEFILE} = "Makefile.mk";
470 $self->{FIRST_MAKEFILE} = $self->{MAKEFILE};
471 $self->{MAKEFILE_OLD} = $self->{MAKEFILE}.'.old';
472
473 $self->{'DEV_NULL'} ||= ' \xB3 Dev:Null';
474
475 return 1;
476}
477
478=item init_platform
479
480Add MACPERL_SRC MACPERL_LIB
481
482=item platform_constants
483
484Add MACPERL_SRC MACPERL_LIB MACLIBS_68K MACLIBS_PPC MACLIBS_SC MACLIBS_MRC
485MACLIBS_ALL_68K MACLIBS_ALL_PPC MACLIBS_SHARED
486
487XXX Few are initialized. How many of these are ever used?
488
489=cut
490
491sub init_platform {
492 my $self = shift;
493
494 $self->{MACPERL_SRC} = $self->catdir("$self->{PERL_SRC}","macos:");
495 $self->{MACPERL_LIB} ||= $self->catdir("$self->{MACPERL_SRC}","lib");
496 $self->{MACPERL_INC} = $self->{MACPERL_SRC};
497}
498
499
500
501sub platform_constants {
502 my $self = shift;
503
504 foreach my $macro (qw(MACPERL_SRC MACPERL_LIB MACLIBS_68K MACLIBS_PPC
505 MACLIBS_SC MACLIBS_MRC MACLIBS_ALL_68K
506 MACLIBS_ALL_PPC MACLIBS_SHARED))
507 {
508 next unless defined $self->{$macro};
509 $make_frag .= "$macro = $self->{$macro}\n";
510 }
511
512 return $make_frag;
f582e489 513}
514
515
516=item init_dirscan
517
518Initializes DIR, XS, PM, C, O_FILES, H, PL_FILES, MAN*PODS, EXE_FILES.
519
520=cut
521
522sub init_dirscan { # --- File and Directory Lists (.xs .pm .pod etc)
523 my($self) = @_;
f582e489 524 my($name, %dir, %xs, %c, %h, %ignore, %pl_files, %manifypods);
525 local(%pm); #the sub in find() has to see this hash
526
527 # in case we don't find it below!
528 if ($self->{VERSION_FROM}) {
529 my $version_from = macify($self->{VERSION_FROM});
479d2113 530 $pm{$version_from} = $self->catfile('$(INST_LIBDIR)',
f582e489 531 $version_from);
532 }
533
534 $ignore{'test.pl'} = 1;
535 foreach $name ($self->lsdir(":")){
536 next if ($name =~ /^\./ or $ignore{$name});
537 next unless $self->libscan($name);
538 if (-d $name){
539 $dir{$name} = $name if (-f ":$name:Makefile.PL");
540 } elsif ($name =~ /\.xs$/){
541 my($c); ($c = $name) =~ s/\.xs$/.c/;
542 $xs{$name} = $c;
543 $c{$c} = 1;
544 } elsif ($name =~ /\.c(p|pp|xx|c)?$/i){ # .c .C .cpp .cxx .cc .cp
545 $c{$name} = 1
546 unless $name =~ m/perlmain\.c/; # See MAP_TARGET
547 } elsif ($name =~ /\.h$/i){
548 $h{$name} = 1;
549 } elsif ($name =~ /\.(p[ml]|pod)$/){
479d2113 550 $pm{$name} = $self->catfile('$(INST_LIBDIR)',$name);
f582e489 551 } elsif ($name =~ /\.PL$/ && $name ne "Makefile.PL") {
552 ($pl_files{$name} = $name) =~ s/\.PL$// ;
553 }
554 }
555
556 # Some larger extensions often wish to install a number of *.pm/pl
557 # files into the library in various locations.
558
559 # The attribute PMLIBDIRS holds an array reference which lists
560 # subdirectories which we should search for library files to
561 # install. PMLIBDIRS defaults to [ 'lib', $self->{BASEEXT} ]. We
562 # recursively search through the named directories (skipping any
563 # which don't exist or contain Makefile.PL files).
564
565 # For each *.pm or *.pl file found $self->libscan() is called with
566 # the default installation path in $_[1]. The return value of
567 # libscan defines the actual installation location. The default
568 # libscan function simply returns the path. The file is skipped
569 # if libscan returns false.
570
571 # The default installation location passed to libscan in $_[1] is:
572 #
573 # ./*.pm => $(INST_LIBDIR)/*.pm
574 # ./xyz/... => $(INST_LIBDIR)/xyz/...
575 # ./lib/... => $(INST_LIB)/...
576 #
577 # In this way the 'lib' directory is seen as the root of the actual
578 # perl library whereas the others are relative to INST_LIBDIR
479d2113 579 # This is a subtle distinction but one that's important for nested
580 # modules.
f582e489 581
582 $self->{PMLIBDIRS} = ['lib', $self->{BASEEXT}]
583 unless $self->{PMLIBDIRS};
584
585 #only existing directories that aren't in $dir are allowed
586
587 my (@pmlibdirs) = map { macify ($_) } @{$self->{PMLIBDIRS}};
588 my ($pmlibdir);
589 @{$self->{PMLIBDIRS}} = ();
590 foreach $pmlibdir (@pmlibdirs) {
591 -d $pmlibdir && !$dir{$pmlibdir} && push @{$self->{PMLIBDIRS}}, $pmlibdir;
592 }
593
594 if (@{$self->{PMLIBDIRS}}){
595 print "Searching PMLIBDIRS: @{$self->{PMLIBDIRS}}\n"
596 if ($Verbose >= 2);
597 require File::Find;
598 File::Find::find(sub {
599 if (-d $_){
479d2113 600 unless ($self->libscan($_)){
f582e489 601 $File::Find::prune = 1;
602 }
603 return;
604 }
605 my($path, $prefix) = ($File::Find::name, '$(INST_LIBDIR)');
606 my($striplibpath,$striplibname);
607 $prefix = '$(INST_LIB)' if (($striplibpath = $path) =~ s:^(\W*)lib\W:$1:);
608 ($striplibname,$striplibpath) = fileparse($striplibpath);
479d2113 609 my($inst) = $self->catfile($prefix,$striplibpath,$striplibname);
f582e489 610 local($_) = $inst; # for backwards compatibility
611 $inst = $self->libscan($inst);
612 print "libscan($path) => '$inst'\n" if ($Verbose >= 2);
613 return unless $inst;
614 $pm{$path} = $inst;
615 }, @{$self->{PMLIBDIRS}});
616 }
617
618 $self->{DIR} = [sort keys %dir] unless $self->{DIR};
619 $self->{XS} = \%xs unless $self->{XS};
620 $self->{PM} = \%pm unless $self->{PM};
621 $self->{C} = [sort keys %c] unless $self->{C};
622 $self->{H} = [sort keys %h] unless $self->{H};
623 $self->{PL_FILES} = \%pl_files unless $self->{PL_FILES};
624
625 # Set up names of manual pages to generate from pods
626 unless ($self->{MAN1PODS}) {
627 $self->{MAN1PODS} = {};
628 }
629 unless ($self->{MAN3PODS}) {
630 $self->{MAN3PODS} = {};
631 }
632}
633
f582e489 634
479d2113 635=item init_VERSION (o)
f582e489 636
479d2113 637Change DEFINE_VERSION and XS_DEFINE_VERSION
f582e489 638
639=cut
640
479d2113 641sub init_VERSION {
642 my $self = shift;
f582e489 643
479d2113 644 $self->SUPER::init_VERSION;
f582e489 645
479d2113 646 $self->{DEFINE_VERSION} = '-d $(VERSION_MACRO)="¶"$(VERSION)¶""';
647 $self->{XS_DEFINE_VERSION} = '-d $(XS_VERSION_MACRO)="¶"$(XS_VERSION)¶""';
648}
f582e489 649
f582e489 650
479d2113 651=item special_targets (o)
f582e489 652
479d2113 653Add .INCLUDE
f582e489 654
479d2113 655=cut
f582e489 656
479d2113 657sub special_targets {
658 my $self = shift;
f582e489 659
479d2113 660 my $make_frag = $self->SUPER::special_targets;
f582e489 661
479d2113 662 return $make_frag . <<'MAKE_FRAG';
663.INCLUDE : $(MACPERL_SRC)BuildRules.mk $(MACPERL_SRC)ExtBuildRules.mk
f582e489 664
479d2113 665MAKE_FRAG
f582e489 666
f582e489 667}
668
669=item static (o)
670
671Defines the static target.
672
673=cut
674
675sub static {
676# --- Static Loading Sections ---
677
678 my($self) = shift;
f582e489 679 my($extlib) = $self->{MYEXTLIB} ? "\nstatic :: myextlib\n" : "";
680 '
681all :: static
682
683install :: do_install_static
684
685install_static :: do_install_static
686' . $extlib;
687}
688
689=item dlsyms (o)
690
691Used by MacOS to define DL_FUNCS and DL_VARS and write the *.exp
692files.
693
694=cut
695
696sub dlsyms {
697 my($self,%attribs) = @_;
f582e489 698
699 return '' unless !$self->{SKIPHASH}{'dynamic'};
700
701 my($funcs) = $attribs{DL_FUNCS} || $self->{DL_FUNCS} || {};
702 my($vars) = $attribs{DL_VARS} || $self->{DL_VARS} || [];
703 my(@m);
704
705 push(@m,"
706dynamic :: $self->{BASEEXT}.exp
707
708") unless $self->{SKIPHASH}{'dynamic'};
709
710 my($extlib) = $self->{MYEXTLIB} ? " myextlib" : "";
711
712 push(@m,"
713$self->{BASEEXT}.exp: Makefile.PL$extlib
714", qq[\t\$(PERL) "-I\$(PERL_LIB)" -e 'use ExtUtils::Mksymlists; ],
715 'Mksymlists("NAME" => "',$self->{NAME},'", "DL_FUNCS" => ',
716 neatvalue($funcs),', "DL_VARS" => ', neatvalue($vars), ');\'
717');
718
719 join('',@m);
720}
721
722=item dynamic (o)
723
724Defines the dynamic target.
725
726=cut
727
728sub dynamic {
729# --- dynamic Loading Sections ---
730
731 my($self) = shift;
f582e489 732 '
733all :: dynamic
734
735install :: do_install_dynamic
736
737install_dynamic :: do_install_dynamic
738';
739}
740
741
742=item clean (o)
743
744Defines the clean target.
745
746=cut
747
748sub clean {
749# --- Cleanup and Distribution Sections ---
750
751 my($self, %attribs) = @_;
f582e489 752 my(@m,$dir);
753 push(@m, '
754# Delete temporary files but do not touch installed files. We don\'t delete
755# the Makefile here so a later make realclean still has a makefile to use.
756
479d2113 757clean :: clean_subdirs
f582e489 758');
f582e489 759
760 my(@otherfiles) = values %{$self->{XS}}; # .c files from *.xs files
761 push(@otherfiles, patternify($attribs{FILES})) if $attribs{FILES};
762 push @m, "\t\$(RM_RF) @otherfiles\n";
763 # See realclean and ext/utils/make_ext for usage of Makefile.old
764 push(@m,
479d2113 765 "\t\$(MV) \$(FIRST_MAKEFILE) \$(MAKEFILE_OLD)\n");
f582e489 766 push(@m,
767 "\t$attribs{POSTOP}\n") if $attribs{POSTOP};
768 join("", @m);
769}
770
479d2113 771=item clean_subdirs_target
772
773MacOS semantics for changing directories and checking for existence
774very different than everyone else.
775
776=cut
777
778sub clean_subdirs_target {
779 my($self) = shift;
780
781 # No subdirectories, no cleaning.
782 return <<'NOOP_FRAG' unless @{$self->{DIR}};
783clean_subdirs :
784 $(NOECHO)$(NOOP)
785NOOP_FRAG
786
787
788 my $clean = "clean_subdirs :\n";
789
790 for my $dir (@{$self->{DIR}}) {
791 $clean .= sprintf <<'MAKE_FRAG', $dir;
792 Set OldEcho {Echo}
793 Set Echo 0
794 Directory %s
795 If "`Exists -f $(FIRST_MAKEFILE)`" != ""
796 $(MAKE) clean
797 End
798 Set Echo {OldEcho}
799
800MAKE_FRAG
801 }
802
803 return $clean;
804}
805
806
f582e489 807=item realclean (o)
808
809Defines the realclean target.
810
811=cut
812
813sub realclean {
814 my($self, %attribs) = @_;
f582e489 815 my(@m);
816 push(@m,'
817# Delete temporary files (via clean) and also delete installed files
818realclean purge :: clean
819');
479d2113 820
821 my(@otherfiles) = ('$(FIRST_MAKEFILE)', '$(MAKEFILE_OLD)'); # Makefiles last
822 push(@otherfiles, patternify($attribs{FILES})) if $attribs{FILES};
823 push(@m, "\t\$(RM_RF) @otherfiles\n") if @otherfiles;
824 push(@m, "\t$attribs{POSTOP}\n") if $attribs{POSTOP};
825 join("", @m);
826}
827
828
829=item realclean_subdirs_target
830
831MacOS semantics for changing directories and checking for existence
832very different than everyone else.
833
834=cut
835
836sub realclean_subdirs_target {
837 my $self = shift;
838
839 return <<'NOOP_FRAG' unless @{$self->{DIR}};
840realclean_subdirs :
841 $(NOECHO)$(NOOP)
842NOOP_FRAG
843
844 my $rclean = "realclean_subdirs :\n";
845
846 foreach my $dir (@{$self->{DIR}}){
847 $rclean .= sprintf <<'RCLEAN', $dir,
848 Set OldEcho \{Echo\}
f582e489 849 Set Echo 0
850 Directory %s
479d2113 851 If \"\`Exists -f $(FIRST_MAKEFILE)\`\" != \"\"
f582e489 852 \$(MAKE) realclean
853 End
854 Set Echo \{OldEcho\}
479d2113 855
856RCLEAN
857
f582e489 858 }
479d2113 859
860 return $rclean;
f582e489 861}
862
479d2113 863
f582e489 864=item rulez (o)
865
866=cut
867
868sub rulez {
869 my($self) = shift;
f582e489 870 qq'
871install install_static install_dynamic ::
872\t\$(MACPERL_SRC)PerlInstall -l \$(PERL_LIB)
873
874.INCLUDE : \$(MACPERL_SRC)BulkBuildRules.mk
875';
876}
877
878sub xsubpp_version
879{
880 return $ExtUtils::MakeMaker::Version;
881}
882
883
884=item processPL (o)
885
886Defines targets to run *.PL files.
887
888=cut
889
890sub processPL {
891 my($self) = shift;
892 return "" unless $self->{PL_FILES};
893 my(@m, $plfile);
894 foreach $plfile (sort keys %{$self->{PL_FILES}}) {
895 my $list = ref($self->{PL_FILES}->{$plfile})
896 ? $self->{PL_FILES}->{$plfile}
897 : [$self->{PL_FILES}->{$plfile}];
898 foreach $target (@$list) {
899 push @m, "
900ProcessPL :: $target
479d2113 901\t$(NOECHO)\$(NOOP)
f582e489 902
903$target :: $plfile
904\t\$(PERL) -I\$(MACPERL_LIB) -I\$(PERL_LIB) $plfile $target
905";
906 }
907 }
908 join "", @m;
909}
910
943b127a 911sub cflags {
912 my($self,$libperl) = @_;
479d2113 913 my $optimize = '';
943b127a 914
915 for (map { $_ . "Optimize" } qw(MWC MWCPPC MWC68K MPW MRC MRC SC)) {
479d2113 916 $optimize .= "$_ = $self->{$_}" if exists $self->{$_};
943b127a 917 }
918
919 return $self->{CFLAGS} = $optimize;
920}
921
479d2113 922
69ff8adf 923sub _include { # for Unix-style includes, with -I instead of -i
924 my($inc) = @_;
925 require File::Spec::Unix;
926
927 # allow only relative paths
928 if (File::Spec::Unix->file_name_is_absolute($inc)) {
929 return '';
930 } else {
931 return '-i ' . macify($inc);
932 }
933}
934
479d2113 935=back
943b127a 936
479d2113 937=cut
943b127a 938
f582e489 9391;