2016-12-25 9 views
0

コンテキスト:私は自動依存生成(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以外のストリーム/ファイル記述子は使用していますか?

+0

GNU sedには、名前付きファイルに置換を書き込む 's/pattern/replacement/w file'があります。あなたは 's /.*/&/w yourFile'を使うことができます。 – potong

+0

あなたの質問に対する答えはいいえ、それを行う方法はありません。いずれにしても、コンパイラがオブジェクトファイルの書き込みを完了する前にsedコマンドがそのファイルの書き込みを完了することを100%保証する方法がないため、あなたは 'touch 'を必要とします。どれが最初に終わるかを保証する。 – MadScientist

答えて

0

本格的なLinux環境であれば、実際には.tmpファイルの作成をスキップして、依存関係をsedに直接パイプすることができます。

# This is needed, because the default shell does not support 
# process substitution 
SHELL = /bin/bash 

SED_COMMAND = sed -E 's|([0-9a-z_.:]*/)?([0-9a-z_.:]+)|$$(DIR)\2|g' > $(word 2,$^) 
DEPFLAGS = -MT [email protected] -MP -MMD -MF >($(SED_COMMAND)) 
COMPILE = $(CC) $(DEPFLAGS) $(CFLAGS) $(CPPFLAGS) -c -o [email protected] $< 

%.o: %.c %.dep 
     $(COMPILE) 
     touch [email protected] 

しかし、これはまだ終わりでtouchコマンドを必要とし、上記正しく@MadScientistによってコメントに言及した理由:

のsedコマンドその100%確認する方法はありませんコンパイラがオブジェクトファイルの書き込みを完了する前にそのファイルの書き込みを終了します。これらは並列に実行されているため、どちらが最初に終了するかを保証することはできません。

+0

Thxs、それはまさに私が探していたものでした(私はまだファイルに触れる必要があるという事実にもかかわらず)。それはLinuxやBash特有のものですか? (私の学校はMacを使用しているので、私はLinuxとMacOSで働いています)。 – VannTen

+0

プロセス置換は、いくつかの環境でのみ利用可能なbash固有の構造です:デスクトップLinuxとMacOSがその中にあります。 – Dario

関連する問題