Linux 如何在Makefile中将目标stem传递给shell命令

Linux 如何在Makefile中将目标stem传递给shell命令,linux,makefile,gnu-make,Linux,Makefile,Gnu Make,我正在编写一个静态模式规则,为匹配模式的目标生成一个依赖项列表。依赖项是通过shell命令生成的(文件内容提供了有关依赖项的信息)。下面是显式规则的一个示例: f1.o: $(shell gendep src/f1/f1.source) ... (some compilation command here) ... 虽然这样做有效,但我不想为每个新目标重写它,因为我维护的是相同的文件结构。我对静态模式规则的尝试是这样的: %.o: $(shell gendep src/%/%.sour

我正在编写一个静态模式规则,为匹配模式的目标生成一个依赖项列表。依赖项是通过shell命令生成的(文件内容提供了有关依赖项的信息)。下面是显式规则的一个示例:

f1.o: $(shell gendep src/f1/f1.source)
    ... (some compilation command here) ...
虽然这样做有效,但我不想为每个新目标重写它,因为我维护的是相同的文件结构。我对静态模式规则的尝试是这样的:

%.o: $(shell gendep src/%/%.source)
    ...
我无法将stem(与%匹配的模式)传递给shell命令。shell命令逐字解释它并在src/%/%.source上操作,当然src/%/%.source并不存在


我怀疑有办法将stem传递给shell命令,但我似乎没有找到它。这里有专家能帮我吗?抱歉,如果这是一个新手问题(我确实是一个)。

您想做什么很困难,因为通常Make会在运行任何规则之前展开
$(shell…
指令,甚至决定必须运行哪些规则。我们可以通过一个稍微高级的Make技巧来延缓这种情况:

.SECONDEXPANSION:

%.o: $$(shell gendep src/$$*/$$*.source)
    ...

也有。

我确实试过,但不起作用。例如,当我尝试$(shell gendep src/$*/$*.source)时,我收到一个错误(由gendep抛出),它正在查找src//.source.source。不确定我是否做错了什么。@dkn37:对不起,我很匆忙地读了你的问题,我以为你指的是规则主体中的shell命令。我会修改。。。