Testing 如何在gnu make中的配方中重置SHELL变量两次?

Testing 如何在gnu make中的配方中重置SHELL变量两次?,testing,makefile,automated-tests,gnu-make,Testing,Makefile,Automated Tests,Gnu Make,这是对这一问题的后续行动: 我想在一个食谱中使用两种不同的贝壳。一个外壳位于主机上,另一个位于没有make的目标设备上。 主机上的shell用于跟踪测试的成功和失败。 目标设备上的外壳用于执行测试。 我已成功地使用$(eval SHELL=)将主机SHELL更改为目标SHELL。然而,当我向配方中添加$(eval SHELL=)时,SHELL似乎从未改变。我假设这两个eval函数是在配方运行之前计算的,所以第二个展开将取消第一个展开。 有没有办法让这些eval函数在运行时扩展,或者在一个配方中更

这是对这一问题的后续行动:

我想在一个食谱中使用两种不同的贝壳。一个外壳位于主机上,另一个位于没有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内部变量,它决定了SHELL make调用哪个来执行配方步骤,而不是环境变量。

如果您不一定只使用一个配方,您可以按如下方式拆分规则:

.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

如果使用最新的GNU Make 3.82,
shell_orig
hack可以通过对特定于目标的
shell
变量使用
private
修饰符来避免。

如果您不一定只使用单一配方,您可以按如下方式拆分规则:

.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

如果使用最新的GNU Make 3.82,
shell_orig
hack可以通过对特定于目标的
shell
变量使用
private
修饰符来避免。

Hi Eldar,您的建议看起来很有趣。我一定会试试的!嗨,艾尔达,你的建议看起来很有趣。我一定会试试的!