2015-06-28

Makefile: Here document

Makefile にターゲットを色々詰め込んでいくと、ターゲットの一覧をヘルプで表示したくなる。そのようなターゲット help を作るのは簡単だが、毎行 echo するとか毎行末 \ エスケープするとか面倒なことはやりたくない。そうすると次は当然、ヒアドキュメントっぽいの無いの?ってなるが、Makefile 文法解析とヒアドキュメントの相性が悪すぎて正攻法ではどうにもならない。というか私には無理だった。orz

環境変数を使え、と。なるほど、make に文字列を展開させるのではなく、シェルに実行時展開させれば良いのか。そうすれば make による文法解析を回避できる。

Makefile:

export _help_msg
override define _help_msg
Targets:
  compile  Compile and build sources.
  install  Install to the PREFIX.
  clean    Remove all generated files.
  help     This message.
Variables:
  PREFIX   The path to be installed.
endef

help:
	@echo "$$_help_msg"

compile:
install:
clean:
# make help
Targets:
  compile  Compile and build sources.
  install  Install to the PREFIX.
  clean    Remove all generated files.
  help     This message.
Variables:
  PREFIX   The path to be installed.

但しこの方法は環境変数を export する必要があり、子プロセスに影響を与える可能性が残ってしまうのが少し気持ち悪い。あとエディターによって(Emacs とか)は、文字列中に半端なクォート(「'」「"」)があると色付けが破綻する。まあ毎行 echo するよりはマシ、ということで妥協するしかない。