1079 words
5 minutes
さくらレンタルサーバーにMySQL8を入れようとして、依存関係モグラ叩き編が始まった話

前回、なんとか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権限はない。

つまり、

Terminal window
sudo pkg install mysql80-server

みたいなことはできない。

一応portsも試した。

すると。

pkg-static: Unable to open
'/usr/local/etc/pkg/repos//sakura-repo.conf':
Permission denied

開始数分で門前払い。

ならもうソースからビルドするしかない。


ソースからビルド開始#

まずはMySQLのソースを落としてくる。

Terminal window
wget https://downloads.mysql.com/archives/get/p/23/file/mysql-8.0.27.tar.gz
tar xzf mysql-8.0.27.tar.gz

ここまでは平和だった。

本当にここまでは。


Boostが足りない#

おもむろにcmakeを叩く。

Terminal window
cmake ..

すると。

You can download it with
-DDOWNLOAD_BOOST=1
-DWITH_BOOST=<directory>

Boost。

突然知らない名前が出てきた。

最初に思った。

MySQLってBoost必要なん?

必要だった。

しかも指定されたバージョンまである。


疲れている時の人間は変なことをする#

言われた通り、

Terminal window
-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はソースディレクトリ直下でビルドするのを推奨していないらしい。

結局、

Terminal window
mkdir build
cd build
cmake ..

という構成に変更。

さらにCMakeCache.txtを消したり、buildディレクトリを作り直したり。

この頃にはcmakeを叩くこと自体が日課になっていた。


最後の敵 Signal 9#

何時間もかけてビルド。

ログも順調。

Building CXX object
sql/CMakeFiles/sql_gis.dir/gis/difference_functor.cc.o

おっ、いけるか?

と思った次の瞬間。

Signal 9

終了。

あまりにも潔い。

原因はおそらくメモリ不足。

共有サーバー側にプロセスを強制終了されたのだと思う。


学び#

この一件で学んだことは3つ。

共有サーバーで大物ソフトウェアをビルドするのはしんどい root権限がないと依存関係モグラ叩きが始まる 「自前で入れたらええやん」はだいたい罠

そしてもうひとつ。

目的地までの地図を見て、

「この道をまっすぐ行けば着きそうやな」

と思って進んでいたはずなのに、途中から地図に載っていない看板が次々出てきたら、一回立ち止まった方がいい。

今回でいうと、

Boost libunwind CMakeCache

あたりがその看板だった。

当時は

「よく分からんけど、とりあえずインストールしたら進めるやろ」

で突き進んでいた。

でも今振り返ると、その辺で一度引き返して

Djangoのバージョンを落とす PostgreSQLへ移行する VPSを使う

というルートを検討しても良かったと思う。

少なくとも、共有サーバー上でMySQLをビルドする道は、地図に載っているようで載っていない道だった。