前回、なんとかDjangoを共有サーバー上で動かすことには成功した。
しかし最後に待っていたのがこれだった。
django.db.utils.NotSupportedError:MySQL 8 or later is required (found 5.7.40)さくら共有サーバーで使えるMySQLは5.7。
当時使っていたDjangoはMySQL8必須。
さてどうする。
選択肢は3つあった。
- Djangoのバージョンを下げる
- PostgreSQLに移行する
- MySQL8を自前で入れる
そして当時の自分は、なぜか一番面倒そうな三番目を選んだ。
root権限がない
共有サーバーなので当然ながらroot権限はない。
つまり、
sudo pkg install mysql80-serverみたいなことはできない。
一応portsも試した。
すると。
pkg-static: Unable to open'/usr/local/etc/pkg/repos//sakura-repo.conf':Permission denied開始数分で門前払い。
ならもうソースからビルドするしかない。
ソースからビルド開始
まずはMySQLのソースを落としてくる。
wget https://downloads.mysql.com/archives/get/p/23/file/mysql-8.0.27.tar.gztar xzf mysql-8.0.27.tar.gzここまでは平和だった。
本当にここまでは。
Boostが足りない
おもむろにcmakeを叩く。
cmake ..すると。
You can download it with-DDOWNLOAD_BOOST=1-DWITH_BOOST=<directory>Boost。
突然知らない名前が出てきた。
最初に思った。
MySQLってBoost必要なん?
必要だった。
しかも指定されたバージョンまである。
疲れている時の人間は変なことをする
言われた通り、
-DDOWNLOAD_BOOST=1 \-DWITH_BOOST=$HOME/tmp/boostを実行した。
結果。
command not found当たり前である。
オプションだけ実行していた。
完全に疲れていた。
新たな刺客、libunwind
Boostを突破した。
勝った。
そう思った瞬間。
fatal error: 'libunwind.h' file not found知らん。
誰や。
調べると、スタックトレース関連のライブラリらしい。
また依存ライブラリである。
しかもroot権限はない。
つまり当然、これもソースからビルドする。
includeとlibの違いを体で覚える
libunwindを頑張ってビルドした。
さらに。
setenv LD_LIBRARY_PATH \$HOME/local/libunwind/lib:$LD_LIBRARY_PATHも設定した。
よし。
再ビルド。
fatal error: 'libunwind.h' file not found変わらない。
ここでようやく理解した。
LD_LIBRARY_PATHは実行時に使われるライブラリ検索パス。
一方、libunwind.hはヘッダファイルなので、コンパイル時のincludeパスが必要だった。
つまり見ている場所が違った。
この頃にはもう、何と戦っているのかわからなくなっていた。
CMakeにも怒られる
さらに設定を変えて再実行すると、
Please do not build in-source.と怒られる。
どうやらMySQLはソースディレクトリ直下でビルドするのを推奨していないらしい。
結局、
mkdir buildcd buildcmake ..という構成に変更。
さらにCMakeCache.txtを消したり、buildディレクトリを作り直したり。
この頃にはcmakeを叩くこと自体が日課になっていた。
最後の敵 Signal 9
何時間もかけてビルド。
ログも順調。
Building CXX objectsql/CMakeFiles/sql_gis.dir/gis/difference_functor.cc.oおっ、いけるか?
と思った次の瞬間。
Signal 9終了。
あまりにも潔い。
原因はおそらくメモリ不足。
共有サーバー側にプロセスを強制終了されたのだと思う。
学び
この一件で学んだことは3つ。
共有サーバーで大物ソフトウェアをビルドするのはしんどい root権限がないと依存関係モグラ叩きが始まる 「自前で入れたらええやん」はだいたい罠
そしてもうひとつ。
目的地までの地図を見て、
「この道をまっすぐ行けば着きそうやな」
と思って進んでいたはずなのに、途中から地図に載っていない看板が次々出てきたら、一回立ち止まった方がいい。
今回でいうと、
Boost libunwind CMakeCache
あたりがその看板だった。
当時は
「よく分からんけど、とりあえずインストールしたら進めるやろ」
で突き進んでいた。
でも今振り返ると、その辺で一度引き返して
Djangoのバージョンを落とす PostgreSQLへ移行する VPSを使う
というルートを検討しても良かったと思う。
少なくとも、共有サーバー上でMySQLをビルドする道は、地図に載っているようで載っていない道だった。