|
@@ -74,12 +74,21 @@ def exec_func(func, d, dirs = None):
|
|
|
if not body:
|
|
|
return
|
|
|
|
|
|
- cleandirs = (data.expand(data.getVarFlag(func, 'cleandirs', d), 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 not dirs:
|
|
|
- dirs = (data.expand(data.getVarFlag(func, 'dirs', d), d) or "").split()
|
|
|
+ if dirs:
|
|
|
+ dirs = data.expand(dirs, d)
|
|
|
+ else:
|
|
|
+ dirs = (data.expand(flags['dirs'], d) or "").split()
|
|
|
for adir in dirs:
|
|
|
mkdirhier(adir)
|
|
|
|
|
@@ -88,24 +97,22 @@ 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)
|
|
|
|
|
|
locks = []
|
|
|
- lockfiles = (data.expand(data.getVarFlag(func, 'lockfiles', d), d) or "").split()
|
|
|
+ lockfiles = (data.expand(flags['lockfiles'], d) or "").split()
|
|
|
for lock in lockfiles:
|
|
|
locks.append(bb.utils.lockfile(lock))
|
|
|
|
|
|
- if data.getVarFlag(func, "python", d):
|
|
|
+ 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)
|
|
@@ -117,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
|
|
@@ -141,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
|
|
@@ -195,7 +203,7 @@ 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 = ''
|
|
@@ -255,72 +263,29 @@ 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, old_overrides), localdata)
|
|
|
+ data.update_data(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) 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)
|
|
@@ -330,49 +295,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
|
|
@@ -409,40 +331,39 @@ def del_stamp(task, d, file_name = None):
|
|
|
stamp_internal(task, d, file_name)
|
|
|
|
|
|
def add_tasks(tasklist, d):
|
|
|
- task_graph = data.getVar('_task_graph', d)
|
|
|
task_deps = data.getVar('_task_deps', d)
|
|
|
- if not task_graph:
|
|
|
- task_graph = bb.digraph()
|
|
|
if not task_deps:
|
|
|
task_deps = {}
|
|
|
+ if not 'tasks' in task_deps:
|
|
|
+ task_deps['tasks'] = []
|
|
|
+ if not 'parents' in task_deps:
|
|
|
+ task_deps['parents'] = {}
|
|
|
|
|
|
for task in tasklist:
|
|
|
- deps = tasklist[task]
|
|
|
task = data.expand(task, d)
|
|
|
-
|
|
|
data.setVarFlag(task, 'task', 1, d)
|
|
|
- task_graph.addnode(task, None)
|
|
|
- for dep in deps:
|
|
|
- dep = data.expand(dep, d)
|
|
|
- if not task_graph.hasnode(dep):
|
|
|
- task_graph.addnode(dep, None)
|
|
|
- task_graph.addnode(task, dep)
|
|
|
+
|
|
|
+ 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] = {}
|
|
|
if name in flags:
|
|
|
deptask = data.expand(flags[name], d)
|
|
|
- if not name in task_deps:
|
|
|
- task_deps[name] = {}
|
|
|
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_graph', task_graph, d)
|
|
|
data.setVar('_task_deps', task_deps, d)
|
|
|
|
|
|
def remove_task(task, kill, d):
|
|
@@ -450,22 +371,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)
|
|
|
+
|