Makefile 检查GNU Make中重写变量的有效值

Makefile 检查GNU Make中重写变量的有效值,makefile,gnu-make,Makefile,Gnu Make,我感兴趣的是检查在命令行上被重写的变量的值是否有几个有效值之一。具体来说,我的makefile中有一部分如下所示: ifndef BUILD BUILD ::= release endif # Set flags for $(CC), based on the value of $(BUILD) CFLAGS ::= -Wall -pthread -std=c17 -I./src/include CFLAGS.debug ::= -g CFLAGS.release ::= -O3 C

我感兴趣的是检查在命令行上被重写的变量的值是否有几个有效值之一。具体来说,我的makefile中有一部分如下所示:

ifndef BUILD
    BUILD ::= release
endif

# Set flags for $(CC), based on the value of $(BUILD) 
CFLAGS ::= -Wall -pthread -std=c17 -I./src/include
CFLAGS.debug ::= -g
CFLAGS.release ::= -O3
CFLAGS ::= $(CFLAGS.$(BUILD)) $(CFLAGS)
我的目标是能够运行类似于
makebuild=debug
的东西,而不必编写单独的调试目标,也不必给我的副本添加一堆混乱


如果指定了类似于
makebuild=production
的内容,我想要的是一种类似于
$(警告无效生成选项)
的方法。除了嵌套一堆
ifneq
,还有更好/更惯用的方法吗?

好吧,类似这样的方法会奏效:

BUILD ?= release
OK_BUILDS := debug release

$(if $(filter $(BUILD),$(OK_BUILDS)),,$(warn Invalid BUILD option: $(BUILD))

我没有想过使用
$(过滤器…
!出于好奇,如果指定了无效的内容,有没有一种方法可以有条件地设置默认值?我以前没有使用过
$(if…
,所以我对它的语法规则不是100%确定,手册读起来含糊不清。在这种情况下,我会使用类似
的ifneq($(filter$(BUILD),$(OK\u BUILDS)),)
/
覆盖…
/
endif
而不是
if
函数。但就我个人而言,我不会以这种方式编写makefile。在我看来,强行纠正某人的错误是个坏主意,除非你100%确信你知道他们真正的意思。如果他们给出了错误的值,请告诉他们,并让他们纠正错误。当然,您可以增强错误消息以打印合法值(
$(确定构建)
)。我可能会让它成为一个
$(错误…
),而不是取消生成,并打印出有效的
生成
值。再次感谢您的帮助!:)