比较makefile中的整数?

时间:2015-07-22 00:20:55

标签: shell makefile gnu-make

我的GNU makefile中有以下内容:

# Undefined Behavior Sanitizer (Clang 3.2 and GCC 4.8 and above)
UBSAN = 0
ifeq ($(findstring ubsan,$(MAKECMDGOALS)),ubsan)
UBSAN = 1
CXXFLAGS += -fsanitize=undefined
endif # UBsan

# Address Sanitizer (Clang 3.2 and GCC 4.8 and above)
ASAN = 0
ifeq ($(findstring asan,$(MAKECMDGOALS)),asan)
ASAN = 1
CXXFLAGS += -fsanitize=address
endif # Asan

# Effectively a NOR
ifneq ($(shell echo $$($(ASAN) * $(UBSAN))),0)
$(error Asan and UBsan are mutually exclusive. Specify only one of them)
endif

我们的想法是检测make ubsan asan(或用户覆盖CFLAGSCXXFLAGS),如果指定了两者,则会出错。

不幸的是,它的射击没有命令目标:

$ make
/bin/sh: 1: 0: not found
GNUmakefile:64: *** Asan and UBsan are mutually exclusive. Specify only one of them.  Stop.

我也尝试使用相同的结果引用"0"ifneq ($(shell echo $$($(ASAN) * $(UBSAN))),"0")

如何比较makefile中的两个整数值?

1 个答案:

答案 0 :(得分:1)

你的问题很简单。

您在(命令的算术扩展中遗漏了一个) / $(shell)

你的shell命令是echo $(0 * 0),shell认为命令替换不是算术扩展,然后尝试运行0 <expansion of all files in the current directory> 0。这就是您收到/bin/sh: 1: 0: not found错误消息的原因。

添加遗失的( / ),您的问题就会消失。

ifneq ($(shell echo $$(($(ASAN) * $(UBSAN)))),0)

话虽如此,我根本不打算使用外壳(价格昂贵)。

在这种情况下,您尝试测试的只是$(ASAN)$(UBSAN)不是 1。所以请断言。

ifeq ($(ASAN)$(UBSAN),11)
$(error Asan and UBsan are mutually exclusive. Specify only one of them)
endif

如果您想更安全地手动分配其他一些值(例如make ASAN=11或其他东西),那么您可以做更多的事情:

ifeq ($(filter-out 1,$(ASAN))$(filter-out 1,$(UBSAN)),)
$(error Asan and UBsan are mutually exclusive. Specify only one of them)
endif