【发布时间】:2014-07-20 07:31:52
【问题描述】:
我为我的论文项目重新设计了大部分 Makefile 文件,以正确反映工作流程 (Creating make rules for dependencies across targets in project's sub-directories)。但是,在特定的子目录 (prepare) 中,make 总是 会重建 所有目标,即使依赖项没有变化。 出现这种意外行为的原因可能是什么?
注意:sf.done 是一个真实文件(类型,我称之为“标志文件”),位于不同的子目录中,并在数据收集完成时创建/更新 (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
更新:
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 答案的最新评论。
标签: r makefile dependencies workflow