ルート権限の無いCentOSにPython-3.8.5を野良ビルドする


はじめに

root権限の無いCentOS7.3&GCC-4.8.5の環境に野良ビルドしたGCC-9.3.0OpenMPI-3.1.6を基に,今回は,Python-3.8.5を野良ビルドで構築し,さらに並列化のためにmpi4pyを入れたいと思います。

準備

Python,OpenSSL,libffiをダウンロードしておきます。

-https://sourceware.org/libffi/
-https://github.com/openssl/openssl
-https://www.python.org/downloads/source/

今回用いたバージョンは,libffi-3.3,openssl-1.1.1g,python-3.8.5です。
Python-3.8.5のビルド自体はlibffiとOpenSSLを事前にビルドしていなくてもできたのですが,pipの際にOpenSSLのエラーが生じます。"pip OpenSSL"などで検索すると色々でてきますが,Python3.7からOpenSSLの新しいバージョンが必要なようです。
また,新しいOpenSSLをインストールすることで,numpyなどはpipで入る様になりますが,mpi4pyはpipの際に”ModuleNotFoundError:No module named ‘_ctypes'”のエラーが生じます。これは,libffiをインストールしておくことで解消する様なのですが,Python-3.8.5をそのままビルドするとlibffiとリンクできないバグがあるようです。

OpenSSLのビルドとインストール

GCC-9.3.0でOpenSSLをビルドしようとしましたが,なぜかエラーになってしまったので,とりあえずデフォルトのGCC-4.8.5でビルドしました。

tar xzvf openssl-OpenSSL_1_1_1g.tar.gz
cd openssl-OpenSSL_1_1_1g
./config --prefix=$HOME/tools/OpenSSL-1.1.1g shared zlib enable-tls1_3
make -j 24
make install

OpenSSLのインストール後,.bash_profileに以下を追記します。

PATH=$HOME/tools/OpenSSL-1.1.1g/bin:$PATH
LD_LIBRARY_PATH=$HOME/tools/OpenSSL-1.1.1g/lib:LD_LIBRARY_PATH

libffiのビルドとインストール

こちらも,OpenSSL同様にGCC-9.3.0でビルドしようとするとエラーが出てしまいました。おそらくパスの設定などに問題があると思うのですが,後で考えることにします。取りあえず,標準で入っていたGCC-4.8.5でそのままビルドしてみます。

tar -zxvf libffi-3.3.tar.gz
mv libffi-3.3 libffi_work
cd libffi_work
mkdir build
cd build
../configure --prefix=$HOME/tools/libffi-3.3
make -j 24
make install

libffiのインストール完了後,.bash_profileに以下を追記しました。

export LD_LIBRARY_PATH=$HOME/tools/libffi-3.3/lib64:$LD_LIBRARY_PATH
export PKG_CONFIG_PATH=$HOME/tools/libffi-3.3/lib/pkgconfig:$PKG_CONFIG_PATH

Python-3.8.5のビルドとインストール

上記でも述べたように,OpenSSLとlibffiを事前にインストールしておかないと,Pythonインストール後のpipの際にエラーが生じるのですが,さらにPythonビルド時にlibffiとリンクできないというバグもあるようです。Pythonの解凍後のトップディレクトリにある,Makefile.pre.in,configure,configure.ac,setup.pyの4つのファイルに対する修正がありましたので,その通りに修正して上書き保存します。
あとは,以下の手順にてインストールを行います。

tar Jxfv Python-3.8.5.tar.xz
mv Python-3.8.5 py_work
cd py_work
mkdir build
cd build
../configure --prefix=$HOME/tools/Python-3.8.5 --enable-shared --with-openssl=$HOME/tools/OpenSSL-1.1.1g --with-ensurepip LDFLAGS=-Wl,-rpath,$HOME/tools/Python-3.8.5/lib CC=$HOME/tools/gcc-9.3.0/bin/gcc CPP=$HOME/tools/gcc-9.3.0/bin/cpp CPPFLAGS="-I$HOME/tools/gcc-9.3.0/include -I$HOME/tools/OpenSSL-1.1.1g/include -I$HOME/tools/libffi-3.3/include"
make j 36
make install

インストール完了後,以下を.bash_profileに追記します。

PYTHON_HOME=$HOME/tools/Python-3.8.5
PYTHONPATH=$PYTHON_HOME/lib/python3.8/site-packages
PATH=$PYTHON_HOME/bin:$PATH
export PYTHON_HOME PYTHONPATH PATH

以下の様に,シンボリックリンクを作成してみました。

cd ~/bin/
ln -s ~/tools/Python-3.8.5/bin/python3.8 python38

また,numpyとmpi4pyも入れてみます。

cd ~/tools/Python-3.8.5/bin
pip3 install numpy
pip3 install mpi4py

以上で,GCC-9.3.0とOpenMPI-3.1.6をベースにしたPython-3.8.5までを野良ビルドで構築できました。一応,numpyとmpi4pyも問題無く動くようです。