pyRFC 用の自己完結型ホイールを作成しようとしています: http://sap.github.io/PyRFC/install.html
必要な (クローズド ソースの) ライブラリとヘッダー ファイルがあります。
ライブラリとヘッダーを $VIRTUAL_ENV/lib と $VIRTUAL_ENV/include にコピーすると、pyRFC のインストールが機能します。
ここで、クローズド ソース ライブラリ ファイルを含むホイールを作成しようとしました。
しかし、私は失敗しています。
ホイールを解凍すると、これだけが含まれています:
(pypi)pypi@pypiserver:~> unzip -l packages/pyrfc-1.9.91-cp27-cp27mu-linux_x86_64.whl
Archive: packages/pyrfc-1.9.91-cp27-cp27mu-linux_x86_64.whl
Length Date Time Name
--------- ---------- ----- ----
5366 2018-07-23 13:38 pyrfc/_exception.py
1045 2018-07-23 13:38 pyrfc/__init__.py
1610216 2018-07-23 14:10 pyrfc/_pyrfc.so
3835 2018-07-23 14:10 pyrfc-1.9.91.dist-info/DESCRIPTION.rst
990 2018-07-23 14:10 pyrfc-1.9.91.dist-info/metadata.json
6 2018-07-23 14:10 pyrfc-1.9.91.dist-info/top_level.txt
105 2018-07-23 14:10 pyrfc-1.9.91.dist-info/WHEEL
4666 2018-07-23 14:10 pyrfc-1.9.91.dist-info/METADATA
715 2018-07-23 14:10 pyrfc-1.9.91.dist-info/RECORD
--------- -------
1626944 9 files
extra_objects (以下を参照) がありません。
pyRFC の setup.py を変更して、ホイールに $VIRTUAL_ENV/lib のライブラリを含めるにはどうすればよいですか?
ここに setup.py があります: https://github.com/SAP/PyRFC/blob/master/setup.py
このパッチを setup.py に試しました
@@ -48,7 +49,9 @@ PYRFC_EXT = Extension(
, libraries=LIBS
, define_macros=MACROS
, extra_compile_args=COMPILE_ARGS
- , extra_link_args=LINK_ARGS
+ , extra_link_args=LINK_ARGS,
+ library_dirs=['lib'],
+ extra_objects = ['lib/libicudata.so.50', 'lib/libsapnwrfc.so', 'lib/libicui18n.so.50', 'lib/libicuuc.so.50', 'lib/libicudecnumber.so', 'lib/libsapucum.so'],
)
ライブラリをインストールして実行すると、次のlibsapnwrfc.so
エラーが発生します。
Traceback (most recent call last):
File "test-pyrfc.py", line 1, in <module>
from pyrfc import Connection
File "/home/other/lib/python2.7/site-packages/pyrfc/__init__.py", line 22, in <module>
from pyrfc._pyrfc import get_nwrfclib_version, Connection, TypeDescription, FunctionDescription, Server
ImportError: libsapnwrfc.so: cannot open shared object file: No such file or directory
開いている呼び出しをトレースすると、ライブラリのルート レベルのみが参照されていることがわかります。ライブラリは、virtualenv (/home/other) で検索されません。
strace python test-pyrfc.py 2>&1 | grep libsapnwrfc.so
open("/lib64/tls/x86_64/libsapnwrfc.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("/lib64/tls/libsapnwrfc.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("/lib64/x86_64/libsapnwrfc.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("/lib64/libsapnwrfc.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("/usr/lib64/tls/x86_64/libsapnwrfc.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("/usr/lib64/tls/libsapnwrfc.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("/usr/lib64/x86_64/libsapnwrfc.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("/usr/lib64/libsapnwrfc.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
write(2, "libsapnwrfc.so: cannot open shar"..., 73libsapnwrfc.so: cannot open shared object file: No such file or directory) = 73
「libsapnwrfc.so」を wheel 経由で virtualenv にインストールしたいと思います。これにより、複数の独立した環境を持つことができるようになります。RPM または config-management を介してインストールできますが、避けたいと思います。