PKGCONFとLIBFFIをビルドし、ctypesサポートを介してPython3.9をビルドし、sudoを使用せずに/usr/localへの書き込みアクセスをどのように作成しますか?

PKGCONFとLIBFFIをビルドし、ctypesサポートを介してPython3.9をビルドし、sudoを使用せずに/usr/localへの書き込みアクセスをどのように作成しますか?

モジュールを正しくインポートできるように、ビルドプロセスのすべての段階でマイバージョンを正しく使用するようにビルドプロセスを正しく設定してpkgconf許可libffiするにはどうすればよいですか。ここで私が逃した部分は何ですか?python3libffi_ctypes

いくつかの背景

PyQt5でGUIを構築するためにソースからPython3を構築しようとしていますが、要件の1つは機能的なlibffi-devライブラリです。この SLES11 システムに対する sudo 権限もなく、汎用ライブラリ・ディレクトリへの書き込み権限もなく、そのような権限を付与される可能性もありません。マシンを管理するチームに連絡しましたが、彼らは私のプロジェクトの完全なシステムライブラリセットを更新するのを気にしませんでした。ソースから約30の依存関係を構築する必要があります。これについての経験はほとんどありませんが、設定-->make-->インストールプロセスに精通しています。 FFIライブラリから欠落しているシンボルを追跡するプロセスの最後のステップ(_ctypesモジュールのインポートに失敗しました)で停止しました。

*** WARNING: renaming "_ctypes" since importing it failed: 
build/lib.linux-x86_64-3.9/_ctypes.cpython-39-x86_64-linux-gnu.so: 
undefined symbol: ffi_prep_cif

libffiライブラリは問題なくビルドおよびインストールされ、ローカルライブラリパスにファイルが表示されるのを見て、libffiバージョンと他の依存関係との間に矛盾があるか、pkgconfがライブラリを見つけることができないと結論付けました。ファイルが隔離され検証されるように指示されたときにpkgconfの動作を観察した結果、後者のlibffi.so可能性が高くなります。しかし、私は実際に完全な初心者であり、ここでこの質問を入力しながら約1週間このビルド全体に参加したので、明らかに異なる考えを聞くことができます!

便利なデバッグ

pkgconf --version 1.7.3 https://distfiles.dereferenced.org/pkgconf/pkgconf-1.7.3.tar.gz
libffi 3.3 ftp://sourceware.org/pub/libffi/libffi-3.3.tar.gz
Python 3.9.1 https://www.python.org/ftp/python/3.9.1/Python-3.9.1.tgz

pkgconfソースを作成するときにローカルライブラリディレクトリを指定するオプションを提供しました。

./configure --prefix=$HOME/LIBRARIES/--with-system-libdir=$HOME/LIBRARIES/lib:$HOME/LIBRARIES/lib64:/usr/lib:/lib --with-system-includedir=$HOME/LIBRARIES/include:/usr/include

My PKG_CONFIG、、、PKG_CONFIG_PATHおよびlibffiファイルとpkgconfファイルの場所を反映するように更新されましたLD_LIBRARY_PATHLDFLAGSPATHpc

$ echo $PKG_CONFIG
$HOME/LIBRARIES/bin/pkgconf
$ echo $PKG_CONFIG_PATH
$HOME/LIBRARIES/lib/pkgconfig:$HOME/LIBRARIES/lib64/pkgconfig
$ echo $LD_LIBRARY_PATH
$HOME/LIBRARIES/lib:$HOME/LIBRARIES/lib64
$ echo $LDFLAGS
-L$HOME/LIBRARIES/lib64/ -L$HOME/LIBRARIES/lib
$ echo $PATH
$HOME//LIBRARIES/bin:/usr/local/bin:/usr/bin
$ ls $HOME/LIBRARIES/lib64/libff*
libffi.a libffi.la libffi.so libffi.so.7 libffi.so.7.1.0

しかし、

pkgconf --validateライブラリの検証が失敗したように見え、Python3 makeスクリプトは未定義のシンボルを記録します。私はmakeスクリプトにもっと興味があります。ここでpkgconfが実際に間違っているかどうかはわかりません。

ここで更新してください:pkgconfによると、ライブラリが有効であるため、これらの疑いは排除されます。ありがとう、テルコ

pkgconf --validate libffi 
$HOME/LIBRARIES/lib/pkgconfig/libffi.pc:9

わかりやすくするために、Python3の設定コマンドを追加しました。

./configure --prefix=$HOME/LIBRARIES --enable-shared --with-system-ffi=$HOME/LIBRARIES/lib

ベストアンサー1

私も同じ問題があります。

build/lib.linux-x86_64-3.9/_ctypes.cpython-39-x86_64-linux-gnu.so

によって生成されますが、makeリンクされていませんlibffi(経由で見つけたようにldd)。後でmake実行すると、setup.py同じエラーが発生します。

*** WARNING: renaming "_ctypes" since importing it failed:
build/lib.linux-x86_64-3.9/_ctypes.cpython-39-x86_64-linux-gnu.so:
undefined symbol: ffi_prep_cif

Following modules built successfully but were removed because they could not be imported:
_ctypes

しかし、私が考える限り、exportingはC_INCLUDE_PATH問題ではありません。問題は、_ctypes.cpython-39-x86_64-linux-gnu.soコンパイル時に次の行を追加してハック-lffiする必要があることでした。setup.py

ext.libraries.append('ffi')

関数定義の最後に

def detect_ctypes(self):

記録のためにconfigureスクリプトを実行しました。

CPPFLAGS="-I/my/path/include" LDFLAGS="-Wl,-rpath=/my/path/lib64 -Wl,-rpath=/my/path/lib" ./configure --prefix=/my/path --build=x86_64-redhat-linux --enable-shared --enable-optimizations

すべての場合において、それが明確でCPPFLAGS必要かどうかはわかりません。LDFLAGS

おすすめ記事