我重新设计了大部分Makefile
我的论文项目的文件,以便正确反映工作流程(为项目子目录中目标之间的依赖关系创建 make 规则 https://stackoverflow.com/questions/23910056/creating-make-rules-for-dependencies-across-targets-in-projects-sub-directories)。但是,在特定的子目录中(prepare
), make
always重建所有目标,即使依赖关系没有变化。这种意外行为的原因可能是什么?
NOTE: 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
UPDATE:
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
to be .PHONY
。这意味着 make 将始终认为它们已过时。
然后你声明各种.done
目标取决于这些.PHONY
目标。由于虚假目标总是被认为是过时的,所以那些.done
目标总是需要更新,而配方总是会触发。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)