conoha wingで gem install mysql2するときの話 その②

## 前回のお話

[前回](https://qiita.com/active765/items/dbf627a16227a31bee1e)、conoha wingで無理やりgem install mysql2をしましたが、わざわざincludeとlibを再設置しているのがスマートじゃないので、別の方法を試しました。

そもそもgem install mysql2がこけるのはmysql_configがまともに動かないのが問題みたいです。


↓mysql_configするとこんな感じ。
```shell
$ mysql_config
/usr/bin/mysql_config: line 8: rpm: command not found
/usr/bin/mysql_config: error: needed binary: /usr/bin/mysql_config-64 is missing. Please check your MySQL installation.
```


## mysql_configが動かないと何がダメか？
gemのmysql2はインストール時に、mysql_configからlibとかincludeの場所やリンク用の引数などを取得しているっぽい(？)のでmysql_configがちゃんと動いてくれないと、コンパイル時のリンク指定が正しくなくなってエラーになっているようです。

でも/usr/lib64/mysqlにlibmysqlclient.soとかはいるし、/usr/includeにヘッダーファイルはいるんだよなぁ・・・。
↓
じゃあ、ちゃんとしたリンク用の引数やlib,includeの場所を返してくれる偽のmysql_configを用意すればいいのでは？


## 偽のmysql_configを用意する
ということで用意したのが以下のシェルスクリプト。
もともとのmysql_configを弄ってconoha wingのlib64とかincludeを返すようにしただけです。

```shell:conoha_mysql_config
#!/bin/sh

port=0
version='5.7.27'
socket='/tmp/mysql.sock'
basedir='/usr'

pkglibdir="/usr/lib64/mysql"

plugindir="$pkglibdir/plugin"

pkgincludedir="$basedir/include/mysql"

libs="-L$pkglibdir"
libs="$libs -lmysqlclient -lpthread -lm -lrt -ldl"
embedded_libs="-L$pkglibdir"
embedded_libs="$embedded_libs -lmysqld -lpthread -lm -lrt -lcrypt -ldl -laio -lnuma"

cflags="-I$pkgincludedir "
cxxflags="-I$pkgincludedir "
include="-I$pkgincludedir"

usage () {
        cat <<EOF
Usage: $0 [OPTIONS]
Compiler: GNU 4.8.5
Options:
        --cflags         [$cflags]
        --cxxflags       [$cxxflags]
        --include        [$include]
        --libs           [$libs]
        --libs_r         [$libs]
        --plugindir      [$plugindir]
        --socket         [$socket]
        --port           [$port]
        --version        [$version]
        --libmysqld-libs [$embedded_libs]
        --variable=VAR   VAR is one of:
                pkgincludedir [$pkgincludedir]
                pkglibdir     [$pkglibdir]
                plugindir     [$plugindir]
EOF
        exit 1
}

if test $# -le 0; then usage; fi

while test $# -gt 0; do
        case $1 in
        --cflags)  echo "$cflags" ;;
        --cxxflags)echo "$cxxflags";;
        --include) echo "$include" ;;
        --libs)    echo "$libs" ;;
        --libs_r)  echo "$libs" ;;
        --plugindir) echo "$plugindir" ;;
        --socket)  echo "$socket" ;;
        --port)    echo "$port" ;;
        --version) echo "$version" ;;
        --embedded-libs | --embedded | --libmysqld-libs)  echo "$embedded_libs" ;;
        --variable=*)
          var=`echo "$1" | sed 's,^[^=]*=,,'`
          case "$var" in
            pkgincludedir) echo "$pkgincludedir" ;;
            pkglibdir) echo "$pkglibdir" ;;
            plugindir) echo "$plugindir" ;;
            *) usage ;;
          esac
          ;;
        *)         usage ;;
        esac

        shift
done

exit 0
```


上記のスクリプトをhomeディレクトリとかにおいて権限を与えてあげる。
```
chmod 755 conoha_mysql_config
```
あとはgem install mysql2する時に--with-mysql-configオプションでこのシェルスクリプトを指定してあげるだけ。
```
$  gem install mysql2 -- --with-mysql-config=/home/conoha_user_id/conoha_mysql_config
Fetching mysql2-0.5.5.gem
Building native extensions with: '--with-mysql-config=/home/conoha_user_id/conoha_mysql_config'
This could take a while...
Successfully installed mysql2-0.5.5
Parsing documentation for mysql2-0.5.5
Installing ri documentation for mysql2-0.5.5
Done installing documentation for mysql2 after 0 seconds
1 gem installed
```
無事インストール完了。

-----
とりあえず、こんな感じでインストールは出来ました。
ちゃんと調べればリンクの引数を渡す方法があるのかもしれませんが、わざわざ重たいmysqlのインストールイメージを落としてこなくて済むので前よりはマシです。

まだやり方にモヤモヤしますが、今のところ普通に使えているので様子見です。もっといい方法があったら情報ください。