3

デフォルトでは、SConsはプログラムの構築に使用される「レシピ」を調べ、そこから暗黙の依存関係を抽出するようです。たとえば、SConstructに次のものが含まれているとします。

Command('foo', 'foocreator.py', '/usr/bin/python foocreator.py > foo')

そして、私はすでに「foo」を構築しました(「foo」は最新です)。ここで、SConstructを変更して(より現実的には、さまざまなオプションを渡します)、「foo」のコマンドは次のようになります。

Command('foo', 'foocreator.py', '/usr/bin/qrsh -V -cwd /usr/bin/python foocreator.py > foo')

(つまり、SGEを介してfoocreator.pyスクリプトを実行します)ここで、SConsはfooを再構築しようとします。これは、「/ usr / bin/qrshへの新しい依存関係」と「ドロップされた依存関係」が原因であると--debug=explainが通知します。 / usr / bin / python ")。

レシピからの依存関係のこの推論を、できればグローバルに防ぐにはどうすればよいですか?これまでのところ、この動作の仕様を見つけることさえできませんでした。'foo'が実際にはpythonやqrshに依存していないという事実を詳しく説明する必要はありません。これは、これらのプログラムのすべてのターゲットとすべての可能な場所に対して行う必要があるためです。「正しい」方法が必要です。

編集:私はまた、次のように、各ターゲットに無視を明示的に追加しようとしました:

Ignore('foo', '/usr/bin/python')
Ignore('foo', '/usr/bin/qrsh')

そしてこれでもうまくいきません!SConsは、qrshを実行するかどうかを切り替えるたびに、すべてを再構築したいと考えています。

4

3 に答える 3

4

問題は、sconsがアクションの最小限の解析を実行して、呼び出しているものを判別することです。

   python $SOURCE > $TARGET

Pythonに依存関係を自動的に追加します。また、アクションのmd5にアクションTEXTが含まれています。に変更すると

   anotherprog -cmd python $SOURCE > $TARGET

3つの変更を検出します。

  1. Pythonへの依存を削除しました
  2. anotherprogへの依存関係を追加
  3. コマンドラインを変更しました

別のプログラムを変更した場合は、間違いなく再構築する必要があるという点で、これは半合理的です。

'$('および'$)'に重要でないビットを含めることで、コマンドラインの変更を検出するsconsを停止できます。

   anotherprog $( -date $TIME $) $SOURCE > $TARGET

   anotherprog $( -time $DATE $) $SOURCE > $TARGET

再構築は発生しません。

だから私はあなたが持っていたと思います

  $( python $) $SOURCE > $TARGET

  $( anotherprog =cmd python $) $SOURCE > $TARGET

それはあなたが望むことをするでしょう。しかし、私はそれを試していません。

于 2012-07-20T07:46:56.587 に答える
1

文書化された解決策を見つけました。この動作を正確に制御する構築変数IMPLICIT_COMMAND_DEPENDENCIESがあります。これはhttp://www.scons.org/doc/HTML/scons-man.htmlに文書化されています(ただし、sconsのソースコードを検索して発見しました!)

したがって、これにより、元の例に基づいて必要な動作が得られます。

env = Environment(IMPLICIT_COMMAND_DEPENDENCIES =0, ... )
Command('foo', 'foocreator.py', '/usr/bin/python foocreator.py > foo')

(また)

env = Environment(IMPLICIT_COMMAND_DEPENDENCIES =0, ... )
Command('foo', 'foocreator.py', '/usr/bin/python foocreator.py > foo')

ターゲット「foo」の2つの定義を切り替えることができ、sconsはfooが古くなっているとは見なしません。

于 2012-07-23T15:54:54.453 に答える
0

これが役立つかどうかはわかりませんが、アクション文字列を次のように変更することをお勧めします。

actionStr = '/usr/bin/qrsh -V -cwd /usr/bin/python $SOURCE > $TARGET'
Command(target = 'foo', source = 'foocreator.py', action = actionStr)

SConsは、アクション文字列からソースとターゲットを判別できず、混乱する可能性があります。

上記のコメントで提案したような動作をオフにすることはできない場合がありますが、独自のビルダーを作成する代わりに、Ignore()およびDepends()関数を使用して微調整する必要があります。そして、絶対的な最悪のケースは、qrshとpythonを内部で実行するシェルスクリプトを呼び出すことによって、アクション文字列を効果的に変更しないようにすることです。

于 2012-07-19T16:02:42.460 に答える