build.py: Make sure expandKeys has been called on the data dictonary before running...
[vuplus_bitbake] / lib / bb / build.py
index bf6b612..7644bf0 100644 (file)
@@ -74,10 +74,22 @@ def exec_func(func, d, dirs = None):
     if not body:
         return
 
-    if not dirs:
-        dirs = (data.getVarFlag(func, 'dirs', d) or "").split()
+    flags = data.getVarFlags(func, d)
+    for item in ['deps', 'check', 'interactive', 'python', 'cleandirs', 'dirs', 'lockfiles', 'fakeroot']:
+        if not item in flags:
+            flags[item] = None
+
+    ispython = flags['python']
+
+    cleandirs = (data.expand(flags['cleandirs'], d) or "").split()
+    for cdir in cleandirs:
+        os.system("rm -rf %s" % cdir)
+
+    if dirs:
+        dirs = data.expand(dirs, d)
+    else:
+        dirs = (data.expand(flags['dirs'], d) or "").split()
     for adir in dirs:
-        adir = data.expand(adir, d)
         mkdirhier(adir)
 
     if len(dirs) > 0:
@@ -85,19 +97,25 @@ def exec_func(func, d, dirs = None):
     else:
         adir = data.getVar('B', d, 1)
 
-    adir = data.expand(adir, d)
-
     try:
         prevdir = os.getcwd()
     except OSError:
-        prevdir = data.expand('${TOPDIR}', d)
+        prevdir = data.getVar('TOPDIR', d, True)
     if adir and os.access(adir, os.F_OK):
         os.chdir(adir)
 
-    if data.getVarFlag(func, "python", d):
+    locks = []
+    lockfiles = (data.expand(flags['lockfiles'], d) or "").split()
+    for lock in lockfiles:
+        locks.append(bb.utils.lockfile(lock))
+
+    if flags['python']:
         exec_func_python(func, d)
     else:
-        exec_func_shell(func, d)
+        exec_func_shell(func, d, flags)
+
+    for lock in locks:
+        bb.utils.unlockfile(lock)
 
     if os.path.exists(prevdir):
         os.chdir(prevdir)
@@ -106,19 +124,20 @@ def exec_func_python(func, d):
     """Execute a python BB 'function'"""
     import re, os
 
+    bbfile = bb.data.getVar('FILE', d, 1)
     tmp  = "def " + func + "():\n%s" % data.getVar(func, d)
     tmp += '\n' + func + '()'
-    comp = utils.better_compile(tmp, func, bb.data.getVar('FILE', d, 1) )
+    comp = utils.better_compile(tmp, func, bbfile)
     prevdir = os.getcwd()
     g = {} # globals
     g['bb'] = bb
     g['os'] = os
     g['d'] = d
-    utils.better_exec(comp,g,tmp, bb.data.getVar('FILE',d,1))
+    utils.better_exec(comp, g, tmp, bbfile)
     if os.path.exists(prevdir):
         os.chdir(prevdir)
 
-def exec_func_shell(func, d):
+def exec_func_shell(func, d, flags):
     """Execute a shell BB 'function' Returns true if execution was successful.
 
     For this, it creates a bash shell script in the tmp dectory, writes the local
@@ -130,9 +149,9 @@ def exec_func_shell(func, d):
     """
     import sys
 
-    deps = data.getVarFlag(func, 'deps', d)
-    check = data.getVarFlag(func, 'check', d)
-    interact = data.getVarFlag(func, 'interactive', d)
+    deps = flags['deps']
+    check = flags['check']
+    interact = flags['interactive']
     if check in globals():
         if globals()[check](func, deps):
             return
@@ -184,11 +203,12 @@ def exec_func_shell(func, d):
 
     # execute function
     prevdir = os.getcwd()
-    if data.getVarFlag(func, "fakeroot", d):
+    if flags['fakeroot']:
         maybe_fakeroot = "PATH=\"%s\" fakeroot " % bb.data.getVar("PATH", d, 1)
     else:
         maybe_fakeroot = ''
-    ret = os.system('%ssh -e %s' % (maybe_fakeroot, runfile))
+    lang_environment = "LC_ALL=C "
+    ret = os.system('%s%ssh -e %s' % (lang_environment, maybe_fakeroot, runfile))
     try:
         os.chdir(prevdir)
     except:
@@ -243,72 +263,30 @@ def exec_task(task, d):
        a function is that a task exists in the task digraph, and therefore
        has dependencies amongst other tasks."""
 
-    # check if the task is in the graph..
-    task_graph = data.getVar('_task_graph', d)
-    if not task_graph:
-        task_graph = bb.digraph()
-        data.setVar('_task_graph', task_graph, d)
-    task_cache = data.getVar('_task_cache', d)
-    if not task_cache:
-        task_cache = []
-        data.setVar('_task_cache', task_cache, d)
-    if not task_graph.hasnode(task):
-        raise EventException("Missing node in task graph", InvalidTask(task, d))
-
-    # check whether this task needs executing..
-    if stamp_is_current(task, d):
-        return 1
-
-    # follow digraph path up, then execute our way back down
-    def execute(graph, item):
-        if data.getVarFlag(item, 'task', d):
-            if item in task_cache:
-                return 1
-
-            if task != item:
-                # deeper than toplevel, exec w/ deps
-                exec_task(item, d)
-                return 1
-
-            try:
-                bb.msg.debug(1, bb.msg.domain.Build, "Executing task %s" % item)
-                old_overrides = data.getVar('OVERRIDES', d, 0)
-                localdata = data.createCopy(d)
-                data.setVar('OVERRIDES', 'task_%s:%s' % (item, old_overrides), localdata)
-                data.update_data(localdata)
-                event.fire(TaskStarted(item, localdata))
-                exec_func(item, localdata)
-                event.fire(TaskSucceeded(item, localdata))
-                task_cache.append(item)
-                data.setVar('_task_cache', task_cache, d)
-            except FuncFailed, reason:
-                bb.msg.note(1, bb.msg.domain.Build, "Task failed: %s" % reason )
-                failedevent = TaskFailed(item, d)
-                event.fire(failedevent)
-                raise EventException("Function failed in task: %s" % reason, failedevent)
-
-    if data.getVarFlag(task, 'dontrundeps', d):
-        execute(None, task)
-    else:
-        task_graph.walkdown(task, execute)
+    # Check whther this is a valid task
+    if not data.getVarFlag(task, 'task', d):
+        raise EventException("No such task", InvalidTask(task, d))
+
+    try:
+        bb.msg.debug(1, bb.msg.domain.Build, "Executing task %s" % task)
+        old_overrides = data.getVar('OVERRIDES', d, 0)
+        localdata = data.createCopy(d)
+        data.setVar('OVERRIDES', 'task-%s:%s' % (task[3:], old_overrides), localdata)
+        data.update_data(localdata)
+        data.expandKeys(localdata)
+        event.fire(TaskStarted(task, localdata))
+        exec_func(task, localdata)
+        event.fire(TaskSucceeded(task, localdata))
+    except FuncFailed, reason:
+        bb.msg.note(1, bb.msg.domain.Build, "Task failed: %s" % reason )
+        failedevent = TaskFailed(task, d)
+        event.fire(failedevent)
+        raise EventException("Function failed in task: %s" % reason, failedevent)
 
     # make stamp, or cause event and raise exception
-    if not data.getVarFlag(task, 'nostamp', d):
+    if not data.getVarFlag(task, 'nostamp', d) and not data.getVarFlag(task, 'selfstamp', d):
         make_stamp(task, d)
 
-def extract_stamp_data(d, fn):
-    """
-    Extracts stamp data from d which is either a data dictonary (fn unset) 
-    or a dataCache entry (fn set). 
-    """
-    if fn:
-        return (d.task_queues[fn], d.stamp[fn], d.task_deps[fn])
-    task_graph = data.getVar('_task_graph', d)
-    if not task_graph:
-        task_graph = bb.digraph()
-        data.setVar('_task_graph', task_graph, d)
-    return (task_graph, data.getVar('STAMP', d, 1), None)
-
 def extract_stamp(d, fn):
     """
     Extracts stamp format which is either a data dictonary (fn unset) 
@@ -318,49 +296,6 @@ def extract_stamp(d, fn):
         return d.stamp[fn]
     return data.getVar('STAMP', d, 1)
 
-def stamp_is_current(task, d, file_name = None, checkdeps = 1):
-    """
-    Check status of a given task's stamp. 
-    Returns 0 if it is not current and needs updating.
-    (d can be a data dict or dataCache)
-    """
-
-    (task_graph, stampfn, taskdep) = extract_stamp_data(d, file_name)
-
-    if not stampfn:
-        return 0
-
-    stampfile = "%s.%s" % (stampfn, task)
-    if not os.access(stampfile, os.F_OK):
-        return 0
-
-    if checkdeps == 0:
-        return 1
-
-    import stat
-    tasktime = os.stat(stampfile)[stat.ST_MTIME]
-
-    _deps = []
-    def checkStamp(graph, task):
-        # check for existance
-        if file_name:
-            if 'nostamp' in taskdep and task in taskdep['nostamp']:
-                return 1
-        else:
-            if data.getVarFlag(task, 'nostamp', d):
-                return 1
-
-        if not stamp_is_current(task, d, file_name, 0                                          ):
-            return 0
-
-        depfile = "%s.%s" % (stampfn, task)
-        deptime = os.stat(depfile)[stat.ST_MTIME]
-        if deptime > tasktime:
-            return 0
-        return 1
-
-    return task_graph.walkdown(task, checkStamp)
-
 def stamp_internal(task, d, file_name):
     """
     Internal stamp helper function
@@ -396,33 +331,40 @@ def del_stamp(task, d, file_name = None):
     """
     stamp_internal(task, d, file_name)
 
-def add_task(task, deps, d):
-    task_graph = data.getVar('_task_graph', d)
-    if not task_graph:
-        task_graph = bb.digraph()
-    data.setVarFlag(task, 'task', 1, d)
-    task_graph.addnode(task, None)
-    for dep in deps:
-        if not task_graph.hasnode(dep):
-            task_graph.addnode(dep, None)
-        task_graph.addnode(task, dep)
-    # don't assume holding a reference
-    data.setVar('_task_graph', task_graph, d)
-
+def add_tasks(tasklist, d):
     task_deps = data.getVar('_task_deps', d)
     if not task_deps:
         task_deps = {}
-    def getTask(name):
-        deptask = data.getVarFlag(task, name, d)
-        if deptask:
+    if not 'tasks' in task_deps:
+        task_deps['tasks'] = []
+    if not 'parents' in task_deps:
+        task_deps['parents'] = {}
+
+    for task in tasklist:
+        task = data.expand(task, d)
+        data.setVarFlag(task, 'task', 1, d)
+
+        if not task in task_deps['tasks']:
+            task_deps['tasks'].append(task)
+
+        flags = data.getVarFlags(task, d)    
+        def getTask(name):
             if not name in task_deps:
                 task_deps[name] = {}
-            task_deps[name][task] = deptask
-    getTask('deptask')
-    getTask('rdeptask')
-    getTask('recrdeptask')
-    getTask('nostamp')
+            if name in flags:
+                deptask = data.expand(flags[name], d)
+                task_deps[name][task] = deptask
+        getTask('depends')
+        getTask('deptask')
+        getTask('rdeptask')
+        getTask('recrdeptask')
+        getTask('nostamp')
+        task_deps['parents'][task] = []
+        for dep in flags['deps']:
+            dep = data.expand(dep, d)
+            task_deps['parents'][task].append(dep)
 
+    # don't assume holding a reference
     data.setVar('_task_deps', task_deps, d)
 
 def remove_task(task, kill, d):
@@ -430,22 +372,5 @@ def remove_task(task, kill, d):
 
        If kill is 1, also remove tasks that depend on this task."""
 
-    task_graph = data.getVar('_task_graph', d)
-    if not task_graph:
-        task_graph = bb.digraph()
-    if not task_graph.hasnode(task):
-        return
-
     data.delVarFlag(task, 'task', d)
-    ref = 1
-    if kill == 1:
-        ref = 2
-    task_graph.delnode(task, ref)
-    data.setVar('_task_graph', task_graph, d)
-
-def task_exists(task, d):
-    task_graph = data.getVar('_task_graph', d)
-    if not task_graph:
-        task_graph = bb.digraph()
-        data.setVar('_task_graph', task_graph, d)
-    return task_graph.hasnode(task)
+