VSCode Dev Containerで、Makefileの内容をコンテナ内で作業しているときと、ローカルにいるときで分けたくなりました。
prefixをつけて別コマンドとしても良いですが、同じ動作を期待するなら自分がコンテナかローカルのどちらにいるかを気にせずに、同じコマンドで動いたほうがいいですよね。
私はMakefileについてはど素人だったので、色々手探りで実装してみました。
TL;DR
ifeq (,$(wildcard /.dockerenv))
@echo "I am not in docker"
else
@echo "I am in docker"
endif
Makefileで条件分岐をする
基本的な構文としてifeq
else
endif
が使えます。他のプログラミング言語とほとんど同じです。
ifeq (AAA, BBB)
@echo "true"
else
@echo "false"
endif
このコードではAAA
=BBB
のとき、true
が出力され、それ以外のときにfalse
が出力されます。
プロセスがDockerコンテナで動いているかを判定する
いろいろ方法はあるらしいですが、/.dockerenv
ファイルの存在確認をするのが早そうです。
ただし、Makefileでファイルの存在を確認するときは少しトリッキーな方法が必要です。
wildcard
という関数があり、本来はワイルドカード*
を利用し特定の拡張子を持つファイルをすべて展開するためのものです。
この関数をワイルドカードを使わず単にフルパスで用いると、ファイルが存在するときはファイル名を、なければ空文字を返しますので、ifeqで分岐に使えます。
ifeq (,$(wildcard /.dockerenv)) # /.dockerenv ファイルが存在しない場合
おまけ
ifeq (,$(wildcard /.dockerenv))
はファイルが 存在しない 場合なので、存在するときのみ処理を行いたいときは ifneq (,$(wildcard /.dockerenv))
とするとよいです。