2012-07-22 75 views
1

這是關於這個問題的後續處理:Can I use GNU make's SHELL variable to connect to a remote shell?如何在gnu-make的配方中重置SHELL變量兩次?

我想在一個配方中使用兩個不同的殼。一個外殼在主機上,另一個在沒有製造的目標設備上。 主機上的外殼用於跟蹤測試的成功和失敗。 目標設備上的外殼用於執行測試。 我已經成功使用$(eval SHELL =)從主機shell更改爲目標shell。但是,當我在配方中添加$(eval SHELL =)時,SHELL似乎永遠不會改變。我假設在配方運行之前評估兩個eval函數,所以第二個擴展取消了第一個擴展。 有沒有辦法讓這些eval函數在運行時間內擴展,或者在單一配方中另外更改SHELL變量兩次?

爲了說明什麼,我瞄準,這將是這樣的:

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-internal變量,它決定了哪個shell爲了執行配方步驟而調用,而不是環境變量。

.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 

和主機

回答

1

如果你不綁定到只使用一個單一的配方,可以按如下方式劃分規則:

.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 

在使用最新的GNU讓3.82的情況下,shell_orig黑客可避免通過使用private修飾符編輯目標專用SHELL變量。

+0

嗨Eldar, 你的建議看起來很有趣。我一定會嘗試一下! – nitzanms 2012-07-24 12:04:04