make始终重建Makefile目标

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)

Mad*_*ist 5

你已经宣布的目标import transform cleanup merge sample clean.PHONY.这意味着make将始终认为它们已过时.

然后,您声明.done要依赖这些.PHONY目标的各种目标.由于虚假的目标总是被认为是过时的,所以这些.done目标总是需要更新,并且食谱总是会被激活.

  • 回答你的第一个问题:你应该做你做过的事情:目标取决于"标志文件"(我通常称之为"哨兵文件"),而不是虚假目标.伪目标主要用于提供命令行目标. (2认同)