我在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
为什么字符串比较无法正常工作?
答案 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(因为它是一行)。