7

scons は、ファイルの mod 時間ではなく MD5 ハッシュを使用して、依存関係を構築する必要があるかどうかを判断します。

これをデフォルトの動作にしたいです。しかし、ファイルを編集して別のものにする以外に、特定のファイルが古くなっていると強制的に仮定する方法はありますか (「タッチ」に相当します)。

編集:使用例:

バイナリ ファイル F は、ツール X を使用して別のファイル G を作成するために使用されます。何らかの理由でファイル G が変更された (破損したか、編集した)、またはツール X が変更されたため、ファイル G とその下流のすべてを再作成したい.

編集:これは時折の使用のみです。私はこれが常に起こることを望んでいません。また、事前に特定のファイルがわからない場合もあります。このため、特定のファイルをビルドするために SConscript/SConstruct ファイルを変更したくありません。私が望むのは、コマンドプロンプトでこれを行うことです:

scons {something to specify file foobar.h}

これにより、scons は foobar.h に依存するすべてのファイルを強制的にビルドしますが、入力sconsするだけで、依存関係のチェックに MD5 ハッシュを使用して通常のビルドが実行されます。SConscript/SConstruct ファイルを事前に編集して、ビルド時間を大幅に増加させない方法があれば、これを許可します (カスタム Decider だと思います)。

4

4 に答える 4

4

Scons の --interactive オプションを見たことがありますか。特定のターゲットをクリーンアップしてビルドできます。

これについて説明している man ページ。

于 2009-11-11T17:02:42.233 に答える
1

それを直接行う方法はないと思います。問題のソース ファイルに、test.ocreated fromなどの明らかな出力が 1 つある場合test.c、削除test.oするとソース ファイルの再コンパイルが強制されます。

代わりに、複数の異なるソース ファイルからインクルードされているものに触れたい場合test.hは、プロジェクト全体をきれいにして、すべてが再構築されるようにすることをお勧めします。

そうは言っても、ファイルの依存関係をどのように処理するかを選択できるDecider()機能について読みたいと思うかもしれません。プロジェクト内の特定のファイルに対してカスタム ディサイダー関数を選択することもできるので、再構築したいグローバル ヘッダー ファイルがある場合はtouch、それを行うことができます。

更新: 最新の質問に答えるには、ファイル G を削除するだけです。Scons は、次にビルドするときに X を実行して F からファイルを再作成します。

于 2009-10-01T05:51:23.517 に答える
0

SConstruct ファイルで、ファイルを表す Node を抽出します。この後、 Node.always_build(true)を使用してビルドされていることを確認できるはずです。これにより、依存関係も強制的に再ビルドされると思います。

于 2009-11-11T15:29:16.353 に答える
0

時分秒までの完全な日付を含むダミーのターゲット ファイルを作成します。次に、このダミー ターゲット ファイルに依存する他の手順を実行します。これにより、ビルド ステップが再コンパイルされるたびに md5 値が変更され、後続のステップが再コンパイルされます。または、ダミーターゲットを削除することもできます。これも再コンパイルをカスケードします。

個人的には、EDA ビルド フローのすべてのステップからのすべての出力を予測できないため、これは非常に便利です。また、メンテナンス コストのために、すべてのビルド ステップのすべての出力を予測しようともしません。

Greg が述べたように、Decider() 関数はより scons に似ていると確信していますが、個人的にはタイムスタンプ ファイルが必要です。

于 2009-10-01T17:36:12.310 に答える