问题描述
我重新设计了我的论文项目的大部分
NOTE: sf.done is a real file (of type, which I call "flag files"), located in a different sub-directory and created/updated upon completion of data collection (import) - dependent step for the target transform.
准备/ Makefile:
IMPORT_DIR=../import prepare: import \ transform \ cleanup \ merge \ sample import: $(IMPORT_DIR)/sf.done transform: transform.done cleanup: cleanup.done merge: merge.done sample: sample.done transform.done: transform.R import @$(RSCRIPT) $(R_OPTS) $< @touch $@ cleanup.done: cleanup.R transform @$(RSCRIPT) $(R_OPTS) $< @touch $@ merge.done: merge.R cleanup @$(RSCRIPT) $(R_OPTS) $< @touch $@ sample.done: sample.R merge @$(RSCRIPT) $(R_OPTS) $< @touch $@ .PHONY: import transform cleanup merge sample clean # remove intermediate files clean: rm -f tmp*.bz2 *.Rdata .Rout
更新:
IMPORT_DIR = ../import IMPORT_DONE = $(IMPORT_DIR)/sf.done prepare: import \ transform \ cleanup \ merge \ sample import: import.done transform: transform.done cleanup: cleanup.done merge: merge.done sample: sample.done import.done: $(IMPORT_DONE) @cd $(IMPORT_DIR) && $(MAKE) transform.done: transform.R import.done @$(RSCRIPT) $(R_OPTS) $< @touch $@ cleanup.done: cleanup.R transform.done @$(RSCRIPT) $(R_OPTS) $< @touch $@ merge.done: merge.R cleanup.done @$(RSCRIPT) $(R_OPTS) $< @touch $@ sample.done: sample.R merge.done @$(RSCRIPT) $(R_OPTS) $< @touch $@ .PHONY: import transform cleanup merge sample clean
推荐答案
您已经宣布了目标 import transform cleanup merge sample clean 为 .PHONY 。这意味着make会永远认为它们已经过时了。
You've declared the targets import transform cleanup merge sample clean to be .PHONY. That means that make will always consider them to be out of date.
然后你声明各种 .done 目标依赖于 .PHONY 目标。由于虚假的目标总是被认为已经过时,那些 .done 目标总是需要更新,食谱总是触发。
Then you declare the various .done targets to depend on those .PHONY targets. Since the phony targets are always considered out of date, those .done targets always need to be updated, and the recipes always fire.
这篇关于make始终重建Makefile目标的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!