我想在 makefile 中定义一个变量,它应该是项目中所有文件依赖项的列表,用一个空格分隔。我这样做是:
DEP_LIST = $(shell g++ -M $(SRC_FILES) $(INC_DIRS))
Run Code Online (Sandbox Code Playgroud)
它输出我的所有项目依赖项,例如:
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 ...
Run Code Online (Sandbox Code Playgroud)
我过滤掉这些xxx.o:位
DEP_LIST_FILTERED = $(filter-out %.o:, $(DEP_LIST))
Run Code Online (Sandbox Code Playgroud)
现在输出
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 ...
Run Code Online (Sandbox Code Playgroud)
到目前为止看起来不错,现在我只需要使用以下方法去除双空格:
DEP_LIST_STRIPPED = $(strip $(DEP_LIST_FILTERED))
Run Code Online (Sandbox Code Playgroud)
但这没有任何效果,输出与之前的相同。大概这与我的 shell (bash) 处理空格的方式有关,但我找不到任何有关它的信息。有任何想法吗?
编辑:如果相关,我需要删除双空格的原因是我想将列表传递给表单中的 ctags
ctags $(DEP_LIST_STRIPPED) -{options}
Run Code Online (Sandbox Code Playgroud)
但在目前的形式中,它抱怨:
ctags: Warning: cannot open source file " /usr/include/c++/4.8/iostream" : No such file or directory
Run Code Online (Sandbox Code Playgroud)
\n\n\n如果有许多包含的文件,则使用 \xe2\x80\x98\\\xe2\x80\x99-newline 将规则分成几行
\n
看起来好像makes$(shell )函数删除了换行符,但\\字符保留在原处,从而有效地转义了一些额外的空格。如果您添加这样的规则:
echo:\n echo "$(DEP_LIST_FILTERED)"\nRun Code Online (Sandbox Code Playgroud)\n\n然后make echo,您应该看到一个列表,如下所示:
\n\n\nsrc.c /usr/include/c++/4.6/iostream \\ /usr/include/c++/4.6/x86_64-linux-gnu/./bits/c++config.h \\ /usr/include/c++/4.6 /x86_64-linux-gnu/./bits/os_defines.h ...
\n
所以我认为这里可能的解决方法就是简单地过滤掉字符串\\:
DEP_LIST_FILTERED1 = $(filter-out \\ , $(DEP_LIST_FILTERED))\n\necho1:\n echo "$(DEP_LIST_FILTERED1)"\nRun Code Online (Sandbox Code Playgroud)\n\n然后make echo1显示我认为你想要什么。