[OE-core] [PATCH 1/1] license.bbclass: Add support for deployed packages not in rootfs
Aníbal Limón
anibal.limon at linux.intel.com
Tue Aug 4 14:44:34 UTC 2015
On 04/08/15 09:04, Mariano Lopez wrote:
>
>
> 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 at linux.intel.com wrote:
>>>> From: Mariano Lopez <mariano.lopez at 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 at 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.
It's that the case, can you define this function outside
license_create_manifest but in the same file for split the functionality?.
alimon
>
>>> ---------------------------------------------------------------------------------------------------------
>>>
>>>> + # 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
More information about the Openembedded-core
mailing list