我正在尝试从文本文件中获取我的编译版本。我正在使用此命令
grep -w -m 1 "V1" server.h | sed $(VERSION) 's/#define V1[\t]//'
它工作正常,但现在我正在尝试使用shell从我的Makefile执行它:
VERSION=$(shell grep -w -m 1 "V1" server.h | sed $(VERSION) 's/#define V1[\t]//')
但由于|
,我无法使其有效。如果我只放一个命令,例如grep运行正常,还有另一种方法来指示|
连接表达式吗?或者我怎么能这样做?
修改
嗨,谢谢你的回答,
阅读你的回答我意识到复制/粘贴背叛了我jeje,这是我正在使用的正确表达:
VERSION:= $(shell grep -w -m 1“V2”server.h | sed's / #define V2 [\ t] //')
这是Makefile的输出:
我已经测试了您的建议,但它也失败并出现相同的错误。
感谢。
答案 0 :(得分:5)
它与管道无关。它无法工作的原因是因为您已将其定义为动态宏。通过使用'=',它将重新评估每个引用上的宏。您实际上通过尝试将VERSION
变量作为版本和文件名重载来创建递归宏。尝试使用不同的变量名称并将其设置为静态:
VERSION_NUMBER:=$(shell grep -w -m 1 "V1" server.h | sed $(VERSION) 's/#define V1[\t]//')
$(error VERSION_NUMBER=$(VERSION_NUMBER))
一旦有了工作,就删除$(错误)。此外,无论如何,awk在这种情况下可能更有效:
VERSION_NUMBER:=$(shell awk '/\<V1\>/ { print gensub(/^\#define V1[[:space:]]+/, "", ""); exit }' $(VERSION))
你也有哈希问题(对你来说是美国人)#
。它将表达式作为注释终止。试试这个:
VERSION:=$(shell grep -w -m 1 "V2" server.h | sed 's/\#define V2[\t]//')
或者这个:
VERSION:=$(shell awk '/\<V1\>/ { print gensub(/^\#define V1[[:space:]]+/, "", ""); exit }' server.h)
make中有很多字符会出现此问题。美元是最容易逃脱的问题。我见过这样的表达式:
V:=$(foreach f,$(list),$(eval $(shell create_rule $$$$(f))))
有时最好编写一个shell脚本并调用它:
script.sh:
#!/bin/sh
awk '/\<V1\>/ { print gensub(/^#define V1[[:space:]]+/, "", ""); exit }' "$@"
生成文件:
VERSION=$(shell script.sh server.h)