大于Makefile中的字符串比较

Dyn*_* Fu 11 makefile

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

if $(XORG_VERSION) > "7.7"
   <do some thing>
fi
Run Code Online (Sandbox Code Playgroud)

Makefile的条件部分仅提供ifeq或ifneq.

ana*_*lyg 14

我使用该sort函数按字典顺序比较值.这个想法是,排序两个值的列表,$(XORG_VERSION)7.7,然后在第一个值-如果它是7.7那么的版本相同或更高.

ifeq "7.7" "$(word 1, $(sort 7.7 $(XORG_VERSION)))"
   <do some thing>
endif
Run Code Online (Sandbox Code Playgroud)

调整7.77.8如果你需要严格大于条件.

这种方法通过避免shell脚本以及有关可用OS shell功能的伴随假设来提高可移植性.但是,如果词典排序不等于数字排序,则失败,例如比较7.77.11.

  • 我使用这个公式已有好几年了,它使我有点...他们的长度必须相同。我的情况是说“ 1048576”小于“ 2047”,这作为字符串是正确的。 (2认同)

pax*_*blo 5

您不限于使用make条件语句 - 每个命令都是一个shell命令,可能会像您需要的那样复杂(包括shell条件语句):

请考虑以下事项makefile:

dummy:
    if [ ${xyz} -gt 8 ] ; then \
        echo urk!! ${xyz} ;\
    fi
Run Code Online (Sandbox Code Playgroud)

使用时xyz=7 make --silent,没有输出.使用时xyz=9 make --silent,它会urk!! 9按预期输出.

  • `Make`没有(也可能不应该)假设有关底层shell的任何内容.例如,如果你在Windows下运行它,它可能只有`cmd.exe`,它没有`bash`那么强大.真正的问题是为什么gnu不能提供更强大的比较运算符?我的回答是"我不知道":-) (3认同)
  • 在 GNU make 系统中有两个不同的条件语境——make 文件语言中的 **make 条件**在 **parse-time** 评估——它们“控制 make 在 makefile 中实际‘看到’的内容”,“不能用于在执行时控制配方”(参见 https://www.gnu.org/software/make/manual/html_node/Conditionals.html#Conditionals)。然后是 **recipe 条件**,它们在 **recipe-execution-time** 评估并提供类似 bash 的脚本的所有功能 (2认同)