【问题标题】:Multiple Shell command in MakefileMakefile 中的多个 Shell 命令
【发布时间】:2013-08-23 09:22:16
【问题描述】:

我正在尝试从文本文件中获取我的编译版本。我正在使用这个命令

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 的输出:

  • 对函数 shell 的未终止调用':缺少)'。停下来。

我已经测试了你的建议,但同样的错误也失败了。

谢谢。

【问题讨论】:

  • make 中的哈希 (#) 表示注释的开始。 #define 和后面的所有内容都被视为注释,因此是未终止的表达式。我将在下面更新答案。

标签: makefile


【解决方案1】:

它与管道无关。它不起作用的原因是您已将其定义为动态宏。通过使用'=',它将重新评估每个引用上的宏。您实际上是通过尝试将VERSION 变量重载为版本和文件名来创建一个递归宏。尝试使用不同的变量名并将其设为静态:

VERSION_NUMBER:=$(shell grep -w -m 1 "V1" server.h | sed $(VERSION) 's/#define V1[\t]//')

$(error VERSION_NUMBER=$(VERSION_NUMBER))

在 $(error) 运行后删除它。此外,无论如何,在这种情况下 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)

【讨论】:

    猜你喜欢
    • 2012-09-20
    • 2019-08-05
    • 2021-07-11
    • 1970-01-01
    • 2012-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多