gpt4 book ai didi

bash - makefile "strip"函数不工作

转载 作者:行者123 更新时间:2023-11-29 09:28:11 24 4
gpt4 key购买 nike

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

最佳答案

问题似乎是g++ generates with the -M option :

If there are many included files then the rule is split into several lines using ‘\’-newline

似乎 make$(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 显示 I think what you want.

关于bash - makefile "strip"函数不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23637140/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com