我有一個用於 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
文件。