Makefile 如何在生成模式规则的依赖项中使用模式依赖变量

Makefile 如何在生成模式规则的依赖项中使用模式依赖变量,makefile,gnu-make,Makefile,Gnu Make,我想用模式依赖变量中的依赖项来定义GNU make模式规则。我想要的是这样的: %.exe : $(%_EXE_SOURCES) $(%_EXE_RESOURCES) $(CSC_V)$(CSC) $(CSCFLAGS) $($*_EXE_CSCFLAGS) -target:exe \ -out:$@ $($*_EXE_SOURCES) $($*_EXE_RESOURCES) 然后定义如下 FOO_EXE_SOURCES = src/Foo.cs all: Fo

我想用模式依赖变量中的依赖项来定义GNU make模式规则。我想要的是这样的:

%.exe : $(%_EXE_SOURCES) $(%_EXE_RESOURCES)
    $(CSC_V)$(CSC) $(CSCFLAGS) $($*_EXE_CSCFLAGS) -target:exe \
            -out:$@ $($*_EXE_SOURCES) $($*_EXE_RESOURCES)
然后定义如下

FOO_EXE_SOURCES = src/Foo.cs
all: Foo.exe
规则提出了建设工程;在规则主体中,
$($*\u EXE\u SOURCES)
变量扩展为
$(FOO\u EXE\u SOURCES)
,该变量扩展为
src/FOO.cs
。但是,依赖项不能正确扩展;更改src/Foo.cs不会导致重新生成Foo.exe

我怀疑这实际上不能在make中完成,但也许有人有一个类似make片段的作品?

您可以使用“二次扩展”。像这样的事情应该可以实现您所寻找的目标:

Foo_EXE_SOURCES := foo.cs bar.cs baz.cs
all: Foo.exe

.SECONDEXPANSION:
%.exe: $$($$*_EXE_SOURCES)
    $(CSC_V)$(CSC) $(CSCFLAGS) $($*_EXE_CSCFLAGS) -target:exe \
            -out:$@ $($*_EXE_SOURCES) $($*_EXE_RESOURCES)

启用二次扩展允许在prerequesites列表中使用自动变量(即在本例中为$*),否则将无法使用。

非常好。看来这正是我想要的。