我正在尝试在Makefile中执行此操作:
value = 2.0
if ${greaterthan ${value}, 1.50}
-> execute a rule
elseif ${lessthan ${value}, 0.50}
-> execute a rule
endif
这似乎是一件非常普通的事情。这样做的最佳方式是什么?
答案 0 :(得分:16)
试试这个
在此示例中,检查VER是否大于4
ifeq ($(shell test $(VER) -gt 4; echo $$?),0)
IFLAGS += -I$(TOPDIR)/include
LIBS += -L$(TOPDIR)/libs -lpcap
endif
答案 1 :(得分:10)
与this question类似,但基本上你可以在Makefile中使用shell命令。所以以下是完全合法的:
foo:
if [ ${value} -gt 2 ] ; then \
#Do stuff;\
fi
编辑小免责声明:IIRC,bash
不了解浮点运算。它可以将它们解释为 strings ,但它可能会让事情变得有些奇怪。请务必考虑到这一点。
答案 2 :(得分:3)
我首选的方法是:
value = 2.0
ifeq ($(shell expr $(value) \>= 1.5), 1)
# execute a rule
else ifeq ($(shell expr $(value) \<= 0.5), 1)
# execute a rule
endif
答案 3 :(得分:0)
如其他答案中所述,使用shell命令应该足以满足大多数用例:
if [ 1 -gt 0 ]; then \
#do something \
fi
但是,如果您和我一样想要使用大于比较来 那么 设置make
变量通过make
&#39; $(eval)
命令,然后你会发现尝试使用其他答案的模型:
if [ 1 -gt 0 ]; then \
$(eval FOO := value) \
fi
引发错误:
if [ 1 -gt 0 ]; then fi;
/bin/bash: -c: line 0: syntax error near unexpected token `fi'
/bin/bash: -c: line 0: `if [ 1 -gt 0 ]; then fi;'
make: *** [clean] Error 2```
原因是make
's $(eval)
expression returns the empty string.生成的bash代码格式不正确。**
我提出了以下解决方案(在尝试了许多不同的方法之后!)。
$(if $(shell [ $(FOO) -ge 1 ] && echo "OK"), \
$(eval BAR := true), \
$(eval BAR := false))
在执行算术比较(echo "OK"
部分)后需要打印出一个字符串,因为make
&#39; $(if)
运算符基于空字符串逻辑:
$(如果是条件,那么部分[,else-part])
if函数在函数上下文中提供对条件扩展的支持(与GNU make makefile条件如ifeq相反(参见条件语法)。
第一个参数condition首先将所有前导和尾随空格剥离,然后展开。如果它扩展为任何非空字符串,则认为该条件为真。如果它扩展为空字符串,则该条件被视为false。
希望这有帮助!
** 注意:最初,我认为通过添加对表达式不做任何操作的bash命令(例如true
)可以轻松解决该问题:
if [ $(VALUE) -ge 1 ]; then \
true; $(eval BAR := GreaterOrEqualThan1) \
else \
true; $(eval BAR := LowerThan1) \
fi
结果证明是一个糟糕的主意。我仍然无法弄清楚原因,但else
分支始终执行,与比较结果无关。
我想我应该为这个案子提出一个问题。