makefile“strip”功能不起作用

bad*_*000 6 bash makefile

我想在 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)

Dig*_*uma 3

问题似乎是使用选项g++ 生成的-M

\n\n
\n

如果有许多包含的文件,则使用 \xe2\x80\x98\\\xe2\x80\x99-newline 将规则分成几行

\n
\n\n

看起来好像makes$(shell )函数删除了换行符,但\\字符保留在原处,从而有效地转义了一些额外的空格。如果您添加这样的规则:

\n\n
echo:\n    echo "$(DEP_LIST_FILTERED)"\n
Run Code Online (Sandbox Code Playgroud)\n\n

然后make echo,您应该看到一个列表,如下所示:

\n\n
\n

src.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
\n\n

所以我认为这里可能的解决方法就是简单地过滤掉字符串\\

\n\n
DEP_LIST_FILTERED1 = $(filter-out \\ , $(DEP_LIST_FILTERED))\n\necho1:\n    echo "$(DEP_LIST_FILTERED1)"\n
Run Code Online (Sandbox Code Playgroud)\n\n

然后make echo1显示我认为你想要什么。

\n