GNUMakefile中的字符串比较始终为true

时间:2015-07-07 06:46:10

标签: string makefile gnu-make

我在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

为什么字符串比较无法正常工作?

2 个答案:

答案 0 :(得分:0)

你不能混合shell条件:

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

使用GNU make函数:

$(eval PLAT := /temp)

GNU make函数将无条件执行。

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

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

答案 1 :(得分:0)

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

制作留下

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

它尽职尽责地传递给一个shell(因为它是一行)。