即使已经事先明确运行依赖项,也要使依赖项多次执行

时间:2018-11-18 11:14:55

标签: makefile dependencies

我有一个makefile,该文件由具有某些依赖关系的多个目标组成。 一个小的结构类似于

pgdynamic_setup:
    cd $(PGDYNAMICDIR);  . /opt/Modules/init/sh; module load <tool_name>; totem2 -lmwait $(PGDYNAMIC_APACHE_LN) $(BATCH_NOBATCH) dynamic_setup.tcl | tee -i ./logs/$@.log

pgdynamic_current: pgdynamic_setup
    cd $(PGDYNAMICDIR);  . /opt/Modules/init/sh; module load <tool_name>; <tool_name> dynamic_current.tcl | tee -i ./logs/$@.log

pgdynamic_cdev: pgdynamic_setup
    cd $(PGDYNAMICDIR);  . /opt/Modules/init/sh; module load <tool_name>; <tool_name> dynamic_cdev.tcl | tee -i ./logs/$@.log

pgdynamic_tool: pgdynamic_current
    cd $(PGDYNAMICDIR);  . /opt/Modules/init/sh; module load <tool_name>; <tool_name> dynamic.tcl | tee -i ./logs/$@.log

我没有太多编写Makefile的经验。问题是,当我运行make pgdynamic_setup时,然后make pgdynamic_current make会执行两个目标(pgdynamic_setuppgdynamic_current)。但是,由于我明确运行了pgdynamic_setup,所以我希望make只执行目标pgdynamic_current

这不是MWE。当我使用某些touchcat命令尝试相同的概念时,它只是按预期工作。我猜这种结构有问题。谁能在结构上帮助我,因为我无法提供有效的MWE。抱歉,谢谢。

1 个答案:

答案 0 :(得分:0)

Make通过比较计算机上存在的文件的时间戳来起作用。它不维护某些内部数据库来运行哪些规则:它将先决条件文件的时间戳和目标文件的时间戳进行比较。

如果使用touch编写此makefile,则将目标创建为本地磁盘上的文件,因此make可以查看已运行的规则和未运行的规则。

在您的“真实”示例中,您没有创建任何文件(您的规则不会创建名为pgdynamic_toolpgdynamic_current等的文件),因此make并不知道这些规则何时最后一次运行。

如果要让make跳过已经运行的规则,则必须在运行时在磁盘上创建具有这些名称的文件,以便make知道。您可以使用touch $@来完成此操作。

ETA 您想要这样的东西:

pgdynamic_setup:
        cd $(PGDYNAMICDIR);  . /opt/Modules/init/sh; module load <tool_name>; totem2 -lmwait $(PGDYNAMIC_APACHE_LN) $(BATCH_NOBATCH) dynamic_setup.tcl | tee -i ./logs/$@.log
        touch $@