我有一个用于 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 make
或pinfo make
并搜索wildcard
和patsubst
函数以获取更多详细信息。根据您的发行版,您可能需要先安装make-doc
软件包(或类似名称)才能获取完整make
文档。