如何在Makefile中表达以下逻辑?
if $(XORG_VERSION) > "7.7"
<do some thing>
fi
Conditional Parts of Makefiles仅提供ifeq或ifneq。
答案 0 :(得分:13)
我使用sort
函数按字典顺序比较值。我们的想法是,对两个值$(XORG_VERSION)
和7.7
的列表进行排序,然后取第一个值 - 如果它是7.7
,则版本相同或更大。< / p>
ifeq "7.7" "$(word 1, $(sort 7.7 $(XORG_VERSION)))"
<do some thing>
endif
如果您需要严格的大于条件,请将7.7
调整为7.8
。
此方法通过避免shell脚本以及有关可用OS shell功能的相应假设来提高可移植性。但是,如果词典排序不等于数字排序,则会失败,例如在比较7.7
和7.11
时。
答案 1 :(得分:5)
您不仅限于使用make
条件语句 - 每个命令都是一个shell命令,可能需要复杂(包括shell条件语句):
考虑以下makefile
:
dummy:
if [ ${xyz} -gt 8 ] ; then \
echo urk!! ${xyz} ;\
fi
使用xyz=7 make --silent
时,没有输出。当您使用xyz=9 make --silent
时,它会按预期输出urk!! 9
。
答案 2 :(得分: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```
我找到了解决问题的方法,并将其发布as a solution to this other question。我希望有人觉得它有用!