Alien-Selenium
view release on metacpan or search on metacpan
inc/My/Module/Build.pm view on Meta::CPAN
=back
=head2 Methods
These are intended to be called directly from Build.PL
=over
=item I<topir>
Returns the directory in which C<Build.PL> resides.
=cut
sub topdir {
# TODO: probably not good enough in some cases.
require FindBin;
no warnings "once";
return $FindBin::Bin;
}
=item I<package2filename($packagename)>
Converts $packagename (e.g. C<Foo::Bar>) into its OS-specific notation
(e.g. C<Foo/Bar.pm>).
=cut
sub package2filename {
my ($self, $package) = @_;
my @components = split m/::/, $package;
$components[$#components] .= ".pm";
return catfile(@components);
}
=item I<process_Inline_C_file($filename, @preload_modules)>
Arranges for L<Inline::C> code contained in $filename to be compiled
into .bs's and .so's. @preload_modules is a list of Perl packages (in
Perl C<use> notation, eg C<Foo::Bar> instead of C<Foo/Bar.pm>) that
should be loaded with C<use> before starting the L<Inline> install
process. Uses a stamp file in C<blib/stamp> to avoid compiling anew
if neither $filename nor @preload_modules changed.
=cut
sub process_Inline_C_file {
my ($self, $filename, @preload_modules) = @_;
my $stampfile = do {
my ($volume, $dir, $base) = splitpath($filename);
catfile(qw(blib stamp Inline-C),
join("_", splitdir($dir), $base));
};
return if $self->up_to_date
([$filename,
map { catfile("lib", $self->package2filename($_)) }
@preload_modules], [$stampfile]);
# Remove any leftovers from a (failed) previous run.
do { unlink($_) or die "Cannot unlink($_): $!" } for glob("*.inl");
# And now some ugly kludge to make everything hold together.
# Inline::C wants to use MakeMaker; we don't. So let's call it in
# a sub-Perl.
my $version = $self->dist_version;
my $module_name = $self->module_name;
my $script = <<"SET_VERSION";
BEGIN { \$${module_name}::VERSION = '$version' ; }
SET_VERSION
$script .= "use $_; " foreach (@preload_modules);
$script .= <<"ACTIVATE_INLINE_COMPILE";
use Inline qw(_INSTALL_);
require "$filename";
ACTIVATE_INLINE_COMPILE
$script =~ s/\n/ /g;
my @cmdline = ($^X, "-I" => catdir($self->topdir, "lib"),
-e => $script, $version, catdir(qw(blib arch)));
warn(join(" ", @cmdline, "\n"));
local %ENV = $self->customize_env(%ENV);
system(@cmdline);
die "Command exited with status " . ($? >> 8) if $?;
# Remove the leftovers again.
do { unlink($_) or die "Cannot unlink($_): $!" } for glob("*.inl");
rmdir("arch");
# Update timestamp
if (! -d (my $stampdir = dirname($stampfile))) {
mkpath($stampdir, 0, 0777)
or die "cannot create directory $stampdir: $!";
}
local *STAMP;
open(STAMP, ">>", $stampfile)
or die "cannot create or update timestamp file $stampfile: $!";
close(STAMP);
utime((time) x 2, $stampfile);
}
=item I<use_blib()>
=item I<use_blib($boolean)>
Returns false if the user specified C<use_blib=0> on the command line,
and true otherwise. See L</Extended C<test> action> for details. The
form with a parameter allows one to set the value that will
subsequently be returned by I<use_blib>, thereby overriding the
command line.
=cut
sub use_blib {
my $self = shift;
if (! @_) {
return 1 if (! exists $self->{args}->{use_blib});
return ! ! $self->{args}->{use_blib};
} else {
$self->{args}->{use_blib} = ! ! shift;
}
}
=back
=head2 Dependent Option Graph Methods
=cut
# These "use" statements are specific to the dependent option graph
# to facilitate refactoring.
use Getopt::Long;
use Carp;
use overload; # for overload::StrVal
=over
=item I<option_value($optionname)>
Returns the value selected for the option $optionname. From within an
option declaration sub, this call may result in the question for
$optionname (and its own dependencies, recursively) being asked on
the terminal at once. If a loop is detected so doing,
I<option_value()> will die with a messsage that starts with the word
"RECURSION".
Answers to questions are persisted using Module::Build's I<< ->notes
( run in 1.141 second using v1.01-cache-2.11-cpan-119454b85a5 )