[yocto] [PATCH] bb.build.addtask: add simple check for circular dependency
Richard Purdie
richard.purdie at linuxfoundation.org
Thu Jan 17 13:05:38 PST 2019
On Thu, 2019-01-17 at 19:15 +0100, Ulf Samuelsson wrote:
> From 864e49bedbdab480c5ada9588ce8f980f23919dd Mon Sep 17 00:00:00
> 2001
> From: Ulf Samuelsson <ulf at emagii.com>
> Date: Thu, 17 Jan 2019 19:07:17 +0100
> Subject: [PATCH] bb.build.addtask: add simple check for circular
> dependency
We really can't hardcode a list of tasks like this in bitbake :(
The list is also incorrect (at a quick look its packagedata and
populate_sysroot is missing).
We'll need to come up with a better algorithm than this. From
experience with circular task dependencies within bitbake's runqueue,
this is a hard problem though.
Cheers,
Richard
> Signed-off-by: Ulf Samuelsson <ulf at emagii.com>
> ---
> bitbake/lib/bb/build.py | 48
> ++++++++++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 48 insertions(+)
>
> diff --git a/bitbake/lib/bb/build.py b/bitbake/lib/bb/build.py
> index 3e2a94e..887ced1 100644
> --- a/bitbake/lib/bb/build.py
> +++ b/bitbake/lib/bb/build.py
> @@ -43,6 +43,25 @@ logger = logging.getLogger('BitBake.Build')
>
> __mtime_cache = {}
>
> +KNOWN_TASKS = {
> + 'do_fetch' : 1 ,
> + 'do_unpack' : 2 ,
> + 'do_patch' : 3 ,
> + 'do_configure' : 4 ,
> + 'do_compile' : 5 ,
> + 'do_install' : 6 ,
> + 'do_package' : 7 ,
> + 'do_package_data' : 8 ,
> + 'do_rootfs' : 9 ,
> + 'do_image_qa' : 10 ,
> + 'do_image' : 11 ,
> + 'do_image_tar' : 12 ,
> + 'do_image_ubifs' : 12 ,
> + 'do_image_jffs2' : 12 ,
> + 'do_image_complete' : 13 ,
> + 'do_build' : 14
> +}
> +
> def cached_mtime_noerror(f):
> if f not in __mtime_cache:
> try:
> @@ -820,7 +839,34 @@ def add_tasks(tasklist, d):
> # don't assume holding a reference
> d.setVar('_task_deps', task_deps)
>
> +def circular(after, before):
> + if after == None:
> + return False
> + if before == None:
> + return False
> + for a in after.split():
> + if a in KNOWN_TASKS:
> + for b in before.split():
> + if a == b:
> + return True
> + if b in KNOWN_TASKS:
> + if KNOWN_TASKS[b] < KNOWN_TASKS[a]:
> + return True
> + else:
> + # tasks OK
> + pass
> + else:
> + # b is unknown
> + pass
> + else:
> + # a is unknown
> + pass
> +
> def addtask(task, before, after, d):
> + if circular(after, before):
> + logger.error("addtask: %s cannot be after %s and before %s"
> %
> (task, after, before))
> + raise
> +
> if task[:3] != "do_":
> task = "do_" + task
>
> @@ -909,3 +955,5 @@ def tasksbetween(task_start, task_end, d):
> chain.pop()
> follow_chain(task_start, task_end)
> return outtasks
> +
> +
More information about the yocto
mailing list