このような Makefile を簡潔かつ効率的に記述する方法は何ですか?
入力のリストと、GNU make 機能を使用してターゲット、依存関係、およびルールを生成する出力ファイル名を生成するシェル スクリプトが与えられる可能性があります。
all :
inputs := in1.c in2.txt in3 sub/in1.c
outputs :=
define make_dependency
${1} : ${2}
outputs += ${1}
endef
# replace $(shell echo ${in}.out) with your $(shell generate ${in})
$(foreach in,${inputs},$(eval $(call make_dependency,$(shell echo ${in}.out),${in})))
# generic rule for all outputs, and the common dependency
# replace "echo ..." with a real rule
${outputs} : % : ${common}
@echo "making $@ from $<"
all : ${outputs}
.PHONY : all
出力:
$ make
making in1.c.out from in1.c
making in2.txt.out from in2.txt
making in3.out from in3
making sub/in1.c.out from sub/in1.c
上記の makefile では、強力な GNU make 構造体によって少し使用されるものが使用されています: $(eval $(call ...))
. マクロを展開してテキストの一部を生成し、そのテキストの一部を makefile の一部として評価するよう make に要求します。つまり、make はその場で makefile を生成します。