Ale*_*ekh 0 workflow dependencies makefile r
我重新设计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
Run Code Online (Sandbox Code Playgroud)
更新:
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
Run Code Online (Sandbox Code Playgroud)
你已经宣布的目标import transform cleanup merge sample clean是.PHONY.这意味着make将始终认为它们已过时.
然后,您声明.done要依赖这些.PHONY目标的各种目标.由于虚假的目标总是被认为是过时的,所以这些.done目标总是需要更新,并且食谱总是会被激活.
| 归档时间: |
|
| 查看次数: |
1197 次 |
| 最近记录: |