2017-12-04 14 views
2

私はwafに2つのタスクを持っており、正しい順序で実行する必要があり、2番目のタスクは最初のタスクが終了するまで待つ必要があります。それは、私はそれが動作するように期待される方法を行動だことを示すためにwafに次のタスクを開始する前にタスクが完了するのを待つように伝えます

、私は最初のタスク(t_1)秒で第二のタスク(t_2)秒で、タスクの内部で待ちます。そして、2番目のタスクが最初に終了します。これは、待機した後に作成するフォルダにタイムスタンプがあるので表示されますt_2 < t_1どのように私はt_1が正常に終了した後t_2がexectuedされていることを、WAFを伝えることができます:?1問で


  1. MWE:のafter属性であなたは(t_1その例では)前を実行しなければならないタスクを指定する必要がのWScript

    from waflib import Context, Options 
    from waflib import Task, TaskGen 
    from waflib.Tools.compiler_c import c_compiler 
    
    def options(opt): 
        opt.load('compiler_c') 
    
    def configure(cnf): 
        cnf.load('compiler_c') 
    
    def build(bld): 
        bld.program(features=['t_1', 't_2'], source='main.c', target='abc') 
    
    class t_1(Task.Task): 
        always_run = True 
        run_str = 'echo start t_1 && python -c "import time; time.sleep(4)" && echo end t_1 && mkdir t_1' 
        color = 'RED' 
    
    
    @TaskGen.feature('t_1') 
    @TaskGen.after('apply_link') 
    @TaskGen.before('t_2') 
    def add_t_1_task(self): 
        self.create_task('t_1') 
    
    
    class t_2(Task.Task): 
        always_run = True 
        run_str = 'echo start t_2 && python -c "import time; time.sleep(1)" && echo end t_2 && mkdir t_2' 
        color = 'RED' 
    
    
    @TaskGen.feature('t_2') 
    @TaskGen.after('apply_link', 't_1') 
    def add_t_2_task(self): 
        self.create_task('t_2') 
    

答えて

2

タスク "待つ "他のタスクが終了する(この例では(t_2))。 それは次のように指定されています。これにafter = ['t_1']

ドキュメントはwaf bookセクションbuild order constraintsにここで見つけることができます。

generic task generator is §9.3を現在のwafブック(waf 2.0)、特に§9.3.4で説明しているドキュメントでは、タスクジェネレータの実行順序について説明しています。


MWEはこのように、その後に見える完全な例:TaskGen.before( 'T_2')@

from waflib import Context, Options 
from waflib import Task, TaskGen 
from waflib.Tools.compiler_c import c_compiler 

def options(opt): 
    opt.load('compiler_c') 

def configure(cnf): 
    cnf.load('compiler_c') 

def build(bld): 
    bld.program(features=['t_1', 't_2'], source='main.c', target='abc') 

class t_1(Task.Task): 
    always_run = True 
    run_str = 'date && echo 1 && echo start t_1 && python -c "import time; time.sleep(4)" && echo end t_1 && mkdir t_1 && date && echo 1' 
    color = 'RED' 


@TaskGen.feature('t_1') 
@TaskGen.after('apply_link') 
@TaskGen.before('t_2') 
def add_t_1_task(self): 
    self.create_task('t_1') 


class t_2(Task.Task): 
    always_run = True 
    after = ['t_1'] # <---------------------------- **The problems solution** 
    run_str = 'date && echo 1 && echo start t_2 && python -c "import time; time.sleep(1)" && echo end t_2 && mkdir t_2 && date && echo 2' 
    color = 'RED' 


@TaskGen.feature('t_2') 
@TaskGen.after('apply_link', 't_1') 
def add_t_2_task(self): 
    self.create_task('t_2') 
+1

''は間違っています。これは '@ TaskGen.before( 'add_t_2_task')'です。さらにそれは必要ではない。タスク 't_1'と' t_2'はあなたの例ではどんな順序でも作成できます。重要なのは実行命令です。 – neuro

+0

コメントありがとうございます。私は文書を見つけることができますが、タスクジェネレーターのメソッドを制約として置く必要があるのはどこですか?しかし、 't_2(Task.Task):'の 'after = ['t_1']'を使う問題に対する私の解決策は正しいですか? – wafwafwaf

+0

@neuroもう一度尋ねて申し訳ありませんが、あなたがwafで非常に経験しているように、私が教えてくれれば、ドキュメントでこれを見つけるべき場所を教えてください。 – wafwafwaf

関連する問題