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' と表示されます。表示されます。

2 番目の 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(まだ値がないことに注意してください)、コマンドをシェルに渡します。シェルは変数を展開し、forループを実行してテストを終了します。

        if  [   CONFIG_MTS_PTHREADS  ==  y   ]; then 

これは明らかに失敗する必要があります。拡張するには遅すぎCONFIG_MTS_PTHREADSます。シェルは、それが値を持つ変数であることを知りません。Make は知っていましたが、Make は既にコマンドをシェルに渡しています。

value1 つの解決策は、シェルに渡す前に Make が変数を展開するように、関数を使用することです。

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