我想要像这样调用我的Makefile:
make x11 oss bin
应该导致编译文件:main.c x11.c oss.c
并将它们链接到一个可执行文件bin
。
调用它的另一种方法是:
make x11 alsa bin
应使用main.c x11.c alsa.c
这是我的Makefile:
bin: $(OBJ) main.o
$(CC) $(LDFLAGS) $(OBJ) main.o $(LDLIBS)
x11:
set OBJ += bsd.o
oss:
set OBJ += oss.o
alsa:
set OBJ += alsa.o
.c.o:
$(CC) $(CFLAGS) -c $<
但似乎OBJ变量的内容在整个食谱中并不持久。有什么建议吗?
答案 0 :(得分:1)
OBJ 是持久性的,但您还有另一个问题:
main.o
作为依赖关系,因为在此阶段所有变量都将替换为它们的值。诀窍是在解析之前让OBJ变量填充。一个简单的解决方案是使用:
调用Makefilemake "OBJ=x11 oss" bin
并稍微修改Makefile以添加.o
- 部分(或者只是将它们添加到make命令中):
bin: $(patsubst %,%.o,$(OBJ)) main.o
$(CC) $(LDFLAGS) $(OBJ) main.o $(LDLIBS)
.c.o:
$(CC) $(CFLAGS) -c $<
注意:我说'Makefile通常不会被第二次解析'。 可以递归地多次使用Makefile。这非常复杂,99%的病例可能都不需要。这种“滥用”的一个例子是OpenWRT buildsystem。 trunk/Makefile是Makefile的一个例子,它自己被多次调用。
答案 1 :(得分:0)
这有点像黑客。
将它添加到Makefile的顶部:
OBJ := $(filter-out bin,${MAKECMDGOALS})
现在,当您键入make x11 oss bin
时,请解析此:
OBJ := x11 oss
并且对于make x11 alsa bin
,它会看到
OBJ := x11 alsa
您可能必须删除 x11 et的shell命令。人。因为set OBJ += bsd.o
不是有效的shell。