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

在Makefile中使用不同的标志编译?,makefile,Makefile,我有一个与操纵杆交互的程序。它使用条件编译来指定特定的操纵杆。我们现在只需将正确的标志硬编码到Makefile中就可以做到这一点 我想让它使用一个不同的标志,这个标志基于给Makefile的命令。例如,我现在有: .PHONY: saitek saitek: $(SOURCES) $(COMPILE) -DSAITEK .PHONY: logitech logitech: $(SOURCES) $(COMPILE) -DLOGITECH 我只希望这些命令中的一个能够运行,并且我

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

我想让它使用一个不同的标志,这个标志基于给Makefile的命令。例如,我现在有:

.PHONY: saitek
saitek: $(SOURCES)
    $(COMPILE) -DSAITEK
.PHONY: logitech
logitech: $(SOURCES)
    $(COMPILE) -DLOGITECH
我只希望这些命令中的一个能够运行,并且我希望它们都能够生成相同的可执行文件。但如果我重新运行“make”,它将再次编译程序。我想让它认识到它已经建立了这个程序


用Makefile还可以这样做吗?

我怀疑这样做的必要性。您可以调用
make
,类似于
makecflags=-DSAITEK
或者使用
autoconf
并替换正确的定义

也就是说,像这样的事情怎么样:

saitek logitech: program
.PHONY: saitek logitech

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

program: $(OBJS)
# Whatever
GNU make,所以如果您指定

$ JOYSICK=LOGITECH
在您的shell中,使用

CFLAGS+=-D$(JOYSTICK)

在您的makefile中。

如果您正在使用GNUMake,这将满足您的要求。它根据要生成的命令使用不同的标志,并且不会不必要地重新生成程序

.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)