[OE-core] [RFC] recipe_links.bbclass: introduction

Mark Hatle mark.hatle at windriver.com
Fri Aug 18 18:07:48 UTC 2017


On 8/18/17 12:58 PM, Andre McCurdy wrote:
> On Fri, Aug 18, 2017 at 8:44 AM, Mark Asselstine
> <mark.asselstine at windriver.com> wrote:
>> This is a new class which can be used (for example via USER_CLASSES in
>> local.conf) to make your build more development friendly. When
>> included this class will create symlinks to the various bb and
>> bbappend files in WORKDIR.
>>
>> Normally when you are debugging or extending a package's recipe files
>> a developer will employ one of a few indirect techniques to determine
>> where bb and bbappends files associated with a recipe exist. For
>> example they might use bitbake-layers show-recipes or similar, or
>> simply rely on their experience to guide them. Even after working with
>> openembedded for serveral years now I find these techniques tedious
>> and time consuming, and sometimes even hit and miss.
>>
>> Since the whereabouts of these files are already stored in various
>> files at parse time we can create symlinks to simplify the task of
>> finding these files, making them available in WORKDIR for easy
>> inpsection and in a convenient location if using devshel for instance.
>>
>> For now this work is completely optional but we could conceivable make
>> this the default behavior if folks find it is convenient and the cost
>> of performing these operations across all builds is minimal enough.
>>
>> recipe_links can safely be added to USER_CLASSES for existing builds,
>> care has been taken to avoid this action causing anything to be
>> rebuilt. After this has been added you can either 'bitbake <recipe> -C
>> unpack' or 'bitbake <recipe> -c create_recipe_links' to cause the
>> links to be created in the WORKDIR for the specified recipe.
>>
>> Signed-off-by: Mark Asselstine <mark.asselstine at windriver.com>
>> ---
>>  meta/classes/recipe_links.bbclass | 79 +++++++++++++++++++++++++++++++++++++++
>>  meta/conf/documentation.conf      |  1 +
>>  2 files changed, 80 insertions(+)
>>  create mode 100644 meta/classes/recipe_links.bbclass
>>
>> diff --git a/meta/classes/recipe_links.bbclass b/meta/classes/recipe_links.bbclass
>> new file mode 100644
>> index 0000000..ea97605
>> --- /dev/null
>> +++ b/meta/classes/recipe_links.bbclass
>> @@ -0,0 +1,79 @@
>> +# Create symlink in WORKDIR to the various bb and
>> +# bbappend files used to define the package ops
>> +
>> +# Create a symlink given src and dst paths
>> +def create_link(d, src, dst):
>> +    if os.path.islink(dst):
>> +        try:
>> +            os.unlink(dst)
>> +        except OSError as err:
>> +            bb.error("  Failed to cleanup old link %s: %s"
>> +                         % (os.path.basename(dst), os.strerror(err.errno)))
>> +            return False
>> +
>> +
>> +    try:
>> +        os.symlink(src, dst)
>> +    except OSError as err:
>> +        bb.error("  Failed to create file link for %s: %s"
>> +                     % (src, os.strerror(err.errno)))
>> +        return False
>> +
>> +    return True
>> +
>> +# Ensure the work is scheduled. We do this as a func
>> +# to avoid sig changes causing things to be rebuilt
>> +# when the class is added/removed after the fact.
>> +do_unpack[postfuncs] += "create_recipe_links "
>> +do_unpack[vardepsexclude] += "create_recipe_links "
>> +python create_recipe_links() {
>> +    import re
>> +    import glob
>> +
>> +    workdir = d.getVar('WORKDIR')
>> +
>> +    # Main recipe file
>> +    bb.note("Add main recipe file link:")
>> +    bb_path = d.getVar('FILE')
>> +    bb_filename = os.path.basename(bb_path)
>> +    bb_destname = "%s/%s" % (workdir, bb_filename)
>> +    bb.note("  Linking %s" % bb_path)
>> +    if not create_link(d, bb_path, bb_destname):
>> +        return False
>> +
>> +    # Cleanup old bbappends links
>> +    bb.note("Removing old bbappend links:")
>> +    pn = d.getVar('PN')
>> +    files = glob.glob('%s/[0-9][0-9]_%s.bbappend' % (workdir,pn))
>> +    files += glob.glob('%s/[0-9][0-9]_%s_*.bbappend' % (workdir, pn))
>> +    for filename in files:
>> +        bb.note("  Removing: %s" % filename)
>> +        try:
>> +            os.unlink(filename)
>> +        except OSError as err:
>> +            bb.error("  Failed to cleanup old link %s: %s" %
>> +                         (os.path.basename(filename), os.strerror(err.errno)))
>> +            return False
>> +
>> +    # Add bbappends links
>> +    bb.note("Adding bbappend links:")
>> +    included_files = d.getVar('BBINCLUDED').split()
>> +    bbappend_re = re.compile( r".*/%s(_[^/]*)?\.bbappend$" % re.escape(pn))
>> +    for filename in included_files:
>> +        if bbappend_re.match(filename):
>> +            bb.note("  Linking %s" % filename)
>> +            destname = "00_%s" % (os.path.basename(filename))
>> +            while os.path.exists("%s/%s" % (workdir, destname)):
>> +                 destname = str(int(destname[:2]) + 1).zfill(2) + destname[2:]
>> +            if not create_link(d, filename, "%s/%s" % (workdir, destname)):
>> +                return False
>> +
>> +    return True
>> +}
>> +
>> +# In addition to the func we want to make things able to be (re)run
>> +# easily by the user so ensure it is available as a task.
>> +addtask do_create_recipe_links
> 
> Perhaps just create the symlinks unconditionally as part of
> do_devshell instead of creating an optional new task?

I rarely use the devshell, so I prefer if the links are always created as it
will make it easier to find the items (.bb and .bbappend) used to construct the
working directory.

--Mark

>> +python do_create_recipe_links() {
>> +    bb.build.exec_func("create_recipe_links", d)
>> +}
>> diff --git a/meta/conf/documentation.conf b/meta/conf/documentation.conf
>> index a55e283..5a8a07e 100644
>> --- a/meta/conf/documentation.conf
>> +++ b/meta/conf/documentation.conf
>> @@ -23,6 +23,7 @@ do_devshell[doc] = "Starts a shell with the environment set up for development/d
>>  do_diffconfig[doc] = "Compares the old and new config files after running do_menuconfig for the kernel"
>>  do_fetch[doc] = "Fetches the source code"
>>  do_fetchall[doc] = "Fetches all remote sources required to build a target"
>> +do_create_recipe_links[doc] = "Creates links to bb and bbappend files in a package's WORKDIR"
>>  do_install[doc] = "Copies files from the compilation directory to a holding area"
>>  do_install_ptest_base[doc] = "Copies the runtime test suite files from the compilation directory to a holding area"
>>  do_kernel_checkout[doc] = "Checks out source/meta branches for a linux-yocto style kernel"
>> --
>> 2.7.4
>>
>> --
>> _______________________________________________
>> Openembedded-core mailing list
>> Openembedded-core at lists.openembedded.org
>> http://lists.openembedded.org/mailman/listinfo/openembedded-core




More information about the Openembedded-core mailing list