ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/cvsroot/staticperl/perl/lib/ExtUtils/MM_MacOS.pm
Revision: 1.1
Committed: Thu Jun 30 14:27:11 2005 UTC (21 years, 4 months ago) by root
Branch: MAIN
CVS Tags: PERL-5-8-7, HEAD
Branch point for: PERL
Log Message:
*** empty log message ***

File Contents

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