1

他のターゲットが何であるかを判断するために、構築する必要があるターゲットがいくつかあります。SCons にどのように伝えますか?

例:

スクリプトgenerateは、いくつかの構成ファイルで実行されます。このスクリプトは、構成ファイルの情報に基づいてインクルード パスとビルド フラグを生成します。SCons をビルドするObjectには、生成されたファイルを読み取る必要があります。

私はちょうど実行Execute()していましgenerateたが、生成するファイルがたくさんあり、かなりの時間がかかるため、それまたは構成ファイルが変更されたときにのみ実行したいと思います。必要な処理が完了したら、SCons にビルド時に追加のターゲットを要求するように指示するにはどうすればCommandよいですか?

4

2 に答える 2

2

わかりました、最初にいくつかの SCons の説明があります。Scons には、ビルドを行う際に 2 つのフェーズがあります。まず、分析フェーズでは、すべてのScons スクリプトが実行され、その結果、スクリプトで定義されたすべてのビルダーのソース ファイルとターゲット ファイルを記述した静的な依存関係ツリーが作成されます。次に、そのツリー、最後のビルドのビルド データベース、およびディスク上のファイルの署名に基づいて、古いターゲットを持つすべてのビルダーが再ビルドされます。

今あなたの質問に。generate必要な場合 (generateまたは構成ファイルが変更された場合)にのみ実行する場合generateは、分析フェーズの一部として実行することは問題外です。使用しないでくださいExecute()。代わりgenerateに、独自のビルダーである必要があります。ここまでは順調ですね。

これで、最初のビルダーgenerateと 2 番目のビルダーの 2 つのビルダーができましたbuildObjectbuildObjectのターゲットに依存しgenerateますが、あなたが述べたように、generateターゲットは分析時に不明です(generate実行されないため、ビルダーとしてのみ設定されます)。分析時に未知のターゲットを持つことは、SCons の典型的な課題であり、簡単に解決する方法はありません。

私は通常、SCons.pleaserファイルと呼ばれるものを使用して解決します。あなたの場合generate、高解像度のタイムスタンプを含む既知のターゲットが生成されます。buildObjectビルダーは、このファイルをソースとして取得します。ここで、構成ファイルが変更されていない場合、generateは実行されず、SCons.pleaser は変更されず、buildObject実行されません。構成ファイルを変更すると、generate が実行され、SCons.pleaser が変更buildObjectされ、同様に実行されます。

よろしく

于 2012-12-16T09:19:18.543 に答える
0

私が行った解決策は、生成フェーズの実行方法を知っている新しいSConstructを作成することExecute()でした。これは、出力が必要なビットに到達する前のSConscriptsの早い段階で作成しました。SCons内からSConsを呼び出すという小さな固定オーバーヘッドで、必要に応じて物事を構築するだけなので、うまく機能します。

于 2012-12-19T14:31:24.103 に答える