我正在学习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做一个伏都教,谢谢
答案 0 :(得分:5)
评论:
删除反引号。它们是不必要的; $(shell)
函数已经捕获了命令的输出。
echo / sed / uniq / sed链可以用ls / uniq替换。 ls
每行会打印一个文件名,因此不需要替换和撤消歌曲和舞蹈。
您似乎丢失了$(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)))