Makefileでコマンドの有無によって動作を変えたい
具体例を挙げると、 mariadb(1) はデフォルトでTLSを要求するので、暗号化しない場合は —skip-ssl オプションが必要になる。だけども mysql(1) には —skip-ssl オプションがなく、またデフォルトでは暗号化を要求しないので、暗号化しない接続をする場合においては、利用するコマンドによって分岐が必要になる。
MYSQL =ifeq (,$(shell command -v mariadb 2>/dev/null)) override MYSQL = mysqlelse override MYSQL = mariadb --skip-sslendifいくつか難しさがある。まずコマンドの検出をどうするかだが、which(1) や where(1) よりも、シェル組み込みの type や command の方が良いらしいのでそれを使った。
次に、変数をセットするとき := が使えるかもと思ったが、そうすると空の値になってしまったのでやめた。
最後、事前に定義された MYSQL 変数は空なので override を付けなくても動くが、仮に MYSQL 変数の値が空じゃなくても上書きしたいので意図を明確にするため付けている。