我为论文项目重新设计了大多数Makefile
文件,以便正确反映工作流程(Creating make rules for dependencies across targets in project's sub-directories)。但是,在特定的子目录(prepare
)中,make
始终重建所有目标,即使依赖项没有变化也是如此。 这种意外行为可能是什么原因?
注意:sf.done
是一个真实的文件(类型,我称之为"标记文件"),位于不同的子目录中,并在完成数据收集后创建/更新({ {1}}) - 目标import
的相关步骤。
准备/生成文件:
transform
更新
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
答案 0 :(得分:5)
您已将目标import transform cleanup merge sample clean
宣布为.PHONY
。这意味着make总是认为它们已经过时了。
然后,您声明各种.done
目标依赖于.PHONY
个目标。由于虚假目标始终被视为过时,因此始终需要更新那些.done
目标,并始终触发食谱。