2015-07-22 122 views
0

我在我的GNU的makefile如下:比較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

你的問題是一個簡單的錯字。

您在$(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) 

這就是說,我不會打擾使用shell(這是昂貴的)。

所有你想測試一下,在這種情況下,是$(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 
+0

*「'IFEQ($(ASAN)$ (UBSAN),11)'* - 哦,這很聰明,謝謝。我鄙視Make缺乏邏輯運算符,我會盡一切努力避免嵌套if語句。 – jww