有关GNU使用二次扩展使内置函数替换的问题

时间:2019-11-05 09:46:03

标签: makefile gnu-make

我对带有辅助扩展功能的GNU make有一些疑问。

这是我的项目结构(例如)

.
├── build
├── Makefile
└── src
    └── a.c

这是我的启用二级扩展的Makefile

.SECONDEXPANSION:

%.o: $$(subst build,src,%.c)
        @echo $^

我输入make build/a.o,GNU抱怨:

make: *** No rule to make target `build/a.o'.  Stop.

貌似make找不到先决条件,所以它停止了制作。

为了进行进一步的调试,我在a.c目录中添加了build并重新键入make build/a.o,GNU将这些内容输出

build/a.c

输出很奇怪,因为我希望输出将是src/a.c而不是build/a.c

似乎内置的文本函数subst不能用于辅助扩展。

有人知道我的Makefile有什么问题吗?

谢谢

2 个答案:

答案 0 :(得分:1)

在执行.SECONDEXPANSION时,如果要操纵先决条件,即,您将需要使用$$*而不是%

$ cat Makefile
.SECONDEXPANSION:

%.o: $$(subst /build,/src,$$(@D))/$$*.c
        @echo Making $@ from $<

输出:

$ make -r OtherDirectory/build/foo.o SomeOtherDirectory/build/bar.o
Making OtherDirectory/build/foo.o from OtherDirectory/src/foo.c
Making SomeOtherDirectory/build/bar.o from SomeOtherDirectory/src/bar.c

答案 1 :(得分:0)

这是您要实现的目标吗?

build/%.o: src/%.c
    @echo $^

观察:

$ make build/a.o
src/a.c

结合模式规则和目录中的文件进行第二次扩展是一项艰巨的任务。我还没有完全理解为什么您的构造无法正常工作。只是它不起作用。我完全了解后会更新帖子。

有关更多信息: