【问题标题】:String comparision in GNUMakefile is always trueGNUMakefile 中的字符串比较总是正确的
【发布时间】:2015-07-07 06:46:09
【问题描述】:

我在 GNUMakefile 中有一个逻辑条件,我在其中比较字符串。无论我要比较的变量的值如何,它总是落入 if 分支。

myRecipe:
    $(eval PLAT := /tmp) \
    if [ $(SYS_NAME) = linux-x86 ]; then \
        $(eval PLAT := /temp) \
        echo $(PLAT); \
    fi

如果 $(SYS_NAME) 是 linux-x86 它执行为:

\
        if [ linux-x86 = linux-x86 ]; then \
             \
            echo /temp; \
    fi        
/temp

如果 $(SYS_NAME) 是 aix61,则执行如下:

\
    if [ aix61 = linux-x86 ]; then \
             \
            echo /temp; \
    fi

为什么字符串比较不能正常工作?

【问题讨论】:

    标签: string makefile gnu-make


    【解决方案1】:

    您不能混合使用 shell 条件:

    if [ $(SYS_NAME) = linux-x86 ]; then
    

    使用 GNU make 函数:

    $(eval PLAT := /temp)
    

    GNU make 函数将无条件执行。

    您应该改用 GNU make 条件 ifeq 等(可能使用 $(shell))。

    另外,请确保不要将 make 变量 ${FOO} 与 shell 变量 $${FOO} 混淆

    【讨论】:

      【解决方案2】:

      make 决定执行您的配方时,它会一次性扩展整个配方,然后逐行执行结果中的每一行,每行都在单独的 shell 中。

      因此,在您的示例中,make 扩展了

      $(eval PLAT := /tmp) \
      if [ $(SYS_NAME) = linux-x86 ]; then \
          $(eval PLAT := /temp) \
          echo $(PLAT); \
      fi
      

      痛苦的细节:

      • $(eval PLAT := /tmp) 成为空字符串。作为扩展的副作用,PLAT make 变量变为 /tmp
      • $(SYS_NAME) 变成 linux(比如说)
      • $(eval PLAT := /tmp) 为空,PLAT 变为 /temp

      Make 剩下

      if [ linux = linux-x86 ]; then \
          echo /temp; \
      fi
      

      它尽职尽责地将其传递给单个外壳(因为它是单行)。

      【讨论】:

        猜你喜欢
        • 2021-11-28
        • 2023-03-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-03
        相关资源
        最近更新 更多