gpt4 book ai didi

shell - makefile 中的 sed,用法

转载 作者:行者123 更新时间:2023-12-01 13:04:52 31 4
gpt4 key购买 nike

我正在学习创建 makefile。

当前目标是扫描 $(SOURCEDIR) 寻找 .c 文件并创建(根据 .c 文件路径格式为 /path/file.c) 一个不错的 $(VPATH) 所以我不需要使用递归 makefile(也就是 a.. 中的痛苦)。

Atm 我坚持这个,其中 $(SOURCETREE)$(ECHO) 上将是空的

SOURCES := $(shell find $(SOURCEDIR) -name '*.c')
SOURCETREE := $(dir $(SOURCES))
SOURCETREE := $(shell $(ECHO) $(SOURCETREE) | $(SED) -e "s/[[:space:]]/\n/g" | uniq | $(SED) -e "s/\n/[[:space:]]/g");

也许我只是不明白这一点(又迟到了:/)

感谢您的帮助。

注意:在 bash shell 中,它在我的 linux 工作箱上完美运行(我相应地替换了变量)注意:我不是 sed 专家,所以如果你对 sed 做了巫术,请解释一下,谢谢

最佳答案

评论:

  1. 移除反引号。它们是不必要的; $(shell) 函数已经捕获了命令的输出。

  2. echo/sed/uniq/sed 链可以用 ls/uniq 代替。 ls 将每行打印一个文件名,因此不需要替换和撤消歌舞。

  3. 看起来您丢失了 $(dir) 的结果,因为您使用的是 $(SOURCES) 而不是 $(SOURCETREE) 在第三个作业中。

结果:

SOURCES := $(shell find $(SOURCEDIR) -name '*.c')
SOURCETREE := $(dir $(SOURCES))
SOURCETREE := $(shell ls $(SOURCETREE) | uniq);

实际上,即使是这种缩短的 shell 调用也是不必要的。 $(sort) function将对名称列表进行排序并删除重复项。来自 make 的文档:“顺便说一下,由于 sort 删除了重复的单词,因此即使您不关心排序顺序也可以将其用于此目的。”

SOURCES := $(shell find $(SOURCEDIR) -name '*.c')
SOURCETREE := $(sort $(dir $(SOURCES)))

关于shell - makefile 中的 sed,用法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3800257/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com