aboutsummaryrefslogtreecommitdiff
path: root/perl
diff options
context:
space:
mode:
authorEelco Dolstra <eelco.dolstra@logicblox.com>2012-05-10 19:03:23 -0400
committerEelco Dolstra <eelco.dolstra@logicblox.com>2012-05-10 19:03:23 -0400
commit4f7bab7db1d0447e41f858633cddba1dcb2c9ea2 (patch)
tree818adb7b019671906e2b9016b4c265ebc53cfdf1 /perl
parent6a7b24a3f25548fe2b083555cd2117dd66557ab0 (diff)
Support building with the Perl XS bindings disabled
Since the Perl bindings require shared libraries, this is required on platforms such as Cygwin where we do a static build.
Diffstat (limited to 'perl')
-rw-r--r--perl/Makefile.am9
-rw-r--r--perl/lib/Nix/Config.pm.in2
-rw-r--r--perl/lib/Nix/Store.pm67
3 files changed, 75 insertions, 3 deletions
diff --git a/perl/Makefile.am b/perl/Makefile.am
index 5c841052f..d1f9b1c74 100644
--- a/perl/Makefile.am
+++ b/perl/Makefile.am
@@ -2,9 +2,12 @@ PERL_MODULES = lib/Nix/Store.pm lib/Nix/Manifest.pm lib/Nix/GeneratePatches.pm l
all: $(PERL_MODULES:.in=)
-install-exec-local: $(PERL_MODULES:.in=)
+install-exec-local: $(PERL_MODULES:.in=) install-perl-xs
$(INSTALL) -d $(DESTDIR)$(perllibdir)/Nix
$(INSTALL_DATA) $(PERL_MODULES:.in=) $(DESTDIR)$(perllibdir)/Nix
+
+if PERL_BINDINGS
+install-perl-xs:
$(INSTALL) -d $(DESTDIR)$(perllibdir)/auto/Nix/Store
ln -sfn $(pkglibdir)/libNixStore$(dynlib_suffix) $(DESTDIR)$(perllibdir)/auto/Nix/Store/Store$(dynlib_suffix)
@@ -25,6 +28,10 @@ AM_CXXFLAGS = \
lib/Nix/Store.cc: lib/Nix/Store.xs
xsubpp $^ -output $@
+else
+install-perl-xs:
+endif
+
EXTRA_DIST = $(PERL_MODULES) lib/Nix/Store.xs
include ../substitute.mk
diff --git a/perl/lib/Nix/Config.pm.in b/perl/lib/Nix/Config.pm.in
index c88854daf..b6d346651 100644
--- a/perl/lib/Nix/Config.pm.in
+++ b/perl/lib/Nix/Config.pm.in
@@ -10,6 +10,8 @@ $confDir = $ENV{"NIX_CONF_DIR"} || "@sysconfdir@/nix";
$bzip2 = $ENV{"NIX_BZIP2"} || "@bzip2@";
$curl = "@curl@";
+$useBindings = "@perlbindings@" eq "yes";
+
sub readConfig {
my %config;
my $config = "@sysconfdir@/nix/nix.conf";
diff --git a/perl/lib/Nix/Store.pm b/perl/lib/Nix/Store.pm
index 1ae3b04b7..8312a732c 100644
--- a/perl/lib/Nix/Store.pm
+++ b/perl/lib/Nix/Store.pm
@@ -2,6 +2,7 @@ package Nix::Store;
use strict;
use warnings;
+use Nix::Config;
require Exporter;
@@ -21,8 +22,70 @@ our @EXPORT = qw(
our $VERSION = '0.15';
-require XSLoader;
-XSLoader::load('Nix::Store', $VERSION);
+sub backtick {
+ open(RES, "-|", @_) or die;
+ local $/;
+ my $res = <RES> || "";
+ close RES or die;
+ return $res;
+}
+
+if ($Nix::Config::useBindings) {
+ require XSLoader;
+ XSLoader::load('Nix::Store', $VERSION);
+} else {
+
+ # Provide slow fallbacks of some functions on platforms that don't
+ # support the Perl bindings.
+
+ use File::Temp;
+ use Fcntl qw/F_SETFD/;
+
+ sub hashFile {
+ my ($algo, $base32, $path) = @_;
+ my $res = backtick("$Nix::Config::binDir/nix-hash", "--flat", $path, "--type", $algo, $base32 ? "--base32" : ());
+ chomp $res;
+ return $res;
+ }
+
+ sub hashPath {
+ my ($algo, $base32, $path) = @_;
+ my $res = backtick("$Nix::Config::binDir/nix-hash", $path, "--type", $algo, $base32 ? "--base32" : ());
+ chomp $res;
+ return $res;
+ }
+
+ sub hashString {
+ my ($algo, $base32, $s) = @_;
+ my $fh = File::Temp->new();
+ print $fh $s;
+ my $res = backtick("$Nix::Config::binDir/nix-hash", $fh->filename, "--type", $algo, $base32 ? "--base32" : ());
+ chomp $res;
+ return $res;
+ }
+
+ sub addToStore {
+ my ($srcPath, $recursive, $algo) = @_;
+ die "not implemented" if $recursive || $algo ne "sha256";
+ my $res = backtick("$Nix::Config::binDir/nix-store", "--add", $srcPath);
+ chomp $res;
+ return $res;
+ }
+
+ sub isValidPath {
+ my ($path) = @_;
+ my $res = backtick("$Nix::Config::binDir/nix-store", "--check-validity", "--print-invalid", $path);
+ chomp $res;
+ return $res ne $path;
+ }
+
+ sub queryPathHash {
+ my ($path) = @_;
+ my $res = backtick("$Nix::Config::binDir/nix-store", "--query", "--hash", $path);
+ chomp $res;
+ return $res;
+ }
+}
1;
__END__