0

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

代码:

#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”时遇到了一些问题。最终我希望 $$compile 被 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.
4

1 回答 1

1

问题是你混合了 Make-expansion 和 shell-expansion。

我们从这个命令开始:

    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,shell 扩展变量,运行for循环并结束测试:

        if  [   CONFIG_MTS_PTHREADS  ==  y   ]; then 

这显然必须失败。扩张为时已晚CONFIG_MTS_PTHREADS;shell 不知道它是一个有值的变量。Make知道,但是Make已经将命令交给了shell。

一种解决方案是使用该value函数,以便 Make 在将变量传递给 shell 之前对其进行扩展:

    for compile in $(value $(LIBRARY_LIST))  ;   do  \
        if  [   $(strip $$compile)  ==  y   ]; then \
            echo "ok";  \
        fi; \
    done
于 2013-03-28T00:40:06.733 回答