GNU Make 配方中是否可以有变量?
像这样的东西不起作用:
%_t.mkd : %.mkd
REV=$$(svn info $<|grep 'Last Changed Rev'|cut -f4 -d\ )
echo $${REV}
Run Code Online (Sandbox Code Playgroud)
有什么方法可以使这项工作发挥作用吗?
如您所见,我想要的是提取文件已更改的修订版,然后在完整配方中稍后使用该修订版。不幸的是,我无法使用,svn:keywords因为我需要相关文档之外的修订号。
小智 18
这是更改配方中变量的解决方案:
Run Code Online (Sandbox Code Playgroud)recipe: $(eval variablename=whatever)
use*_*686 14
这不起作用,因为该make工具为每个配方行启动一个新的 shell 进程。并且 shell 变量——即使是“导出”的环境变量——也不可能“向上”传播;一旦 shell 进程退出,它们就消失了。
传统的方法是\在 Makefile 中使用加入配方行:
foo: bar baz
line1; \
line2; \
line3
Run Code Online (Sandbox Code Playgroud)
(请注意,必须使用;or分隔命令&&,因为反斜杠也会传递给执行相同行连接的 shell。)
又见info make "Splitting Lines"并info make "Splitting Recipe Lines"在GNU制作的手册。
另一种方法是make使用.ONESHELL指令告诉始终对整个配方使用一个 shell 进程:
.ONESHELL:
foo: bar baz
line1
line2
line3
Run Code Online (Sandbox Code Playgroud)
(请注意,虽然.ONESHELLPOSIX 推荐,但并非所有 make 版本都支持它;例如,BSD make 只有一个命令行标志。不过,这应该不是问题。)
根据@user3645902提到的内容,以下是主要问题的解决方案:
recipe:
@$(eval REV=`svn info $<|grep 'Last Changed Rev'|cut -f4 -d`)
@echo $(REV)
Run Code Online (Sandbox Code Playgroud)