请教一下, Makefile 中怎么保留字符串中的引号呢?

2018-07-30 11:54:00 +08:00
 z0z

EXCLUDE_FILES=$(shell find . test *.c |grep -vE "a.c|b.c")

上面的的 EXCLUDE_FILES 是 Makefile 中的一条语句,通过打印可知它的值是复合期望的。

为了便于扩展我把它改成了下面这样

EXCLUDE_SRCS=a.c EXCLUDE_SRCS+=b.c EXCLUDE_FILES=$(shell find . test *.c | grep -vE "$(EXCLUDE_SRCS)")

这样再打印 EXCLUDE_FILES 的值发现,EXCLUDE_SRCS 对应的文件并没有被过滤掉,也就是 grep -vE 后面的那一坨没有起作用。

请教大神,我该怎么改能达到期望的效果呢?

3505 次点击
所在节点    Linux
9 条回复
z0z
2018-07-30 11:54:46 +08:00
重新编辑一下。

EXCLUDE_FILES=$(shell find . test *.c |grep -vE "a.c|b.c")

上面的的 EXCLUDE_FILES 是 Makefile 中的一条语句,通过打印可知它的值是复合期望的。

为了便于扩展我把它改成了下面这样

EXCLUDE_SRCS=a.c

EXCLUDE_SRCS+=b.c

EXCLUDE_FILES=$(shell find . test *.c | grep -vE "$(EXCLUDE_SRCS)")

这样再打印 EXCLUDE_FILES 的值发现,EXCLUDE_SRCS 对应的文件并没有被过滤掉,也就是 grep -vE 后面的那一坨没有起作用。

请教大神,我该怎么改能达到期望的效果呢?
eastlhu
2018-07-30 12:05:59 +08:00
加个转义符试试
z0z
2018-07-30 12:23:28 +08:00
EXCLUDE_FILES=$(shell find . test *.c | grep -vE \"$(EXCLUDE_SRCS)\")

这样的也试过,仍然不起作用。

单引号,双引号,$$,也都试过了。
myth
2018-07-30 14:10:26 +08:00
grep -vE "$(EXCLUDE_SRCS)"
这里$(EXCLUDE_SRCS)是以空格间隔的文件列表,而 grep 的需要的是"|"间隔的表达式

可以考虑用 Makefile 的 $(filter-out <pattern...>;,<text>;)
z0z
2018-07-30 15:48:25 +08:00
@myth 你说的这个问题是一个值得注意的地方。

对不住大家,楼主位的 find 语句参数有笔误。

但是我按照下面的测试了,仍然没有起作用:
EXCLUDE_SRCS=a.c

EXCLUDE_FILES=$(shell find test *.c | grep -vE "$(EXCLUDE_SRCS)")
z0z
2018-07-30 15:55:05 +08:00
@myth
@z0z
==,我错了,刚才测试有错误。稍后公布结果
huiyifyj
2018-07-30 16:07:29 +08:00
lz 有什么写 Makefile 的好教程么?最近正打算学,但是网上搜的都是杂七杂八的
waruqi
2018-07-30 16:53:28 +08:00
别用 makefile 啦,直接 xmake 多省事,添加并排除文件只需要:

target("test")
set_kind("binary")
add_files("src/*.c|a.c|b.c")
z0z
2018-07-30 17:55:02 +08:00
@huiyifyj 《跟我一起学 Makefile.pdf 》
@waruqi 这个是挺省事的,但是有些基本的用法需要了解掌握的,我还不熟练,得好好学学。多谢推荐,等过一段时间开始去了解 xmake

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/475286

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX