Makefile シェルが sed 正規表現の行末を無視する

Makefile シェルが sed 正規表現の行末を無視する

C コードのさまざまなテスト用のフォルダーがあり、 という名前のファイルが多数含まれています*.c。私の目標は、Makefile で で終わるファイル名を検索し.c、そのファイル名のルートをターゲットに追加することです。

Makefile:

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

問題は、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を検索してください。ディストリビューションによっては、完全なドキュメントを取得するために、最初にパッケージ (または同様の名前)をインストールする必要がある場合があります。wildcardpatsubstmake-docmake

関連情報