2012-07-22 55 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