1

这是对这个问题的跟进:我可以使用 GNU make 的 SHELL 变量连接到远程 shell 吗?

我想在一个食谱中使用两种不同的贝壳。一个 shell 在主机上,另一个在没有 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 make 以执行配方步骤,而不是环境变量。

4

1 回答 1

1

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

.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修饰符来避免 hack。SHELL

于 2012-07-24T00:27:28.237 回答