4

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

4

1 回答 1

8

您可以使用“二次扩展”。这样的事情应该完成你正在寻找的东西:

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 列表中使用自动变量(即$*在这种情况下),否则这是无法工作的。

于 2009-12-07T03:13:00.073 回答