私は GNU Make Third Edition を使用したプロジェクトの管理を読んでおり、自動依存関係の生成に関するセクションで、次の sed スクリプトを見ました。
sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@;
インクルードを含むルール全体を次に示します。
include $(subst .c,.d,$(SOURCES))
%.d: %.c
$(CC) -M $(CPPFLAGS) $< > $@.$$$$; \
sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@; \
rm -f $@.$$$$
これを調べた後、なぜ g コマンドが使用されているのか疑問に思いました。そこで、すべてを新しいディレクトリにコピーし、すべてのターゲット ファイルを削除し、sed スクリプトから g コマンドを削除して、再度 make を実行しました。すべてがエラーなしでビルドされました。また、sed スクリプトで g コマンドを使用する makefile があるディレクトリとないディレクトリの 2 つのディレクトリを比較したところ、その 1 つの違いだけが表示されました。
したがって、この g コマンドが機能するまれなケースがあるかどうか疑問に思っています。
私は何が欠けていますか?
ありがとう、スティーブン
's,($ ).o[ :] ,\1.o $@ : ,g' の g は sed コマンドではないことを友人が指摘しました。sed コマンドはセミコロンで区切ります。これが sed コマンドのコンテキストでは意味をなさないのも不思議ではありません。
/g は正規表現の一部であり、最初の一致だけでなくすべての一致を検索します。
ご指摘ありがとうございます。