我的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
(或用户覆盖CFLAGS
和CXXFLAGS
),如果指定了两者,则会出错。
不幸的是,它的射击没有命令目标:
$ 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中的两个整数值?
答案 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