多用途Makefile?

时间:2012-06-29 09:12:42

标签: makefile

我有文件main.cversion1.cversion2.cheader.h

version1.cversion2.c是同一个头文件(header.h)的两种不同实现,main.c使用此头文件。

现在,我想

$ make v1
cc -c main.c
cc -c version1.c
cc -o prog main.o version1.o

$ make v2
cc -c main.c
cc -c version2.c
cc -o prog main.o version2.o

取决于我正在使用的代码版本。

我试过Conditionally appending to a variable inside a Makefile target并写了

.PHONY: v1 v2
OBJ = main.o
v1: OBJ += version1.o
v2: OBJ += version2.o
v1 v2: prog
prog: $(OBJ)
     cc -o prog $(OBJ)
%.o: %.c header.h
     cc -c $<

但这根本不起作用:

$ make v1
cc -c main.c
cc -o prog main.o version1.o
cc: version1.o: No such file or directory
make: *** [prog] Error 1

似乎make在附加内容之前评估$(OBJ) ,当它出现在依赖项列表中时,之后它出现在命令列表。

这是make中的错误吗?或者我只是做错了?我该如何正确地做到这一点?

1 个答案:

答案 0 :(得分:1)

变量(v1: OBJ += version1.o)的特定于目标的修改适用于规则的主体,而不是先决条件列表。我就是这样做的:

.PHONY: v1 v2
v1: version1.o
v2: version2.o
v1 v2: main.o
    cc -o prog $^

%.o: %.c header.h
    cc -c $<