Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

生成されたファイルを手動で削除しても、それに依存したタスクが実行されない #79

Open
beam2d opened this issue Jul 14, 2014 · 2 comments
Labels

Comments

@beam2d
Copy link
Member

beam2d commented Jul 14, 2014

import maf

def configure(conf): pass
def build(exp):
    exp(target='a', rule='date >> ${TGT}')
    exp(source='a', target='b', rule='cp ${SRC} ${TGT}')

例えばこのwscriptに対して

./waf configure build
rm build/a
./waf

このコマンドを実行した場合、 build/a は再生成されるが build/b は再生成されない。この挙動はwafを直接使った場合でも変わらない。場合によっては実行のための依存関係をすべてwscriptに記述するのが難しく、手動で削除する運用で対処したい場合があるので、上記のケースで build/b も再生成されるようになると嬉しい。

@beam2d beam2d added the bug label Jul 14, 2014
@hiroshinoji
Copy link
Contributor

何が起きているかを整理する。以下、 target='a' のタスクをタスクa, target='b' のタスクをタスクbと呼ぶ。

  • まず、タスク a が行われると、Task.post_run によって、ノード a には、タスク a のハッシュ値が保存される。このハッシュ値は、タスク a の入力ノードなどから計算される値であり、出力は全く参照しない。
  • タスク b は、入力ノードが a であるなどの情報をもとに、ハッシュ値を計算する。この際ノード a のハッシュ値を参照するが、この値は前回のタスク a の実行時に保存された値であるため、上に述べたように、ノード a の出力には依存しない。よって、ファイル a が削除された場合も、タスク b の再実行に関わるハッシュ値は変化しないため、再実行が行われない。

@hiroshinoji
Copy link
Contributor

あるタスクの全ての出力ノードのハッシュ値と、タスク自体のハッシュ値が同一でなければならないという条件は色々なところで使われているので、この条件を崩すことが難しそう。例えば、 Task.runnable_status() はあるタスクを実行する直前に、タスクを実行するか決定する関数で、各出力ノードのハッシュ値を見て不整合が見つかれば再実行を行う。
http://docs.waf.googlecode.com/git/apidocs_17/_modules/waflib/Task.html#Task.runnable_status

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

Successfully merging a pull request may close this issue.

2 participants