[Reproducible-commits] [libextutils-depends-perl] 02/187: *** empty log message ***

Maria Valentina Marin Rodrigues akira-guest at moszumanska.debian.org
Wed Jan 21 21:16:42 UTC 2015


This is an automated email from the git hooks/post-receive script.

akira-guest pushed a commit to branch pu/reproducible_builds
in repository libextutils-depends-perl.

commit 8baa48d926b8ffba1489673c54a25dbe634f0ae7
Author: x-pcg <x-pcg at localhost>
Date:   Wed Jun 18 23:34:10 2003 +0000

    *** empty log message ***
    
    svn path=/trunk/; revision=3
---
 Changes                 |   2 +-
 Makefile.PL             |  11 ++
 lib/ExtUtils/Depends.pm | 395 ++++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 407 insertions(+), 1 deletion(-)

diff --git a/Changes b/Changes
index e351c5a..c1d8802 100644
--- a/Changes
+++ b/Changes
@@ -1,5 +1,5 @@
 Revision history for Perl extension ExtUtils::Depends.
 
-0.01  Thu Jun 19 01:29:25 CEST 2003
+0.1  Thu Jun 19 01:29:25 CEST 2003
 	- original version; created by extracting it from glib.
 
diff --git a/Makefile.PL b/Makefile.PL
new file mode 100644
index 0000000..25689dc
--- /dev/null
+++ b/Makefile.PL
@@ -0,0 +1,11 @@
+use ExtUtils::MakeMaker;
+
+WriteMakefile(
+    'dist'	=> {
+	            PREOP	=> 'pod2text lib/ExtUtils/Depends.pm | tee README >$(DISTVNAME)/README; chmod -R u=rwX,go=rX . ;',
+	            COMPRESS	=> 'gzip -9v',
+	            SUFFIX	=> '.gz',
+	           },
+    'NAME'	=> 'ExtUtils::Depends',
+    'VERSION_FROM' => 'lib/ExtUtils/Depends.pm',
+);
diff --git a/lib/ExtUtils/Depends.pm b/lib/ExtUtils/Depends.pm
new file mode 100644
index 0000000..5d8164e
--- /dev/null
+++ b/lib/ExtUtils/Depends.pm
@@ -0,0 +1,395 @@
+#
+# $Header$
+#
+
+package ExtUtils::Depends;
+use File::Basename;
+use Carp;
+use Cwd;
+use IO::File;
+use strict;
+use vars qw($AUTOLOAD $VERSION);
+
+$VERSION = 0.1;
+
+sub new {
+	my ($class, $package, @depends) = @_;
+	my $self = {
+		_name_ => $package,
+		_depends_ => [@depends],
+		_dtypemaps_ => [],
+		_ddefines_ => [],
+		_prefix_ => 'xs/',
+		_install_ => [qw(typemaps defs)],
+		_handler_ => {
+			typemaps => \&basename,
+			defs => \&basename,
+			headers => sub {
+				my $s = $_[0]; 
+				$s =~ s(^[^<"]+/)(); #"
+				return $s;
+			},
+		},
+	};
+	$class = ref($class) || $class;
+
+	$self = bless $self, $class;
+
+	$self->load(@depends) if @depends;
+	return $self;
+}
+
+sub installdir {
+	my $self = shift;
+	my $dir = $self->{_name_};
+	$dir =~ s/^(\w+::)+//;
+	$dir =~ s(::)(/); #/
+	$dir = '$(INST_ARCHLIBDIR)/'.$dir.'/Install/';
+	return $dir;
+}
+
+sub set_prefix {
+	my ($self, $prefix) = @_;
+	$self->{_prefix_} = $prefix;
+}
+
+sub set_libs {
+	my ($self, $libs) = @_;
+	chomp($libs);
+	$self->{_libs_} = $libs;
+}
+
+sub set_inc {
+	my ($self, $inc) = @_;
+	chomp($inc);
+	$self->{_inc_} = $inc;
+}
+
+# load dependencies ...
+sub load {
+	my ($self, @depends) = @_;
+	my ($dir, $module);
+	
+	for (@depends) {
+		no strict 'refs';
+		my ($name, $file);
+		undef $dir;
+		if (ref $_) {
+			($name, $file) = %$_;
+			my $dname = $name;
+			my $i = 2;
+			my $tmpdir = $file;
+			$dname =~ s(::)(/); #/
+			while ($i--) {
+				$tmpdir = dirname($tmpdir);
+				if ( -f "$tmpdir/Makefile.PL") {
+					$dir = "$tmpdir/blib/lib/".$dname."/Install/";
+					last;
+				}
+			}
+		} else {
+			$_.='::Install::Files';
+			$module = $_.'.pm';
+			$module =~ s(::)(/)g; #/
+			$name = $_;
+			$file = $module;
+		}
+		eval {require $file;};
+		if ($@) {
+			die "Cannot load $_: $@\n";
+		}
+		$dir ||= ${"${_}::CORE"} || $INC{$file};
+		$dir = cwd().'/'.$dir unless $dir =~ m(^/);
+		warn "Found $name in $dir\n";
+		push @{$self->{_dtypemaps_}}, map {$dir.'/'.$_} @{"${_}::typemaps"};
+		#push @{$self->{_ddefs_}}, @{"${_}::defs"};
+		push @{$self->{_ddefines_}}, @{"${_}::defines"};
+		$self->{_dlibs_} .= " ".${"${_}::libs"};
+		$self->{_dinc_} .= " -I$dir ".${"${_}::inc"};
+	}
+}
+
+sub add_pm {
+	my ($self, %pm) = @_;
+	foreach (keys %pm) {
+		$self->{_pm_}->{$_} = $pm{$_};
+	}
+}
+
+sub get_pm {
+	my $self = shift;
+	# maybe make a copy
+	foreach ($self->get_headers) {
+		next unless s/^"//;
+		s/"$//;
+		warn "FORCE installing header: $_\n";
+		$self->{_pm_}->{$_} = $self->installdir().basename($_);
+	}
+	foreach ($self->get_typemaps) {
+		$self->{_pm_}->{$_} = $self->installdir().basename($_);
+	}
+	return $self->{_pm_};
+}
+
+sub install {
+	my $self = shift;
+	my $dir = $self->installdir;
+	foreach (@_) {
+		$self->add_pm($_, $dir.basename($_));
+	}
+}
+
+# called by AUTOLOAD
+sub real_add {
+	my ($self, $tag, @args) = @_;
+	my $file;
+	
+	foreach (@args) {
+		$file = $self->{_prefix_}.$_;
+		if (-e || ! -e $file) {
+			$file = $_;
+		}
+		$self->{$tag}->{$file} = $self->{_counter_}++;
+	}
+}
+
+# called by AUTOLOAD
+sub real_remove {
+	my ($self, $tag, @args) = @_;
+	my $file;
+	
+	foreach (@args) {
+		$file = $self->{_prefix_}.$_;
+		if (-e || ! -e $file) {
+			$file = $_;
+		}
+		delete $self->{$tag}->{$file};
+	}
+}
+
+# called by AUTOLOAD
+sub real_get {
+	my ($self, $tag) = @_;
+
+	return sort {$self->{$tag}->{$a} <=> $self->{$tag}->{$b}} 
+		keys %{$self->{$tag}};
+}
+
+# handle op_foo, where op is get, add, or remove, and foo is one of the
+# internal keys.
+sub AUTOLOAD {
+	my $self = shift @_;
+	my $method = $AUTOLOAD;
+	my $tag;
+	
+	$method =~ s/^.*:://;
+	if ($method =~ s/^(get|add|remove)_//) {
+		no strict 'subs';
+		$tag = $method;
+		$method = "real_$1";
+		return $self->$method ($tag, @_);
+	}
+	carp "No method '$method'\n";
+}
+
+sub DESTROY {}
+
+sub sort_libs {
+	my ($libs) = '';
+	my (@libs, %seenlibs, @revlibs, @lflags);
+	
+	foreach (@_) {
+		$libs .= ' ';
+		$libs .= $_ if( defined($_) );
+	}
+	$libs =~ s/(^|\s)-[rR]\S+//g;
+	
+	@libs = split(/\s+/, $libs);
+	%seenlibs = ();
+	@revlibs=();
+	@lflags=();
+
+	foreach (@libs) {
+		if (/^-l/) {
+			unshift(@revlibs, $_);
+		} else {
+			unshift(@lflags, $_) unless $seenlibs{$_}++;
+		}
+	}
+	@libs=();
+	foreach (@revlibs) {
+		unshift(@libs, $_) unless $seenlibs{$_}++;
+	}
+	return join(' ', @lflags, @libs);
+}
+
+sub get_makefile_vars {
+	my $self = shift;
+	my (%result);
+	my ($xfiles, $object, $ldfrom, $clean) = $self->setup_xs();
+
+	push @$clean, keys %{$self->{clean}};
+	$result{PM} = $self->get_pm;
+	$result{TYPEMAPS} = [@{$self->{_dtypemaps_}}, $self->get_typemaps];
+	$result{DEFINE} = join(' ', @{$self->{_ddefines_}}, keys %{$self->{defines}});
+	$result{OBJECT} = $object;
+	#$result{LDFROM} = $ldfrom;
+	$result{XS} = $xfiles;
+	$self->{_dinc_} = '' unless( defined($self->{_dinc_}) );
+	$self->{_inc_} = '' unless( defined($self->{_inc_}) );
+	$result{INC} = join(' ', $self->{_dinc_}, $self->{_inc_});
+	$result{LIBS} = [sort_libs($self->{_dlibs_}, $self->{_libs_})];
+	$result{clean} = {FILES => join(' ', @$clean) };
+	
+	return %result;
+}
+
+sub setup_xs {
+	my $self = shift;
+	my $xfiles = {};
+	my ($ldfrom, $object, @clean);
+	
+	$ldfrom = $object = '';
+	foreach (keys %{$self->{xs}}) {
+		my($xs) = $_;
+		s/\.xs$/.c/;
+		$xfiles->{$xs} = $_;
+		push(@clean, $_);
+		s/\.c$/.o/;
+		push(@clean, $_);
+		$object .= " $_";
+		s(.*/)();
+		$ldfrom .= " $_";
+	}
+	foreach (keys %{$self->{c}}) {
+		s/\.c$/.o/i;
+		push(@clean, $_);
+		$object .= " $_";
+	}
+	return ($xfiles, $object, $ldfrom, [@clean]);
+}
+
+sub save_config {
+	my ($self, $filename) = @_;
+	my ($file, $mdir, $mdir2, $pm, $name);
+	my (%installable, %handler);
+
+	@installable{@{$self->{_install_}}} = ();
+	%handler = %{$self->{_handler_}};
+
+	$file = new IO::File ">$filename" || croak "Cannot open '$filename': $!";;
+	$name = $mdir = $mdir2 = $self->{_name_};
+	$pm = $self->{_pm_};
+	
+	$mdir =~ s/.*:://;
+	$mdir2 =~ s.::./.g;
+	
+	$pm->{$filename} = '$(INST_ARCHLIBDIR)/'."$mdir/Install/Files.pm";
+
+	print $file "#!/usr/bin/perl\n\npackage ${name}::Install::Files;\n\n";
+
+	foreach my $tag (sort keys %{$self}) {
+		next if $tag =~ /^_/;
+		my %items = %{$self->{$tag}};
+		print $file "\@$tag = qw(\n";
+		foreach my $item (sort {$items{$a} <=> $items{$b}} keys %items) {
+			my $s = exists $handler{$tag} ? $handler{$tag}->($item): $item;
+			print $file "\t$s\n";
+			$pm->{$item} = '$(INST_ARCHLIBDIR)/'. "$mdir/Install/" . $s if exists $installable{$tag};
+		}
+		print $file ");\n\n";
+	}
+	print $file "\$libs = '$self->{_libs_}';\n";
+	print $file "\$inc = '$self->{_inc_}';\n";
+	print $file <<"EOT";
+
+	\$CORE = undef;
+	foreach (\@INC) {
+		if ( -f \$_ . "/$mdir2/Install/Files.pm") {
+			\$CORE = \$_ . "/$mdir2/Install/";
+			last;
+		}
+	}
+
+	1;
+EOT
+	close($file);
+}
+
+sub write_ext {
+	my ($self, $filename) = @_;
+	my $file = new IO::File "> $filename" || carp "Cannot create $filename: $!";
+	
+	print $file "\n\n# Do not edit this file, as it is automatically generated by Makefile.PL\n\n";
+
+	print $file "BOOT:\n{\n";
+
+	foreach ($self->get_boot) {
+        my($b) = $_;
+        $b =~ s/::/__/g;
+        $b = "boot_$b";
+        print $file "extern void $b(CV *cv);\n";
+	}
+	foreach ($self->get_boot) {
+        my($b) = $_;
+        $b =~ s/::/__/g;
+        $b = "boot_$b";
+        print $file "callXS($b, cv, mark);\n";
+	}
+
+	print $file "}\n";
+	close($file);
+
+}
+
+=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_lib("-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");
+	# safe 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.
+
+=head1 AUTHOR
+
+Paolo Molaro, lupus at debian.org
+
+=head1 MAINTAINER
+
+The Gtk2 project, http://gtk2-perl.sf.net/
+
+=head1 SEE ALSO
+
+ExtUtils::MakeMaker.
+
+=cut
+

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/reproducible/libextutils-depends-perl.git



More information about the Reproducible-commits mailing list