3 回答
![?](http://img1.sycdn.imooc.com/5458478b0001f01502200220-100-100.jpg)
TA贡献1804条经验 获得超2个赞
在您的示例中,TMP只要评估了规则,out.tar便会设置变量(并创建临时目录)。为了仅在out.tar实际触发时创建目录,您需要将目录创建移至以下步骤:
out.tar :
$(eval TMP := $(shell mktemp -d))
@echo hi $(TMP)/hi.txt
tar -C $(TMP) cf $@ .
rm -rf $(TMP)
该EVAL,如果它已经手动键入到makefile文件函数计算的字符串。在这种情况下,它将TMP变量设置为shell函数调用的结果。
编辑(回应评论):
要创建唯一变量,您可以执行以下操作:
out.tar :
$(eval $@_TMP := $(shell mktemp -d))
@echo hi $($@_TMP)/hi.txt
tar -C $($@_TMP) cf $@ .
rm -rf $($@_TMP)
这会将目标名称(在本例中为out.tar)放在变量之前,从而产生一个名称为的变量out.tar_TMP。希望这足以防止冲突。
![?](http://img1.sycdn.imooc.com/54584c910001b8d902200220-100-100.jpg)
TA贡献1785条经验 获得超4个赞
另一种可能性是在规则触发时使用单独的行来设置Make变量。
例如,这是带有两个规则的makefile。如果规则触发,它将创建一个临时目录并将TMP设置为该临时目录名称。
PHONY = ruleA ruleB display
all: ruleA
ruleA: TMP = $(shell mktemp -d testruleA_XXXX)
ruleA: display
ruleB: TMP = $(shell mktemp -d testruleB_XXXX)
ruleB: display
display:
echo ${TMP}
运行代码会产生预期的结果:
$ ls
Makefile
$ make ruleB
echo testruleB_Y4Ow
testruleB_Y4Ow
$ ls
Makefile testruleB_Y4Ow
没有找到匹配的内容?试试慕课网站内搜索吧
- 3 回答
- 0 关注
- 568 浏览
添加回答
举报