Testing 如何在gnu make中的配方中重置SHELL变量两次?
这是对这一问题的后续行动: 我想在一个食谱中使用两种不同的贝壳。一个外壳位于主机上,另一个位于没有make的目标设备上。 主机上的shell用于跟踪测试的成功和失败。 目标设备上的外壳用于执行测试。 我已成功地使用$(eval SHELL=)将主机SHELL更改为目标SHELL。然而,当我向配方中添加$(eval SHELL=)时,SHELL似乎从未改变。我假设这两个eval函数是在配方运行之前计算的,所以第二个展开将取消第一个展开。 有没有办法让这些eval函数在运行时扩展,或者在一个配方中更改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函数在运行时扩展,或者在一个配方中更
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,您的建议看起来很有趣。我一定会试试的!嗨,艾尔达,你的建议看起来很有趣。我一定会试试的!