2011-03-05 14 views
1

主なターゲットをビルドする前に、生成されたC#ファイルを作成するためにRubyスクリプトで処理する必要のあるXMLソースファイルがあります。スクリプトの起動コストは各ファイルを処理する時間よりもはるかに長いため、通常はmakeファイルで行われるように、1つずつ処理することは非常に非効率です。私がしたいことは、それらをすべてまとめて、メインターゲットを更新する直前に実行するスクリプトのリストとして渡すことです。GNU makeで古い依存関係のリストを収集するにはどうすればよいですか?

私が今持っていることのようなものです:処理されたファイルは、.Sの接尾辞を持っているとの接尾辞を持つファイルを生成するので、もし

_generated_/%.xml.cs : %.cs 
    #execute ruby script to generate .cs file 

out.exe : a.cs b.cs _generated_/e.xml.cs .... 
    #compile .cs files 

私はこのためにはevalを使用してのアイデアに出くわしましたスクリプトによって処理されたとき.T私の考えでは、これを行うことでした。

%.xml : _generated_/%.xml.cs   
    $(eval SOURCE_FILES += $<) 

シェルコマンドは(エコーが行います)evalの後がない限りしかし、このルールがトリガされません - 私はmakeがその単に知っているからだと思います関数を呼び出すとファイルが生成されない可能性があります。私が持っていたもう一つのアイデアは、代わりにファイルのリストを一時ファイルに集めることでした。

.INTERMEDIATE source_list.txt 

    %.xml : _generated_/%.xml.cs   
     echo $< >> source_list.txt 

これらはおそらく両方で動作しますが、これを行うより良い方法があるかどうかは疑問です。

アップデート:私はをやってしまった何を

には、次のようなものだった - のeval関数愚か者の@プレフィックスはシェルコマンドが実行されていることを信じるようにします。ターゲットよりも新しい前提条件のリストがある$? -

_generated_/%.xml.cs : %.cs 
     @ $(eval DIRTY_XML += $(<)) 

out.exe : a.cs b.cs _generated_/e.xml.cs .... 
     # Create generated cs files 
     # by running ruby script with DIRTY_XML as input 
     # Compile all .cs files 

答えて

0

あなたは$(filter)$?に使用することができます。

+0

私は私がより明確にやっている、それが何を作るために私の質問を編集しました。私はこれを試しましたが、もし$ xmlファイルの古いリストを作成しようとすると? .csファイルをコンパイルするルールでは、生成された.csファイルをどのように作成するのか不満を募らせます。それを動作させる1つの方法は、生成された.csファイルが.xmlファイルに依存し、ダミー生成.​​csファイルを作成するためにtouchを実行するという別のルールを持つことで、2番目のルールは、それらをコンパイルする前にバッチで処理します。 – Shane

3

たとえば、ruby-markerという空のファイルを使用して、すべてのxmlファイルが処理されたことを示します。その変更時刻は、 "x.s"ファイルの変更時刻と比較することができます。次に、$?を使用して、前回のルビスクリプトの実行以降に変更された前提条件の "x.s"ファイルのみを選択します。

main-target: ruby-marker 
    whatever... 

ruby-marker: foo.s bar.s baz.s 
    ruby-script $? 
    @touch [email protected] 
関連する問題