From: "Aníbal Limón" <anibal.limon@linux.intel.com>
To: "Flanagan, Elizabeth" <elizabeth.flanagan@intel.com>
Cc: Patches and discussions about the oe-core layer
<openembedded-core@lists.openembedded.org>
Subject: Re: [PATCH 1/3] license_class: Reimplemented manifest creation in python
Date: Fri, 08 May 2015 15:38:04 -0500 [thread overview]
Message-ID: <554D1EAC.50309@linux.intel.com> (raw)
In-Reply-To: <CAPhnLPDnUyLb1U=EpE-yV8rgGh+amVddjNDzbExWGgD0TNmOQg@mail.gmail.com>
Hi,
I tested also using SSTATE and works good, see my comments below.
On 08/05/15 12:30, Flanagan, Elizabeth wrote:
> On 6 May 2015 at 15:52, Aníbal Limón <anibal.limon@linux.intel.com> wrote:
>> Reimplemented license_manifest_create from shell to python for
>> INCOMPATIBLE_LICENSE handle using oe.license module.
>>
>> Optimizations are made to avoid license copy now uses a hardlink
>> and symbolic link this helps to save space during build.
>>
>> Signed-off-by: Aníbal Limón <anibal.limon@linux.intel.com>
>> ---
>> meta/classes/license.bbclass | 163 ++++++++++++++++++++++---------------------
>> 1 file changed, 82 insertions(+), 81 deletions(-)
>>
>> diff --git a/meta/classes/license.bbclass b/meta/classes/license.bbclass
>> index d9409a9..975867d 100644
>> --- a/meta/classes/license.bbclass
>> +++ b/meta/classes/license.bbclass
>> @@ -25,87 +25,88 @@ python write_package_manifest() {
>> 'w+').write(image_list_installed_packages(d))
>> }
>>
>> -license_create_manifest() {
>> - # Test if BUILD_IMAGES_FROM_FEEDS is defined in env
>> - if [ -n "${BUILD_IMAGES_FROM_FEEDS}" ]; then
>> - exit 0
>> - fi
>> -
>> - INSTALLED_PKGS=`cat ${LICENSE_DIRECTORY}/${IMAGE_NAME}/package.manifest`
>> - LICENSE_MANIFEST="${LICENSE_DIRECTORY}/${IMAGE_NAME}/license.manifest"
>> - # remove existing license.manifest file
>> - if [ -f ${LICENSE_MANIFEST} ]; then
>> - rm ${LICENSE_MANIFEST}
>> - fi
>> - touch ${LICENSE_MANIFEST}
>> - for pkg in ${INSTALLED_PKGS}; do
>> - filename=`ls ${PKGDATA_DIR}/runtime-reverse/${pkg}| head -1`
>> - pkged_pn="$(sed -n 's/^PN: //p' ${filename})"
>> -
>> - # check to see if the package name exists in the manifest. if so, bail.
>> - if grep -q "^PACKAGE NAME: ${pkg}" ${LICENSE_MANIFEST}; then
>> - continue
>> - fi
>> -
>> - pkged_pv="$(sed -n 's/^PV: //p' ${filename})"
>> - pkged_name="$(basename $(readlink ${filename}))"
>> - pkged_lic="$(sed -n "/^LICENSE_${pkged_name}: /{ s/^LICENSE_${pkged_name}: //; p }" ${filename})"
>> - pkged_size="$(sed -n "/^PKGSIZE_${pkged_name}: /{ s/^PKGSIZE_${pkged_name}: //; p }" ${filename})"
>> - if [ -z "${pkged_lic}" ]; then
>> - # fallback checking value of LICENSE
>> - pkged_lic="$(sed -n "/^LICENSE: /{ s/^LICENSE: //; p }" ${filename})"
>> - fi
>> -
>> - echo "PACKAGE NAME:" ${pkg} >> ${LICENSE_MANIFEST}
>> - echo "PACKAGE VERSION:" ${pkged_pv} >> ${LICENSE_MANIFEST}
>> - echo "RECIPE NAME:" ${pkged_pn} >> ${LICENSE_MANIFEST}
>> - echo "LICENSE:" ${pkged_lic} >> ${LICENSE_MANIFEST}
>> - echo "" >> ${LICENSE_MANIFEST}
>> -
>> - # If the package doesn't contain any file, that is, its size is 0, the license
>> - # isn't relevant as far as the final image is concerned. So doing license check
>> - # doesn't make much sense, skip it.
>> - if [ "$pkged_size" = "0" ]; then
>> - continue
>> - fi
>> -
>> - lics="$(echo ${pkged_lic} | sed "s/[|&()*]/ /g" | sed "s/ */ /g" )"
>> - for lic in ${lics}; do
>> - # to reference a license file trim trailing + symbol
>> - if ! [ -e "${LICENSE_DIRECTORY}/${pkged_pn}/generic_${lic%+}" ]; then
>> - bbwarn "The license listed ${lic} was not in the licenses collected for ${pkged_pn}"
>> - fi
>> - done
>> - done
>> -
>> - # Two options here:
>> - # - Just copy the manifest
>> - # - Copy the manifest and the license directories
>> - # With both options set we see a .5 M increase in core-image-minimal
>> - if [ "${COPY_LIC_MANIFEST}" = "1" ]; then
>> - mkdir -p ${IMAGE_ROOTFS}/usr/share/common-licenses/
>> - cp ${LICENSE_MANIFEST} ${IMAGE_ROOTFS}/usr/share/common-licenses/license.manifest
>> - if [ "${COPY_LIC_DIRS}" = "1" ]; then
>> - for pkg in ${INSTALLED_PKGS}; do
>> - mkdir -p ${IMAGE_ROOTFS}/usr/share/common-licenses/${pkg}
>> - pkged_pn="$(oe-pkgdata-util -p ${PKGDATA_DIR} lookup-recipe ${pkg})"
>> - for lic in `ls ${LICENSE_DIRECTORY}/${pkged_pn}`; do
>> - # Really don't need to copy the generics as they're
>> - # represented in the manifest and in the actual pkg licenses
>> - # Doing so would make your image quite a bit larger
>> - if [ "${lic#generic_}" = "${lic}" ]; then
>> - cp ${LICENSE_DIRECTORY}/${pkged_pn}/${lic} ${IMAGE_ROOTFS}/usr/share/common-licenses/${pkg}/${lic}
>> - else
>> - if [ ! -f ${IMAGE_ROOTFS}/usr/share/common-licenses/${lic} ]; then
>> - cp ${LICENSE_DIRECTORY}/${pkged_pn}/${lic} ${IMAGE_ROOTFS}/usr/share/common-licenses/
>> - fi
>> - ln -sf ../${lic} ${IMAGE_ROOTFS}/usr/share/common-licenses/${pkg}/${lic}
>> - fi
>> - done
>> - done
>> - fi
>> - fi
>> -
>> +python license_create_manifest() {
>> + import re
>> + import oe.packagedata
>> +
>> + build_images_from_feeds = d.getVar('BUILD_IMAGES_FROM_FEEDS', True)
>> + if build_images_from_feeds == "1":
>> + return 0
>> +
>> + pkg_dic = {}
>> + package_manifest = os.path.join(d.getVar('LICENSE_DIRECTORY', True),
>> + d.getVar('IMAGE_NAME', True), 'package.manifest')
> Why aren't you using [image|sdk]_list_installed_packages to get the
> package list here?
I made this change sending v3.
Cheers,
alimon
>> + with open(package_manifest, "r") as package_file:
>> + pkg_list = package_file.read().split()
>> + for pkg in pkg_list:
>> + pkg_info = os.path.join(d.getVar('PKGDATA_DIR', True),
>> + 'runtime-reverse', pkg)
>> + pkg_name = os.path.basename(os.readlink(pkg_info))
>> +
>> + pkg_dic[pkg_name] = oe.packagedata.read_pkgdatafile(pkg_info)
>> + if not "LICENSE" in pkg_dic[pkg_name].keys():
>> + 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),
>> + d.getVar('IMAGE_NAME', True), 'license.manifest')
>> + with open(license_manifest, "w") as license_file:
>> + for pkg in sorted(pkg_dic):
>> + license_file.write("PACKAGE NAME: %s\n" % pkg)
>> + license_file.write("PACKAGE VERSION: %s\n" % pkg_dic[pkg]["PV"])
>> + license_file.write("RECIPE NAME: %s\n" % pkg_dic[pkg]["PN"])
>> + license_file.write("LICENSE: %s\n\n" % pkg_dic[pkg]["LICENSE"])
>> +
>> + # If the package doesn't contain any file, that is, its size is 0, the license
>> + # isn't relevant as far as the final image is concerned. So doing license check
>> + # doesn't make much sense, skip it.
>> + if pkg_dic[pkg]["PKGSIZE_%s" % pkg] == "0":
>> + continue
>> +
>> + licenses = re.sub('[|&()*]', '', pkg_dic[pkg]["LICENSE"])
>> + licenses = re.sub(' *', ' ', licenses)
>> + for lic in licenses.split():
>> + lic_file = os.path.join(d.getVar('LICENSE_DIRECTORY', True),
>> + pkg_dic[pkg]["PN"], "generic_%s" %
>> + re.sub('\+', '', lic))
>> + if not os.path.exists(lic_file):
>> + bb.warn("The license listed %s was not in the "\
>> + "licenses collected for recipe %s"
>> + % (lic, pkg_dic[pkg]["PN"]))
>> +
>> + # Two options here:
>> + # - Just copy the manifest
>> + # - Copy the manifest and the license directories
>> + # With both options set we see a .5 M increase in core-image-minimal
>> + copy_lic_manifest = d.getVar('COPY_LIC_MANIFEST', True)
>> + copy_lic_dirs = d.getVar('COPY_LIC_DIRS', True)
>> + 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)
>> + rootfs_license_manifest = os.path.join(rootfs_license_dir,
>> + 'license.manifest')
>> + 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)
>> + pkg_license_dir = os.path.join(d.getVar('LICENSE_DIRECTORY', True),
>> + pkg_dic[pkg]["PN"])
>> + licenses = os.listdir(pkg_license_dir)
>> + for lic in licenses:
>> + rootfs_license = os.path.join(rootfs_license_dir, lic)
>> + pkg_license = os.path.join(pkg_license_dir, lic)
>> + pkg_rootfs_license = os.path.join(pkg_rootfs_license_dir, lic)
>> +
>> + if re.match("^generic_.*$", lic):
>> + if not os.path.exists(rootfs_license):
>> + os.link(pkg_license, rootfs_license)
>> +
>> + os.symlink(os.path.join('..', lic), pkg_rootfs_license)
>> + else:
>> + os.link(pkg_license, pkg_rootfs_license)
>> }
>>
>> python do_populate_lic() {
>> --
>> 1.8.4.5
>>
>
>
next prev parent reply other threads:[~2015-05-08 20:37 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-05-06 14:52 [PATCH 0/3] Add support to handle INCOMPATIBLE_LICENSE Aníbal Limón
2015-05-06 14:52 ` [PATCH 1/3] license_class: Reimplemented manifest creation in python Aníbal Limón
2015-05-08 17:30 ` Flanagan, Elizabeth
2015-05-08 20:38 ` Aníbal Limón [this message]
2015-05-06 14:52 ` [PATCH 2/3] license_class: Generalize license_ok function Aníbal Limón
2015-05-06 14:52 ` [PATCH 3/3] license: Add support for handle INCOMPATIBLE_LICENSE in manifest creation 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=554D1EAC.50309@linux.intel.com \
--to=anibal.limon@linux.intel.com \
--cc=elizabeth.flanagan@intel.com \
--cc=openembedded-core@lists.openembedded.org \
/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