pythonPackages.rpy2: various fixes (#51084)

- make sure libreadline is found at runtime
- make sure python libraries are found at runtime
- add libraries necessary to pass the testsuite and standard libraries
This commit is contained in:
Timo Kaufmann 2018-11-27 18:24:37 +01:00 committed by GitHub
parent be8569be49
commit 63b39af496
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 71 additions and 5 deletions

View File

@ -1,10 +1,13 @@
{ lib { lib
, python
, buildPythonPackage , buildPythonPackage
, fetchPypi , fetchPypi
, isPyPy , isPyPy
, isPy27 , isPy27
, readline , readline
, R , R
, rWrapper
, rPackages
, pcre , pcre
, lzma , lzma
, bzip2 , bzip2
@ -13,7 +16,11 @@
, singledispatch , singledispatch
, six , six
, jinja2 , jinja2
, pytz
, numpy
, pytest , pytest
, mock
, extraRPackages ? []
}: }:
buildPythonPackage rec { buildPythonPackage rec {
@ -38,18 +45,54 @@ buildPythonPackage rec {
bzip2 bzip2
zlib zlib
icu icu
] ++ (with rPackages; [
# packages expected by the test framework
ggplot2
dplyr
RSQLite
broom
DBI
dbplyr
hexbin
lme4
tidyr
]) ++ extraRPackages ++ rWrapper.recommendedPackages;
patches = [
# R_LIBS_SITE is used by the nix r package to point to the installed R libraries.
# This patch sets R_LIBS_SITE when rpy2 is imported.
./r-libs-site.patch
]; ];
postPatch = ''
substituteInPlace rpy/rinterface/__init__.py --replace '@NIX_R_LIBS_SITE@' "$R_LIBS_SITE"
'';
propagatedBuildInputs = [ propagatedBuildInputs = [
singledispatch singledispatch
six six
jinja2 jinja2
pytz
numpy
]; ];
checkInputs = [ pytest ];
# Tests fail with `assert not _relpath.startswith('..'), "Path must be within the project"` checkInputs = [
# in the unittest `loader.py`. I don't know what causes this. pytest
mock
];
# One remaining test failure caused by different unicode encoding.
# https://bitbucket.org/rpy2/rpy2/issues/488
doCheck = false; doCheck = false;
# without this tests fail when looking for libreadline.so checkPhase = ''
LD_LIBRARY_PATH = lib.makeLibraryPath buildInputs; ${python.interpreter} -m 'rpy2.tests'
'';
# For some reason libreadline.so is not found. Curiously `ldd _rinterface.so | grep readline` shows two readline entries:
# libreadline.so.6 => not found
# libreadline.so.6 => /nix/store/z2zhmrg6jcrn5iq2779mav0nnq4vm2q6-readline-6.3p08/lib/libreadline.so.6 (0x00007f333ac43000)
# There must be a better way to fix this, but I don't know it.
postFixup = ''
patchelf --add-needed ${readline}/lib/libreadline.so "$out/${python.sitePackages}/rpy2/rinterface/"_rinterface*.so
'';
meta = { meta = {
homepage = http://rpy.sourceforge.net/rpy2; homepage = http://rpy.sourceforge.net/rpy2;

View File

@ -0,0 +1,20 @@
diff --git a/rpy/rinterface/__init__.py b/rpy/rinterface/__init__.py
index 9362e57..1af258e 100644
--- a/rpy/rinterface/__init__.py
+++ b/rpy/rinterface/__init__.py
@@ -43,6 +43,15 @@ if not R_HOME:
if not os.environ.get("R_HOME"):
os.environ['R_HOME'] = R_HOME
+# path to libraries
+existing = os.environ.get('R_LIBS_SITE')
+if existing is not None:
+ prefix = existing + ':'
+else:
+ prefix = ''
+additional = '@NIX_R_LIBS_SITE@'
+os.environ['R_LIBS_SITE'] = prefix + additional
+
if sys.platform == 'win32':
_load_r_dll(R_HOME)

View File

@ -5,6 +5,9 @@ stdenv.mkDerivation {
buildInputs = [makeWrapper R] ++ recommendedPackages ++ packages; buildInputs = [makeWrapper R] ++ recommendedPackages ++ packages;
# Make the list of recommended R packages accessible to other packages such as rpy2
passthru.recommendedPackages = recommendedPackages;
unpackPhase = ":"; unpackPhase = ":";
installPhase = '' installPhase = ''