コンテキスト:私は自動依存生成(GCCを使用してhere、非再帰的、私のプロジェクトの任意のレベルから使用することができる)を構築しようとしています そのために、そうするためには出力を特定のファイルにsedコマンドにリダイレクトする方法は?
、どんなメイク呼び出しのレベル、適切にファイルを見つけることができ作るその方法
$(DIR)file.o: $(DIR)file.c $(DIR)file.h
$(DIR)file.h
、私は以下の暗黙のルールがあります。以下の形式である必要があります。
DEPFLAGS = -MT [email protected] -MP -MMD -MF $(word 2,$^).tmp
COMPILE = $(CC) $(DEPFLAGS) $(CFLAGS) $(CPPFLAGS) -c -o [email protected] $<
POSTCOMPILE = sed -E 's|([0-9a-z_.:]*/)?([0-9a-z_.:]+)|$$(DIR)\2|g' $(word 2,$^).tmp > $(word 2,$^)
%.o: %.c %.dep
$(COMPILE)
$(POSTCOMPILE)
$(RM) $(word 2,$^).tmp
touch [email protected]
sedの呼び出しが$(DIR)
問題は、依存関係ファイルは、オブジェクトファイルの後に生成されているので、それはすべての時間を再リンクするためにMakefileを引き起こすことがあることで、ファイル名の前に任意のディレクトリ部分を交換してください。そして、私は、オブジェクトファイルが最新であると考えられることを確認するためにタッチコマンドを追加しなければなりません。それはあまりエレガントではありません。 私はこの質問があります:一時ファイルを使用する代わりに、gccの出力(.tmpファイルに転送される)をsedコマンドに直接リダイレクトする方法がありますか?
他の言葉で言えば、パイプリダイレクトと同等の処理を行う方法はありますが、stdout以外のストリーム/ファイル記述子は使用していますか?
GNU sedには、名前付きファイルに置換を書き込む 's/pattern/replacement/w file'があります。あなたは 's /.*/&/w yourFile'を使うことができます。 – potong
あなたの質問に対する答えはいいえ、それを行う方法はありません。いずれにしても、コンパイラがオブジェクトファイルの書き込みを完了する前にsedコマンドがそのファイルの書き込みを完了することを100%保証する方法がないため、あなたは 'touch 'を必要とします。どれが最初に終わるかを保証する。 – MadScientist