Makefile将循环变量替换为函数

时间:2013-03-27 23:43:01

标签: shell makefile gnu-make

我不确定最好的方法是什么,这方面的一些指示会有所帮助

代码:

#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.

1 个答案:

答案 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