sed in makefile,用法

时间:2010-09-26 23:23:27

标签: shell sed makefile

我正在学习makefile的创建过程。

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

我仍然坚持这一点,$(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做一个伏都教,谢谢

1 个答案:

答案 0 :(得分:5)

评论:

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

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

  3. 您似乎丢失了$(dir)的结果,因为您在第三次分配中使用了$(SOURCES)而不是$(SOURCETREE)

  4. 结果:

    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)))