Skip to content

Commit

Permalink
Support building with the Perl XS bindings disabled
Browse files Browse the repository at this point in the history
Since the Perl bindings require shared libraries, this is required on
platforms such as Cygwin where we do a static build.
  • Loading branch information
edolstra committed May 10, 2012
1 parent 6a7b24a commit 4f7bab7
Show file tree
Hide file tree
Showing 5 changed files with 92 additions and 12 deletions.
25 changes: 16 additions & 9 deletions configure.ac
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ fi
AC_PROG_CC
AC_PROG_CXX

# To build programs to be run in the build machine
# To build programs to be run in the build machine.
if test "$CC_FOR_BUILD" = ""; then
if test "$cross_compiling" = "yes"; then
AC_CHECK_PROGS(CC_FOR_BUILD, gcc cc)
Expand All @@ -86,13 +86,6 @@ AC_DISABLE_STATIC
AC_ENABLE_SHARED
AC_PROG_LIBTOOL

if test "$enable_shared" = yes; then
SUB_CONFIGURE_FLAGS="--enable-shared --disable-static"
else
SUB_CONFIGURE_FLAGS="--enable-static --disable-shared"
fi
AC_SUBST(SUB_CONFIGURE_FLAGS)


# Use 64-bit file system calls so that we can support files > 2 GiB.
AC_SYS_LARGEFILE
Expand Down Expand Up @@ -247,7 +240,7 @@ PKG_CHECK_MODULES([SQLITE3], [sqlite3 >= 3.6.19], [CXXFLAGS="$SQLITE3_CFLAGS $CX

# Whether to use the Boehm garbage collector.
AC_ARG_ENABLE(gc, AC_HELP_STRING([--enable-gc],
[enable garbage collection in the Nix expression evaluator (requires Boehm GC)]),
[enable garbage collection in the Nix expression evaluator (requires Boehm GC) [default=no]]),
gc=$enableval, gc=no)
if test "$gc" = yes; then
PKG_CHECK_MODULES([BDW_GC], [bdw-gc])
Expand Down Expand Up @@ -277,6 +270,20 @@ AC_MSG_RESULT(yes)
AC_SUBST(perlFlags)


# Whether to build the Perl bindings
AC_MSG_CHECKING([whether to build the Perl bindings])
AC_ARG_ENABLE(perl-bindings, AC_HELP_STRING([--enable-perl-bindings],
[whether to build the Perl bindings (recommended) [default=yes]]),
perlbindings=$enableval, perlbindings=yes)
if test "$enable_shared" = no; then
# Perl bindings require shared libraries.
perlbindings=no
fi
AM_CONDITIONAL(PERL_BINDINGS, test "$perlbindings" = "yes")
AC_SUBST(perlbindings)
AC_MSG_RESULT($perlbindings)


AC_ARG_ENABLE(init-state, AC_HELP_STRING([--disable-init-state],
[do not initialise DB etc. in `make install']),
init_state=$enableval, init_state=yes)
Expand Down
9 changes: 8 additions & 1 deletion perl/Makefile.am
Original file line number Diff line number Diff line change
Expand Up @@ -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)

Expand All @@ -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
2 changes: 2 additions & 0 deletions perl/lib/Nix/Config.pm.in
Original file line number Diff line number Diff line change
Expand Up @@ -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";
Expand Down
67 changes: 65 additions & 2 deletions perl/lib/Nix/Store.pm
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package Nix::Store;

use strict;
use warnings;
use Nix::Config;

require Exporter;

Expand All @@ -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__
1 change: 1 addition & 0 deletions substitute.mk
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
-e "s^@xsltproc\@^$(xsltproc)^g" \
-e "s^@sqlite_bin\@^$(sqlite_bin)^g" \
-e "s^@version\@^$(VERSION)^g" \
-e "s^@perlbindings\@^$(perlbindings)^g" \
-e "s^@testPath\@^$(coreutils):$$(dirname $$(type -p expr))^g" \
< $< > $@ || rm $@
if test -x $<; then chmod +x $@; fi

0 comments on commit 4f7bab7

Please sign in to comment.