makefile“strip”功能不起作用

时间:2014-05-13 16:46:40

标签: bash makefile

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

1 个答案:

答案 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显示我认为你想要的东西。