这是这个问题的后续:Can I use GNU make's SHELL variable to connect to a remote shell?
我想在一个食谱中使用两个不同的shell。一个shell在主机上,另一个在没有make的目标设备上。主机上的shell用于跟踪测试的成功和失败。目标设备上的shell用于执行测试。我已经成功地使用$(eval SHELL=)将主机shell更改为目标shell。但是,当我将$(eval 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来执行菜谱步骤,而不是环境变量。
发布于 2012-07-24 08:27:28
如果您不限于只使用一个配方,则可以按如下方式拆分规则:
.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变量使用private修饰符来避免SHELL黑客攻击。
https://stackoverflow.com/questions/11600025
复制相似问题