bate's blog

調べたこと実装したことなどを取りとめもなく書きます。

makefile 2

time_list_a.txt と time_list_b.txt を stamp_list.txt を作成するために必要な中間ファイルとする。
より複雑で多様なファイルを扱う場合を想定。
stamp_list.txt は time_a_*.txt, time_b_*.txt との更新日時を比較する。
下記の場合、time_a_*.txt か time_b_*.txt のどれか一つでも更新されれば time_list_a.txt, time_list_b.txt の両方の中間ファイルを作成してしまう。
time_a_*.txt だけの更新なら time_list_a.txt だけ生成したいが、どうやればいいのやら。
中間ファイルを削除しても、stamp_list.txt が time_a_*.txt, time_b_*.txt より新しければ make しなくて良いわけで。
time_list_*.txt をターゲットに入れると、これらの中間ファイルのどちらかでも削除すると、stamp_list.txt を更新しようとしてしまうので厄介。
どうすれば良いの??????

##############
# makefile
##############

# マクロ
STAMP_LIST = stamp_list.txt
TIME_LIST_A = time_list_a.txt
TIME_LIST_B = time_list_b.txt
TIME_A_1 = time_a_1.txt
TIME_A_2 = time_a_2.txt
TIME_B_1 = time_b_1.txt
TIME_B_2 = time_b_2.txt

TIME_A = $(TIME_A_1) $(TIME_A_2)
TIME_B = $(TIME_B_1) $(TIME_B_2)

#
all : list
	@echo exec all

list : $(STAMP_LIST)
	@echo exec list

$(STAMP_LIST) : $(TIME_A) $(TIME_B)
	@echo exec $^ in $@
	:> $(TIME_LIST_A)
	cat $(TIME_A) >> $(TIME_LIST_A)
	:> $(TIME_LIST_B)
	cat $(TIME_B) >> $(TIME_LIST_B)
	:> $(STAMP_LIST)
	@echo $^ >> $(STAMP_LIST)
	cat $(TIME_LIST_A) >> $(STAMP_LIST)
	cat $(TIME_LIST_B) >> $(STAMP_LIST)