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