公正な警告: 私はメイクファイルを使用するのが初めてなので、これは明らかなことかもしれません。私がやろうとしているのは、その生成ツールのソース ファイル (.abc ファイルと呼びます) が変更されたときだけ、make を使用してサードパーティのコード生成ツールを実行することです。MD5 のビルド方法を示すhttp://www.cmcrossroads.com/ask-mr-make/6795-rebuilding-when-a-files-checksum-changesの例を参照し、アイデアを少し調整しました。
ファイル: abc.mk
target = all
files := $(wildcard Abc/*.abc)
bltfiles := $files $(addsuffix .built,$files)
all: $bltfiles
%.built: %.abc %.abc.md5
@echo "Building $*"
@ #Command that generates code from a .abc file
@touch $@
%.md5: FORCE
@echo "Checking $* for changes..."
@ #Command to update the .md5 file, if the sum of the .abc file is different
FORCE:
私が意図しているのは、各 .abc ファイルに .abc.built と .abc.md5 の 2 つの補助ファイルを含めることです。.built ファイルは、生成ツールによって生成されたコードをターゲットとして簡単に定義できないため、最後にビルドされたときのダミーのターゲットとタイムスタンプにすぎません。.md5 ファイルには、.abc ファイルの最後の既知のコンテンツのハッシュが含まれています。ファイルのハッシュが変更された場合にのみ更新する必要があります。
ただし、.built ファイルは、存在しない場合にのみ作成されます。.md5 ルールはまったく実行されず、.abc ファイルのタイムスタンプが新しい場合でも、.built ルールは再構築されません。私は何か間違ったことをしていますか?
更新: 後世のために、ここに私が仕事をしたバージョンがあります:
ファイル: abc.mk
# Call this makefile as: make all --file=abc.mk
# Default Target
target = all
COMP_ABC_FILES := $(wildcard Abc/*.abc)
COMP_BLT_FILES := $(COMP_ABC_FILES) $(addsuffix .built, $(COMP_ABC_FILES) )
# This line is needed to keep make from deleting intermediary output files:
.SECONDARY:
# Targets:
.PHONY: all
all: $(COMP_BLT_FILES)
Abc/%.abc.built: Abc/%.abc Abc/%.abc.md5
@echo "Building $*"
@ #Command that generates code from a .abc file
@touch $@
%.md5: FORCE
@echo "Checking $* for changes..."
@$(if $(filter-out $(shell cat $@ 2>/dev/null),$(shell md5sum $*)),md5sum $* > $@)
# Empty rule to force re-build of files:
FORCE:
clean:
@echo "Cleaning .built & .md5 files..."
@rm Abc/*.built
@rm Abc/*.md5