我重新设计Makefile
了论文项目的大部分文件,以便正确反映工作流程(为项目子目录中的目标创建依赖项的制定规则).但是,在特定的子目录(prepare
)中,即使没有依赖项更改,也make
始终重建所有目标.这种意外行为可能是什么原因?
注意:sf.done
是一个真实的文件(类型,我称之为"标记文件"),位于不同的子目录中,并在完成数据收集(import
)时创建/更新目标的相关步骤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
MadScientist.. 5
你已经宣布的目标import transform cleanup merge sample clean
是.PHONY
.这意味着make将始终认为它们已过时.
然后,您声明.done
要依赖这些.PHONY
目标的各种目标.由于虚假的目标总是被认为是过时的,所以这些.done
目标总是需要更新,并且食谱总是会被激活.
你已经宣布的目标import transform cleanup merge sample clean
是.PHONY
.这意味着make将始终认为它们已过时.
然后,您声明.done
要依赖这些.PHONY
目标的各种目标.由于虚假的目标总是被认为是过时的,所以这些.done
目标总是需要更新,并且食谱总是会被激活.