> > I think this supports my point about being more interested in patches
> > allowing people to extend/customise buildhistory than just adding X.
> >
> > Whilst we want to have good defaults, there are always going to be
> > niche cases for people wanting to extend it...
> 
> 
> Agreed. Then we can implement our BRANCH scheme without polluting the core 
> code with it.

Richard, et al. - 

I have created the cpl/buildhistory branch on poky-contrib to share a draft of 
my ideas for making buildhistory more modular and extensible. Would appreciate 
any comments.

The first change was to break up buildhistory.bbclass. Previously it was ~1000 
lines, one of the biggest bbclasses in meta/classes. Now, buildhistory just 
contains common functionality and plumbing for the buildhistory features. Each 
feature listed in BUILDHISTORY_FEATURES causes a class to be automatically 
inherited, with a naming convention of "buildhistory-{feature}". I created 
buildhistory-package, buildhistory-task, buildhistory-sdk, and 
buildhistory-image.

Users could extend buildhistory by inheriting from buildhistory directly (e.g. 
if they have a completely new type of buildhistory to implement), or they can 
inherit from a feature class. For example, 
buildhistory-my-custom-packaging.bbclass. Then, they would use something like 
the following:

    BUILDHISTORY_FEATURES_remove = "package"
    BUILDHISTORY_FEATURES_append = " my-custom-packaging"

Alternatively, they could just add "buildhistory-my-custom-packaging" to 
INHERIT. 

Some features need to do additional things in the buildhistory event handler, 
e.g. "task" writes task signatures during commit. For this, I created 
BUILDHISTORY_COMMIT_PREFUNCS, which nicely decouples "task" from the base 
buildhistory class.

The only other big change (for now) on this branch is to abstract the 
buildhistory-packaging feature a bit. I do this by introducing several "hooks":

    BUILDHISTORY_PACKAGE_HOOKS - Python functions or BB functions run at the 
end of buildhistory_emit_pkghistory. Currently used to invoke 
buildhistory_list_pkg_files. 
    BUILDHISTORY_PACKAGE_RECIPEHISTORY_HOOKS - Python functions invoked in 
write_recipehistory, providing an opportunity to write additional lines to the 
per-recipe "latest" file. 
    BUILDHISTORY_PACKAGE_PACKAGEHISTORY_HOOKS - Python functions invoked in 
write_packagehistory providing an opportunity to write additional lines to the 
per-package "latest" file.
    BUILDHISTORY_PACKAGE_SRCREV_HOOKS - Python functions invoked in 
write_latest_srcrev, called once per srcrev-supporting SRC_URI. 
    BUILDHISTORY_PACKAGE_TAGSRCREV_HOOKS - Python functions invoked in 
write_latest_srcrev, called once per tag srcrev SRC_URI.

Additionally, I have re-implemented the latest_srcrev functionality in terms of 
BUILDHISTORY_PACKAGE_SRCREV_HOOKS and BUILDHISTORY_PACKAGE_TAGSRCREV_HOOKS.

An example usage of BUILDHISTORY_PACKAGE_SRCREV_HOOKS could be the following:

    def branch_hook(d, name, srcrev, ud, total_count, f): 
        if total_count == 1:
            f.write('BRANCH = "{0}"\n'.format(ud.branches[name]))
        else:
            f.write('BRANCH_{0} = "{1}"\n'.format(name, ud.branches[name]))

    BUILDHISTORY_PACKAGE_SRCREV_HOOKS_append = " branch_hook"


Things I'm currently unsure about:
    1. Variable naming - I thought about calling them _PREFUNCS or _POSTFUNCS 
instead of _HOOKS, or something like that. But the problem is that some of them 
can only be Python functions, not BB functions. Which leads me to:
    2. Most hooks are intended to be Python functions that are found via 
looking in globals(). If someone has a better solution I'd be interested. But I 
also don't think this one is necessarily bad.
    3. I'm trying to err on the side of not adding too many hooks for the first 
release. Hopefully the set I have chosen to add is seen as useful.
    4. I wonder if I should create a "buildhistory" directory under "classes" 
into which I would move the feature classes. To avoid polluting the "classes" 
directory.

Additional stuff to explore:
    1. Adding a buildhistory-logs feature class, which archives the 
log.do_{TASK} for a user-configurable selection of tasks. Default would be 
compile, configure, and install. 
    2. Adding other extension points where it makes sense.

Thanks,
Chris

-- 
_______________________________________________
Openembedded-core mailing list
Openembedded-core@lists.openembedded.org
http://lists.openembedded.org/mailman/listinfo/openembedded-core

Reply via email to