Makefile依赖性取决于参数

时间:2015-03-20 09:13:41

标签: makefile

我们有一个项目可以构建一个应用程序,但根据某个参数使用不同的源代码。简化示例如下所示:

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

有没有一种理智的方法来正确重建所有内容而不删除输出?

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)