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.
6 # Author: Matthias Neeracher <neeracher@mac.com>
7 # Maintainer: Chris Nandor <pudge@pobox.com>
9 package ExtUtils::MM_MacOS;
10 require ExtUtils::MM_Any;
11 require ExtUtils::MM_Unix;
12 @ISA = qw( ExtUtils::MM_Any ExtUtils::MM_Unix );
14 use vars qw($VERSION);
21 use vars qw(%make_data);
23 my $Mac_FS = eval { require Mac::FileSpec::Unixish };
25 use ExtUtils::MakeMaker qw($Verbose &neatvalue);
29 ExtUtils::MM_MacOS - methods to override UN*X behaviour in ExtUtils::MakeMaker
33 use ExtUtils::MM_MacOS; # Done internally by ExtUtils::MakeMaker if needed
37 MM_MacOS currently only produces an approximation to the correct Makefile.
44 my($class,$self) = @_;
48 print STDOUT "Mac MakeMaker (v$ExtUtils::MakeMaker::VERSION)\n" if $Verbose;
49 if (-f "MANIFEST" && ! -f "Makefile.mk"){
50 ExtUtils::MakeMaker::check_manifest();
53 mkdir("Obj", 0777) unless -d "Obj";
55 $self = {} unless defined $self;
59 my(%initial_att) = %$self; # record initial attributes
61 if (defined $self->{CONFIGURE}) {
62 if (ref $self->{CONFIGURE} eq 'CODE') {
63 $self = { %$self, %{&{$self->{CONFIGURE}}}};
66 Carp::croak("Attribute 'CONFIGURE' to WriteMakefile() not a code reference\n");
70 my $newclass = ++$ExtUtils::MakeMaker::PACKNAME;
71 local @ExtUtils::MakeMaker::Parent = @ExtUtils::MakeMaker::Parent; # Protect against non-local exits
74 print "Blessing Object into class [$newclass]\n" if $Verbose>=2;
75 ExtUtils::MakeMaker::mv_all_methods("MY",$newclass);
76 bless $self, $newclass;
79 @{"$newclass\:\:ISA"} = 'MM';
82 $ExtUtils::MakeMaker::Recognized_Att_Keys{$_} = 1
83 for map { $_ . 'Optimize' } qw(MWC MWCPPC MWC68K MPW MRC MRC SC);
85 if (defined $ExtUtils::MakeMaker::Parent[-2]){
86 $self->{PARENT} = $ExtUtils::MakeMaker::Parent[-2];
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});
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);
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})
112 # inherit, but only if already unspecified
113 $self->{$opt} = $self->{PARENT}->{$opt};
117 my @fm = grep /^FIRST_MAKEFILE=/, @ARGV;
118 $self->parse_args(@fm) if @fm;
120 $self->parse_args(split(' ', $ENV{PERL_MM_OPT} || ''),@ARGV);
123 $self->{NAME} ||= $self->guess_name;
125 ($self->{NAME_SYM} = $self->{NAME}) =~ s/\W+/_/g;
128 $self->init_dirscan();
129 $self->init_others();
131 push @{$self->{RESULT}}, <<END;
132 # This Makefile is for the $self->{NAME} extension to perl.
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.
138 # ANY CHANGES MADE HERE WILL BE LOST!
140 # MakeMaker Parameters:
143 foreach $key (sort keys %initial_att){
144 my($v) = neatvalue($initial_att{$key});
145 $v =~ s/(CODE|HASH|ARRAY|SCALAR)\([\dxa-f]+\)/$1\(...\)/;
147 push @{$self->{RESULT}}, "# $key => $v";
150 # turn the SKIP array into a SKIPHASH hash
152 for $skip (@{$self->{SKIP} || []}) {
153 $self->{SKIPHASH}{$skip} = 1;
155 delete $self->{SKIP}; # free memory
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
168 $self->{SKIPHASH}{$_} = 2;
170 push @ExtUtils::MakeMaker::MM_Sections, "rulez"
171 unless grep /rulez/, @ExtUtils::MakeMaker::MM_Sections;
173 if ($self->{PARENT}) {
174 for (qw/install dist dist_basics dist_core distdir dist_test dist_ci/) {
175 $self->{SKIPHASH}{$_} = 1;
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}};
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);
194 push @{$self->{RESULT}}, "\n# --- MakeMaker $section section $skipit.";
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 ));
203 push @{$self->{RESULT}}, "\n# End.";
206 $ExtUtils::MM_MacOS::make_data{$cwd} = $self;
213 return 'skipped' if $self->{SKIPHASH}{$section};
219 Returns true, if the argument is likely to be a command.
224 my($self,$file) = @_;
225 return $file if ! -d $file;
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
240 $name =~ s/.*:// unless ($name =~ s/^.*:ext://);
242 $name =~ s#[\-_][\d.\-]+$##; # this is new with MM 5.00
248 Translate relative Unix filepaths into Mac names.
256 foreach (split(/[ \t\n]+/, $unix)) {
258 if ($Mac_FS) { # should always be true
259 $_ = Mac::FileSpec::Unixish::nativize($_);
274 Translate Unix filepaths and shell globs to Mac style.
281 use ExtUtils::MakeMaker::bytes; # Non-UTF-8 high bytes below.
283 foreach (split(/[ \t\n]+/, $unix)) {
288 $_ = "'$_'" if /[?Å]/;
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.
308 # --- Initialize Module Name and Paths
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.
314 $self->{NAME}) =~ s!::!:!g ; #eg. BSD:Foo:Socket
316 $self->{NAME}) =~ s!.*::!! ; #eg. Socket
318 # --- Initialize PERL_LIB, INST_LIB, PERL_SRC
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'});
324 unless ($self->{PERL_SRC}){
326 foreach $dir (qw(:: ::: :::: ::::: ::::::)){
327 if (-f "${dir}perl.h") {
328 $self->{PERL_SRC}=$dir ;
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:";
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};
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} = '';
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";
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";
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
373 open(FH,macify($self->{VERSION_FROM})) or
374 die "Could not open '$self->{VERSION_FROM}' (attribute VERSION_FROM): $!";
377 next unless /\$([\w:]*\bVERSION)\b.*=/;
378 local $ExtUtils::MakeMaker::module_version_variable = $1;
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;
385 # XXX this should probably croak
386 print "WARNING: Setting VERSION via file '$self->{VERSION_FROM}' failed\n";
393 if ($self->{VERSION}) {
394 $self->{VERSION} =~ s/^\s+//;
395 $self->{VERSION} =~ s/\s+$//;
398 $self->{VERSION} = "0.10" unless $self->{VERSION};
399 ($self->{VERSION_SYM} = $self->{VERSION}) =~ s/\W/_/g;
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};
409 $self->{DEFINE} .= " \$(XS_DEFINE_VERSION) \$(DEFINE_VERSION)";
411 # Preprocessor definitions may be useful
412 $self->{DEFINE} =~ s/-D/-d /g;
414 # UN*X includes probably are not useful
415 $self->{DEFINE} =~ s/-I\S+/_include($1)/eg;
419 # UN*X includes probably are not useful
420 $self->{INC} =~ s/-I(\S+)/_include($1)/eg;
424 # --- Initialize Perl Binary Locations
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;
433 $self->{PERL} = "$self->{PERL_SRC}miniperl";
438 Initializes LDLOADLIBS, LIBS
442 sub init_others { # --- Initialize Other Attributes
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}||[]};
450 $self->{OBJECT} =~ s/\$\(O_FILES\)/@{$self->{C}||[]}/;
453 foreach (split(/[ \t\n]+/, $self->{OBJECT})) {
454 if (/^$self->{BASEEXT}\.o(bj)?$/) {
455 $src .= " $self->{BASEEXT}.c";
456 } elsif (/^(.*\..*)\.o$/) {
458 } elsif (/^(.*)(\.o(bj)?|\$\(OBJ_EXT\))$/) {
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';
474 $self->{'DEV_NULL'} ||= ' \xB3 Dev:Null';
481 Add MACPERL_SRC MACPERL_LIB
483 =item platform_constants
485 Add MACPERL_SRC MACPERL_LIB MACLIBS_68K MACLIBS_PPC MACLIBS_SC MACLIBS_MRC
486 MACLIBS_ALL_68K MACLIBS_ALL_PPC MACLIBS_SHARED
488 XXX Few are initialized. How many of these are ever used?
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};
502 sub platform_constants {
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))
509 next unless defined $self->{$macro};
510 $make_frag .= "$macro = $self->{$macro}\n";
519 Initializes DIR, XS, PM, C, O_FILES, H, PL_FILES, MAN*PODS, EXE_FILES.
523 sub init_dirscan { # --- File and Directory Lists (.xs .pm .pod etc)
525 my($name, %dir, %xs, %c, %h, %ignore, %pl_files, %manifypods);
526 local(%pm); #the sub in find() has to see this hash
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)',
535 $ignore{'test.pl'} = 1;
536 foreach $name ($self->lsdir(":")){
537 next if ($name =~ /^\./ or $ignore{$name});
538 next unless $self->libscan($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/;
546 } elsif ($name =~ /\.c(p|pp|xx|c)?$/i){ # .c .C .cpp .cxx .cc .cp
548 unless $name =~ m/perlmain\.c/; # See MAP_TARGET
549 } elsif ($name =~ /\.h$/i){
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$// ;
558 # Some larger extensions often wish to install a number of *.pm/pl
559 # files into the library in various locations.
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).
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.
573 # The default installation location passed to libscan in $_[1] is:
575 # ./*.pm => $(INST_LIBDIR)/*.pm
576 # ./xyz/... => $(INST_LIBDIR)/xyz/...
577 # ./lib/... => $(INST_LIB)/...
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
584 $self->{PMLIBDIRS} = ['lib', $self->{BASEEXT}]
585 unless $self->{PMLIBDIRS};
587 #only existing directories that aren't in $dir are allowed
589 my (@pmlibdirs) = map { macify ($_) } @{$self->{PMLIBDIRS}};
591 @{$self->{PMLIBDIRS}} = ();
592 foreach $pmlibdir (@pmlibdirs) {
593 -d $pmlibdir && !$dir{$pmlibdir} && push @{$self->{PMLIBDIRS}}, $pmlibdir;
596 if (@{$self->{PMLIBDIRS}}){
597 print "Searching PMLIBDIRS: @{$self->{PMLIBDIRS}}\n"
600 File::Find::find(sub {
602 unless ($self->libscan($_)){
603 $File::Find::prune = 1;
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);
617 }, @{$self->{PMLIBDIRS}});
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};
627 # Set up names of manual pages to generate from pods
628 unless ($self->{MAN1PODS}) {
629 $self->{MAN1PODS} = {};
631 unless ($self->{MAN3PODS}) {
632 $self->{MAN3PODS} = {};
637 =item init_VERSION (o)
639 Change DEFINE_VERSION and XS_DEFINE_VERSION
646 $self->SUPER::init_VERSION;
648 $self->{DEFINE_VERSION} = '-d $(VERSION_MACRO)="¶"$(VERSION)¶""';
649 $self->{XS_DEFINE_VERSION} = '-d $(XS_VERSION_MACRO)="¶"$(XS_VERSION)¶""';
653 =item special_targets (o)
659 sub special_targets {
662 my $make_frag = $self->SUPER::special_targets;
664 return $make_frag . <<'MAKE_FRAG';
665 .INCLUDE : $(MACPERL_SRC)BuildRules.mk $(MACPERL_SRC)ExtBuildRules.mk
673 Defines the static target.
678 # --- Static Loading Sections ---
681 my($extlib) = $self->{MYEXTLIB} ? "\nstatic :: myextlib\n" : "";
685 install :: do_install_static
687 install_static :: do_install_static
693 Used by MacOS to define DL_FUNCS and DL_VARS and write the *.exp
699 my($self,%attribs) = @_;
701 return '' unless !$self->{SKIPHASH}{'dynamic'};
703 my($funcs) = $attribs{DL_FUNCS} || $self->{DL_FUNCS} || {};
704 my($vars) = $attribs{DL_VARS} || $self->{DL_VARS} || [];
708 dynamic :: $self->{BASEEXT}.exp
710 ") unless $self->{SKIPHASH}{'dynamic'};
712 my($extlib) = $self->{MYEXTLIB} ? " myextlib" : "";
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), ');\'
726 Defines the dynamic target.
731 # --- dynamic Loading Sections ---
737 install :: do_install_dynamic
739 install_dynamic :: do_install_dynamic
746 Defines the clean target.
751 # --- Cleanup and Distribution Sections ---
753 my($self, %attribs) = @_;
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.
759 clean :: clean_subdirs
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
767 "\t\$(MV) \$(FIRST_MAKEFILE) \$(MAKEFILE_OLD)\n");
769 "\t$attribs{POSTOP}\n") if $attribs{POSTOP};
773 =item clean_subdirs_target
775 MacOS semantics for changing directories and checking for existence
776 very different than everyone else.
780 sub clean_subdirs_target {
783 # No subdirectories, no cleaning.
784 return <<'NOOP_FRAG' unless @{$self->{DIR}};
790 my $clean = "clean_subdirs :\n";
792 for my $dir (@{$self->{DIR}}) {
793 $clean .= sprintf <<'MAKE_FRAG', $dir;
797 If "`Exists -f $(FIRST_MAKEFILE)`" != ""
811 Defines the realclean target.
816 my($self, %attribs) = @_;
819 # Delete temporary files (via clean) and also delete installed files
820 realclean purge :: clean
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};
831 =item realclean_subdirs_target
833 MacOS semantics for changing directories and checking for existence
834 very different than everyone else.
838 sub realclean_subdirs_target {
841 return <<'NOOP_FRAG' unless @{$self->{DIR}};
846 my $rclean = "realclean_subdirs :\n";
848 foreach my $dir (@{$self->{DIR}}){
849 $rclean .= sprintf <<'RCLEAN', $dir,
853 If \"\`Exists -f $(FIRST_MAKEFILE)\`\" != \"\"
873 install install_static install_dynamic ::
874 \t\$(MACPERL_SRC)PerlInstall -l \$(PERL_LIB)
876 .INCLUDE : \$(MACPERL_SRC)BulkBuildRules.mk
883 Defines targets to run *.PL files.
889 return "" unless $self->{PL_FILES};
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) {
901 \t\$(PERL) -I\$(MACPERL_LIB) -I\$(PERL_LIB) $plfile $target
909 my($self,$libperl) = @_;
912 for (map { $_ . "Optimize" } qw(MWC MWCPPC MWC68K MPW MRC MRC SC)) {
913 $optimize .= "$_ = $self->{$_}" if exists $self->{$_};
916 return $self->{CFLAGS} = $optimize;
920 sub _include { # for Unix-style includes, with -I instead of -i
922 require File::Spec::Unix;
924 # allow only relative paths
925 if (File::Spec::Unix->file_name_is_absolute($inc)) {
928 return '-i ' . macify($inc);
934 MacOS Classic is MacOS and MacOS Classic.
939 return('MacOS', 'MacOS Classic');