【发布时间】:2014-05-13 16:46:40
【问题描述】:
我想在 makefile 中定义一个变量,它应该是项目中所有文件依赖项的列表,用一个空格分隔。我这样做:
DEP_LIST = $(shell g++ -M $(SRC_FILES) $(INC_DIRS))
输出我所有的项目依赖,例如:
main.o: src/main.cpp /usr/include/stdc-predef.h /usr/include/c++/4.8/iostream /usr/include/x86_64-linux-gnu/c++/4.8/bits/c++config.h ...
我用
过滤掉xxx.o: 位
DEP_LIST_FILTERED = $(filter-out %.o:, $(DEP_LIST))
现在输出
src/main.cpp /usr/include/stdc-predef.h /usr/include/c++/4.8/iostream /usr/include/x86_64-linux-gnu/c++/4.8/bits/c++config.h ...
到目前为止看起来不错,现在我只需要使用以下方法去除双空格:
DEP_LIST_STRIPPED = $(strip $(DEP_LIST_FILTERED))
但是这没有效果,输出和之前一样。大概这与我的 shell(bash)如何处理空格有关,但我找不到任何关于它的信息。有任何想法吗?
编辑:如果它是相关的,我需要删除双空格的原因是我想以表格的形式将列表传递给 ctags
ctags $(DEP_LIST_STRIPPED) -{options}
但在当前的形式中它抱怨:
ctags: Warning: cannot open source file " /usr/include/c++/4.8/iostream" : No such file or directory
【问题讨论】:
-
您使用的是哪个版本的make?
make --version。使用 GNU make 3.81,我看到filter-out删除了额外的空格,甚至不需要strip。 -
嘿,不幸的是,如果我尝试将双空格版本传递给 ctags(这是我想要的),它会说
ctags: Warning: cannot open source file " /usr/include/c++/4.8/iostream" : No such file or directory:P -
$ make --version GNU Make 3.81 -
我认为问题不在于您的想法。除非你的 shell、你的系统或你的 make 版本有什么特别奇怪的地方,否则还有一些你没有向我们展示的东西。请剪切并粘贴调用
ctags的makefile 部分到您的问题中,并剪切并粘贴在该错误之前进行打印的输出(向我们展示ctags命令行)。在这一点上,我最好的猜测是该字符不是真正的空格:它是一些 i18n 字符,打印起来像空格,但不是 ASCII 空格、制表符或换行符。 -
@MadScientist 来自 gcc 文档 "如果包含的文件很多,则使用'\'-newline 将规则分成几行"