[bitbake-devel] [PATCH 1/4] bitbake: Retain order for __depends and __base_depends
Lu, Lianhao
lianhao.lu at intel.com
Wed Apr 18 03:52:34 UTC 2012
Richard Purdie wrote on 2012-04-17:
> Hi Dongxiao,
>
> I've spent a while thinking about this patch and its implications. We
> have several potential correctness issues here. I finally realised there
> is a correctness issue for get_file_depends() with the ordering which
Currently the only user of get_file_depends() is the variable BBINCLUDED
which is used by eclipse plugin. I'm not sure whether other uses of __(base_)depends
care about the order, but eclipse plugin doesn't care about the order very much,
as long as the patch doesn't change the BBINCLUDED content.
> means I can't merge it :(. I'm going to give all the feedback I came up
> with whilst considering it as there are other details we need to get
> right.
>
> The issue is that we need consider what we're using this variable for
> and how. We need the data to be meaningful, useful and correct. We're
> trying to use the data for multiple things and it needs to be correct in
> each case.
>
> On Tue, 2012-04-17 at 16:21 +0800, Dongxiao Xu wrote:
>> Bitbake take seriously with variables order, therefore when setting
>> values to __depends and __base_depends, we need to retain its order.
>>
>> Signed-off-by: Dongxiao Xu <dongxiao.xu at intel.com>
>> ---
>> lib/bb/cache.py | 6 ++++--
>> lib/bb/cooker.py | 6 ++++--
>> lib/bb/parse/__init__.py | 12 ++++++++----
>> 3 files changed, 16 insertions(+), 8 deletions(-)
>> diff --git a/lib/bb/cache.py b/lib/bb/cache.py
>> index 47e814b..a114582 100644
>> --- a/lib/bb/cache.py
>> +++ b/lib/bb/cache.py
>> @@ -391,12 +391,14 @@ class Cache(object):
>> """Parse the specified filename, returning the recipe information"""
>> infos = []
>> datastores = cls.load_bbfile(filename, appends, configdata)
>> - depends = set()
>> + depends = []
>> for variant, data in sorted(datastores.iteritems(),
>> key=lambda i: i[0],
>> reverse=True):
>> virtualfn = cls.realfn2virtual(filename, variant)
>> - depends |= (data.getVar("__depends", False) or set())
>> + for dep in (data.getVar("__depends", False) or []):
>> + if dep not in depends:
>> + depends.append(dep)
>> if depends and not variant:
>> data.setVar("__depends", depends)
>
> This one is the hardest to get right. We really need to:
>
> * Save off the original __depends
> * Check the returned __depends and compute what was added compared to
> the original __depends value for each variant, then add only these
> additions to the base __depends value.
>
>
>> diff --git a/lib/bb/cooker.py b/lib/bb/cooker.py
>> index dea0aad..51341fa 100644
>> --- a/lib/bb/cooker.py
>> +++ b/lib/bb/cooker.py
>> @@ -680,8 +680,10 @@ class BBCooker:
>> # Generate a list of parsed configuration files by searching the files
>> # listed in the __depends and __base_depends variables with a .conf suffix.
>> conffiles = []
>> - dep_files = self.configuration.data.getVar('__depends') or set()
>> - dep_files.union(self.configuration.data.getVar('__base_depends') or set())
>> + dep_files = self.configuration.data.getVar('__depends') or []
>> + for dep in (self.configuration.data.getVar('__base_depends') or []):
>> + if dep not in dep_files:
>> + dep_files.append(dep)
>
> Here we may as well do:
>
> dep_files = set(self.configuration.data.getVar('__depends') or [])
> dep_files.update(self.configuration.data.getVar('__base_depends') or [])
> since order and duplicates don't matter.
>
>> for f in dep_files:
>> if f[0].endswith(".conf"):
>> diff --git a/lib/bb/parse/__init__.py b/lib/bb/parse/__init__.py
>> index 7b9c47e..f223ff9 100644
>> --- a/lib/bb/parse/__init__.py
>> +++ b/lib/bb/parse/__init__.py
>> @@ -73,8 +73,10 @@ def update_mtime(f):
>> def mark_dependency(d, f):
>> if f.startswith('./'):
>> f = "%s/%s" % (os.getcwd(), f[2:])
>> - deps = d.getVar('__depends') or set()
>> - deps.update([(f, cached_mtime(f))])
>> + deps = d.getVar('__depends') or []
>> + t = cached_mtime(f)
>> + if (f, t) not in deps:
>> + deps.append((f, t))
>> d.setVar('__depends', deps)
>
> I think this should be unconditional even if it introduces duplicates so
> that we can know if the file was included more than once:
>
> deps = d.getVar('__depends') or []
> t = cached_mtime(f)
> deps.append((f, t))
> d.setVar('__depends', deps)
>> def supports(fn, data): @@ -134,8 +136,10 @@ def vars_from_file(mypkg,
>> d): def get_file_depends(d):
>> '''Return the dependent files'''
>> dep_files = []
>> - depends = d.getVar('__depends', True) or set()
>> - depends = depends.union(d.getVar('__base_depends', True) or set())
>> + depends = d.getVar('__depends', True) or []
>> + for dep in (d.getVar('__base_depends', True) or []):
>> + if dep not in depends:
>> + depends.append(dep)
>> for (fn, _) in depends:
>> dep_files.append(os.path.abspath(fn))
>> return " ".join(dep_files)
>
> This is the one that really worried me. __base_depends needs to be
> listed before __depends as that was the order used. Again, we shouldn't
> be removing duplicates so:
>
> depends = d.getVar('__base_depends', True) or []
> for dep in (d.getVar('__depends', True) or []):
> depends.append(dep)
> Also, in cache.py:cacheValidUpdate(), we might as well do something like:
>
> - for f, old_mtime in depends:
> + for f, old_mtime in set(depends):
>
> although this is a micro optimisation. We could do that when the value
> is placed in the cache I guess and reduce cache size too.
>
> Cheers,
>
> Richard
>
>
>
> _______________________________________________
> bitbake-devel mailing list
> bitbake-devel at lists.openembedded.org
> http://lists.linuxtogo.org/cgi-bin/mailman/listinfo/bitbake-devel
Best Regards,
Lianhao
More information about the bitbake-devel
mailing list