aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShea Levy <shea@shealevy.com>2016-08-12 09:44:01 -0400
committerShea Levy <shea@shealevy.com>2017-02-07 15:56:32 -0500
commitf7b7df8d1fcb41156fe92ef2ecf5b17074b88446 (patch)
treef82182ef4ca466809089e462e3261bce30055ef4
parent418a837897e597c5dc2eb4e458462bd04b2abde7 (diff)
Add nix-perl package for the perl bindings
-rw-r--r--.gitignore1
-rw-r--r--Makefile.config.in3
-rw-r--r--corepkgs/config.nix.in3
-rw-r--r--local.mk2
-rw-r--r--perl/Makefile14
-rw-r--r--perl/Makefile.config.in19
-rw-r--r--perl/configure.ac117
-rw-r--r--perl/lib/Nix/Config.pm.in14
-rw-r--r--perl/local.mk25
-rw-r--r--release.nix27
10 files changed, 201 insertions, 24 deletions
diff --git a/.gitignore b/.gitignore
index 951efb4c9..4f7e668e7 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,4 +1,5 @@
Makefile.config
+perl/Makefile.config
# /
/aclocal.m4
diff --git a/Makefile.config.in b/Makefile.config.in
index 15e943804..e2277c667 100644
--- a/Makefile.config.in
+++ b/Makefile.config.in
@@ -24,9 +24,6 @@ libdir = @libdir@
libexecdir = @libexecdir@
localstatedir = @localstatedir@
mandir = @mandir@
-perl = @perl@
-perlbindings = @perlbindings@
-perllibdir = @perllibdir@
pkglibdir = $(libdir)/$(PACKAGE_NAME)
prefix = @prefix@
storedir = @storedir@
diff --git a/corepkgs/config.nix.in b/corepkgs/config.nix.in
index f0f4890a3..32ce6b399 100644
--- a/corepkgs/config.nix.in
+++ b/corepkgs/config.nix.in
@@ -14,6 +14,9 @@ in rec {
nixBinDir = fromEnv "NIX_BIN_DIR" "@bindir@";
nixPrefix = "@prefix@";
nixLibexecDir = fromEnv "NIX_LIBEXEC_DIR" "@libexecdir@";
+ nixLocalstateDir = "@localstatedir@";
+ nixSysconfDir = "@sysconfdir@";
+ nixStoreDir = fromEnv "NIX_STORE_DIR" "@storedir@";
# If Nix is installed in the Nix store, then automatically add it as
# a dependency to the core packages. This ensures that they work
diff --git a/local.mk b/local.mk
index eebd71961..dc10e6870 100644
--- a/local.mk
+++ b/local.mk
@@ -3,7 +3,7 @@ ifeq ($(MAKECMDGOALS), dist)
dist-files += $(shell git --git-dir=.git ls-files || find * -type f)
endif
-dist-files += configure config.h.in nix.spec
+dist-files += configure config.h.in nix.spec perl/configure
clean-files += Makefile.config
diff --git a/perl/Makefile b/perl/Makefile
new file mode 100644
index 000000000..41a32576e
--- /dev/null
+++ b/perl/Makefile
@@ -0,0 +1,14 @@
+makefiles = local.mk
+
+GLOBAL_CXXFLAGS += -std=c++11 -g -Wall
+
+-include Makefile.config
+
+OPTIMIZE = 1
+
+ifeq ($(OPTIMIZE), 1)
+ GLOBAL_CFLAGS += -O3
+ GLOBAL_CXXFLAGS += -O3
+endif
+
+include mk/lib.mk
diff --git a/perl/Makefile.config.in b/perl/Makefile.config.in
new file mode 100644
index 000000000..901d1283e
--- /dev/null
+++ b/perl/Makefile.config.in
@@ -0,0 +1,19 @@
+CC = @CC@
+CFLAGS = @CFLAGS@
+CXX = @CXX@
+CXXFLAGS = @CXXFLAGS@
+HAVE_SODIUM = @HAVE_SODIUM@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+SODIUM_LIBS = @SODIUM_LIBS@
+NIX_CFLAGS = @NIX_CFLAGS@
+NIX_LIBS = @NIX_LIBS@
+nixbindir = @nixbindir@
+curl = @curl@
+nixlibexecdir = @nixlibexecdir@
+nixlocalstatedir = @nixlocalstatedir@
+perl = @perl@
+perllibdir = @perllibdir@
+nixstoredir = @nixstoredir@
+nixsysconfdir = @nixsysconfdir@
+perlbindings = @perlbindings@
diff --git a/perl/configure.ac b/perl/configure.ac
new file mode 100644
index 000000000..dea2b6140
--- /dev/null
+++ b/perl/configure.ac
@@ -0,0 +1,117 @@
+AC_INIT(nix-perl, m4_esyscmd([bash -c "echo -n $(cat ../version)$VERSION_SUFFIX"]))
+AC_CONFIG_SRCDIR(MANIFEST)
+AC_CONFIG_AUX_DIR(../config)
+
+CFLAGS=
+CXXFLAGS=
+AC_PROG_CC
+AC_PROG_CXX
+AX_CXX_COMPILE_STDCXX_11
+
+# Use 64-bit file system calls so that we can support files > 2 GiB.
+AC_SYS_LARGEFILE
+
+AC_DEFUN([NEED_PROG],
+[
+AC_PATH_PROG($1, $2)
+if test -z "$$1"; then
+ AC_MSG_ERROR([$2 is required])
+fi
+])
+
+NEED_PROG(perl, perl)
+NEED_PROG(curl, curl)
+NEED_PROG(bzip2, bzip2)
+NEED_PROG(xz, xz)
+
+# Test that Perl has the open/fork feature (Perl 5.8.0 and beyond).
+AC_MSG_CHECKING([whether Perl is recent enough])
+if ! $perl -e 'open(FOO, "-|", "true"); while (<FOO>) { print; }; close FOO or die;'; then
+ AC_MSG_RESULT(no)
+ AC_MSG_ERROR([Your Perl version is too old. Nix requires Perl 5.8.0 or newer.])
+fi
+AC_MSG_RESULT(yes)
+
+
+# Figure out where to install Perl modules.
+AC_MSG_CHECKING([for the Perl installation prefix])
+perlversion=$($perl -e 'use Config; print $Config{version};')
+perlarchname=$($perl -e 'use Config; print $Config{archname};')
+AC_SUBST(perllibdir, [${libdir}/perl5/site_perl/$perlversion/$perlarchname])
+AC_MSG_RESULT($perllibdir)
+
+AC_ARG_WITH(store-dir, AC_HELP_STRING([--with-store-dir=PATH],
+ [path of the Nix store (defaults to /nix/store)]),
+ storedir=$withval, storedir='/nix/store')
+AC_SUBST(storedir)
+
+# Look for libsodium, an optional dependency.
+PKG_CHECK_MODULES([SODIUM], [libsodium],
+ [AC_DEFINE([HAVE_SODIUM], [1], [Whether to use libsodium for cryptography.])
+ CXXFLAGS="$SODIUM_CFLAGS $CXXFLAGS"
+ have_sodium=1], [have_sodium=])
+AC_SUBST(HAVE_SODIUM, [$have_sodium])
+
+# Check for the required Perl dependencies (DBI, DBD::SQLite and WWW::Curl).
+perlFlags="-I$perllibdir"
+
+AC_ARG_WITH(dbi, AC_HELP_STRING([--with-dbi=PATH],
+ [prefix of the Perl DBI library]),
+ perlFlags="$perlFlags -I$withval")
+
+AC_ARG_WITH(dbd-sqlite, AC_HELP_STRING([--with-dbd-sqlite=PATH],
+ [prefix of the Perl DBD::SQLite library]),
+ perlFlags="$perlFlags -I$withval")
+
+AC_ARG_WITH(www-curl, AC_HELP_STRING([--with-www-curl=PATH],
+ [prefix of the Perl WWW::Curl library]),
+ perlFlags="$perlFlags -I$withval")
+
+AC_MSG_CHECKING([whether DBD::SQLite works])
+if ! $perl $perlFlags -e 'use DBI; use DBD::SQLite;' 2>&5; then
+ AC_MSG_RESULT(no)
+ AC_MSG_FAILURE([The Perl modules DBI and/or DBD::SQLite are missing.])
+fi
+AC_MSG_RESULT(yes)
+
+AC_MSG_CHECKING([whether WWW::Curl works])
+if ! $perl $perlFlags -e 'use WWW::Curl;' 2>&5; then
+ AC_MSG_RESULT(no)
+ AC_MSG_FAILURE([The Perl module WWW::Curl is missing.])
+fi
+AC_MSG_RESULT(yes)
+
+AC_SUBST(perlFlags)
+
+PKG_CHECK_MODULES([NIX], [nix-store])
+
+NEED_PROG([NIX_INSTANTIATE_PROGRAM], [nix-instantiate])
+
+# Get nix configure values
+nixbindir=$("$NIX_INSTANTIATE_PROGRAM" --eval '<nix/config.nix>' -A nixBinDir | tr -d \")
+nixlibexecdir=$("$NIX_INSTANTIATE_PROGRAM" --eval '<nix/config.nix>' -A nixLibexecDir | tr -d \")
+nixlocalstatedir=$("$NIX_INSTANTIATE_PROGRAM" --eval '<nix/config.nix>' -A nixLocalstateDir | tr -d \")
+nixsysconfdir=$("$NIX_INSTANTIATE_PROGRAM" --eval '<nix/config.nix>' -A nixSysconfDir | tr -d \")
+nixstoredir=$("$NIX_INSTANTIATE_PROGRAM" --eval '<nix/config.nix>' -A nixStoreDir | tr -d \")
+AC_SUBST(nixbindir)
+AC_SUBST(nixlibexecdir)
+AC_SUBST(nixlocalstatedir)
+AC_SUBST(nixsysconfdir)
+AC_SUBST(nixstoredir)
+
+AC_SUBST(perlbindings, "yes")
+
+# Expand all variables in config.status.
+test "$prefix" = NONE && prefix=$ac_default_prefix
+test "$exec_prefix" = NONE && exec_prefix='${prefix}'
+for name in $ac_subst_vars; do
+ declare $name="$(eval echo "${!name}")"
+ declare $name="$(eval echo "${!name}")"
+ declare $name="$(eval echo "${!name}")"
+done
+
+rm -f Makefile.config
+ln -s ../mk mk
+
+AC_CONFIG_FILES([])
+AC_OUTPUT
diff --git a/perl/lib/Nix/Config.pm.in b/perl/lib/Nix/Config.pm.in
index 3575d99cb..4f1dd9674 100644
--- a/perl/lib/Nix/Config.pm.in
+++ b/perl/lib/Nix/Config.pm.in
@@ -4,18 +4,18 @@ use MIME::Base64;
$version = "@PACKAGE_VERSION@";
-$binDir = $ENV{"NIX_BIN_DIR"} || "@bindir@";
-$libexecDir = $ENV{"NIX_LIBEXEC_DIR"} || "@libexecdir@";
-$stateDir = $ENV{"NIX_STATE_DIR"} || "@localstatedir@/nix";
-$logDir = $ENV{"NIX_LOG_DIR"} || "@localstatedir@/log/nix";
-$confDir = $ENV{"NIX_CONF_DIR"} || "@sysconfdir@/nix";
-$storeDir = $ENV{"NIX_STORE_DIR"} || "@storedir@";
+$binDir = $ENV{"NIX_BIN_DIR"} || "@nixbindir@";
+$libexecDir = $ENV{"NIX_LIBEXEC_DIR"} || "@nixlibexecdir@";
+$stateDir = $ENV{"NIX_STATE_DIR"} || "@nixlocalstatedir@/nix";
+$logDir = $ENV{"NIX_LOG_DIR"} || "@nixlocalstatedir@/log/nix";
+$confDir = $ENV{"NIX_CONF_DIR"} || "@nixsysconfdir@/nix";
+$storeDir = $ENV{"NIX_STORE_DIR"} || "@nixstoredir@";
$bzip2 = "@bzip2@";
$xz = "@xz@";
$curl = "@curl@";
-$useBindings = "@perlbindings@" eq "yes";
+$useBindings = 1;
%config = ();
diff --git a/perl/local.mk b/perl/local.mk
index 5b43c4b71..1793ececf 100644
--- a/perl/local.mk
+++ b/perl/local.mk
@@ -1,10 +1,10 @@
nix_perl_sources := \
- $(d)/lib/Nix/Store.pm \
- $(d)/lib/Nix/Manifest.pm \
- $(d)/lib/Nix/SSH.pm \
- $(d)/lib/Nix/CopyClosure.pm \
- $(d)/lib/Nix/Config.pm.in \
- $(d)/lib/Nix/Utils.pm
+ lib/Nix/Store.pm \
+ lib/Nix/Manifest.pm \
+ lib/Nix/SSH.pm \
+ lib/Nix/CopyClosure.pm \
+ lib/Nix/Config.pm.in \
+ lib/Nix/Utils.pm
nix_perl_modules := $(nix_perl_sources:.in=)
@@ -12,12 +12,12 @@ $(foreach x, $(nix_perl_modules), $(eval $(call install-data-in, $(x), $(perllib
ifeq ($(perlbindings), yes)
- $(d)/lib/Nix/Store.cc: $(d)/lib/Nix/Store.xs
+ lib/Nix/Store.cc: lib/Nix/Store.xs
$(trace-gen) xsubpp $^ -output $@
libraries += Store
- Store_DIR := $(d)/lib/Nix
+ Store_DIR := lib/Nix
Store_SOURCES := $(Store_DIR)/Store.cc
@@ -25,11 +25,10 @@ ifeq ($(perlbindings), yes)
-I$(shell $(perl) -e 'use Config; print $$Config{archlibexp};')/CORE \
-D_FILE_OFFSET_BITS=64 \
-Wno-unknown-warning-option -Wno-unused-variable -Wno-literal-suffix \
- -Wno-reserved-user-defined-literal -Wno-duplicate-decl-specifier -Wno-pointer-bool-conversion
+ -Wno-reserved-user-defined-literal -Wno-duplicate-decl-specifier -Wno-pointer-bool-conversion \
+ $(NIX_CFLAGS)
- Store_LIBS = libstore libutil
-
- Store_LDFLAGS := $(SODIUM_LIBS)
+ Store_LDFLAGS := $(SODIUM_LIBS) $(NIX_LIBS)
ifeq (CYGWIN,$(findstring CYGWIN,$(OS)))
archlib = $(shell perl -E 'use Config; print $$Config{archlib};')
@@ -45,4 +44,4 @@ ifeq ($(perlbindings), yes)
endif
-clean-files += $(d)/lib/Nix/Config.pm $(d)/lib/Nix/Store.cc
+clean-files += lib/Nix/Config.pm lib/Nix/Store.cc Makefile.config
diff --git a/release.nix b/release.nix
index 7bfde71a6..b93b64ea9 100644
--- a/release.nix
+++ b/release.nix
@@ -41,6 +41,7 @@ let
'';
preConfigure = ''
+ (cd perl ; autoreconf --install --force --verbose)
# TeX needs a writable font cache.
export VARTEXFONTS=$TMPDIR/texfonts
'';
@@ -96,6 +97,32 @@ let
});
+ perl = pkgs.lib.genAttrs systems (system:
+
+ let pkgs = import <nixpkgs> { inherit system; }; in with pkgs;
+
+ releaseTools.nixBuild {
+ name = "nix-perl";
+ src = tarball;
+
+ buildInputs =
+ [ (builtins.getAttr system jobs.build) curl bzip2 xz pkgconfig pkgs.perl ]
+ ++ lib.optional stdenv.isLinux libsodium;
+
+ configureFlags = ''
+ --with-dbi=${perlPackages.DBI}/${pkgs.perl.libPrefix}
+ --with-dbd-sqlite=${perlPackages.DBDSQLite}/${pkgs.perl.libPrefix}
+ --with-www-curl=${perlPackages.WWWCurl}/${pkgs.perl.libPrefix}
+ '';
+
+ enableParallelBuilding = true;
+
+ postUnpack = "sourceRoot=$sourceRoot/perl";
+
+ preBuild = "unset NIX_INDENT_MAKE";
+ });
+
+
binaryTarball = pkgs.lib.genAttrs systems (system:
# FIXME: temporarily use a different branch for the Darwin build.