首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在gnu-make中两次重置一个配方中的SHELL变量?

如何在gnu-make中两次重置一个配方中的SHELL变量?
EN

Stack Overflow用户
提问于 2012-07-22 19:48:10
回答 1查看 124关注 0票数 1

这是这个问题的后续: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变量?

为了说明我的目标,它将是这样的:

代码语言:javascript
复制
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来执行菜谱步骤,而不是环境变量。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-07-24 08:27:28

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

代码语言:javascript
复制
.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)

与目标相关的规则如下所示:

代码语言:javascript
复制
.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  

和主机:

代码语言:javascript
复制
.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黑客攻击。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11600025

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档