如何在make模式规则的依赖关系中使用模式相关变量

6

我想定义一个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

这个规则可以起到构建作用。在规则的主体中,$($*_EXE_SOURCES) 变量会被扩展为 $(FOO_EXE_SOURCES),进而扩展为 src/Foo.cs。但是依赖项未能正确扩展;改变 src/Foo.cs 并不会导致 Foo.exe 重新构建。

我怀疑在 make 中无法实现这个功能,但也许有人会有一个类似 make 的片段可以替代?

1个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
9
您可以使用“二次扩展”。类似这样的内容应该可以实现您想要的效果:
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)
启用二次扩展允许在先决条件列表中使用自动变量(即在此情况下的$*),否则这是不起作用的。请注意保留HTML标记。

太棒了!这看起来正是我想要的东西。 - RAOF

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,