Makefile shell 忽略 sed regexp 行尾

Makefile shell 忽略 sed regexp 行尾

我有一个用于 C 代码的各种测试的文件夹,其中包含许多名为*.c.我的目标是让 Makefile 搜索以 结尾的任何文件名,.c并将该文件名的根添加到目标中。

Makefile:

TARGETS = $(shell ls *.c | sed "s/\.c$//g")
all: $(TARGETS)

问题是 shell 命令在 sh 中按预期工作:

$ sh -c 'ls *.c | sed "s/\.c$//g"'
hello

...虽然它失败了make

$ make
sed: 1: "s/\.c/g": unterminated substitute in regular expression
make: Nothing to be done for `all'.

我尝试转义$as \$,结果却是:

`sed: 1: "s/\.c\/g": unterminated substitute pattern`

"将双引号 ( ) 替换为单引号 ( )也是如此'

答案1

你需要逃离$。在 中make,您可以通过使用 来做到这一点$$。你的线路应该是:

TARGETS = $(shell ls *.c | sed "s/\.c$$//g")

虽然这个直接回答了问题,但 @cas 的解决方案似乎更好。

答案2

使用 GNU Make:

objects := $(patsubst %.c,%.o,$(wildcard *.c))

all : $(objects)

请参阅info makepinfo make并搜索wildcardpatsubst函数以获取更多详细信息。根据您的发行版,您可能需要先安装make-doc软件包(或类似名称)才能获取完整make文档。

相关内容