[Jifty-commit] r5713 - in B-OPCheck: inc/ExtUtils lib/B
Jifty commits
jifty-commit at lists.jifty.org
Wed Aug 13 09:25:03 EDT 2008
Author: clkao
Date: Wed Aug 13 09:25:03 2008
New Revision: 5713
Added:
B-OPCheck/inc/ExtUtils/
B-OPCheck/inc/ExtUtils/Depends.pm
Removed:
B-OPCheck/.Makefile.PL.swp
Modified:
B-OPCheck/Makefile.PL
B-OPCheck/OPCheck.xs
B-OPCheck/lib/B/OPCheck.pm
B-OPCheck/ppport.h
Log:
Use newer B::Utils that exports BUtils_op_name_to_num.
Modified: B-OPCheck/Makefile.PL
==============================================================================
--- B-OPCheck/Makefile.PL (original)
+++ B-OPCheck/Makefile.PL Wed Aug 13 09:25:03 2008
@@ -1,7 +1,22 @@
+use lib 'inc';
+require ExtUtils::Depends;
+
use strict;
-use lib '.';
-use inc::Module::Install 0.75;
+use ExtUtils::MakeMaker;
+
+require ExtUtils::Depends;
+my $bc = ExtUtils::Depends->new("B::OPCheck", "B::Utils");
+WriteMakefile(
+ 'NAME' => 'B::OPCheck',
+ 'VERSION_FROM' => 'lib/B/OPCheck.pm', # finds $VERSION
+ $bc->get_makefile_vars,
+);
+__END__
+
+# XXX: get M::I to support ExtUtils::MakeMaker
+
+use inc::Module::Install 0.75;
name 'B-OPCheck';
all_from 'lib/B/OPCheck.pm';
Modified: B-OPCheck/OPCheck.xs
==============================================================================
--- B-OPCheck/OPCheck.xs (original)
+++ B-OPCheck/OPCheck.xs Wed Aug 13 09:25:03 2008
@@ -3,6 +3,7 @@
#include "EXTERN.h"
#include "perl.h"
#include "embed.h"
+#include "BUtils.h"
#include "XSUB.h"
#define NEED_load_module
@@ -142,52 +143,6 @@
return o;
}
-/* ============================================
- from B.xs. We need to find a way to share c functions
-*/
-
-static I32
-op_name_to_num(SV * name)
-{
- dTHX;
- char const *s;
- char *wanted = SvPV_nolen(name);
- int i =0;
- int topop = OP_max;
-
-#ifdef PERL_CUSTOM_OPS
- topop--;
-#endif
-
- if (SvIOK(name) && SvIV(name) >= 0 && SvIV(name) < topop)
- return SvIV(name);
-
- for (s = PL_op_name[i]; s; s = PL_op_name[++i]) {
- if (strEQ(s, wanted))
- return i;
- }
-#ifdef PERL_CUSTOM_OPS
- if (PL_custom_op_names) {
- HE* ent;
- SV* value;
- /* This is sort of a hv_exists, backwards */
- (void)hv_iterinit(PL_custom_op_names);
- while ((ent = hv_iternext(PL_custom_op_names))) {
- if (strEQ(SvPV_nolen(hv_iterval(PL_custom_op_names,ent)),wanted))
- return OP_CUSTOM;
- }
- }
-#endif
-
- croak("No such op \"%s\"", SvPV_nolen(name));
-
- return -1;
-}
-
-/* ============================================
- end of code form B. We need to find a way to share c functions
-*/
-
MODULE = B::OPCheck PACKAGE = B::OPCheck
PROTOTYPES: ENABLE
@@ -204,7 +159,7 @@
SV *perlsub
PROTOTYPE: $$
PREINIT:
- I32 opnum = op_name_to_num(opname);
+ I32 opnum = BUtils_op_name_to_num(opname);
CODE:
if ( !PL_check_orig[opnum] ) {
PL_check_orig[opnum] = PL_check[opnum];
@@ -226,7 +181,7 @@
PROTOTYPE: $$
PREINIT:
AV *av;
- I32 opnum = op_name_to_num(opname);
+ I32 opnum = BUtils_op_name_to_num(opname);
CODE:
if (av = OPCHECK_subs[opnum]) {
I32 i;
@@ -253,7 +208,7 @@
AV *
get_guts(opname)
SV *opname
- I32 opnum = op_name_to_num(opname);
+ I32 opnum = BUtils_op_name_to_num(opname);
CODE:
{
RETVAL = OPCHECK_subs[opnum];
Added: B-OPCheck/inc/ExtUtils/Depends.pm
==============================================================================
--- (empty file)
+++ B-OPCheck/inc/ExtUtils/Depends.pm Wed Aug 13 09:25:03 2008
@@ -0,0 +1,549 @@
+#
+# $Header: /cvsroot/gtk2-perl/gtk2-perl-xs/ExtUtils-Depends/lib/ExtUtils/Depends.pm,v 1.18 2008/03/30 15:36:23 kaffeetisch Exp $
+#
+
+package ExtUtils::Depends;
+
+use strict;
+use warnings;
+use Carp;
+use File::Find;
+use File::Spec;
+use Data::Dumper;
+
+our $VERSION = '0.300';
+
+sub import {
+ my $class = shift;
+ return unless @_;
+ die "$class version $_[0] is required--this is only version $VERSION"
+ if $VERSION < $_[0];
+}
+
+sub new {
+ my ($class, $name, @deps) = @_;
+ my $self = bless {
+ name => $name,
+ deps => {},
+ inc => [],
+ libs => '',
+
+ pm => {},
+ typemaps => [],
+ xs => [],
+ c => [],
+ }, $class;
+
+ $self->add_deps (@deps);
+
+ # attempt to load these now, so we'll find out as soon as possible
+ # whether the dependencies are valid. we'll load them again in
+ # get_makefile_vars to catch any added between now and then.
+ $self->load_deps;
+
+ return $self;
+}
+
+sub add_deps {
+ my $self = shift;
+ foreach my $d (@_) {
+ $self->{deps}{$d} = undef
+ unless $self->{deps}{$d};
+ }
+}
+
+sub get_deps {
+ my $self = shift;
+ $self->load_deps; # just in case
+
+ return %{$self->{deps}};
+}
+
+sub set_inc {
+ my $self = shift;
+ push @{ $self->{inc} }, @_;
+}
+
+sub set_libs {
+ my ($self, $newlibs) = @_;
+ $self->{libs} = $newlibs;
+}
+
+sub add_pm {
+ my ($self, %pm) = @_;
+ while (my ($key, $value) = each %pm) {
+ $self->{pm}{$key} = $value;
+ }
+}
+
+sub _listkey_add_list {
+ my ($self, $key, @list) = @_;
+ $self->{$key} = [] unless $self->{$key};
+ push @{ $self->{$key} }, @list;
+}
+
+sub add_xs { shift->_listkey_add_list ('xs', @_) }
+sub add_c { shift->_listkey_add_list ('c', @_) }
+sub add_typemaps {
+ my $self = shift;
+ $self->_listkey_add_list ('typemaps', @_);
+ $self->install (@_);
+}
+
+# no-op, only used for source back-compat
+sub add_headers { carp "add_headers() is a no-op" }
+
+####### PRIVATE
+sub basename { (File::Spec->splitdir ($_[0]))[-1] }
+# get the name in Makefile syntax.
+sub installed_filename {
+ my $self = shift;
+ return '$(INST_ARCHLIB)/$(FULLEXT)/Install/'.basename ($_[0]);
+}
+
+sub install {
+ # install things by adding them to the hash of pm files that gets
+ # passed through WriteMakefile's PM key.
+ my $self = shift;
+ foreach my $f (@_) {
+ $self->add_pm ($f, $self->installed_filename ($f));
+ }
+}
+
+sub save_config {
+ use Data::Dumper;
+ use IO::File;
+
+ my ($self, $filename) = @_;
+ my $file = IO::File->new (">".$filename)
+ or croak "can't open '$filename' for writing: $!\n";
+ print $file "package $self->{name}\::Install::Files;\n\n";
+ # for modern stuff
+ print $file "".Data::Dumper->Dump([{
+ inc => join (" ", @{ $self->{inc} }),
+ libs => $self->{libs},
+ typemaps => [ map { basename $_ } @{ $self->{typemaps} } ],
+ deps => [keys %{ $self->{deps} }],
+ }], ['self']);
+ # for ancient stuff
+ print $file "\n\n# this is for backwards compatiblity\n";
+ print $file "\@deps = \@{ \$self->{deps} };\n";
+ print $file "\@typemaps = \@{ \$self->{typemaps} };\n";
+ print $file "\$libs = \$self->{libs};\n";
+ print $file "\$inc = \$self->{inc};\n";
+ # this is riduculous, but old versions of ExtUtils::Depends take
+ # first $loadedmodule::CORE and then $INC{$file} --- the fallback
+ # includes the Filename.pm, which is not useful. so we must add
+ # this crappy code. we don't worry about portable pathnames,
+ # as the old code didn't either.
+ (my $mdir = $self->{name}) =~ s{::}{/}g;
+ print $file <<"EOT";
+
+ \$CORE = undef;
+ foreach (\@INC) {
+ if ( -f \$_ . "/$mdir/Install/Files.pm") {
+ \$CORE = \$_ . "/$mdir/Install/";
+ last;
+ }
+ }
+EOT
+
+ print $file "\n1;\n";
+
+ close $file;
+
+ # we need to ensure that the file we just created gets put into
+ # the install dir with everything else.
+ #$self->install ($filename);
+ $self->add_pm ($filename, $self->installed_filename ('Files.pm'));
+}
+
+sub load {
+ my $dep = shift;
+ my @pieces = split /::/, $dep;
+ my @suffix = qw/ Install Files /;
+ my $relpath = File::Spec->catfile (@pieces, @suffix) . '.pm';
+ my $depinstallfiles = join "::", @pieces, @suffix;
+ eval {
+ require $relpath
+ } or die " *** Can't load dependency information for $dep:\n $@\n";
+ #
+ #print Dumper(\%INC);
+
+ # effectively $instpath = dirname($INC{$relpath})
+ @pieces = File::Spec->splitdir ($INC{$relpath});
+ pop @pieces;
+ my $instpath = File::Spec->catdir (@pieces);
+
+ no strict;
+
+ croak "No dependency information found for $dep"
+ unless $instpath;
+
+ if (not File::Spec->file_name_is_absolute ($instpath)) {
+ $instpath = File::Spec->rel2abs ($instpath);
+ }
+
+ my @typemaps = map {
+ File::Spec->rel2abs ($_, $instpath)
+ } @{"$depinstallfiles\::typemaps"};
+
+ {
+ instpath => $instpath,
+ typemaps => \@typemaps,
+ inc => "-I$instpath ".${"$depinstallfiles\::inc"},
+ libs => ${"$depinstallfiles\::libs"},
+ # this will not exist when loading files from old versions
+ # of ExtUtils::Depends.
+ (exists ${"$depinstallfiles\::"}{deps}
+ ? (deps => \@{"$depinstallfiles\::deps"})
+ : ()),
+ }
+}
+
+sub load_deps {
+ my $self = shift;
+ my @load = grep { not $self->{deps}{$_} } keys %{ $self->{deps} };
+ foreach my $d (@load) {
+ my $dep = load ($d);
+ $self->{deps}{$d} = $dep;
+ if ($dep->{deps}) {
+ foreach my $childdep (@{ $dep->{deps} }) {
+ push @load, $childdep
+ unless
+ $self->{deps}{$childdep}
+ or
+ grep {$_ eq $childdep} @load;
+ }
+ }
+ }
+}
+
+sub uniquify {
+ my %seen;
+ # we use a seen hash, but also keep indices to preserve
+ # first-seen order.
+ my $i = 0;
+ foreach (@_) {
+ $seen{$_} = ++$i
+ unless exists $seen{$_};
+ }
+ #warn "stripped ".(@_ - (keys %seen))." redundant elements\n";
+ sort { $seen{$a} <=> $seen{$b} } keys %seen;
+}
+
+
+sub get_makefile_vars {
+ my $self = shift;
+
+ # collect and uniquify things from the dependencies.
+ # first, ensure they are completely loaded.
+ $self->load_deps;
+
+ ##my @defbits = map { split } @{ $self->{defines} };
+ my @incbits = map { split } @{ $self->{inc} };
+ my @libsbits = split /\s+/, $self->{libs};
+ my @typemaps = @{ $self->{typemaps} };
+ foreach my $d (keys %{ $self->{deps} }) {
+ my $dep = $self->{deps}{$d};
+ #push @defbits, @{ $dep->{defines} };
+ push @incbits, @{ $dep->{defines} } if $dep->{defines};
+ push @incbits, split /\s+/, $dep->{inc} if $dep->{inc};
+ push @libsbits, split /\s+/, $dep->{libs} if $dep->{libs};
+ push @typemaps, @{ $dep->{typemaps} } if $dep->{typemaps};
+ }
+
+ # we have a fair bit of work to do for the xs files...
+ my @clean = ();
+ my @OBJECT = ();
+ my %XS = ();
+ foreach my $xs (@{ $self->{xs} }) {
+ (my $c = $xs) =~ s/\.xs$/\.c/i;
+ (my $o = $xs) =~ s/\.xs$/\$(OBJ_EXT)/i;
+ $XS{$xs} = $c;
+ push @OBJECT, $o;
+ # according to the MakeMaker manpage, the C files listed in
+ # XS will be added automatically to the list of cleanfiles.
+ push @clean, $o;
+ }
+
+ # we may have C files, as well:
+ foreach my $c (@{ $self->{c} }) {
+ (my $o = $c) =~ s/\.c$/\$(OBJ_EXT)/i;
+ push @OBJECT, $o;
+ push @clean, $o;
+ }
+
+ my %vars = (
+ INC => join (' ', uniquify @incbits),
+ LIBS => join (' ', uniquify $self->find_extra_libs, @libsbits),
+ TYPEMAPS => [@typemaps],
+ );
+
+ # we don't want to provide these if there is no data in them;
+ # that way, the caller can still get default behavior out of
+ # MakeMaker when INC, LIBS and TYPEMAPS are all that are required.
+ $vars{PM} = $self->{pm}
+ if %{ $self->{pm} };
+ $vars{clean} = { FILES => join (" ", @clean), }
+ if @clean;
+ $vars{OBJECT} = join (" ", @OBJECT)
+ if @OBJECT;
+ $vars{XS} = \%XS
+ if %XS;
+
+ %vars;
+}
+
+sub find_extra_libs {
+ my $self = shift;
+
+ my %mappers = (
+ MSWin32 => sub { $_[0] . '.lib' },
+ cygwin => sub { 'lib' . $_[0] . '.dll.a'},
+ );
+ my $mapper = $mappers{$^O};
+ return () unless defined $mapper;
+
+ my @found_libs = ();
+ foreach my $name (keys %{ $self->{deps} }) {
+ (my $stem = $name) =~ s/^.*:://;
+ my $lib = $mapper->($stem);
+ my $pattern = qr/$lib$/;
+
+ my $matching_file;
+ find (sub {
+ if ((not $matching_file) && /$pattern/) {;
+ $matching_file = $File::Find::name;
+ }
+ }, map { -d $_ ? ($_) : () } @INC); # only extant dirs
+
+ if ($matching_file && -f $matching_file) {
+ push @found_libs, $matching_file;
+ next;
+ }
+ }
+
+ return @found_libs;
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+ExtUtils::Depends - Easily build XS extensions that depend on XS extensions
+
+=head1 SYNOPSIS
+
+ use ExtUtils::Depends;
+ $package = new ExtUtils::Depends ('pkg::name', 'base::package')
+ # set the flags and libraries to compile and link the module
+ $package->set_inc("-I/opt/blahblah");
+ $package->set_libs("-lmylib");
+ # add a .c and an .xs file to compile
+ $package->add_c('code.c');
+ $package->add_xs('module-code.xs');
+ # add the typemaps to use
+ $package->add_typemaps("typemap");
+ # install some extra data files and headers
+ $package->install (qw/foo.h data.txt/);
+ # save the info
+ $package->save_config('Files.pm');
+
+ WriteMakefile(
+ 'NAME' => 'Mymodule',
+ $package->get_makefile_vars()
+ );
+
+=head1 DESCRIPTION
+
+This module tries to make it easy to build Perl extensions that use
+functions and typemaps provided by other perl extensions. This means
+that a perl extension is treated like a shared library that provides
+also a C and an XS interface besides the perl one.
+
+This works as long as the base extension is loaded with the RTLD_GLOBAL
+flag (usually done with a
+
+ sub dl_load_flags {0x01}
+
+in the main .pm file) if you need to use functions defined in the module.
+
+The basic scheme of operation is to collect information about a module
+in the instance, and then store that data in the Perl library where it
+may be retrieved later. The object can also reformat this information
+into the data structures required by ExtUtils::MakeMaker's WriteMakefile
+function.
+
+When creating a new Depends object, you give it a name, which is the name
+of the module you are building. You can also specify the names of modules
+on which this module depends. These dependencies will be loaded
+automatically, and their typemaps, header files, etc merged with your new
+object's stuff. When you store the data for your object, the list of
+dependencies are stored with it, so that another module depending on your
+needn't know on exactly which modules yours depends.
+
+For example:
+
+ Gtk2 depends on Glib
+
+ Gnome2::Canvas depends on Gtk2
+
+ ExtUtils::Depends->new ('Gnome2::Canvas', 'Gtk2');
+ this command automatically brings in all the stuff needed
+ for Glib, since Gtk2 depends on it.
+
+
+=head1 METHODS
+
+=over
+
+=item $object = ExtUtils::Depends->new($name, @deps)
+
+Create a new depends object named I<$name>. Any modules listed in I<@deps>
+(which may be empty) are added as dependencies and their dependency
+information is loaded. An exception is raised if any dependency information
+cannot be loaded.
+
+=item $depends->add_deps (@deps)
+
+Add modules listed in I<@deps> as dependencies.
+
+=item (hashes) = $depends->get_deps
+
+Fetch information on the dependencies of I<$depends> as a hash of hashes,
+which are dependency information indexed by module name. See C<load>.
+
+=item $depends->set_inc (@newinc)
+
+Add strings to the includes or cflags variables.
+
+=item $depends->set_libs (@newlibs)
+
+Add strings to the libs (linker flags) variable.
+
+=item $depends->add_pm (%pm_files)
+
+Add files to the hash to be passed through ExtUtils::WriteMakefile's
+PM key.
+
+=item $depends->add_xs (@xs_files)
+
+Add xs files to be compiled.
+
+=item $depends->add_c (@c_files)
+
+Add C files to be compiled.
+
+=item $depends->add_typemaps (@typemaps)
+
+Add typemap files to be used and installed.
+
+=item $depends->add_headers (list)
+
+No-op, for backward compatibility.
+
+=item $depends->install (@files)
+
+Install I<@files> to the data directory for I<$depends>.
+
+This actually works by adding them to the hash of pm files that gets
+passed through WriteMakefile's PM key.
+
+=item $depends->save_config ($filename)
+
+Save the important information from I<$depends> to I<$filename>, and
+set it up to be installed as I<name>::Install::Files.
+
+Note: the actual value of I<$filename> seems to be irrelevant, but its
+usage is kept for backward compatibility.
+
+=item hash = $depends->get_makefile_vars
+
+Return the information in I<$depends> in a format digestible by
+WriteMakefile.
+
+This sets at least the following keys:
+
+ INC
+ LIBS
+ TYPEMAPS
+ PM
+
+And these if there is data to fill them:
+
+ clean
+ OBJECT
+ XS
+
+=item hashref = ExtUtils::Depends::load (name)
+
+Load and return dependency information for I<name>. Croaks if no such
+information can be found. The information is returned as an anonymous
+hash containing these keys:
+
+=over
+
+=item instpath
+
+The absolute path to the data install directory for this module.
+
+=item typemaps
+
+List of absolute pathnames for this module's typemap files.
+
+=item inc
+
+CFLAGS string for this module.
+
+=item libs
+
+LIBS string for this module.
+
+=item deps
+
+List of modules on which this one depends. This key will not exist when
+loading files created by old versions of ExtUtils::Depends.
+
+=back
+
+=item $depends->load_deps
+
+Load I<$depends> dependencies, by calling C<load> on each dependency module.
+This is usually done for you, and should only be needed if you want to call
+C<get_deps> after calling C<add_deps> manually.
+
+=back
+
+
+=head1 BUGS
+
+Version 0.2 discards some of the more esoteric features provided by the
+older versions. As they were completely undocumented, and this module
+has yet to reach 1.0, this may not exactly be a bug.
+
+This module is tightly coupled to the ExtUtils::MakeMaker architecture.
+
+=head1 SEE ALSO
+
+ExtUtils::MakeMaker.
+
+=head1 AUTHOR
+
+Paolo Molaro <lupus at debian dot org> wrote the original version for
+Gtk-Perl. muppet <scott at asofyet dot org> rewrote the innards for
+version 0.2, borrowing liberally from Paolo's code.
+
+=head1 MAINTAINER
+
+The Gtk2 project, http://gtk2-perl.sf.net/
+
+=head1 LICENSE
+
+This library is free software; you may redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=cut
+
Modified: B-OPCheck/lib/B/OPCheck.pm
==============================================================================
--- B-OPCheck/lib/B/OPCheck.pm (original)
+++ B-OPCheck/lib/B/OPCheck.pm Wed Aug 13 09:25:03 2008
@@ -9,6 +9,7 @@
use XSLoader;
use Scalar::Util;
use Scope::Guard;
+use B::Utils ();
our $VERSION = '0.27';
Modified: B-OPCheck/ppport.h
==============================================================================
--- B-OPCheck/ppport.h (original)
+++ B-OPCheck/ppport.h Wed Aug 13 09:25:03 2008
@@ -4,9 +4,9 @@
/*
----------------------------------------------------------------------
- ppport.h -- Perl/Pollution/Portability Version 3.12
+ ppport.h -- Perl/Pollution/Portability Version 3.13
- Automatically created by Devel::PPPort running under perl 5.008008.
+ Automatically created by Devel::PPPort running under perl 5.010000.
Do NOT edit this file directly! -- Edit PPPort_pm.PL and the
includes in parts/inc/ instead.
@@ -21,7 +21,7 @@
=head1 NAME
-ppport.h - Perl/Pollution/Portability version 3.12
+ppport.h - Perl/Pollution/Portability version 3.13
=head1 SYNOPSIS
@@ -371,7 +371,7 @@
# Disable broken TRIE-optimization
BEGIN { eval '${^RE_TRIE_MAXBUF} = -1' if $] >= 5.009004 && $] <= 5.009005 }
-my $VERSION = 3.12;
+my $VERSION = 3.13;
my %opt = (
quiet => 0,
@@ -3834,7 +3834,7 @@
* automatically be defined as the correct argument.
*/
-#if (PERL_BCDVERSION <= 0x5005004)
+#if (PERL_BCDVERSION <= 0x5005005)
/* Replace: 1 */
# define PL_ppaddr ppaddr
# define PL_no_modify no_modify
More information about the Jifty-commit
mailing list