Openembedded Core Discussions
 help / color / mirror / Atom feed
From: Mariano Lopez <mariano.lopez@linux.intel.com>
To: "Aníbal Limón" <anibal.limon@linux.intel.com>,
	openembedded-core@lists.openembedded.org
Cc: paul.eggleton@linux.intel.com
Subject: Re: [PATCH 1/1] license.bbclass: Add support for deployed packages not in rootfs
Date: Tue, 04 Aug 2015 09:04:06 -0500	[thread overview]
Message-ID: <55C0C656.4000004@linux.intel.com> (raw)
In-Reply-To: <55BFD106.7010805@linux.intel.com>



On 08/03/2015 03:37 PM, Mariano Lopez wrote:
>
> On 08/03/2015 03:20 PM, Aníbal Limón wrote:
>> Hi,
>>
>> Comments below,
>>
>> On 03/08/15 06:59, mariano.lopez@linux.intel.com wrote:
>>> From: Mariano Lopez <mariano.lopez@linux.intel.com>
>>>
>>> This adds a new manifest file for the packages that were
>>> deployed but not included into rootfs. The new manifest file
>>> is in the same directory as the rootfs manifest but the name is
>>> image_license.manifest.
>>>
>>> It also creates the directory structure for the packages and
>>> add the license file in such directories.
>>>
>>> The bootloader is an example of such packages.
>>>
>>> [YOCTO #6772]
>>>
>>> Signed-off-by: Mariano Lopez <mariano.lopez@linux.intel.com>
>>> ---
>>>   meta/classes/license.bbclass | 107 
>>> +++++++++++++++++++++++++++++++++++++------
>>>   1 file changed, 94 insertions(+), 13 deletions(-)
>>>
>>> diff --git a/meta/classes/license.bbclass 
>>> b/meta/classes/license.bbclass
>>> index 224d541..42d2748 100644
>>> --- a/meta/classes/license.bbclass
>>> +++ b/meta/classes/license.bbclass
>>> @@ -26,18 +26,14 @@ python write_package_manifest() {
>>>   }
>>>     python license_create_manifest() {
>>> -    import re
>>>       import oe.packagedata
>>>       from oe.rootfs import image_list_installed_packages
>>>   -    bad_licenses = (d.getVar("INCOMPATIBLE_LICENSE", True) or 
>>> "").split()
>>> -    bad_licenses = map(lambda l: canonical_license(d, l), 
>>> bad_licenses)
>>> -    bad_licenses = expand_wildcard_licenses(d, bad_licenses)
>>> -
>>>       build_images_from_feeds = d.getVar('BUILD_IMAGES_FROM_FEEDS', 
>>> True)
>>>       if build_images_from_feeds == "1":
>>>           return 0
>>>   +    # Files that are installed in the rootfs
>>>       pkg_dic = {}
>>>       for pkg in image_list_installed_packages(d).split("\n"):
>>>           pkg_info = os.path.join(d.getVar('PKGDATA_DIR', True),
>>> @@ -49,8 +45,90 @@ python license_create_manifest() {
>>>               pkg_lic_name = "LICENSE_" + pkg_name
>>>               pkg_dic[pkg_name]["LICENSE"] = 
>>> pkg_dic[pkg_name][pkg_lic_name]
>>>   -    license_manifest = os.path.join(d.getVar('LICENSE_DIRECTORY', 
>>> True),
>> Will be better to move this code into another function like 
>> image_list_installed_package to
>> re-utilize if needed in other parts of the code base.
>>
> It's a good idea, let me work in that and I will send another patch 
> implementing this.
>

On a second thought, it won't be a reliable because it needs the 
BB_TASKDEPDATA for do_rootfs.

This is needed because there are some virtual dependency in the image 
creation, such as virtual/kernel,
virtual/bootloader and the only way to get what package provides such 
dependency is using BB_TASKDEPDATA.
If the function would be called from the do_rootfs task, it would work, 
otherwise it would fail. So I think
it's better to keep it this way.

>> --------------------------------------------------------------------------------------------------------- 
>>
>>> +    # Files that are part of the image but no installed in rootfs
>>> +    imgpkg_dic = {}
>>> +    taskdepdata = d.getVar("BB_TASKDEPDATA", True)
>>> +    all_depends = imagetypes_getdepends(d)
>>> +    all_depends += " %s" % d.getVar("EXTRA_IMAGEDEPENDS", True)
>>> +    for depend in all_depends.split():
>>> +        # Get package name without task
>>> +        depend = depend.split(":")[0]
>>> +        if not depend.endswith("native"):
>>> +            pkgs_file = os.path.join(
>>> +                    d.getVar('PKGDATA_DIR', True), depend)
>>> +            # Search for the file on the installed packages with the
>>> +            # same name as depend if not found fallback to search
>>> +            # the provider for that depend.
>>> +            if not os.path.isfile(pkgs_file):
>>> +                pkgs_file = ""
>>> +                for taskdep in taskdepdata.itervalues():
>>> +                    # The fifth field of BB_TASKDEPDATA is PROVIDES
>>> +                    if depend in taskdep[4]:
>>> +                        pkgs_file = os.path.join(
>>> +                                d.getVar('PKGDATA_DIR', True),
>>> +                                taskdep[0])
>>> +                        if os.path.isfile(pkgs_file):
>>> +                            break
>>> +                        else:
>>> +                            pkgs_file = ""
>>> +            if pkgs_file:
>>> +                pkgs_dep = oe.packagedata.read_pkgdatafile(pkgs_file)
>>> +                # There is no need to duplicate license info for
>>> +                # derivated packages or packages in the other
>>> +                # license manifest
>>> +                for pkg in pkgs_dep['PACKAGES'].split():
>>> +                    if (pkg.endswith("-dbg") or
>>> +                            pkg.endswith("-dev") or
>>> +                            pkg.endswith("-doc") or
>>> +                            pkg.endswith("-locale") or
>>> +                            pkg.endswith("-localedata") or
>>> +                            pkg.endswith("-staticdev") or
>>> +                            pkg in pkg_dic.keys()):
>>> +                        continue
>>> +                    pkg_data_file = os.path.join(
>>> +                            d.getVar('PKGDATA_DIR', True),
>>> +                            "runtime", pkg)
>>> +                    pkg_data = oe.packagedata.read_pkgdatafile(
>>> +                            pkg_data_file)
>>> +                    pkg_pe = pkg_data.get("PE","0")
>>> +                    if pkg_pe is "0":
>>> +                        pkg_pf = "%s-%s" % (pkg_data["PV"], 
>>> pkg_data["PR"])
>>> +                    else:
>>> +                        pkg_pf = "%s_%s-%s" % (pkg_pe,
>>> +                                pkg_data["PV"], pkg_data["PR"])
>>> +                    # There is no need to add the license for
>>> +                    # packages that were not deployed
>>> +                    pkg_deploy = os.path.join(
>>> +                            d.getVar("TMPDIR", True), "work",
>>> +                            d.getVar("MULTIMACH_TARGET_SYS", True),
>>> +                            pkg_data["PN"], pkg_pf, "temp", 
>>> "run.do_deploy")
>>> +                    if os.path.isfile(pkg_deploy):
>>> +                        imgpkg_dic[pkg] = pkg_data
>>> +                        if not "LICENSE" in imgpkg_dic[pkg].keys():
>>> +                            pkg_lic_name = "LICENSE_%s" % pkg
>>> +                            imgpkg_dic[pkg]["LICENSE"] = \
>>> + imgpkg_dic[pkg][pkg_lic_name]
>>> +            # If for some reason, couldn't find the provider
>>> +            # print a warning to add the license manually
>>> +            else:
>>> +                bb.warn("Couldn't find packages that provides "
>>> +                        "%s, please add licenses manually" % depend)
>> --------------------------------------------------------------------------------------------------------- 
>>
>>> +
>>> +    rootfs_license_manifest = 
>>> os.path.join(d.getVar('LICENSE_DIRECTORY', True),
>>>                           d.getVar('IMAGE_NAME', True), 
>>> 'license.manifest')
>>> +    image_license_manifest = 
>>> os.path.join(d.getVar('LICENSE_DIRECTORY', True),
>>> +                        d.getVar('IMAGE_NAME', True), 
>>> 'image_license.manifest')
>>> +    write_license_files(d, rootfs_license_manifest, pkg_dic)
>>> +    write_license_files(d, image_license_manifest, imgpkg_dic)
>>> +}
>>> +
>>> +def write_license_files(d, license_manifest, pkg_dic):
>>> +    import re
>>> +
>>> +    bad_licenses = (d.getVar("INCOMPATIBLE_LICENSE", True) or 
>>> "").split()
>>> +    bad_licenses = map(lambda l: canonical_license(d, l), 
>>> bad_licenses)
>>> +    bad_licenses = expand_wildcard_licenses(d, bad_licenses)
>>> +
>>>       with open(license_manifest, "w") as license_file:
>>>           for pkg in sorted(pkg_dic):
>>>               if bad_licenses:
>>> @@ -98,15 +176,16 @@ python license_create_manifest() {
>>>       if copy_lic_manifest == "1":
>>>           rootfs_license_dir = os.path.join(d.getVar('IMAGE_ROOTFS', 
>>> 'True'),
>>>                                   'usr', 'share', 'common-licenses')
>>> -        os.makedirs(rootfs_license_dir)
>>> +        bb.utils.mkdirhier(rootfs_license_dir)
>>>           rootfs_license_manifest = os.path.join(rootfs_license_dir,
>>> - 'license.manifest')
>>> +                os.path.split(license_manifest)[1])
>> Why split this manifest path?
>>> +
>>>           os.link(license_manifest, rootfs_license_manifest)
>>>             if copy_lic_dirs == "1":
>>>               for pkg in sorted(pkg_dic):
>>>                   pkg_rootfs_license_dir = 
>>> os.path.join(rootfs_license_dir, pkg)
>>> -                os.makedirs(pkg_rootfs_license_dir)
>>> +                bb.utils.mkdirhier(pkg_rootfs_license_dir)
>>>                   pkg_license_dir = 
>>> os.path.join(d.getVar('LICENSE_DIRECTORY', True),
>>> pkg_dic[pkg]["PN"])
>>>                   licenses = os.listdir(pkg_license_dir)
>>> @@ -124,14 +203,16 @@ python license_create_manifest() {
>>>                           if not os.path.exists(rootfs_license):
>>>                               os.link(pkg_license, rootfs_license)
>>>   -                        os.symlink(os.path.join('..', lic), 
>>> pkg_rootfs_license)
>>> +                        if not os.path.exists(pkg_rootfs_license):
>> Why test if exist?, this code creates symlink into recipe license.
>>> + os.symlink(os.path.join('..', lic), pkg_rootfs_license)
>>>                       else:
>>> -                        if oe.license.license_ok(canonical_license(d,
>>> -                            lic), bad_licenses) == False:
>>> +                        if 
>>> ((oe.license.license_ok(canonical_license(d,
>>> +                            lic), bad_licenses) == False) or
>>> + os.path.exists(pkg_rootfs_license)):
>> Why test if exist?.
>>>                               continue
>>>                             os.link(pkg_license, pkg_rootfs_license)
>>> -}
>>> +
>>>     python do_populate_lic() {
>>>       """
>>
>> Cheers,
>>     alimon
>>
> Regards,
>
> Mariano Lopez
Regards,

Mariano Lopez


  reply	other threads:[~2015-08-04 14:04 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-08-03 11:59 [PATCH 0/1] Creates manifest/license files for deployed packages not in rootfs mariano.lopez
2015-08-03 11:59 ` [PATCH 1/1] license.bbclass: Add support " mariano.lopez
2015-08-03 20:20   ` Aníbal Limón
2015-08-03 20:37     ` Mariano Lopez
2015-08-04 14:04       ` Mariano Lopez [this message]
2015-08-04 14:44         ` Aníbal Limón

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=55C0C656.4000004@linux.intel.com \
    --to=mariano.lopez@linux.intel.com \
    --cc=anibal.limon@linux.intel.com \
    --cc=openembedded-core@lists.openembedded.org \
    --cc=paul.eggleton@linux.intel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox