diff options
author | Beth Flanagan <elizabeth.flanagan@intel.com> | 2011-01-27 11:25:12 -0800 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2011-01-28 16:49:13 +0000 |
commit | 4bda50f28919d62410feabae530e6f7186812938 (patch) | |
tree | ec30b488327016be64009b6d185be2b3e1e349fd /meta/classes | |
parent | c7b489c22bcf7f0e062f4dd1c4040928cd71883a (diff) | |
download | ast2050-yocto-poky-4bda50f28919d62410feabae530e6f7186812938.zip ast2050-yocto-poky-4bda50f28919d62410feabae530e6f7186812938.tar.gz |
Initial commit of license reporting:
This is an intial commit for the license reporting system. A few notes:
The LICENSE fields needs to be standardized throughout poky. As it
stands, we throw a warning if the license file is not found (either
because it does not exist or because LICENSE_FILE_CHKSUM is munged)
in the generic license directory. This should eventually become an
error.
I've seen a few places where Apache-v2.0 is written differently and
I'm sure this will throw the above warning. This does not put the
license data on the rootfs. Also, I provide both the actual license
text and a link to the best guess of the generic_license. That guessing
is not very robust and I'm loath to get into a bunch of pattern matching
rather than standardize LICENSE.
This adds one new param to poky.conf and one new to license.bbclass:
LICENSE_DIR: the base directory we copy all the license results to (set
in license.bbclass)
COMMON_LICENSE_DIR: this is the directory that holds all the common
generic license files. currently meta/files/common-licenses (set in
poky.conf)
TODO:
- We should verify the common-licenses. I stripped these from my Ubuntu
10.10 system.
- We should allow the capability of licenses on the rootfs, although the
resulting image created would be a lot larger.
- More common-licenses. I don't include bzip, zlib, ICS.... I should,
but that means tracking down a lot of licenses.
- General cleanup of licensing and standardization of names. We should
standardize on a naming convention. What's in licenses.conf should
match up with what is in the recipes which should match with what is
in common-licenses. Outside the scope of this though. See:
http://bugzilla.pokylinux.org/show_bug.cgi?id=650
Diffstat (limited to 'meta/classes')
-rw-r--r-- | meta/classes/license.bbclass | 101 |
1 files changed, 101 insertions, 0 deletions
diff --git a/meta/classes/license.bbclass b/meta/classes/license.bbclass new file mode 100644 index 0000000..ddedd57 --- /dev/null +++ b/meta/classes/license.bbclass @@ -0,0 +1,101 @@ +# Populates LICENSE_DIRECTORY as set in poky.conf with the license files as set by +# LIC_FILES_CHKSUM. +# TODO: +# - We should also enable the ability to put the generated license directory onto the +# rootfs +# - Gather up more generic licenses +# - There is a real issue revolving around license naming standards. See license names +# licenses.conf and compare them to the license names in the recipes. You'll see some +# differences and that should be corrected. + +LICENSE_DIRECTORY ??= "${DEPLOY_DIR_IMAGE}/licenses" + +addtask populate_lic after do_patch before do_package +do_populate_lic[nostamp] = "1" +python do_populate_lic() { + """ + Populate LICENSE_DIRECTORY with licenses. + """ + import os + import bb + import shutil + + # All the license types for the package + license_types = bb.data.getVar('LICENSE', d, True) + # All the license files for the package + lic_files = bb.data.getVar('LIC_FILES_CHKSUM', d, True) + pn = bb.data.getVar('PN', d, True) + # The base directory we wrangle licenses to + destdir = os.path.join(bb.data.getVar('LICENSE_DIRECTORY', d, True), pn) + # The license files are located in S/LIC_FILE_CHECKSUM. + srcdir = bb.data.getVar('S', d, True) + # Directory we store the generic licenses as set in poky.conf + generic_directory = bb.data.getVar('COMMON_LICENSE_DIR', d, True) + if not generic_directory: + raise bb.build.FuncFailed("COMMON_LICENSE_DIR is unset. Please set this in your distro config") + + try: + # Let's try to clean up the packages license directory + shutil.rmtree(destdir) + except: + pass + + try: + # Create the package license directory structure. + bb.mkdirhier(destdir) + except: + pass + + if not lic_files: + # No recipe should have an invalid license file. This is checked else + # where, but let's be pedantic + bb.note(pn + ": Recipe file does not have license file information.") + return True + + for url in lic_files.split(): + (type, host, path, user, pswd, parm) = bb.decodeurl(url) + # We want the license file to be copied into the destination + srclicfile = os.path.join(srcdir, path) + ret = bb.copyfile(srclicfile, os.path.join(destdir, os.path.basename(path))) + # If the copy didn't occur, something horrible went wrong and we fail out + if ret is False or ret == 0: + bb.warn("%s could not be copied for some reason. It may not exist. WARN for now." % srclicfile) + + # This takes some explaining.... we now are going to go an try to symlink + # to a generic file. But, with the way LICENSE works, a package can have multiple + # licenses. Some of them are, for example, GPLv2+, which means it can use that version + # of GPLv2 specified in it's license, or a later version of GPLv2. For the purposes of + # what we're doing here, we really don't track license revisions (although we may want to) + # So, we strip out the + and link to a generic GPLv2 + # + # That said, there are some entries into LICENSE that either have no generic (bzip, zlib, ICS) + # or the LICENSE is messy (Apache 2.0 .... when they mean Apache-2.0). This should be corrected + # but it's outside of scope for this. + # + # Also, you get some clever license fields with logic in the field. + # I'm sure someone has written a logic parser for these fields, but if so, I don't know where it is. + # So what I do is just link to every license mentioned in the license field. + + for license_type in license_types.replace('&', '').replace('+', '').replace('&', '').replace('(', '').replace(')', '').split(): + if os.path.isfile(os.path.join(generic_directory, license_type)): + gen_lic_dest = os.path.join(bb.data.getVar('LICENSE_DIRECTORY', d, True), "common-licenses") + try: + bb.mkdirhier(gen_lic_dest) + except: + pass + + try: + bb.copyfile(os.path.join(generic_directory, license_type), os.path.join(gen_lic_dest, license_type)) + except: + bb.warn("%s: No generic license file exists for: %s at %s" % (pn, license_type, generic_directory)) + pass + try: + os.symlink(os.path.join(gen_lic_dest, license_type), os.path.join(destdir, "generic_" + license_type)) + except: + bb.warn("%s: No generic license file exists for: %s at %s" % (pn, license_type, generic_directory)) + pass + else: + bb.warn("%s: Something went wrong with copying: %s to %s" % (pn, license_type, generic_directory)) + bb.warn("This could be either because we do not have a generic for this license or the LICENSE field is incorrect") + pass +} |