我对带有辅助扩展功能的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有什么问题吗?
谢谢
答案 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
结合模式规则和目录中的文件进行第二次扩展是一项艰巨的任务。我还没有完全理解为什么您的构造无法正常工作。只是它不起作用。我完全了解后会更新帖子。
有关更多信息: