Acme-MITHALDU-XSGrabBag
view release on metacpan or search on metacpan
inc/Inline/C.pm view on Meta::CPAN
'.all' => 0,
};
while (@_) {
my ($key, $value) = (shift, shift);
if ($key eq 'PRE_HEAD') {
unless( -f $value) {
$o->{ILSM}{AUTO_INCLUDE} = $value . "\n" .
$o->{ILSM}{AUTO_INCLUDE};
}
else {
my $insert;
open RD, '<', $value
or die "Couldn't open $value for reading: $!";
while (<RD>) {$insert .= $_}
close RD
or die "Couldn't close $value after reading: $!";
$o->{ILSM}{AUTO_INCLUDE} =
$insert . "\n" . $o->{ILSM}{AUTO_INCLUDE};
}
next;
}
if ($key eq 'MAKE' or
$key eq 'AUTOWRAP' or
$key eq 'XSMODE'
) {
$o->{ILSM}{$key} = $value;
next;
}
if ($key eq 'CC' or
$key eq 'LD'
) {
$o->{ILSM}{MAKEFILE}{$key} = $value;
next;
}
if ($key eq 'LIBS') {
$o->add_list($o->{ILSM}{MAKEFILE}, $key, $value, []);
next;
}
if ($key eq 'INC') {
$o->add_string(
$o->{ILSM}{MAKEFILE},
$key,
quote_space($value),
'',
);
next;
}
if ($key eq 'MYEXTLIB' or
$key eq 'OPTIMIZE' or
$key eq 'CCFLAGS' or
$key eq 'LDDLFLAGS'
) {
$o->add_string($o->{ILSM}{MAKEFILE}, $key, $value, '');
next;
}
if ($key eq 'CCFLAGSEX') {
$o->add_string(
$o->{ILSM}{MAKEFILE},
'CCFLAGS',
$Config{ccflags} . ' ' . $value, '',
);
next;
}
if ($key eq 'TYPEMAPS') {
unless(ref($value) eq 'ARRAY') {
croak "TYPEMAPS file '$value' not found"
unless -f $value;
$value = File::Spec->rel2abs($value);
}
else {
for (my $i = 0; $i < scalar(@$value); $i++) {
croak "TYPEMAPS file '${$value}[$i]' not found"
unless -f ${$value}[$i];
${$value}[$i] = File::Spec->rel2abs(${$value}[$i]);
}
}
$o->add_list($o->{ILSM}{MAKEFILE}, $key, $value, []);
next;
}
if ($key eq 'AUTO_INCLUDE') {
$o->add_text($o->{ILSM}, $key, $value, '');
next;
}
if ($key eq 'BOOT') {
$o->add_text($o->{ILSM}{XS}, $key, $value, '');
next;
}
if ($key eq 'PREFIX') {
croak "Invalid value for 'PREFIX' option"
unless ($value =~ /^\w*$/ and
$value !~ /\n/);
$o->{ILSM}{XS}{PREFIX} = $value;
next;
}
if ($key eq 'FILTERS') {
next if $value eq '1' or $value eq '0'; # ignore ENABLE, DISABLE
$value = [$value] unless ref($value) eq 'ARRAY';
my %filters;
for my $val (@$value) {
if (ref($val) eq 'CODE') {
$o->add_list($o->{ILSM}, $key, $val, []);
}
elsif (ref($val) eq 'ARRAY') {
my ($filter_plugin, @args) = @$val;
croak "Bad format for filter plugin name: '$filter_plugin'"
unless $filter_plugin =~ m/^[\w:]+$/;
eval "require Inline::Filters::${filter_plugin}";
croak "Filter plugin Inline::Filters::$filter_plugin not installed"
if $@;
croak "No Inline::Filters::${filter_plugin}::filter sub found"
unless defined &{"Inline::Filters::${filter_plugin}::filter"};
my $filter_factory = \&{"Inline::Filters::${filter_plugin}::filter"};
$o->add_list($o->{ILSM}, $key, $filter_factory->(@args), []);
}
else {
eval { require Inline::Filters };
croak "'FILTERS' option requires Inline::Filters to be installed."
if $@;
%filters = Inline::Filters::get_filters($o->{API}{language})
unless keys %filters;
if (defined $filters{$val}) {
my $filter = Inline::Filters->new(
$val,
$filters{$val});
$o->add_list($o->{ILSM}, $key, $filter, []);
}
else {
croak "Invalid filter $val specified.";
}
}
}
next;
}
if ($key eq 'STRUCTS') {
# A list of struct names
if (ref($value) eq 'ARRAY') {
for my $val (@$value) {
croak "Invalid value for 'STRUCTS' option"
unless ($val =~ /^[_a-z][_0-9a-z]*$/i);
$o->{STRUCT}{$val}++;
}
}
# Enable or disable
elsif ($value =~ /^\d+$/) {
$o->{STRUCT}{'.any'} = $value;
}
# A single struct name
else {
croak "Invalid value for 'STRUCTS' option"
unless ($value =~ /^[_a-z][_0-9a-z]*$/i);
$o->{STRUCT}{$value}++;
}
eval { require Inline::Struct };
croak "'STRUCTS' option requires Inline::Struct to be installed."
if $@;
$o->{STRUCT}{'.any'} = 1;
next;
}
if ($key eq 'PROTOTYPES') {
$o->{CONFIG}{PROTOTYPES} = $value;
next if $value eq 'ENABLE';
next if $value eq 'DISABLE';
die "PROTOTYPES can be only either 'ENABLE' or 'DISABLE' - not $value";
}
if ($key eq 'PROTOTYPE') {
die "PROTOTYPE configure arg must specify a hash reference"
unless ref($value) eq 'HASH';
$o->{CONFIG}{PROTOTYPE} = $value;
next;
}
if ($key eq 'CPPFLAGS') {
# C preprocessor flags, used by Inline::Filters::Preprocess()
next;
}
my $class = ref $o; # handles subclasses correctly.
croak "'$key' is not a valid config option for $class\n";
}
}
sub add_list {
my $o = shift;
my ($ref, $key, $value, $default) = @_;
$value = [$value] unless ref $value eq 'ARRAY';
for (@$value) {
if (defined $_) {
push @{$ref->{$key}}, $_;
}
else {
$ref->{$key} = $default;
}
}
}
sub add_string {
my $o = shift;
my ($ref, $key, $value, $default) = @_;
$value = [$value] unless ref $value;
croak usage_validate($key) unless ref($value) eq 'ARRAY';
for (@$value) {
if (defined $_) {
$ref->{$key} .= ' ' . $_;
}
else {
$ref->{$key} = $default;
}
}
}
sub add_text {
my $o = shift;
my ($ref, $key, $value, $default) = @_;
$value = [$value] unless ref $value;
croak usage_validate($key) unless ref($value) eq 'ARRAY';
for (@$value) {
if (defined $_) {
chomp;
$ref->{$key} .= $_ . "\n";
}
else {
$ref->{$key} = $default;
}
}
}
#==============================================================================
# Return a small report about the C code..
#==============================================================================
sub info {
my $o = shift;
return <<END if $o->{ILSM}{XSMODE};
No information is currently generated when using XSMODE.
( run in 0.874 second using v1.01-cache-2.11-cpan-140bd7fdf52 )