ViMをコンパイルするためにPythonとOpensslをコンパイルする

調査研究

1.ViMをコンパイルするためにPythonとOpensslをコンパイルするまとめ

・vimを自分でコンパイルする際はpythonとopensslもコンパイルする必要が出てくる
・手順が確立できていればコンパイル自体は難しくはないが確立するまで大変
・コンパイルは面倒だが自分でできるとパッケージの提供を待たなくてよいので捗る側面も有り

2.PythonをDeep Learning VM上でコンパイルする

アイキャッチのクレジットはPhoto by Stefan Sidén on Unsplash

背景

vimのpython開発用Plugin導入のためにはpythonサポートをONにしてコンパイルした特定のVersion以上のvimが必要だった
(YouCompleteMe unavailable: requires Vim 8.1.2269+.)

自分の希望するVersionでpythonサポートをONにしたvimがaptでまだ提供されていなかった

vimを自分でコンパイルする事にした

PythonサポートをONにしたvimをコンパイルするためには同じオプション(lto)でコンパイルされたPythonが必要だった
(lto1: fatal error: bytecode stream in file ‘/opt/conda/lib/python3.7/config-3.7m-x86_64-linux-gnu/libpython3.7m.a’ generated with LTO version 8.1 instead of the expected 7.1)

Pythonを自分でコンパイルする事にした

ssl moduleがビルドできないと言われた
(Python requires an OpenSSL 1.0.2 or 1.1 compatible libssl with X509_VERIFY_PARAM_set1_host().

OpenSSL 1.1.1を自分でコンパイルする事にした

ということで、以下、非常に粗い手順ですが、GCPのDeep Learning VM(Debian 10)でpython3.8.8 + Tensorflow2.4をコンパイルしてvimをカスタマイズした際の記録です。

(1)GCPのMarketplaceからDeep Learning VMをデプロイ

AI/MLを使ってる方はDeep Learning VMをやっぱり使うのかな、と思って選択したのですが、よく考えてみると、Deep Learning VMを使う理由はこういったコンパイルとか面倒な事をしたくないからであって、スタートからして矛盾している気もしないでもないです。

まぁ、下記画像の赤いチェック部分のようにNVIDIAのドライバのインストールをチェックしておくと、インストールに加えて、LD_LIBRARY_PATHなどの設定もしてくれているようなので、少しだけ楽かもしれません。逆に言えばDeep Learning VMはDebian 10らしいのでDebianでもUbuntuでもドライバのインストールとLD_LIBRARY_PATHの設定さえすれば、GCPでなくても行けると思います。

(2)コンパイルに必要になるパッケージをインストール

sudo apt-get install build-essential checkinstall libreadline-gplv2-dev libsqlite3-dev tk-dev libgdbm-dev libc6-dev libbz2-dev python3-dev libperl-dev libffi-dev liblzma-dev zlib1g-dev wget curl libncurses5-dev libncursesw5-dev xz-utils tk-dev liblzma-dev git

上記リストはかなり粗いです。しかし、あまり関係なさそうなパッケージが実は意外なところで使われる場合があるので精査すると減らせるかもしれませんが、精査の余力はありませんでした。約400 MB ディスク容量が必要になります。

(2)OpenSSL 1.1.1を自分のホームディレクトリにインストール

以下、自分のホームディレクトリ/home/dahara1のlocal配下にインストールする前提なので、ご自分の環境に合わせて適宜書き換えてください。

cd ~
mkdir work
cd work/
wget https://www.openssl.org/source/openssl-1.1.1.tar.gz
tar xvzf openssl-1.1.1.tar.gz
cd openssl-1.1.1/
./config --prefix=/home/dahara1/local/openssl-1.1.1 shared zlib
make depend
make
make test
make install

インストール完了後、下記コマンドを打ちます

export LD_LIBRARY_PATH=/home/dahara1/local/openssl-1.1.1/lib:$LD_LIBRARY_PATH

(3)Pythonを自分のホームディレクトリにインストール

TensorFlow 2.4はまだPython 3.9に対応していないので3.8の最新にしておきます。

cd ~/work/
wget https://www.python.org/ftp/python/3.8.8/Python-3.8.8.tgz
tar zxfv Python-3.8.8.tgz
cd Python-3.8.8
./configure --prefix=/home/dahara1/local/python38 --enable-optimizations --with-openssl=/home/dahara1/local/openssl-1.1.1 --with-ensurepip --enable-shared --with-lto
make
make install

未解決のwarning
以下はコンパイル中に出た警告ですが、検索したところ深刻なものではなさそうなので、スルーしました。

/home/dahara1/work/python/Python-3.8.8/Modules/_testcapimodule.c: In function ‘PyInit__testcapi’:
/home/dahara1/work/python/Python-3.8.8/Modules/_testcapimodule.c:6328:5: warning: ‘tp_print’ is deprecated [-Wdeprecated-declaration ] MyList_Type.tp_print = 0;
・・・
In file included from ./Include/object.h:746,
from ./Include/pytime.h:6,
from ./Include/Python.h:85,
from /home/dahara1/work/python/Python-3.8.8/Modules/_testcapimodule.c:15:
./Include/cpython/object.h:260:30: note: declared here
Py_DEPRECATED(3.8) int (*tp_print)(PyObject *, FILE *, int);
・・・
/home/dahara1/work/python/Python-3.8.8/Modules/_testcapimodule.c: In function ‘test_buildvalue_issue38913’:
/home/dahara1/work/python/Python-3.8.8/Modules/_testcapimodule.c:6463:15: warning: variable ‘res’ set but not used [-Wunused-but-set-variable] PyObject *res;

pythonのインストールが終わったら、PATH等を.bash_profileに書き込みましょう。

vim ~/.bash_profile

iキーを押してから以下をコピペ

export PATH=/home/dahara1/local/python38/bin:$PATH
export PYTHONPATH=/home/dahara1/local/python38/bin
export LD_LIBRARY_PATH=/home/dahara1/local/openssl-1.1.1/lib:/home/dahara1/local/python38/lib:$LD_LIBRARY_PATH
alias vi=/home/dahara1/local/bin/vim

# 以下は直接的には今回のviコンパイル作業には関係ありませんがコンパイルしたpythonで
# https関係のプログラムを動かす際に必要になるのでやっておいた方が良い設定です
export SSL_CERT_FILE=/home/dahara1/local/python38/lib/python3.8/site-pac
kages/pip/_vendor/certifi/cacert.pem

Escキーを押して:キーを押してwq!と打ち込んで保存して終了

一度、ログアウトしてから再ログインし、設定がちゃんとできているか確認しましょう。

$ python3 --version
Python 3.8.8
$ which python3
/home/dahara1/local/python38/bin/python3
which pip3
/home/dahara1/local/python38/bin/pip3

(4)vimをインストール

cd ~work/
git clone https://github.com/vim/vim.git
cd vim
./configure --with-features=huge \
--enable-multibyte \
--enable-python3interp=yes \
--with-python3-config-dir=$(python3-config --configdir) \
--enable-perlinterp=yes \
--prefix=/home/dahara1/local
make VIMRUNTIMEDIR=/home/dahara1/local/share/vim/vim82
make install

インストール後は「クラウドでインスタンスを新しく構築した時用のviの設定ファイル」を参考にPluguinのインストールと設定ファイルを作成してください。

YouCompleteMeのインストールのところで –allをつけずに

python3 install.py

とすればgo言語関係のエラーは出ずにインストールできると思います。

(5)Tensorflowを自分のホームディレクトリにインストール

tensorflowの公式ドキュメントでは仮想環境を作ってインストール推奨と書いてあるのですが、作成した仮想環境にスイッチしてからviのコンパイルをすると失敗するのでやるなら最後で。

pip3 install --upgrade pip
pip3 install --upgrade tensorflow

コマンドラインから

python3 -c "import tensorflow as tf;print(tf.reduce_sum(tf.random.normal([1000, 1000])))"

と実行して下記のようにSuccessfully opened dynamic libraryとログが出てきたら成功です。

2021-03-11 10:25:01.550606: I tensorflow/stream_executor/platform/default/dso_loader.cc:49] Successfully opened dynamic library libcudart.so.11.0
・・・
pciBusID: 0000:00:04.0 name: Tesla T4 computeCapability: 7.5
coreClock: 1.59GHz coreCount: 40 deviceMemorySize: 14.75GiB deviceMemoryBandwidth: 298.08GiB/s
・・・

お疲れ様でした!

もしかしたら完全にこの文章通りにはいかないかもしれませんが、この文章が貴方の何らかの助けになる事を願っています。

3.ViMをコンパイルするためにPythonとOpensslをコンパイルする関連リンク

1)vim-jp.org
usr_90 – Vim日本語ドキュメント

2)www.tensorflow.org
pip での TensorFlow のインストール

コメント

タイトルとURLをコピーしました