我想在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
答案 0 :(得分:3)
问题似乎是g++
generates with the -M
option:
如果包含许多文件,则使用'\' - 换行符
将规则拆分为多行
似乎make
s $(shell )
函数删除了换行符,但\
字符保留在原位,从而有效地转义了一些额外的空格。如果您添加如下规则:
echo:
echo "$(DEP_LIST_FILTERED)"
然后make echo
,您应该会看到一个列表,如下所示:
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 ...
所以我认为这里可能的解决方法只是过滤掉\
字符串:
DEP_LIST_FILTERED1 = $(filter-out \ , $(DEP_LIST_FILTERED))
echo1:
echo "$(DEP_LIST_FILTERED1)"
然后make echo1
显示我认为你想要的东西。