大于Makefile中的字符串比较

时间:2010-08-09 03:30:22

标签: makefile

如何在Makefile中表达以下逻辑?

if $(XORG_VERSION) > "7.7"
   <do some thing>
fi

Conditional Parts of Makefiles仅提供ifeq或ifneq。

3 个答案:

答案 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.77.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。我希望有人觉得它有用!