—package
Module::Build::Platform::MacOS;
use
strict;
use
warnings;
our
$VERSION
=
'0.4234'
;
$VERSION
=
eval
$VERSION
;
use
Module::Build::Base;
our
@ISA
=
qw(Module::Build::Base)
;
use
ExtUtils::Install;
sub
have_forkpipe { 0 }
sub
new {
my
$class
=
shift
;
my
$self
=
$class
->SUPER::new(
@_
);
# $Config{sitelib} and $Config{sitearch} are, unfortunately, missing.
foreach
(
'sitelib'
,
'sitearch'
) {
$self
->config(
$_
=>
$self
->config(
"install$_"
))
unless
$self
->config(
$_
);
}
# For some reason $Config{startperl} is filled with a bunch of crap.
(
my
$sp
=
$self
->config(
'startperl'
)) =~ s/.
*Exit
\{Status\}\s//;
$self
->config(
startperl
=>
$sp
);
return
$self
;
}
sub
make_executable {
my
$self
=
shift
;
foreach
(
@_
) {
MacPerl::SetFileInfo(
'McPL'
,
'TEXT'
,
$_
);
}
}
sub
dispatch {
my
$self
=
shift
;
if
( !
@_
and !
@ARGV
) {
# What comes first in the action list.
my
@action_list
=
qw(build test install)
;
my
%actions
=
map
{+(
$_
, 1)}
$self
->known_actions;
delete
@actions
{
@action_list
};
push
@action_list
,
sort
{
$a
cmp
$b
}
keys
%actions
;
my
%toolserver
=
map
{+
$_
=> 1}
qw(test disttest diff testdb)
;
foreach
(
@action_list
) {
$_
.=
' *'
if
$toolserver
{
$_
};
}
my
$cmd
= MacPerl::Pick(
"What build command? ('*' requires ToolServer)"
,
@action_list
);
return
unless
defined
$cmd
;
$cmd
=~ s/ \*$//;
$ARGV
[0] = (
$cmd
);
my
$args
= MacPerl::Ask(
'Any extra arguments? (ie. verbose=1)'
,
''
);
return
unless
defined
$args
;
push
@ARGV
,
$self
->split_like_shell(
$args
);
}
$self
->SUPER::dispatch(
@_
);
}
sub
ACTION_realclean {
my
$self
=
shift
;
chmod
0666,
$self
->{properties}{build_script};
$self
->SUPER::ACTION_realclean;
}
# ExtUtils::Install has a hard-coded '.' directory in versions less
# than 1.30. We use a sneaky trick to turn that into ':'.
#
# Note that we do it here in a cross-platform way, so this code could
# actually go in Module::Build::Base. But we put it here to be less
# intrusive for other platforms.
sub
ACTION_install {
my
$self
=
shift
;
return
$self
->SUPER::ACTION_install(
@_
)
if
eval
{ExtUtils::Install->VERSION(
'1.30'
); 1};
local
$^W = 0;
# Avoid a 'redefine' warning
local
*ExtUtils::Install::find
=
sub
{
my
(
$code
,
@dirs
) =
@_
;
@dirs
=
map
{
$_
eq
'.'
? File::Spec->curdir :
$_
}
@dirs
;
return
File::Find::find(
$code
,
@dirs
);
};
return
$self
->SUPER::ACTION_install(
@_
);
}
1;
__END__
=head1 NAME
Module::Build::Platform::MacOS - Builder class for MacOS platforms
=head1 DESCRIPTION
The sole purpose of this module is to inherit from
C<Module::Build::Base> and override a few methods. Please see
L<Module::Build> for the docs.
=head2 Overridden Methods
=over 4
=item new()
MacPerl doesn't define $Config{sitelib} or $Config{sitearch} for some
reason, but $Config{installsitelib} and $Config{installsitearch} are
there. So we copy the install variables to the other location
=item make_executable()
On MacOS we set the file type and creator to MacPerl so it will run
with a double-click.
=item dispatch()
Because there's no easy way to say "./Build test" on MacOS, if
dispatch is called with no arguments and no @ARGV a dialog box will
pop up asking what action to take and any extra arguments.
Default action is "test".
=item ACTION_realclean()
Need to unlock the Build program before deleting.
=back
=head1 AUTHOR
Michael G Schwern <schwern@pobox.com>
=head1 SEE ALSO
perl(1), Module::Build(3), ExtUtils::MakeMaker(3)
=cut