技术解析

请教一下, Makefile 中怎么保留字符串中的引号呢?
0
2021-06-23 17:32:28
idczone

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 后面的那一坨没有起作用。

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


重新编辑一下。
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 后面的那一坨没有起作用。
请教大神,我该怎么改能达到期望的效果呢?

加个转义符试试

EXCLUDE_FILES=$(shell find . test *.c | grep -vE \"$(EXCLUDE_SRCS)\")
这样的也试过,仍然不起作用。
单引号,双引号,$$,也都试过了。

grep -vE "$(EXCLUDE_SRCS)"
这里$(EXCLUDE_SRCS)是以空格间隔的文件列表,而 grep 的需要的是"|"间隔的表达式
可以考虑用 Makefile 的 $(filter-out ;,;)

你说的这个问题是一个值得注意的地方。
对不住大家,楼主位的 find 语句参数有笔误。
但是我按照下面的测试了,仍然没有起作用:
EXCLUDE_SRCS=a.c
EXCLUDE_FILES=$(shell find test *.c | grep -vE "$(EXCLUDE_SRCS)")


@z0z
==,我错了,刚才测试有错误。稍后公布结果

lz 有什么写 Makefile 的好教程么?最近正打算学,但是网上搜的都是杂七杂八的

别用 makefile 啦,直接 xmake 多省事,添加并排除文件只需要:
target("test")
set_kind("binary")
add_files("src/*.c|a.c|b.c")

《跟我一起学 Makefile.pdf 》
这个是挺省事的,但是有些基本的用法需要了解掌握的,我还不熟练,得好好学学。多谢推荐,等过一段时间开始去了解 xmake

数据地带为您的网站提供全球顶级IDC资源
在线咨询
专属客服