我有一个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_setup
和pgdynamic_current
)。但是,由于我明确运行了pgdynamic_setup
,所以我希望make只执行目标pgdynamic_current
。
这不是MWE。当我使用某些touch
,cat
命令尝试相同的概念时,它只是按预期工作。我猜这种结构有问题。谁能在结构上帮助我,因为我无法提供有效的MWE。抱歉,谢谢。
答案 0 :(得分:0)
Make通过比较计算机上存在的文件的时间戳来起作用。它不维护某些内部数据库来运行哪些规则:它将先决条件文件的时间戳和目标文件的时间戳进行比较。
如果使用touch
编写此makefile,则将目标创建为本地磁盘上的文件,因此make可以查看已运行的规则和未运行的规则。
在您的“真实”示例中,您没有创建任何文件(您的规则不会创建名为pgdynamic_tool
,pgdynamic_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 $@