持久性Makefile变量

时间:2011-03-01 06:44:04

标签: makefile

我想要像这样调用我的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变量的内容在整个食谱中并不持久。有什么建议吗?

2 个答案:

答案 0 :(得分:1)

OBJ 持久性的,但您还有另一个问题:

  • Makefile首先完全由make解析。因此,在这个阶段,$ OBJ仍未设置/空。因此,bin目标只获得main.o作为依赖关系,因为在此阶段所有变量都将替换为它们的值。
  • 接下来,OBJ正在使用命令行上的给定目标更新其内容。但是OBJ不再用于bin目标,因为make已经完成了构建依赖关系。 (Makefile通常不会再次解析)

诀窍是在解析之前让OBJ变量填充。一个简单的解决方案是使用:

调用Makefile
make "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 buildsystemtrunk/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。