我们有一个项目可以构建一个应用程序,但根据某个参数使用不同的源代码。简化示例如下所示:
app1.c
int main() {
printf("1\n");
}
app2.c
int main() {
printf("2\n");
}
生成文件
ifeq ($(PARAM),true)
OBJ=app1.o
else
OBJ=app2.o
endif
all: app
app: $(OBJ)
$(CC) $< -o $@
问题:
$ make app
cc -c -o app2.o app2.c
cc app2.o -o app
$ ./app
2
$ PARAM=true make app
cc -c -o app1.o app1.c
cc app1.o -o app
$ ./app
1
$ make app # I want 2 again
make: `app' is up to date.
$ ./app
1
有没有一种理智的方法来正确重建所有内容而不删除输出?
答案 0 :(得分:1)
问题是app
依赖于不同的输入,具体取决于该变量的值。 Make不记得调用之间的变量值。您可以有效地获得具有该变量的不同值的不同makefile。
一种解决方案是无条件地构建两个应用程序:
all: app1 app2
app1: app1.o
$(CC) -o $@ $<
app2: app2.o
$(CC) -o $@ $<
然后如果你只需要建立一个:
$ make app1
建立另一个:
$ make app2
构建所有:
$ make
您可能还想在Makefile上添加依赖项,以便在更改Makefile时重建应用程序,例如:
app1: app1.o Makefile
$(CC) -o $@ $(filter-out Makefile,$^)
自动生成依赖项:
%.o: %.c Makefile
$(CC) -o $@ -c ${CPPFLAGS} ${CFLAGS} -MD -MP $<
-include $(wildcard *.d)