Makefile:如何正确 sed 来编辑变量

迈克93

我正在尝试编写一个自定义 Makefile,在其中收集所有源文件以针对主文件进行编译。首先我收集他们的名字:

# other sources to compile against (without extensions, separated by spaces)
DEPENDENT_FILES = greet farewell

然后我想附加.o到每个单词。在 shell 中,我可以通过多种方式执行此操作,例如

echo '$DEPENDENT_FILES' | sed 's/\>/\.o/g' # but I know, it's UNIX dependant
# or ...
echo '$DEPENDENT_FILES' | sed 's/[^ ]*/&\.o/g'

两者都在greet.o farewell.o终端上导致,但在此make过程中失败(导致空字符串)我把它们写成

DEPENDENCIES := $(echo '$DEPENDENT_FILES' | sed 's/\>/\.o/g')
# or ...
DEPENDENCIES := $(echo '$DEPENDENT_FILES' | sed 's/[^ ]*/&\.o/g')
# but they result in
$(info DEPENDENCIES is $(DEPENDENCIES)) # "DEPENDENCIES is "

我不知道我在这里做错了什么,我怀疑这可能与 Makefile 中的回声或管道有关,但我无法弄清楚。

拜托,我更喜欢与工作 sed 和 echo 解决方案相关的答案,而不提出不同的方法:这不是我第一次在 Makefile 中遇到 echo 和管道问题,但我仍然不知道我的方法有什么问题.

来宾_7

您需要意识到它们在语法上的所有相似之处,make并且shell非常不同,必须非常谨慎地使用。更糟糕的是,make 对它的警告非常吝啬。

您在make代码中的两个地方犯了错误

## bad code 
DEPENDENCIES := $(echo '$DEPENDENT_FILES' | sed 's/\>/\.o/g')
  • 没有GNU make名为echo l, 因为这就是 make 理解它的含义的内置函数
  • 当您需要运行外部实用程序时,您需要做的是调用 gnu make 内置$(shell ...) 函数。
  • 现在,在您编写 make 代码的方式中潜伏着一个潜在的问题,那就是变量$DEPENDENT_FILESmake 会将其解析为 make 变量 $D 后跟字符串文字 EPENDENT !这是因为当没有括起来的括号或大括号只有单个字母时 make vars,其余被视为文字字符串。
  • 注意 shell vars 用 $$ 开始,除非 eval 正在运行。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章