在Makefile中使用不同的标志进行编译?

时间:2010-10-18 22:38:16

标签: makefile

我有一个程序用于与操纵杆交互。它使用条件编译来指定特定的操纵杆。我们现在只需将正确的标志硬编码到Makefile中即可。

我想这样做,所以它根据给Makefile的命令使用不同的标志。例如,我目前有这个:

.PHONY: saitek
saitek: $(SOURCES)
    $(COMPILE) -DSAITEK
.PHONY: logitech
logitech: $(SOURCES)
    $(COMPILE) -DLOGITECH

我只想运行其中一个命令,我希望它们都能生成相同的可执行文件。但如果我重新运行'make',它将再次编译程序。我希望它能够认识到它已经构建了该程序。

无论如何使用Makefile执行此操作?

3 个答案:

答案 0 :(得分:3)

如果你正在使用GNUMake,那么这就是你所要求的。它根据给Make的命令使用不同的标志,并且不会不必要地重建程序。

.PHONY: saitek logitech
saitek: JOYSTICK=SAITEK
logitech: JOYSTICK=LOGITECH

# Suppose the actual name of your executable is "program"

saitek logitech: program

program: $(SOURCES)
    $(COMPILE) -D$(JOYSTICK)

答案 1 :(得分:2)

GNU make inherits variables from its environment,所以如果你指定

$ JOYSICK=LOGITECH
在你的shell中

,然后使用

CFLAGS+=-D$(JOYSTICK)

在您的makefile中。

答案 2 :(得分:0)

我质疑这是必要的。您可以将make称为make CFLAGS=-DSAITEK或使用autoconf,并使用正确的定义替换。

那说,怎么样这样:

saitek logitech: program
.PHONY: saitek logitech

ifeq ($(MAKECMDGOALS),saitek)
CFLAGS += -DSAITEK
endif
ifeq ($(MAKECMDGOALS),logitech)
CFLAGS += -DLOGITECH
endif

program: $(OBJS)
# Whatever