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文件。

相關內容