我不确定最好的方法是什么,这方面的一些指示会有所帮助
#Else where in different file and included in this makefile i have
LIBRARY_LIST := CONFIG_MTS_PTHREADS
CONFIG_MTS_PTHREADS := y
collect-compilation:
if [ $(strip $(CONFIG_MTS_PTHREADS)) == y ]; then \
echo "ok"; \
fi;
for compile in $(LIBRARY_LIST) ; do \
if [ $(strip $$compile) == y ]; then \
echo "ok"; \
fi; \
done
所以从上面的代码片段开始,'IF'循环的顶部工作正常,我看到'OK'。 显示。
现在对于第二个for循环,我有一些问题将$$ compile替换为'IF'。最终我希望$$编译被CONFIG_MTS_PTHREADS取代,表达式应该评估为y == y并显示'OK'但对我而言。
make -C ./Dev2.0.1/OSX
if [ y == y ]; then \
echo "ok"; \
fi;
ok <----- fine and expected
for compile in CONFIG_MTS_PTHREADS ; do \
if [ $compile == y ]; then \
echo "ok"; \
fi; \
done <------ Here it skips the then part and proceeds further, i expect 'OK' after this though.
答案 0 :(得分:1)
麻烦的是你正在混合Make-expansion和shell扩展。
我们从这个命令开始:
for compile in $(LIBRARY_LIST) ; do \
if [ $(strip $$compile) == y ]; then \
echo "ok"; \
fi; \
done
Make扩展变量:
for compile in CONFIG_MTS_PTHREADS ; do \
if [ $compile == y ]; then \
echo "ok"; \
fi; \
done
(注意compile
还没有值)并将命令传递给shell,它会扩展变量,运行for
循环并结束测试:
if [ CONFIG_MTS_PTHREADS == y ]; then
显然必须失败。展开CONFIG_MTS_PTHREADS
为时已晚; shell不知道它是带值的变量。知道了,但是Make已经把命令交给了shell。
一种解决方案是使用value
函数,以便Make在将变量传递给shell之前展开变量:
for compile in $(value $(LIBRARY_LIST)) ; do \
if [ $(strip $$compile) == y ]; then \
echo "ok"; \
fi; \
done