* Include the Nix Perl bindings in Nix itself. This will allow the
bindings to be used in Nix's own Perl scripts. The only downside is that Perl XS and Automake/libtool don't really like each other, so building is a bit tricky.
This commit is contained in:
parent
55481c44d4
commit
73fe6871c4
6 changed files with 186 additions and 1 deletions
|
@ -1,4 +1,4 @@
|
||||||
SUBDIRS = externals src scripts corepkgs doc misc tests
|
SUBDIRS = externals src perl scripts corepkgs doc misc tests
|
||||||
EXTRA_DIST = substitute.mk nix.spec nix.spec.in bootstrap.sh \
|
EXTRA_DIST = substitute.mk nix.spec nix.spec.in bootstrap.sh \
|
||||||
nix.conf.example NEWS version
|
nix.conf.example NEWS version
|
||||||
|
|
||||||
|
|
|
@ -341,6 +341,7 @@ AC_CONFIG_FILES([Makefile
|
||||||
src/nix-setuid-helper/Makefile
|
src/nix-setuid-helper/Makefile
|
||||||
src/nix-log2xml/Makefile
|
src/nix-log2xml/Makefile
|
||||||
src/bsdiff-4.3/Makefile
|
src/bsdiff-4.3/Makefile
|
||||||
|
perl/Makefile
|
||||||
scripts/Makefile
|
scripts/Makefile
|
||||||
corepkgs/Makefile
|
corepkgs/Makefile
|
||||||
corepkgs/nar/Makefile
|
corepkgs/nar/Makefile
|
||||||
|
|
7
perl/MANIFEST
Normal file
7
perl/MANIFEST
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
Changes
|
||||||
|
Makefile.PL
|
||||||
|
MANIFEST
|
||||||
|
Nix.xs
|
||||||
|
README
|
||||||
|
t/Nix.t
|
||||||
|
lib/Nix.pm
|
25
perl/Makefile.am
Normal file
25
perl/Makefile.am
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
perlversion := $(shell perl -e 'use Config; print $$Config{version};')
|
||||||
|
perlarchname := $(shell perl -e 'use Config; print $$Config{archname};')
|
||||||
|
perllibdir = $(libdir)/perl5/site_perl/$(perlversion)/$(perlarchname)
|
||||||
|
|
||||||
|
install-exec-local: lib/Nix/*.pm
|
||||||
|
$(INSTALL) -d $(DESTDIR)$(perllibdir)/Nix
|
||||||
|
$(INSTALL_DATA) lib/Nix/*.pm $(DESTDIR)$(perllibdir)/Nix
|
||||||
|
$(INSTALL) -d $(DESTDIR)$(perllibdir)/auto/Nix/Store
|
||||||
|
ln -sfn $(pkglibdir)/libNixStore.so $(DESTDIR)$(perllibdir)/auto/Nix/Store/Store.so
|
||||||
|
|
||||||
|
# Awful hackery to get libtool to build Perl XS bindings.
|
||||||
|
pkglib_LTLIBRARIES = libNixStore.la
|
||||||
|
|
||||||
|
libNixStore_la_SOURCES = lib/Nix/Store.cc
|
||||||
|
|
||||||
|
libNixStore_la_LIBADD = $(top_srcdir)/src/libstore/libstore.la
|
||||||
|
|
||||||
|
AM_CXXFLAGS = \
|
||||||
|
-I$(top_srcdir)/src -I$(top_srcdir)/src/libutil -I$(top_srcdir)/src/libstore \
|
||||||
|
-I$(shell perl -e 'use Config; print $$Config{archlibexp};')/CORE
|
||||||
|
|
||||||
|
lib/Nix/Store.cc: lib/Nix/Store.xs
|
||||||
|
xsubpp $^ -output $@
|
||||||
|
|
||||||
|
EXTRA_DIST = lib/Nix/*.pm lib/Nix/Store.xs
|
23
perl/lib/Nix/Store.pm
Normal file
23
perl/lib/Nix/Store.pm
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
package Nix::Store;
|
||||||
|
|
||||||
|
use 5.010001;
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
|
||||||
|
require Exporter;
|
||||||
|
|
||||||
|
our @ISA = qw(Exporter);
|
||||||
|
|
||||||
|
our %EXPORT_TAGS = ( 'all' => [ qw( ) ] );
|
||||||
|
|
||||||
|
our @EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} } );
|
||||||
|
|
||||||
|
our @EXPORT = qw( );
|
||||||
|
|
||||||
|
our $VERSION = '0.15';
|
||||||
|
|
||||||
|
require XSLoader;
|
||||||
|
XSLoader::load('Nix::Store', $VERSION);
|
||||||
|
|
||||||
|
1;
|
||||||
|
__END__
|
129
perl/lib/Nix/Store.xs
Normal file
129
perl/lib/Nix/Store.xs
Normal file
|
@ -0,0 +1,129 @@
|
||||||
|
#include "EXTERN.h"
|
||||||
|
#include "perl.h"
|
||||||
|
#include "XSUB.h"
|
||||||
|
|
||||||
|
/* Prevent a clash between some Perl and libstdc++ macros. */
|
||||||
|
#undef do_open
|
||||||
|
#undef do_close
|
||||||
|
|
||||||
|
#include <store-api.hh>
|
||||||
|
#include <globals.hh>
|
||||||
|
#include <misc.hh>
|
||||||
|
#include <util.hh>
|
||||||
|
|
||||||
|
|
||||||
|
using namespace nix;
|
||||||
|
|
||||||
|
|
||||||
|
void doInit()
|
||||||
|
{
|
||||||
|
if (!store) {
|
||||||
|
nixStore = canonPath(getEnv("NIX_STORE_DIR", getEnv("NIX_STORE", "/nix/store")));
|
||||||
|
nixStateDir = canonPath(getEnv("NIX_STATE_DIR", "/nix/var/nix"));
|
||||||
|
nixDBPath = getEnv("NIX_DB_DIR", nixStateDir + "/db");
|
||||||
|
try {
|
||||||
|
store = openStore();
|
||||||
|
} catch (Error & e) {
|
||||||
|
croak(e.what());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
MODULE = Nix::Store PACKAGE = Nix::Store
|
||||||
|
PROTOTYPES: ENABLE
|
||||||
|
|
||||||
|
|
||||||
|
void init()
|
||||||
|
CODE:
|
||||||
|
doInit();
|
||||||
|
|
||||||
|
|
||||||
|
int isValidPath(path)
|
||||||
|
char * path
|
||||||
|
CODE:
|
||||||
|
try {
|
||||||
|
doInit();
|
||||||
|
RETVAL = store->isValidPath(path);
|
||||||
|
} catch (Error & e) {
|
||||||
|
croak(e.what());
|
||||||
|
}
|
||||||
|
OUTPUT:
|
||||||
|
RETVAL
|
||||||
|
|
||||||
|
|
||||||
|
SV * queryReferences(path)
|
||||||
|
char * path
|
||||||
|
PPCODE:
|
||||||
|
try {
|
||||||
|
doInit();
|
||||||
|
PathSet paths;
|
||||||
|
store->queryReferences(path, paths);
|
||||||
|
for (PathSet::iterator i = paths.begin(); i != paths.end(); ++i)
|
||||||
|
XPUSHs(sv_2mortal(newSVpv(i->c_str(), 0)));
|
||||||
|
} catch (Error & e) {
|
||||||
|
croak(e.what());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
SV * queryPathHash(path)
|
||||||
|
char * path
|
||||||
|
PPCODE:
|
||||||
|
try {
|
||||||
|
doInit();
|
||||||
|
Hash hash = store->queryPathHash(path);
|
||||||
|
string s = "sha256:" + printHash(hash);
|
||||||
|
XPUSHs(sv_2mortal(newSVpv(s.c_str(), 0)));
|
||||||
|
} catch (Error & e) {
|
||||||
|
croak(e.what());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
SV * queryDeriver(path)
|
||||||
|
char * path
|
||||||
|
PPCODE:
|
||||||
|
try {
|
||||||
|
doInit();
|
||||||
|
Path deriver = store->queryDeriver(path);
|
||||||
|
if (deriver == "") XSRETURN_UNDEF;
|
||||||
|
XPUSHs(sv_2mortal(newSVpv(deriver.c_str(), 0)));
|
||||||
|
} catch (Error & e) {
|
||||||
|
croak(e.what());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
SV * queryPathInfo(path)
|
||||||
|
char * path
|
||||||
|
PPCODE:
|
||||||
|
try {
|
||||||
|
doInit();
|
||||||
|
ValidPathInfo info = store->queryPathInfo(path);
|
||||||
|
if (info.deriver == "")
|
||||||
|
XPUSHs(&PL_sv_undef);
|
||||||
|
else
|
||||||
|
XPUSHs(sv_2mortal(newSVpv(info.deriver.c_str(), 0)));
|
||||||
|
string s = "sha256:" + printHash(info.hash);
|
||||||
|
XPUSHs(sv_2mortal(newSVpv(s.c_str(), 0)));
|
||||||
|
mXPUSHi(info.registrationTime);
|
||||||
|
mXPUSHi(info.narSize);
|
||||||
|
AV * arr = newAV();
|
||||||
|
for (PathSet::iterator i = info.references.begin(); i != info.references.end(); ++i)
|
||||||
|
av_push(arr, newSVpv(i->c_str(), 0));
|
||||||
|
XPUSHs(sv_2mortal(newRV((SV *) arr)));
|
||||||
|
} catch (Error & e) {
|
||||||
|
croak(e.what());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
SV * computeFSClosure(int flipDirection, int includeOutputs, ...)
|
||||||
|
PPCODE:
|
||||||
|
try {
|
||||||
|
doInit();
|
||||||
|
PathSet paths;
|
||||||
|
for (int n = 2; n < items; ++n)
|
||||||
|
computeFSClosure(*store, SvPV_nolen(ST(n)), paths, flipDirection, includeOutputs);
|
||||||
|
for (PathSet::iterator i = paths.begin(); i != paths.end(); ++i)
|
||||||
|
XPUSHs(sv_2mortal(newSVpv(i->c_str(), 0)));
|
||||||
|
} catch (Error & e) {
|
||||||
|
croak(e.what());
|
||||||
|
}
|
Loading…
Reference in a new issue