4

makefileに変数があり、unsetターゲットaを指定し、それぞれのmakefile内で正しい値を使用するb(またはまったく使用しない)ように、または再定義します。cMY_VARIABLE

私が次のように実行make fooした場合:

export MY_VARIABLE := 'false'
foo: prep_foo dist
prep_foo:
    $(shell export MY_VARIABLE='true')
    echo ${MY_VARIABLE}
dist: a b c
a: 
    make -C a/src
b: 
    make -C b/src
c: 
    make -C c/src

私はこの出力を取得します:

export MY_VARIABLE='true'
echo 'false'
false
...

代わりにmake foo、次のmakefileを使用して実行する場合:

export MY_VARIABLE := 'false'
foo: prep_foo dist
prep_foo:
    $(shell unset MY_VARIABLE)
    echo ${MY_VARIABLE}
dist: a b c
a: 
    make -C a/src
b: 
    make -C b/src
c: 
    make -C c/src

次の出力が得られます。

make: unset: No such file or directory
echo 'false'
false
...

MY_VARIABLEターゲット(fooこの場合はなど)を指定するときに、設定を解除または再定義するにはどうすればよいですか?

編集

これが私が避けたい状況です:

dist: a b c 
foo: a_foo b_foo c_foo
a:
    make -C a/src
...
a_foo
    make -C a_foo/src

ターゲットが特定の変数に異なる値を使用するようにしたいaので、そのターゲットのmakefileでコンパイルが異なる方法で処理されます。

また、ターゲット内の変数exportや変数のようには見えません。unset例えば:

dist: a b c 
foo: a_foo b_foo c_foo
a:
    make -C a/src
...
a_foo:
    export MY_VARIABLE='true'; make -C a/src

これを行おうとすると、次のようなエラーが発生しますexport MY_VARIABLE='true'(使用しようとすると同様にunset)。

Makefile:16: *** unterminated variable reference.  Stop.

これは私がやろうとしていることを明確にするのに役立ちますか?

編集2

touchファイルを-esし、子ターゲットmakefile(ファイルの存在をチェックする)を実行しようとするターゲットを試しました。

foo: prep_foo
prep_foo:
    touch a/src/.foo
    make -C a/src

を介してこれを実行しようとするとmake foo、次のエラーが発生します。

Makefile:14: *** commands commence before first target.  Stop.

makeからステートメントを削除すると、エラーメッセージが表示されずにファイルを作成できますが、ターゲットの作成をトリガーできないprep_fooため、これは役に立たないようです。toucha

次の場合、同じcommands commence before first targetエラーメッセージが表示されます。

foo: prep_foo a
prep_foo:
    touch a/src/.foo

touch子ターゲットに状態を伝達するために使用する例はありますか?

4

2 に答える 2

1

Makefile 内のターゲット間で通信する一般的な方法は、ファイルを使用することです。1 つのターゲットにあるファイルだけtouchを、もう 1 つのターゲットにチェックインします。これはあなたの問題を解決するのに役立ちますか?

于 2012-06-13T23:54:43.427 に答える
0

makeでのすべてのシェル実行が新しいプロセスで行われることを忘れないでください。このようにレシピの環境変数をいじろうとしてもあまり意味がありません。特定の行で変更した環境は、そのシェルが終了した後、次の行が実行される前に消えてしまいます。

あなたは次のような仕事をすることができるかもしれません:

a:
    unset MY_VARIABLE; $MAKE -C a/src

また

a:
    $MAKE MY_VARIABLE=foo -C a/src
于 2012-06-13T23:14:54.323 に答える