为什么这个makefile隐式规则不起作用?

时间:2017-03-09 16:02:14

标签: makefile gnu-make

我有一个Makefile,我正在尝试制作这组特定的变量和隐式规则

pcode-LINKDEPS := pasv5-database pasv5-log pasv5-utils
%/node_modules: $(%-LINKDEPS)
    cd $*; npm install; for link in $^ ; do npm link $$link ; done
pasv5-database:
    cd libs/database; npm link

我可以移除目录pcode/node_modules并运行make -d,我可以看到它选择了模式规则%/node_modules并执行基本安装,但$^扩展为空所以链接没有发生,并且先前必需的目标pasv5-database永远不会运行。这是否意味着我无法将%放入先决条件扩展中,如果是这样,我可以采取什么方法来有效地为先决条件列表选择pcode-LINKDEPS,因此目标{ {1}}运行?

或者我是否犯了一些其他根本错误?

pasv5-database(以及pcode-LINKDEPS的其他元素)都在pasv5-database中定义。

1 个答案:

答案 0 :(得分:3)

问题是在规则与您尝试构建的目标匹配之前,$(%-LINKDEPS)已展开。而且由于你没有名为%-LINKDEPS的变量,它会扩展为空。

尝试secondary expansion

.SECONDEXPANSION:
%/node_modules: $$(%-LINKDEPS)
    ...