如何让 Makefile 从另一个文件中看到目标

How to let Makefile see target from another file

我有这样的Makefile创建脚本的内容:

.PHONY cluster-run 
cluster-run:
        make $(TARGET) --just-print >> tmp_script.sh;

还有一个nn.mk:

.PHONY nn-model
include Makefile

nn-model:
    python run-nn.py 

为了便于阅读,我有两个单独的 Makefile,因为它们的内容很大,而且我还有另一个“*.mk”文件,如 nn-lstm.mknn-conv.mk

我启动如下:

make -f nn.mk cluster-run TARGET=nn-model

但是make报错:

make nn-model --just-print >> tmp_script.sh;
make[1]: *** No rule to make target `nn-model'.  Stop.
make: *** [cluster-run] Error 2

对我来说,这种行为很奇怪,因为目标 nn-model 确实存在。我该如何解决这个问题?

所以发生的事情是,当您构建 cluster-run 时,它会调用一个递归 make,它读取 Makefile,并要求它构建 $(TARGET)(其中将包括 nn-model).

注意递归 make 是一个新的 make 并且不从父 make 继承变量或规则,所以这个 make 实例不知道如何构建 nn-model 如果你想让子 make 看到这个, 那么子 make 必须包含父 make...

首先,你不应该在食谱中使用原始 make。始终使用 $(MAKE) 变量。

其次,问题是因为当你 运行 子 make 时你没有提供 -f 选项:

make nn-model --just-print >> tmp_script.sh;

因此,它读取 Makefile 而不是 nn.mk,因此没有构建目标 nn-model.

的规则

请记住,如果您 运行 像这样的子制作,它会以全新的方式开始一个全新的制作过程:子制作过程中定义的 none 目标是已知的-启动时制作。

我不知道你所说的 目标是什么意思 nn_model 确实存在 但绝对没有名为 nn_model 的文件,否则你不会明白错误。