1

これは、この質問のフォローアップです。GNUmakeのSHELL変数を使用してリモートシェルに接続できますか?

1つのレシピで2つの異なるシェルを使用したいと思います。1つのシェルはホストマシン上にあり、もう1つはmakeを持たないターゲットデバイス上にあります。ホストマシンのシェルは、テストの成功と失敗を追跡するために使用されます。ターゲットデバイスのシェルは、テストの実行に使用されます。$(eval SHELL =)を使用して、ホストシェルからターゲットシェルに変更することに成功しました。ただし、レシピに$(eval SHELL =)を追加すると、SHELLは変更されないように見えます。レシピが実行される前に2つのeval関数が評価されると想定しているため、2番目の展開は最初の関数をキャンセルします。これらのeval関数を実行時に拡張する方法、または1つのレシピでSHELL変数を2回変更する方法はありますか?

私が目指していることを説明するために、次のようになります。

test: test_dependencies  
    touch $host_files_for_tracking  
    SHELL = target_shell  
    $(program_to_test) $(params) -o result  
    cmp result gold  
    SHELL = host_shell  
    rm $host_files_for_tracking

ありがとう。

注:SHELLについて話しているときは、環境変数ではなく、レシピステップを実行するためにどのシェルmakeが呼び出すかを決定するmake-internal変数を指します。

4

1 に答える 1

1

単一のレシピのみを使用する必要がない場合は、次のようにルールを分割できます。

.PHONY: test test_dependencies

test : test_target test_host
test_host : test_target # to enforce the order
test_target test_host : test_dependencies

shell_orig := $(SHELL)

ターゲット関連のルールは次のようになります。

.PHONY: test_target test_target_touch

test_target: test_target_touch
test_target_touch: SHELL = $(shell_orig)
    touch $host_files_for_tracking  

test_target: SHELL = target_shell
    $(program_to_test) $(params) -o result  

そしてホスト:

.PHONY: test_host test_host_cmp

test_host: test_host_cmp
test_host_cmp: SHELL = $(shell_orig)
    cmp result gold  

test_host: SHELL = host_shell
    rm $host_files_for_tracking

最新のGNUMake3.82を使用する場合、ターゲット固有の変数に修飾子をshell_orig使用することでハッキングを回避できます。privateSHELL

于 2012-07-24T00:27:28.237 に答える