Skip to contentSkip to conversation

License Consolidated Pull

PATCH Applied Beth Flanagan 9 participants 34 messages Dec 7, 2011 – Oct 2, 2012

lore
Share & tools
lore
#0 lore raw

cover License Consolidated Pull

These are the changes from the RFCs Chris Larson and I sent out this weekend merged into one branch along with a gettext minimal fix from RP. I've trimmed the diffs in the PULL down some as there are a number of license text diffs that cause send-patch-request to choke.

The following changes since commit f17e0ae38b2e6c4cbe7f0f9d76c3e1a386335fd1:

conf/machine: Don't poke around providers which aren't machine specific/safe (2011-12-06 22:47:09 +0000)

are available in the git repository at:
git://git.yoctoproject.org/poky-contrib eflanagan/consolidated_license
http://git.yoctoproject.org/cgit.cgi/poky-contrib/log/?h=eflanagan/consolidated_license

Christopher Larson (4):
oe.test_types: move into an oe.tests package
license: split license parsing into oe.license
oe.license: add license flattening code
Add copyleft compliance class

Elizabeth Flanagan (3):
[YOCTO #1776] license: manifest and license path OECore license fixes: meta/* package.bbclass: Adding license collection

Richard Purdie (1):
gettext-minimal-native: Fix License

 meta/classes/copyleft_compliance.bbclass           |   94 +++
 meta/classes/license.bbclass                       |  258 +++++---
 meta/classes/package.bbclass                       |    1 +
 meta/conf/licenses.conf                            |   54 ++-
 meta/files/common-licenses/AFL-1                   |   92 ---
 meta/files/common-licenses/AFL-2                   |  155 -----
 meta/files/common-licenses/AGPL-3                  |  213 ------
 meta/files/common-licenses/APL-1                   |  327 ----------
 meta/files/common-licenses/APSL-1                  |  334 ----------
 meta/files/common-licenses/APSL-2                  |  337 ----------
 meta/files/common-licenses/Adobe                   |   14 +
 meta/files/common-licenses/Apache-1                |   59 --
 meta/files/common-licenses/Apache-2                |  203 ------
 meta/files/common-licenses/Artistic                |  131 ----
 meta/files/common-licenses/Artistic-1              |   97 ---
 meta/files/common-licenses/Artistic-2              |  202 ------
 meta/files/common-licenses/BSL-1                   |   25 -
 meta/files/common-licenses/BitstreamVera           |  160 +++++
 meta/files/common-licenses/CATOSL-1                |  335 ----------
 meta/files/common-licenses/CC-BY-1                 |  185 ------
 meta/files/common-licenses/CC-BY-2                 |  205 ------
 meta/files/common-licenses/CC-BY-3                 |  283 --------
 meta/files/common-licenses/CC-BY-NC-1              |  194 ------
 meta/files/common-licenses/CC-BY-NC-2              |  220 -------
 meta/files/common-licenses/CC-BY-NC-3              |  297 ---------
 meta/files/common-licenses/CC-BY-NC-ND-1           |  146 -----
 meta/files/common-licenses/CC-BY-NC-ND-2           |  209 ------
 meta/files/common-licenses/CC-BY-NC-ND-3           |  272 --------
 meta/files/common-licenses/CC-BY-NC-SA-1           |  209 ------
 meta/files/common-licenses/CC-BY-NC-SA-2           |  242 -------
 meta/files/common-licenses/CC-BY-NC-SA-3           |  320 ---------
 meta/files/common-licenses/CC-BY-ND-2              |  194 ------
 meta/files/common-licenses/CC-BY-ND-3              |  259 --------
 meta/files/common-licenses/CC-BY-SA-1              |  201 ------
 meta/files/common-licenses/CC-BY-SA-2              |  227 -------
 meta/files/common-licenses/CC-BY-SA-3              |  319 ---------
 meta/files/common-licenses/CDDL-1                  |  313 ---------
 meta/files/common-licenses/CECILL-1                |  462 -------------
 meta/files/common-licenses/CECILL-2                |  451 -------------
 meta/files/common-licenses/CPAL-1                  |  435 -------------
 meta/files/common-licenses/CPL-1                   |  250 -------
 meta/files/common-licenses/CUA-OPL-1               |  482 --------------
 meta/files/common-licenses/DSSSL                   |   49 ++
 meta/files/common-licenses/ECL-1                   |   61 --
 meta/files/common-licenses/ECL-2                   |  218 -------
 meta/files/common-licenses/EDL-1.0                 |   13 +
 meta/files/common-licenses/EFL-1                   |   30 -
 meta/files/common-licenses/EFL-2                   |   27 -
 meta/files/common-licenses/EPL-1                   |  204 ------
 meta/files/common-licenses/EUPL-1                  |  302 ---------
 meta/files/common-licenses/Elfutils-Exception      |   12 +
 meta/files/common-licenses/ErlPL-1                 |  293 ---------
 meta/files/common-licenses/FSF-Unlimited           |    4 +
 meta/files/common-licenses/Frameworx-1             |  181 ------
 meta/files/common-licenses/FreeType                |  170 +++++
 meta/files/common-licenses/GPL-1                   |  259 --------
 meta/files/common-licenses/GPL-1.0+                |  252 --------
 meta/files/common-licenses/GPL-2                   |   23 -
 .../common-licenses/GPL-2,0-with-GCC-exception     |   17 -
 .../common-licenses/GPL-2,0-with-font-exception    |   18 -
 meta/files/common-licenses/GPL-2.0+                |  132 ----
 .../common-licenses/GPL-2.0-with-GCC-exception     |   13 +-
 .../common-licenses/GPL-2.0-with-font-exception    |   14 +-
 meta/files/common-licenses/GPL-3                   |   70 --
 meta/files/common-licenses/GPL-3.0                 |  224 +++++++-
 meta/files/common-licenses/GPL-3.0+                |    3 -
 meta/files/common-licenses/IPL-1                   |  222 -------
 meta/files/common-licenses/LGPL-2                  |  461 -------------
 meta/files/common-licenses/LGPL-2.0                |  189 +++++-
 meta/files/common-licenses/LGPL-2.0+               |  173 -----
 meta/files/common-licenses/LGPL-2.1+               |  176 -----
 meta/files/common-licenses/LGPL-3                  |  147 -----
 meta/files/common-licenses/LGPL-3.0                |   53 +-
 meta/files/common-licenses/LGPL-3.0+               |   66 --
 meta/files/common-licenses/LPL-1                   |  213 ------
 meta/files/common-licenses/LPPL-1                  |  422 ------------
 meta/files/common-licenses/MIT-style               |    1 -
 meta/files/common-licenses/MPL-1                   |  433 -------------
 meta/files/common-licenses/NASA-1                  |  246 -------
 meta/files/common-licenses/NPOSL-3                 |  206 ------
 meta/files/common-licenses/OASIS                   |   13 +
 meta/files/common-licenses/OCLC-2                  |  207 ------
 meta/files/common-licenses/OFL-1                   |   96 ---
 meta/files/common-licenses/OLDAP-2                 |   54 --
 meta/files/common-licenses/OSL-1                   |  172 -----
 meta/files/common-licenses/OSL-1.0                 |    2 +-
 meta/files/common-licenses/OSL-2                   |  171 -----
 meta/files/common-licenses/OSL-3                   |  157 -----
 meta/files/common-licenses/PHP-3                   |   70 --
 meta/files/common-licenses/Proprietary             |    1 +
 meta/files/common-licenses/Python-2                |  192 ------
 meta/files/common-licenses/QPL-1                   |   96 ---
 meta/files/common-licenses/RPL-1                   |  582 -----------------
 meta/files/common-licenses/RPSL-1                  |  535 ---------------
 meta/files/common-licenses/SPL                     |  519 ---------------
 meta/files/common-licenses/Simple-2                |   53 --
 meta/files/common-licenses/UCB                     |   26 +
 meta/files/common-licenses/VSL-1                   |   54 --
 meta/files/common-licenses/Watcom-1                |  389 -----------
 meta/files/common-licenses/XFree86-1               |   50 --
 meta/files/common-licenses/YPL-1                   |  140 ----
 meta/files/common-licenses/ZPL-1                   |   60 --
 meta/files/common-licenses/ZPL-2                   |   44 --
 meta/files/common-licenses/Zimbra-1                |  140 ----
 meta/files/common-licenses/eCos-2                  |   38 --
 meta/lib/oe/license.py                             |   62 ++
 .../CC-BY-ND-1 => lib/oe/tests/__init__.py}        |    0
 meta/lib/oe/tests/test_license.py                  |   68 ++
 meta/lib/oe/{ => tests}/test_types.py              |    0
 .../base-files/base-files/licenses/Artistic        |  131 ----
 .../base-files/base-files/licenses/BSD             |   26 -
 .../base-files/base-files/licenses/GFDL-1.2        |  397 ------------
 .../base-files/base-files/licenses/GPL-3           |  676 -------------------
 .../base-files/base-files/licenses/LGPL-2          |  481 --------------
 .../base-files/base-files/licenses/LGPL-2.1        |  510 ---------------
 .../base-files/base-files/licenses/LGPL-3          |  165 -----
 meta/recipes-core/base-files/base-files_3.0.14.bb  |   20 +-
 meta/recipes-core/busybox/busybox.inc              |    3 +-
 meta/recipes-core/busybox/busybox_1.19.3.bb        |    2 +-
 .../gettext/gettext-minimal-0.18.1.1/COPYING       |  678 +-------------------
 .../gettext/gettext-minimal-native_0.18.1.1.bb     |    4 +-
 meta/recipes-core/gettext/gettext_0.18.1.1.bb      |    4 +-
 meta/recipes-core/jpeg/jpeg_8c.bb                  |    4 +-
 meta/recipes-devtools/elfutils/elfutils_0.148.bb   |    4 +-
 meta/recipes-devtools/python/python-pyrex_0.9.9.bb |    4 +-
 .../squashfs-tools/squashfs-tools_4.2.bb           |    4 +-
 meta/recipes-devtools/tcf-agent/tcf-agent_svn.bb   |    4 +-
 meta/recipes-devtools/tcltk/tcl_8.5.11.bb          |    4 +-
 .../transfig/transfig-native_3.2.5d.bb             |    4 +-
 meta/recipes-extended/byacc/byacc_20110908.bb      |   10 +-
 meta/recipes-extended/bzip2/bzip2_1.0.6.bb         |    4 +-
 meta/recipes-extended/less/less_444.bb             |    7 +-
 .../tcp-wrappers/tcp-wrappers_7.6.bb               |    4 +-
 meta/recipes-extended/unzip/unzip_6.0.bb           |    4 +-
 meta/recipes-extended/xinetd/xinetd_2.3.14.bb      |    5 +-
 meta/recipes-extended/zip/zip.inc                  |    2 +-
 meta/recipes-extended/zip/zip_3.0.bb               |    2 +-
 .../recipes-gnome/gnome/gnome-icon-theme_2.31.0.bb |    4 +-
 meta/recipes-graphics/clutter/clutter-box2d.inc    |    2 +-
 meta/recipes-graphics/clutter/clutter-box2d_git.bb |    2 +-
 meta/recipes-graphics/freetype/freetype_2.4.6.bb   |    4 +-
 .../ttf-fonts/ttf-bitstream-vera_1.10.bb           |    4 +-
 meta/recipes-graphics/xorg-app/xrandr_1.3.5.bb     |    4 +-
 .../recipes-graphics/xorg-font/font-alias_1.0.3.bb |    4 +-
 meta/recipes-graphics/xorg-font/font-util_1.2.0.bb |    5 +-
 .../linux-firmware/linux-firmware_git.bb           |    5 +
 meta/recipes-multimedia/libtiff/tiff_3.9.5.bb      |    4 +-
 .../matchbox-theme-sato/matchbox-theme-sato.inc    |    2 +-
 .../matchbox-theme-sato/matchbox-theme-sato_0.1.bb |    2 +-
 .../sato-icon-theme/sato-icon-theme.inc            |    2 +-
 .../sato-icon-theme/sato-icon-theme_0.4.1.bb       |    2 +-
 meta/recipes-support/boost/boost.inc               |    4 +-
 152 files changed, 1439 insertions(+), 20828 deletions(-)
 create mode 100644 meta/classes/copyleft_compliance.bbclass
 delete mode 100644 meta/files/common-licenses/AFL-1
 delete mode 100644 meta/files/common-licenses/AFL-2
 delete mode 100644 meta/files/common-licenses/AGPL-3
 delete mode 100644 meta/files/common-licenses/APL-1
 delete mode 100644 meta/files/common-licenses/APSL-1
 delete mode 100644 meta/files/common-licenses/APSL-2
 create mode 100644 meta/files/common-licenses/Adobe
 delete mode 100644 meta/files/common-licenses/Apache-1
 delete mode 100644 meta/files/common-licenses/Apache-2
 delete mode 100644 meta/files/common-licenses/Artistic
 delete mode 100644 meta/files/common-licenses/Artistic-1
 delete mode 100644 meta/files/common-licenses/Artistic-2
 delete mode 100644 meta/files/common-licenses/BSL-1
 create mode 100644 meta/files/common-licenses/BitstreamVera
 delete mode 100644 meta/files/common-licenses/CATOSL-1
 delete mode 100644 meta/files/common-licenses/CC-BY-1
 delete mode 100644 meta/files/common-licenses/CC-BY-2
 delete mode 100644 meta/files/common-licenses/CC-BY-3
 delete mode 100644 meta/files/common-licenses/CC-BY-NC-1
 delete mode 100644 meta/files/common-licenses/CC-BY-NC-2
 delete mode 100644 meta/files/common-licenses/CC-BY-NC-3
 delete mode 100644 meta/files/common-licenses/CC-BY-NC-ND-1
 delete mode 100644 meta/files/common-licenses/CC-BY-NC-ND-2
 delete mode 100644 meta/files/common-licenses/CC-BY-NC-ND-3
 delete mode 100644 meta/files/common-licenses/CC-BY-NC-SA-1
 delete mode 100644 meta/files/common-licenses/CC-BY-NC-SA-2
 delete mode 100644 meta/files/common-licenses/CC-BY-NC-SA-3
 delete mode 100644 meta/files/common-licenses/CC-BY-ND-2
 delete mode 100644 meta/files/common-licenses/CC-BY-ND-3
 delete mode 100644 meta/files/common-licenses/CC-BY-SA-1
 delete mode 100644 meta/files/common-licenses/CC-BY-SA-2
 delete mode 100644 meta/files/common-licenses/CC-BY-SA-3
 delete mode 100644 meta/files/common-licenses/CDDL-1
 delete mode 100644 meta/files/common-licenses/CECILL-1
 delete mode 100644 meta/files/common-licenses/CECILL-2
 delete mode 100644 meta/files/common-licenses/CPAL-1
 delete mode 100644 meta/files/common-licenses/CPL-1
 delete mode 100644 meta/files/common-licenses/CUA-OPL-1
 create mode 100644 meta/files/common-licenses/DSSSL
 delete mode 100644 meta/files/common-licenses/ECL-1
 delete mode 100644 meta/files/common-licenses/ECL-2
 create mode 100644 meta/files/common-licenses/EDL-1.0
 delete mode 100644 meta/files/common-licenses/EFL-1
 delete mode 100644 meta/files/common-licenses/EFL-2
 delete mode 100644 meta/files/common-licenses/EPL-1
 delete mode 100644 meta/files/common-licenses/EUPL-1
 create mode 100644 meta/files/common-licenses/Elfutils-Exception
 delete mode 100644 meta/files/common-licenses/ErlPL-1
 create mode 100644 meta/files/common-licenses/FSF-Unlimited
 delete mode 100644 meta/files/common-licenses/Frameworx-1
 create mode 100644 meta/files/common-licenses/FreeType
 delete mode 100644 meta/files/common-licenses/GPL-1
 delete mode 100644 meta/files/common-licenses/GPL-1.0+
 delete mode 100644 meta/files/common-licenses/GPL-2
 delete mode 100644 meta/files/common-licenses/GPL-2,0-with-GCC-exception
 delete mode 100644 meta/files/common-licenses/GPL-2,0-with-font-exception
 delete mode 100644 meta/files/common-licenses/GPL-2.0+
 delete mode 100644 meta/files/common-licenses/GPL-3
 delete mode 100644 meta/files/common-licenses/GPL-3.0+
 delete mode 100644 meta/files/common-licenses/IPL-1
 delete mode 100644 meta/files/common-licenses/LGPL-2
 delete mode 100644 meta/files/common-licenses/LGPL-2.0+
 delete mode 100644 meta/files/common-licenses/LGPL-2.1+
 delete mode 100644 meta/files/common-licenses/LGPL-3
 delete mode 100644 meta/files/common-licenses/LGPL-3.0+
 delete mode 100644 meta/files/common-licenses/LPL-1
 delete mode 100644 meta/files/common-licenses/LPPL-1
 delete mode 120000 meta/files/common-licenses/MIT-style
 delete mode 100644 meta/files/common-licenses/MPL-1
 delete mode 100644 meta/files/common-licenses/NASA-1
 delete mode 100644 meta/files/common-licenses/NPOSL-3
 create mode 100644 meta/files/common-licenses/OASIS
 delete mode 100644 meta/files/common-licenses/OCLC-2
 delete mode 100644 meta/files/common-licenses/OFL-1
 delete mode 100644 meta/files/common-licenses/OLDAP-2
 delete mode 100644 meta/files/common-licenses/OSL-1
 delete mode 100644 meta/files/common-licenses/OSL-2
 delete mode 100644 meta/files/common-licenses/OSL-3
 delete mode 100644 meta/files/common-licenses/PHP-3
 create mode 100644 meta/files/common-licenses/Proprietary
 delete mode 100644 meta/files/common-licenses/Python-2
 delete mode 100644 meta/files/common-licenses/QPL-1
 delete mode 100644 meta/files/common-licenses/RPL-1
 delete mode 100644 meta/files/common-licenses/RPSL-1
 delete mode 100644 meta/files/common-licenses/SPL
 delete mode 100644 meta/files/common-licenses/Simple-2
 create mode 100644 meta/files/common-licenses/UCB
 delete mode 100644 meta/files/common-licenses/VSL-1
 delete mode 100644 meta/files/common-licenses/Watcom-1
 delete mode 100644 meta/files/common-licenses/XFree86-1
 delete mode 100644 meta/files/common-licenses/YPL-1
 delete mode 100644 meta/files/common-licenses/ZPL-1
 delete mode 100644 meta/files/common-licenses/ZPL-2
 delete mode 100644 meta/files/common-licenses/Zimbra-1
 delete mode 100644 meta/files/common-licenses/eCos-2
 create mode 100644 meta/lib/oe/license.py
 rename meta/{files/common-licenses/CC-BY-ND-1 => lib/oe/tests/__init__.py} (100%)
 create mode 100644 meta/lib/oe/tests/test_license.py
 rename meta/lib/oe/{ => tests}/test_types.py (100%)
 delete mode 100644 meta/recipes-core/base-files/base-files/licenses/Artistic
 delete mode 100644 meta/recipes-core/base-files/base-files/licenses/BSD
 delete mode 100644 meta/recipes-core/base-files/base-files/licenses/GFDL-1.2
 delete mode 100644 meta/recipes-core/base-files/base-files/licenses/GPL-3
 delete mode 100644 meta/recipes-core/base-files/base-files/licenses/LGPL-2
 delete mode 100644 meta/recipes-core/base-files/base-files/licenses/LGPL-2.1
 delete mode 100644 meta/recipes-core/base-files/base-files/licenses/LGPL-3
#1 lore raw

PATCH 1/8 oe.test_types: move into an oe.tests package

From: Christopher Larson <[email protected]>

---
 meta/lib/oe/{ => tests}/test_types.py |    0
 1 files changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 meta/lib/oe/tests/__init__.py
 rename meta/lib/oe/{ => tests}/test_types.py (100%)
meta/lib/oe/tests/__init__.py new file +0 -0
new file mode 100644
index 0000000..e69de29
meta/lib/oe/tests/test_types.py renamed from meta/lib/oe/test_types.py +0 -0
similarity index 100%
rename from meta/lib/oe/test_types.py
rename to meta/lib/oe/tests/test_types.py
Signature · 1 line
1.7.1
#2 lore raw

PATCH 2/8 license: split license parsing into oe.license

From: Christopher Larson <[email protected]>

In addition to moving this functionality to oe.license, makes the string preparation more picky before passing it off to the ast compilation. This ensures that LICENSE entries like 'GPL/BSD' are seen as invalid (due to the presence of the unsupported '/').

---
 meta/classes/license.bbclass      |   59 ++++++++++++------------------------
 meta/lib/oe/license.py            |   32 ++++++++++++++++++++
 meta/lib/oe/tests/test_license.py |   38 +++++++++++++++++++++++
 3 files changed, 90 insertions(+), 39 deletions(-)
 create mode 100644 meta/lib/oe/license.py
 create mode 100644 meta/lib/oe/tests/test_license.py
meta/classes/license.bbclass +20 -39
index 4d036b1..8c6e2d2 100644
@@ -1,17 +1,17 @@
 # Populates LICENSE_DIRECTORY as set in distro config with the license files as set by
-# LIC_FILES_CHKSUM. 
+# 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 
+# - 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}/licenses"
 LICSSTATEDIR = "${WORKDIR}/license-destdir/"
 
-addtask populate_lic after do_patch before do_package 
+addtask populate_lic after do_patch before do_package
 do_populate_lic[dirs] = "${LICSSTATEDIR}/${PN}"
 do_populate_lic[cleandirs] = "${LICSSTATEDIR}"
 
@@ -20,7 +20,7 @@ do_populate_lic[cleandirs] = "${LICSSTATEDIR}"
 # break the non-standardized license names that we find in LICENSE, we'll set
 # up a bunch of VarFlags to accomodate non-SPDX license names.
 #
-# We should really discuss standardizing this field, but that's a longer term goal. 
+# We should really discuss standardizing this field, but that's a longer term goal.
 # For now, we can do this and it should grab the most common LICENSE naming variations.
 
 #GPL variations
@@ -57,37 +57,25 @@ python do_populate_lic() {
     import os
     import bb
     import shutil
-    import ast
-
-    class LicenseVisitor(ast.NodeVisitor):
-        def generic_visit(self, node):
-            ast.NodeVisitor.generic_visit(self, node)
+    import oe.license
 
+    class FindVisitor(oe.license.LicenseVisitor):
         def visit_Str(self, node):
             #
             # Until I figure out what to do with
             # the two modifiers I support (or greater = +
             # and "with exceptions" being *
-            # we'll just strip out the modifier and put 
+            # we'll just strip out the modifier and put
             # the base license.
             find_license(node.s.replace("+", "").replace("*", ""))
-            ast.NodeVisitor.generic_visit(self, node)
-
-        def visit_BinOp(self, node):
-            op = node.op
-            if isinstance(op, ast.BitOr): 
-                x = LicenseVisitor()
-                x.visit(node.left)
-                x.visit(node.right)
-            else:               
-                ast.NodeVisitor.generic_visit(self, node)
+            self.generic_visit(node)
 
     def copy_license(source, destination, file_name):
         try:
             bb.copyfile(os.path.join(source, file_name), os.path.join(destination, file_name))
         except:
             bb.warn("%s: No generic license file exists for: %s at %s" % (pn, file_name, source))
-            pass 
+            pass
 
     def link_license(source, destination, file_name):
         try:
@@ -108,8 +96,8 @@ python do_populate_lic() {
                 # Great, there is an SPDXLICENSEMAP. We can copy!
                 bb.note("We need to use a SPDXLICENSEMAP for %s" % (license_type))
                 spdx_generic = d.getVarFlag('SPDXLICENSEMAP', license_type)
-                copy_license(generic_directory, gen_lic_dest, spdx_generic)            
-                link_license(gen_lic_dest, destdir, spdx_generic)            
+                copy_license(generic_directory, gen_lic_dest, spdx_generic)
+                link_license(gen_lic_dest, destdir, spdx_generic)
             else:
                 # And here is where we warn people that their licenses are lousy
                 bb.warn("%s: No generic license file exists for: %s at %s" % (pn, license_type, generic_directory))
@@ -117,7 +105,7 @@ python do_populate_lic() {
                 pass
         elif os.path.isfile(os.path.join(generic_directory, license_type)):
             copy_license(generic_directory, gen_lic_dest, license_type)
-            link_license(gen_lic_dest, destdir, license_type)            
+            link_license(gen_lic_dest, destdir, license_type)
 
     # All the license types for the package
     license_types = d.getVar('LICENSE', True)
@@ -130,7 +118,7 @@ python do_populate_lic() {
     srcdir = d.getVar('S', True)
     # Directory we store the generic licenses as set in the distro configuration
     generic_directory = d.getVar('COMMON_LICENSE_DIR', True)
-    
+
     try:
         bb.mkdirhier(destdir)
     except:
@@ -153,21 +141,14 @@ python do_populate_lic() {
         # 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)
- 
+
     gen_lic_dest = os.path.join(d.getVar('LICENSE_DIRECTORY', True), "common-licenses")
-    
-    clean_licenses = ""
-
-    for x in license_types.replace("(", " ( ").replace(")", " ) ").split():
-        if ((x != "(") and (x != ")") and (x != "&") and (x != "|")):
-            clean_licenses += "'" + x + "'"
-        else:
-            clean_licenses += " " + x + " "
-
-    # lstrip any possible indents, since ast needs python syntax.
-    node = ast.parse(clean_licenses.lstrip())
-    v = LicenseVisitor()
-    v.visit(node)
+
+    v = FindVisitor()
+    try:
+        v.visit_string(license_types)
+    except oe.license.InvalidLicense as exc:
+        bb.fatal("%s: %s" % (d.getVar('PF', True), exc))
 }
 
 SSTATETASKS += "do_populate_lic"
meta/lib/oe/license.py new file +32 -0
new file mode 100644
index 0000000..b230d3e
@@ -0,0 +1,32 @@
+# vi:sts=4:sw=4:et
+"""Code for parsing OpenEmbedded license strings"""
+
+import ast
+import re
+
+class InvalidLicense(StandardError):
+    def __init__(self, license):
+        self.license = license
+        StandardError.__init__(self)
+
+    def __str__(self):
+        return "invalid license '%s'" % self.license
+
+license_operator = re.compile('([&|() ])')
+license_pattern = re.compile('[a-zA-Z0-9.+_\-]+$')
+
+class LicenseVisitor(ast.NodeVisitor):
+    """Syntax tree visitor which can accept OpenEmbedded license strings"""
+    def visit_string(self, licensestr):
+        new_elements = []
+        elements = filter(lambda x: x.strip(), license_operator.split(licensestr))
+        for pos, element in enumerate(elements):
+            if license_pattern.match(element):
+                if pos > 0 and license_pattern.match(elements[pos-1]):
+                    new_elements.append('&')
+                element = '"' + element + '"'
+            elif not license_operator.match(element):
+                raise InvalidLicense(element)
+            new_elements.append(element)
+
+        self.visit(ast.parse(' '.join(new_elements)))
meta/lib/oe/tests/test_license.py new file +38 -0
new file mode 100644
index 0000000..cb949fc
@@ -0,0 +1,38 @@
+import unittest
+import oe.license
+
+class SeenVisitor(oe.license.LicenseVisitor):
+    def __init__(self):
+        self.seen = []
+        oe.license.LicenseVisitor.__init__(self)
+
+    def visit_Str(self, node):
+        self.seen.append(node.s)
+
+class TestSingleLicense(unittest.TestCase):
+    licenses = [
+        "GPLv2",
+        "LGPL-2.0",
+        "Artistic",
+        "MIT",
+        "GPLv3+",
+        "FOO_BAR",
+    ]
+    invalid_licenses = ["GPL/BSD"]
+
+    @staticmethod
+    def parse(licensestr):
+        visitor = SeenVisitor()
+        visitor.visit_string(licensestr)
+        return visitor.seen
+
+    def test_single_licenses(self):
+        for license in self.licenses:
+            licenses = self.parse(license)
+            self.assertListEqual(licenses, [license])
+
+    def test_invalid_licenses(self):
+        for license in self.invalid_licenses:
+            with self.assertRaises(oe.license.InvalidLicense) as cm:
+                self.parse(license)
+            self.assertEqual(cm.exception.license, license)
Signature · 1 line
1.7.1
#3 lore raw

PATCH 3/8 oe.license: add license flattening code

In reply to Beth Flanagan

From: Christopher Larson <[email protected]>

This flattens a license tree by selecting one side of each OR operation (chosen via the user supplied function).

---
 meta/lib/oe/license.py            |   30 ++++++++++++++++++++++++++++++
 meta/lib/oe/tests/test_license.py |   30 ++++++++++++++++++++++++++++++
 2 files changed, 60 insertions(+), 0 deletions(-)
meta/lib/oe/license.py +30 -0
index b230d3e..7ab66e7 100644
@@ -30,3 +30,33 @@ class LicenseVisitor(ast.NodeVisitor):
             new_elements.append(element)
 
         self.visit(ast.parse(' '.join(new_elements)))
+
+class FlattenVisitor(LicenseVisitor):
+    """Flatten a license tree (parsed from a string) by selecting one of each
+    set of OR options, in the way the user specifies"""
+    def __init__(self, choose_licenses):
+        self.choose_licenses = choose_licenses
+        self.licenses = []
+        LicenseVisitor.__init__(self)
+
+    def visit_Str(self, node):
+        self.licenses.append(node.s)
+
+    def visit_BinOp(self, node):
+        if isinstance(node.op, ast.BitOr):
+            left = FlattenVisitor(self.choose_licenses)
+            left.visit(node.left)
+
+            right = FlattenVisitor(self.choose_licenses)
+            right.visit(node.right)
+
+            selected = self.choose_licenses(left.licenses, right.licenses)
+            self.licenses.extend(selected)
+        else:
+            self.generic_visit(node)
+
+def flattened_licenses(licensestr, choose_licenses):
+    """Given a license string and choose_licenses function, return a flat list of licenses"""
+    flatten = FlattenVisitor(choose_licenses)
+    flatten.visit_string(licensestr)
+    return flatten.licenses
meta/lib/oe/tests/test_license.py +30 -0
index cb949fc..c388886 100644
@@ -36,3 +36,33 @@ class TestSingleLicense(unittest.TestCase):
             with self.assertRaises(oe.license.InvalidLicense) as cm:
                 self.parse(license)
             self.assertEqual(cm.exception.license, license)
+
+class TestSimpleCombinations(unittest.TestCase):
+    tests = {
+        "FOO&BAR": ["FOO", "BAR"],
+        "BAZ & MOO": ["BAZ", "MOO"],
+        "ALPHA|BETA": ["ALPHA"],
+        "BAZ&MOO|FOO": ["FOO"],
+        "FOO&BAR|BAZ": ["FOO", "BAR"],
+    }
+    preferred = ["ALPHA", "FOO", "BAR"]
+
+    def test_tests(self):
+        def choose(a, b):
+            if all(lic in self.preferred for lic in b):
+                return b
+            else:
+                return a
+
+        for license, expected in self.tests.items():
+            licenses = oe.license.flattened_licenses(license, choose)
+            self.assertListEqual(licenses, expected)
+
+class TestComplexCombinations(TestSimpleCombinations):
+    tests = {
+        "FOO & (BAR | BAZ)&MOO": ["FOO", "BAR", "MOO"],
+        "(ALPHA|(BETA&THETA)|OMEGA)&DELTA": ["OMEGA", "DELTA"],
+        "((ALPHA|BETA)&FOO)|BAZ": ["BETA", "FOO"],
+        "(GPL-2.0|Proprietary)&BSD-4-clause&MIT": ["GPL-2.0", "BSD-4-clause", "MIT"],
+    }
+    preferred = ["BAR", "OMEGA", "BETA", "GPL-2.0"]
Signature · 1 line
1.7.1
#4 lore raw

PATCH 4/8 Add copyleft compliance class

In reply to Beth Flanagan

From: Christopher Larson <[email protected]>

Deploys sources for recipes for compliance with copyleft-style licenses Defaults to using symlinks, as it's a quick operation, and one can easily follow the links when making use of the files (e.g. tar with the -h arg).

By default, includes all GPL and LGPL, and excludes CLOSED and Proprietary.

---
 meta/classes/copyleft_compliance.bbclass |   94 ++++++++++++++++++++++++++++++
 1 files changed, 94 insertions(+), 0 deletions(-)
 create mode 100644 meta/classes/copyleft_compliance.bbclass
meta/classes/copyleft_compliance.bbclass new file +94 -0
new file mode 100644
index 0000000..5d9ab11
@@ -0,0 +1,94 @@
+# Deploy sources for recipes for compliance with copyleft-style licenses
+# Defaults to using symlinks, as it's a quick operation, and one can easily
+# follow the links when making use of the files (e.g. tar with the -h arg).
+#
+# By default, includes all GPL and LGPL, and excludes CLOSED and Proprietary.
+#
+# vi:sts=4:sw=4:et
+
+COPYLEFT_SOURCES_DIR ?= '${DEPLOY_DIR}/copyleft_sources'
+
+COPYLEFT_LICENSE_INCLUDE ?= 'GPL* LGPL*'
+COPYLEFT_LICENSE_INCLUDE[type] = 'list'
+COPYLEFT_LICENSE_INCLUDE[doc] = 'Space separated list of globs which include licenses'
+
+COPYLEFT_LICENSE_EXCLUDE ?= 'CLOSED Proprietary'
+COPYLEFT_LICENSE_EXCLUDE[type] = 'list'
+COPYLEFT_LICENSE_INCLUDE[doc] = 'Space separated list of globs which exclude licenses'
+
+
+def copyleft_should_include(d):
+    """Determine if this recipe's sources should be deployed for compliance"""
+    import ast
+    import oe.license
+    from fnmatch import fnmatchcase as fnmatch
+
+    if oe.utils.inherits(d, 'native', 'nativesdk', 'cross', 'crossdk'):
+        # not a target recipe
+        return
+
+    include = oe.data.typed_value('COPYLEFT_LICENSE_INCLUDE', d)
+    exclude = oe.data.typed_value('COPYLEFT_LICENSE_EXCLUDE', d)
+
+    def include_license(license):
+        if any(fnmatch(license, pattern) for pattern in exclude):
+            return False
+        if any(fnmatch(license, pattern) for pattern in include):
+            return True
+        return False
+
+    def choose_licenses(a, b):
+        """Select the left option in an OR if all its licenses are to be included"""
+        if all(include_license(lic) for lic in a):
+            return a
+        else:
+            return b
+
+    try:
+        licenses = oe.license.flattened_licenses(d.getVar('LICENSE', True), choose_licenses)
+    except oe.license.InvalidLicense as exc:
+        bb.fatal('%s: %s' % (d.getVar('PF', True), exc))
+
+    return all(include_license(lic) for lic in licenses)
+
+python do_prepare_copyleft_sources () {
+    """Populate a tree of the recipe sources and emit patch series files"""
+    import os.path
+    import shutil
+
+    if not copyleft_should_include(d):
+        return
+
+    sources_dir = d.getVar('COPYLEFT_SOURCES_DIR', 1)
+    src_uri = d.getVar('SRC_URI', 1).split()
+    fetch = bb.fetch2.Fetch(src_uri, d)
+    ud = fetch.ud
+
+    locals = (fetch.localpath(url) for url in fetch.urls)
+    localpaths = [local for local in locals if not local.endswith('.bb')]
+    if not localpaths:
+        return
+
+    pf = d.getVar('PF', True)
+    dest = os.path.join(sources_dir, pf)
+    shutil.rmtree(dest, ignore_errors=True)
+    bb.mkdirhier(dest)
+
+    for path in localpaths:
+        os.symlink(path, os.path.join(dest, os.path.basename(path)))
+
+    patches = src_patches(d)
+    for patch in patches:
+        _, _, local, _, _, parm = bb.decodeurl(patch)
+        patchdir = parm.get('patchdir')
+        if patchdir:
+            series = os.path.join(dest, 'series.subdir.%s' % patchdir.replace('/', '_'))
+        else:
+            series = os.path.join(dest, 'series')
+
+        with open(series, 'a') as s:
+            s.write('%s -p%s\n' % (os.path.basename(local), parm['striplevel']))
+}
+
+addtask prepare_copyleft_sources after do_fetch before do_build
+do_build[recrdeptask] += 'do_prepare_copyleft_sources'
Signature · 1 line
1.7.1
#5 lore raw

Re: [PATCH 4/8] Add copyleft compliance class

Quoted 36 lines · Beth Flanagan

From: Christopher Larson <[email protected]>

Deploys sources for recipes for compliance with copyleft-style licenses Defaults to using symlinks, as it's a quick operation, and one can easily follow the links when making use of the files (e.g. tar with the -h arg).

By default, includes all GPL and LGPL, and excludes CLOSED and Proprietary.

---
 meta/classes/copyleft_compliance.bbclass |   94 ++++++++++++++++++++++++++++++
 1 files changed, 94 insertions(+), 0 deletions(-)
 create mode 100644 meta/classes/copyleft_compliance.bbclass
meta/classes/copyleft_compliance.bbclass new file +16 -0
new file mode 100644
index 0000000..5d9ab11
@@ -0,0 +1,94 @@
+# Deploy sources for recipes for compliance with copyleft-style licenses
+# Defaults to using symlinks, as it's a quick operation, and one can easily
+# follow the links when making use of the files (e.g. tar with the -h arg).
+#
+# By default, includes all GPL and LGPL, and excludes CLOSED and Proprietary.
+#
+# vi:sts=4:sw=4:et
+
+COPYLEFT_SOURCES_DIR ?= '${DEPLOY_DIR}/copyleft_sources'
+
+COPYLEFT_LICENSE_INCLUDE ?= 'GPL* LGPL*'
+COPYLEFT_LICENSE_INCLUDE[type] = 'list'
+COPYLEFT_LICENSE_INCLUDE[doc] = 'Space separated list of globs which include licenses'
+
+COPYLEFT_LICENSE_EXCLUDE ?= 'CLOSED Proprietary'
+COPYLEFT_LICENSE_EXCLUDE[type] = 'list'

meta/classes/copyleft_compliance.bbclass line 26

Quoted 10 lines
meta/classes/copyleft_compliance.bbclass new file +10 -0
+COPYLEFT_LICENSE_INCLUDE[doc] = 'Space separated list of globs which exclude licenses'
+
+
+def copyleft_should_include(d):
+    """Determine if this recipe's sources should be deployed for compliance"""
+    import ast
+    import oe.license
+    from fnmatch import fnmatchcase as fnmatch
+
+    if oe.utils.inherits(d, 'native', 'nativesdk', 'cross', 'crossdk'):

we do ship some of them in SDK so IMO they should not be excluded.

#6 lore raw

Re: [PATCH 4/8] Add copyleft compliance class

Quoted 26 lines · Khem Raj
Quoted 26 lines
meta/classes/copyleft_compliance.bbclass new file +20 -0
new file mode 100644
index 0000000..5d9ab11
@@ -0,0 +1,94 @@
+# Deploy sources for recipes for compliance with copyleft-style licenses
+# Defaults to using symlinks, as it's a quick operation, and one can easily
+# follow the links when making use of the files (e.g. tar with the -h arg).
+#
+# By default, includes all GPL and LGPL, and excludes CLOSED and Proprietary.
+#
+# vi:sts=4:sw=4:et
+
+COPYLEFT_SOURCES_DIR ?= '${DEPLOY_DIR}/copyleft_sources'
+
+COPYLEFT_LICENSE_INCLUDE ?= 'GPL* LGPL*'
+COPYLEFT_LICENSE_INCLUDE[type] = 'list'
+COPYLEFT_LICENSE_INCLUDE[doc] = 'Space separated list of globs which include licenses'
+
+COPYLEFT_LICENSE_EXCLUDE ?= 'CLOSED Proprietary'
+COPYLEFT_LICENSE_EXCLUDE[type] = 'list'
+COPYLEFT_LICENSE_INCLUDE[doc] = 'Space separated list of globs which exclude licenses'
+
+
+def copyleft_should_include(d):
Quoted 8 lines

meta/classes/copyleft_compliance.bbclass line 26

Quoted 6 lines
meta/classes/copyleft_compliance.bbclass new file +6 -0
+    """Determine if this recipe's sources should be deployed for compliance"""
+    import ast
+    import oe.license
+    from fnmatch import fnmatchcase as fnmatch
+
+    if oe.utils.inherits(d, 'native', 'nativesdk', 'cross', 'crossdk'):

we do ship some of them in SDK so IMO they should not be excluded.

Fair enough. It'd probably be useful to hook something in to use the output of this class to produce a tree of just the sources that went into a given image or sdk, to go alongside the new manifests. I think this is good to go in though, I'll submit a second patch in the next day or two to enhance it to cover more, unless someone disagrees with that approach.

Signature · 5 lines
Christopher Larson
clarson at kergoth dot com
Founder - BitBake, OpenEmbedded, OpenZaurus
Maintainer - Tslib
Senior Software Engineer, Mentor Graphics
#7 lore raw

Re: [PATCH 4/8] Add copyleft compliance class --- MAJOR BREAKAGE!!!!

In reply to Khem Raj
Quoted 26 lines · Khem Raj
Quoted 25 lines · Beth Flanagan

From: Christopher Larson<[email protected]>

Deploys sources for recipes for compliance with copyleft-style licenses Defaults to using symlinks, as it's a quick operation, and one can easily follow the links when making use of the files (e.g. tar with the -h arg).

By default, includes all GPL and LGPL, and excludes CLOSED and Proprietary.

---
  meta/classes/copyleft_compliance.bbclass |   94 ++++++++++++++++++++++++++++++
  1 files changed, 94 insertions(+), 0 deletions(-)

create mode 100644 meta/classes/copyleft_compliance.bbclass

meta/classes/copyleft_compliance.bbclass new file +5 -0
new file mode 100644
index 0000000..5d9ab11
@@ -0,0 +1,94 @@
+# Deploy sources for recipes for compliance with copyleft-style licenses
+# Defaults to using symlinks, as it's a quick operation, and one can easily
+# follow the links when making use of the files (e.g. tar with the -h arg).
+#
+# By default, includes all GPL and LGPL, and excludes CLOSED and Proprietary.
Quoted 8 lines

meta/classes/copyleft_compliance.bbclass line 13

Quoted 8 lines
meta/classes/copyleft_compliance.bbclass new file +8 -0
+#
+# vi:sts=4:sw=4:et
+
+COPYLEFT_SOURCES_DIR ?= '${DEPLOY_DIR}/copyleft_sources'
+
+COPYLEFT_LICENSE_INCLUDE ?= 'GPL* LGPL*'
+COPYLEFT_LICENSE_INCLUDE[type] = 'list'
+COPYLEFT_LICENSE_INCLUDE[doc] = 'Space separated list of globs which include licenses'

If the Ampersand is not accepted in the LICENSE string, then the recipes below are broken.

From my latest build, at least recipes with "&&" fail... This means that nothing really completes that I have tested.

MAJOR BREAKAGE!!!!

I think it would be better FIRST to fix the recipes, and then introduce checking. BR
Ulf

meta-bugfix/meta/recipes-connectivity/connman/connman-gnome_0.5.bb:LICENSE = "GPLv2 & LGPLv2.1"
meta-openembedded/meta-gnome/recipes-gnome/gobject-introspection/gobject-introspection_0.9.10.bb:LICENSE = "GPLv2+ & LGPLv2+"
meta-openembedded/meta-gnome/recipes-gnome/gobject-introspection/gobject-introspection_git.bb:LICENSE = "GPLv2+ & LGPLv2+"
meta-openembedded/meta-gnome/recipes-gnome/gnome-menus/gnome-menus_2.30.5.bb:LICENSE = "GPLv2 && LGPLv2"
meta-openembedded/meta-gnome/recipes-gnome/gnome-vfs/gnome-vfs_2.24.4.bb:LICENSE = "GPLv2+ & LGPLv2+"
meta-openembedded/meta-gnome/recipes-gnome/gtk+/gtk+3_3.0.11.bb:LICENSE = "LGPLv2 & LGPLv2+ & LGPLv2.1+"
meta-openembedded/meta-gnome/recipes-gnome/nautilus/nautilus3_3.0.2.bb:LICENSE="GPLv2 && LGPLv2"
meta-openembedded/meta-gnome/recipes-gnome/nautilus/nautilus_2.32.2.bb:LICENSE="GPLv2 && LGPLv2"
meta-openembedded/meta-gnome/recipes-gnome/bonobo/libbonobo.inc:LICENSE = "GPLv2 && LGPLv2.1"
meta-openembedded/meta-gnome/recipes-gnome/bonobo/libbonoboui_2.24.3.bb:LICENSE = "GPLv2 && LGPLv2.1"
meta-openembedded/meta-gnome/recipes-gnome/gnome-desktop/gnome-desktop_2.32.1.bb:LICENSE = "GPLv2 & LGPLv2"
meta-openembedded/meta-gnome/recipes-gnome/gnome-desktop/gnome-desktop3_3.0.2.bb:LICENSE = "GPLv2 & LGPLv2"
meta-openembedded/meta-gnome/recipes-gnome/gnome-panel/gnome-panel_2.32.1.bb:LICENSE = "GPLv2 && LGPLv2 && GFDLv1.1"
meta-openembedded/meta-gnome/recipes-gnome/gnome-panel/gnome-panel3_3.0.2.bb:LICENSE = "GPLv2 && LGPLv2 && GFDLv1.1"
meta-openembedded/meta-gnome/recipes-gnome/gnome-bluetooth/gnome-bluetooth_2.32.0.bb:LICENSE = "GPLv2 && LGPLv2.1"
meta-openembedded/meta-gnome/recipes-gnome/libgnome/libgnome-keyring_2.32.0.bb:LICENSE = "LGPLv2 && GPLv2"
meta-openembedded/meta-oe/recipes-multimedia/jack/jack_0.121.0.bb:LICENSE = "GPLv2 && LGPLv2.1"
meta-openembedded/meta-oe/recipes-multimedia/audiofile/audiofile_0.2.7.bb:LICENSE = "LGPLv2 && GPLv2"
meta-openembedded/meta-oe/recipes-connectivity/obex/openobex_1.5.bb:LICENSE = "GPLv2 && LGPLv2.1"
meta-openembedded/meta-oe/recipes-gnome/gtk+/gtkmm.inc:LICENSE = "LGPLv2.1 && GPLv2"
meta-openembedded/meta-oe/recipes-devtools/nodejs/nodejs_0.4.12.bb:LICENSE = "MIT && zlib"
meta-openembedded/meta-oe/recipes-devtools/python/python-numeric_24.2.bb:LICENSE = "PSF & LLNL"
meta-openembedded/meta-oe/recipes-devtools/swig/swig.inc:LICENSE = "BSD && GPLv3"
meta-openembedded/meta-oe/recipes-devtools/gcc/gcc-4.5.inc:LICENSE="GCC RUNTIME LIBRARY EXCEPTION & GPLv2 & GPLv3 & LGPLv2.1 & LGPLv3"
meta-openembedded/meta-oe/recipes-core/glib-2.0/glibmm.inc:LICENSE = "LGPLv2.1 && GPLv2"
meta-openembedded/meta-oe/recipes-core/udev/udev_175.bb:LICENSE = "GPLv2+ & LGPLv2.1+"
meta-openembedded/meta-oe/recipes-core/udev/udev_173.bb:LICENSE = "GPLv2+ & LGPLv2.1+"
meta-openembedded/meta-oe/recipes-support/ntfs-3g-ntfsprogs/ntfs-3g-ntfsprogs_2011.4.12.bb:LICENSE = "GPLv2 & LGPLv2"
meta-openembedded/meta-oe/recipes-support/sg3-utils/sg3-utils_1.31.bb:LICENSE = "GPLv2+ && BSD"
meta-openembedded/meta-oe/recipes-support/debianutils/debianutils_2.30.bb:LICENSE = "GPLv2 & BSD & SMAIL_GPL"
meta-openembedded/meta-oe/recipes-support/mpfr/mpfr_3.0.0.bb:LICENSE="GPLv3&LGPLv3"
meta-openembedded/meta-oe/recipes-support/fuse/fuse_2.8.6.bb:LICENSE = "GPLv2&LGPLv2"
meta-openembedded/meta-oe/recipes-support/fuse/fuse_2.8.5.bb:LICENSE = "GPLv2&LGPLv2"
meta-openembedded/meta-oe/recipes-support/lvm2/lvm2.inc:LICENSE = "GPLv2 && LGPLv2"
meta-openembedded/meta-oe/recipes-graphics/pango/pangomm_2.28.2.bb:LICENSE = "LGPLv2.1 && GPLv2"
meta-openembedded/meta-oe/recipes-graphics/ttf-fonts/ttf-gentium_1.02.bb:LICENSE_URL = "http://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&item_id=OFL"
meta-smartphone/meta-aurora/recipes-aurora/aurora/aurora-daemon_git.bb:LICENSE = "GPLv2 & Other"
meta-ti/recipes-misc/payload/beaglebone-getting-started.bb:LICENSE = "GPLv2+ && MIT && PD && others"
openembedded-core/meta/recipes-multimedia/flac/flac_1.2.1.bb:LICENSE = "FDLv1.2 & GPLv2+ & LGPLv2.1+ & BSD"
openembedded-core/meta/recipes-multimedia/alsa/alsa-lib_1.0.24.1.bb:LICENSE = "LGPLv2.1 & GPLv2+"
openembedded-core/meta/recipes-multimedia/alsa/alsa-tools_1.0.24.1.bb:LICENSE = "GPLv2 & LGPLv2+"
openembedded-core/meta/recipes-multimedia/pulseaudio/pulseaudio.inc:LICENSE = "GPLv2+ & LGPLv2.1"
openembedded-core/meta/recipes-multimedia/pulseaudio/libatomics-ops_1.2.bb:LICENSE = "GPLv2 & MIT"
openembedded-core/meta/recipes-multimedia/gstreamer/gst-plugins-ugly_0.10.17.bb:LICENSE = "GPLv2+ & LGPLv2.1+ & LGPLv2+"
openembedded-core/meta/recipes-multimedia/gstreamer/gst-ffmpeg_0.10.11.bb:LICENSE = "GPLv2+ & LGPLv2+ & ( (GPLv2+ & LGPLv2.1+) | (GPLv3+ & LGPLv3+) )"
openembedded-core/meta/recipes-multimedia/gstreamer/gst-plugins-base_0.10.35.bb:LICENSE = "GPLv2+ & LGPLv2+"
openembedded-core/meta/recipes-multimedia/gstreamer/gst-plugins-bad_0.10.21.bb:LICENSE = "GPLv2+ & LGPLv2+ & LGPLv2.1+ "
openembedded-core/meta/recipes-multimedia/gstreamer/gst-plugins-good_0.10.30.bb:LICENSE = "GPLv2+ & LGPLv2.1+"
openembedded-core/meta/classes/src_distribute.bbclass: licenses = d.getVar('LICENSE', 1).replace('&', '|')
openembedded-core/meta/classes/license.bbclass: pkged_lic="$(sed -n '/^LICENSE: /{ s/^LICENSE: //; s/[+|&()*]/ /g; s/ */ /g; p }' ${filename})"
openembedded-core/meta/recipes-connectivity/bluez/bluez4.inc:LICENSE = "GPLv2+ & LGPLv2.1+"
openembedded-core/meta/recipes-connectivity/bind/bind_9.8.1.bb:LICENSE = "ISC & BSD"
openembedded-core/meta/recipes-connectivity/wireless-tools/wireless-tools_29.bb:LICENSE = "GPLv2 & (LGPL | MPL | BSD)"
openembedded-core/meta/recipes-connectivity/gypsy/gypsy_git.bb:LICENSE = "GPLv2+ & LGPLv2+"
openembedded-core/meta/recipes-connectivity/gypsy/gypsy_0.8.bb:LICENSE = "GPLv2+ & LGPLv2+"
openembedded-core/meta/recipes-connectivity/avahi/avahi.inc:LICENSE = "GPLv2+ & LGPLv2.1+"
openembedded-core/meta/recipes-connectivity/connman/connman-gnome_0.5.bb:LICENSE = "GPLv2 & LGPLv2.1"
openembedded-core/meta/recipes-connectivity/ppp/ppp_2.4.5.bb:LICENSE = "BSD & GPLv2+ & LGPLv2+ & PD"
openembedded-core/meta/recipes-connectivity/gsm/gsmd.inc:LICENSE = "GPLv2+ & LGPLv2.1+"
openembedded-core/meta/recipes-gnome/gtk+/gtk+.inc:LICENSE = "LGPLv2 & LGPLv2+ & LGPLv2.1+"
openembedded-core/meta/recipes-gnome/libglade/libglade_2.6.4.bb:LICENSE = "LGPLv2 & LGPLv2+"
openembedded-core/meta/recipes-gnome/gnome/gnome-desktop.inc:LICENSE = "GPLv2 & LGPLv2"
openembedded-core/meta/recipes-gnome/gnome/gobject-introspection_git.bb:LICENSE = "GPLv2+ & LGPLv2+"
openembedded-core/meta/recipes-gnome/gnome/gnome-doc-utils.inc:LICENSE = "GPL & LGPL"
openembedded-core/meta/recipes-gnome/gnome/libgnome-keyring_2.32.0.bb:LICENSE = "LGPLv2 & LGPLv2+ & LGPLv2.1+"
openembedded-core/meta/recipes-gnome/gnome/gnome-mime-data_2.18.0.bb:LICENSE = "GPLv2 & GPLv2+"
openembedded-core/meta/recipes-gnome/gnome/gnome-keyring_2.32.1.bb:LICENSE = "GPLv2+ & LGPLv2+ & LGPLv2.1+"
openembedded-core/meta/recipes-extended/quota/quota_4.00-pre1.bb:LICENSE = "BSD & GPLv2+ & LGPLv2.1+"
openembedded-core/meta/recipes-extended/sudo/sudo.inc:LICENSE = "ISC & UCB & Zlib"
openembedded-core/meta/recipes-extended/sysklogd/sysklogd.inc:LICENSE = "GPLv2+ & BSD"
openembedded-core/meta/recipes-extended/xz/xz_5.0.3.bb:LICENSE = "GPLv2+ & GPLv3+ & LGPLv2.1+"
openembedded-core/meta/recipes-extended/cronie/cronie_1.4.8.bb:LICENSE = "ISC & BSD"
openembedded-core/meta/recipes-extended/libidn/libidn_0.6.14.bb:LICENSE = "LGPLv2.1+ & GPLv2+"
openembedded-core/meta/recipes-extended/libidn/libidn_1.22.bb:LICENSE = "LGPLv2.1+ & GPLv3+"
openembedded-core/meta/recipes-extended/iputils/iputils_s20101006.bb:LICENSE = "BSD & GPLv2+"
openembedded-core/meta/recipes-extended/bc/bc_1.06.bb:LICENSE = "GPLv2+ & LGPLv2.1"
openembedded-core/meta/recipes-extended/mailx/mailx_12.5.bb:LICENSE = "BSD & MPL-1"
openembedded-core/meta/recipes-extended/procps/procps.inc:LICENSE = "GPLv2+ & LGPLv2+"
openembedded-core/meta/files/common-licenses/CDDL-1.0:COVERED SOFTWARE IS PROVIDED UNDER THIS LICENSE ON AN &#8220;AS IS&#8221; BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE COVERED SOFTWARE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED SOFTWARE IS WITH YOU. SHOULD ANY COVERED SOFTWARE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY COVERED SOFTWARE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER. openembedded-core/meta/files/common-licenses/CPAL-1.0:COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN &#8220;AS IS&#8221; BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE COVERED CODE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED CODE IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL DEVELOPER, ORIGINAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER. openembedded-core/meta/recipes-devtools/elfutils/elfutils_0.148.bb:LICENSE = "(GPL-2+ & Elfutils-Exception)"
openembedded-core/meta/recipes-devtools/e2fsprogs/e2fsprogs.inc:LICENSE = "GPLv2 & LGPLv2 & BSD & MIT"
openembedded-core/meta/recipes-devtools/valgrind/valgrind_3.6.1.bb:LICENSE = "GPLv2 & GPLv2+ & BSD"
openembedded-core/meta/recipes-devtools/gdb/gdb_7.3.1.bb:LICENSE="GPLv2 & GPLv3 & LGPLv2 & LGPLv3"
openembedded-core/meta/recipes-devtools/python/python-pycairo_1.8.10.bb:LICENSE = "LGPLv2.1 & MPL-1"
openembedded-core/meta/recipes-devtools/gcc/gcc-4.6.inc:LICENSE="GPL-3.0-with-GCC-exception & GPLv3"
openembedded-core/meta/recipes-devtools/squashfs-tools/squashfs-tools_4.2.bb:LICENSE = "GPL-2 & PD"
openembedded-core/meta/recipes-devtools/libtool/libtool-2.4.2.inc:LICENSE = "GPLv2 & LGPLv2.1"
openembedded-core/meta/recipes-devtools/autoconf/autoconf_2.68.bb:LICENSE = "GPLv2 & GPLv3"
openembedded-core/meta/recipes-devtools/qemu/qemu.inc:LICENSE = "GPLv2 & LGPLv2.1"
openembedded-core/meta/recipes-devtools/make/make_3.82.bb:LICENSE="GPLv3&LGPLv2"
openembedded-core/meta/recipes-core/gettext/gettext_0.18.1.1.bb:LICENSE = "GPL-3+ & LGPL-2.1+"
openembedded-core/meta/recipes-core/glib-2.0/glib.inc:LICENSE = "LGPLv2+ & BSD & PD"
openembedded-core/meta/recipes-core/busybox/busybox.inc:LICENSE = "GPLv2 & BSD-4-Clause"
openembedded-core/meta/recipes-core/udev/udev-new.inc:LICENSE = "GPLv2+ & LGPLv2.1+"
openembedded-core/meta/recipes-core/sysfsutils/sysfsutils_2.1.0.bb:LICENSE = "GPLv2 & LGPLv2.1"
openembedded-core/meta/recipes-core/eglibc/eglibc-locale.inc:LICENSE = "GPLv2 & LGPLv2.1"
openembedded-core/meta/recipes-core/eglibc/eglibc-common.inc:LICENSE = "GPLv2 & LGPLv2.1"
openembedded-core/meta/recipes-core/util-linux/util-linux.inc:LICENSE = "GPLv2+ & LGPLv2.1+ & BSD"
openembedded-core/meta/recipes-kernel/oprofile/oprofile.inc:LICENSE = "LGPLv2.1+ & GPLv2"
openembedded-core/meta/recipes-kernel/lttng/lttng-ust_0.15.bb:LICENSE = "LGPLv2.1+ & BSD"
openembedded-core/meta/recipes-kernel/lttng/lttng-viewer_0.12.38.bb:LICENSE = "GPLv2 & LGPLv2.1"
openembedded-core/meta/recipes-sato/pimlico/contacts.inc:LICENSE = "GPLv2 & GPLv2+ & GPLv3+ "
openembedded-core/meta/recipes-sato/pimlico/tasks.inc:LICENSE = "GPLv2 & GPLv2+"
openembedded-core/meta/recipes-sato/pimlico/dates.inc:LICENSE = "GPLv2 & GPLv2+ & LGPLv2+"
openembedded-core/meta/recipes-sato/sato-screenshot/sato-screenshot_git.bb:LICENSE = "GPLv2 & GPLv2+"
openembedded-core/meta/recipes-sato/matchbox-desktop/matchbox-desktop_git.bb:LICENSE = "GPLv2+ & LGPLv2+"
openembedded-core/meta/recipes-sato/gtk-engines/gtk-sato-engine.inc:LICENSE = "LGPLv2.1 & LGPLv2+"
openembedded-core/meta/recipes-sato/libowl/libowl_git.bb:LICENSE = "GPLv2 & LGPLv2+"
openembedded-core/meta/recipes-sato/eds/eds-dbus_2.20.0.bb:LICENSE = "LGPLv2 & LGPLv2+"
openembedded-core/meta/recipes-sato/eds/eds-dbus_git.bb:LICENSE = "LGPLv2 & LGPLv2+"
openembedded-core/meta/recipes-sato/owl-video-widget/owl-video_git.bb:LICENSE = "LGPLv2.1 & GPLv2+"
openembedded-core/meta/recipes-sato/leafpad/leafpad_0.8.18.1.bb:LICENSE = "GPLv2 & GPLv2+"
openembedded-core/meta/recipes-sato/webkit/webkit-gtk_svn.bb:LICENSE = "BSD & LGPLv2+"
openembedded-core/meta/recipes-sato/pcmanfm/pcmanfm_0.9.10.bb:LICENSE = "GPLv2 & GPLv2+ & LGPLv2.1+"
openembedded-core/meta/recipes-support/gmp/gmp_5.0.2.bb:LICENSE="LGPLv3&GPLv3"
openembedded-core/meta/recipes-support/libfm/libfm_0.1.17.bb:LICENSE = "GPLv2 & GPLv2+"
openembedded-core/meta/recipes-support/boost/boost.inc:LICENSE = "BSL-1 & MIT & Python-2.0"
openembedded-core/meta/recipes-support/gpgme/gpgme_1.3.1.bb:LICENSE = "GPLv2+ & LGPLv2.1+"
openembedded-core/meta/recipes-support/beecrypt/beecrypt_4.2.1.bb:LICENSE = "GPLv2 & LGPLv2.1"
openembedded-core/meta/recipes-support/libcroco/libcroco_0.6.3.bb:LICENSE = "LGPLv2 & LGPLv2.1"
openembedded-core/meta/recipes-support/libgdbus/libgdbus_git.bb:LICENSE = "GPLv2 & LGPLv2.1"
openembedded-core/meta/recipes-support/libgpg-error/libgpg-error_1.10.bb:LICENSE = "GPLv2+ & LGPLv2.1+"
openembedded-core/meta/recipes-support/atk/atk.inc:LICENSE = "LGPLv2 & LGPLv2+"
openembedded-core/meta/recipes-support/gnutls/gnutls.inc:LICENSE = "GPLv3+ & LGPLv2.1+"
openembedded-core/meta/recipes-support/gnutls/libtasn1_2.11.bb:LICENSE = "GPLv3+ & LGPLv2.1+"
openembedded-core/meta/recipes-support/libgcrypt/libgcrypt.inc:LICENSE = "GPLv2+ & LGPLv2.1+"
openembedded-core/meta/recipes-support/liburcu/liburcu_0.6.4.bb:LICENSE = "LGPLv2.1+ & MIT-style"
openembedded-core/meta/recipes-support/libassuan/libassuan_2.0.2.bb:LICENSE = "GPLv3 & LGPLv2.1+"
openembedded-core/meta/recipes-support/attr/acl.inc:LICENSE = "LGPLv2.1+ & GPLv2+"
openembedded-core/meta/recipes-support/attr/attr.inc:LICENSE = "LGPLv2.1+ & GPLv2+"
openembedded-core/meta/recipes-support/mpfr/mpfr_3.1.0.bb:LICENSE="GPLv3&LGPLv3"
openembedded-core/meta/recipes-graphics/xorg-util/util-macros_1.15.0.bb:LICENSE = "MIT & MIT-style"
openembedded-core/meta/recipes-graphics/xtscal/xtscal_0.6.3.bb:LICENSE = "GPLv2 & GPLv2+"
openembedded-core/meta/recipes-graphics/cairo/cairo.inc:LICENSE = "MPL-1 & LGPLv2.1"
openembedded-core/meta/recipes-graphics/mesa/mesa-demos_8.0.1.bb:LICENSE = "MIT & PD"
openembedded-core/meta/recipes-graphics/xorg-font/font-util_1.2.0.bb:LICENSE = "BSD & MIT"
openembedded-core/meta/recipes-graphics/xorg-driver/xf86-video-omapfb_git.bb:LICENSE = "MIT-X & GPLv2+"
openembedded-core/meta/recipes-graphics/fontconfig/fontconfig_2.8.0.bb:LICENSE = "MIT-style & MIT & PD"
openembedded-core/meta/recipes-graphics/menu-cache/menu-cache_0.3.2.bb:LICENSE = "GPLv2 & GPLv2+"
openembedded-core/meta/recipes-graphics/xorg-proto/fixesproto_5.0.bb:LICENSE = "MIT & MIT-style"
openembedded-core/meta/recipes-graphics/xorg-proto/xextproto_7.2.0.bb:LICENSE = "MIT & MIT-style"
openembedded-core/meta/recipes-graphics/xorg-proto/compositeproto_0.4.2.bb:LICENSE = "MIT & MIT-style"
openembedded-core/meta/recipes-graphics/xorg-proto/videoproto_2.3.1.bb:LICENSE = "MIT & MIT-style"
openembedded-core/meta/recipes-graphics/xorg-proto/xproto_7.0.22.bb:LICENSE = "MIT & MIT-style"
openembedded-core/meta/recipes-graphics/xorg-proto/xineramaproto_1.2.1.bb:LICENSE = "MIT & MIT-style"
openembedded-core/meta/recipes-graphics/xorg-proto/inputproto_2.0.2.bb:LICENSE = "MIT & MIT-style"
openembedded-core/meta/recipes-graphics/xorg-lib/libxt_1.1.1.bb:LICENSE = "MIT & MIT-style"
openembedded-core/meta/recipes-graphics/xorg-lib/libxmu_1.1.0.bb:LICENSE = "MIT & MIT-style"
openembedded-core/meta/recipes-graphics/xorg-lib/xtrans_1.2.6.bb:LICENSE = "MIT & MIT-style"
openembedded-core/meta/recipes-graphics/xorg-lib/libx11-trim_1.3.4.bb:LICENSE = "MIT & MIT-style & BSD"
openembedded-core/meta/recipes-graphics/xorg-lib/pixman_0.24.0.bb:LICENSE = "MIT & MIT-style & PD"
openembedded-core/meta/recipes-graphics/xorg-lib/xkeyboard-config_2.1.bb:LICENSE = "MIT & MIT-style"
openembedded-core/meta/recipes-graphics/xorg-lib/libpciaccess_0.12.1.bb:LICENSE = "MIT & MIT-style"
openembedded-core/meta/recipes-graphics/xorg-lib/libxfont_1.4.4.bb:LICENSE= "MIT & MIT-style & BSD"
openembedded-core/meta/recipes-graphics/xorg-lib/libxp_1.0.1.bb:LICENSE = "MIT & MIT-style"
openembedded-core/meta/recipes-graphics/xorg-lib/libxi_1.4.3.bb:LICENSE = "MIT & MIT-style"
openembedded-core/meta/recipes-graphics/xorg-lib/libx11-trim_1.4.4.bb:LICENSE = "MIT & MIT-style & BSD"
openembedded-core/meta/recipes-graphics/xorg-lib/libx11.inc:LICENSE = "MIT & MIT-style & BSD"
openembedded-core/meta/recipes-rt/rt-tests/rt-tests_0.83.bb:LICENSE = "GPLv2 & GPLv2+"

Quoted 19 lines

meta/classes/copyleft_compliance.bbclass line 26

Quoted 13 lines
meta/classes/copyleft_compliance.bbclass new file +13 -0
+
+COPYLEFT_LICENSE_EXCLUDE ?= 'CLOSED Proprietary'
+COPYLEFT_LICENSE_EXCLUDE[type] = 'list'
+COPYLEFT_LICENSE_INCLUDE[doc] = 'Space separated list of globs which exclude licenses'
+
+
+def copyleft_should_include(d):
+    """Determine if this recipe's sources should be deployed for compliance"""
+    import ast
+    import oe.license
+    from fnmatch import fnmatchcase as fnmatch
+
+    if oe.utils.inherits(d, 'native', 'nativesdk', 'cross', 'crossdk'):

we do ship some of them in SDK so IMO they should not be excluded.

_______________________________________________
Openembedded-core mailing list
[email protected]
http://lists.linuxtogo.org/cgi-bin/mailman/listinfo/openembedded-core

Signature · 3 lines
Best Regards
Ulf Samuelsson
eMagii
#8 lore raw

Re: [PATCH 4/8] Add copyleft compliance class --- MAJOR BREAKAGE!!!!

Quoted 43 lines · Ulf Samuelsson
Quoted 32 lines · Khem Raj
Quoted 31 lines · Beth Flanagan

From: Christopher Larson<[email protected]>

Deploys sources for recipes for compliance with copyleft-style licenses Defaults to using symlinks, as it's a quick operation, and one can easily follow the links when making use of the files (e.g. tar with the -h arg).

By default, includes all GPL and LGPL, and excludes CLOSED and Proprietary.

---
  meta/classes/copyleft_compliance.bbclass |   94 
++++++++++++++++++++++++++++++
  1 files changed, 94 insertions(+), 0 deletions(-)

create mode 100644 meta/classes/copyleft_compliance.bbclass

meta/classes/copyleft_compliance.bbclass new file +1 -0
new file mode 100644
index 0000000..5d9ab11
@@ -0,0 +1,94 @@
+# Deploy sources for recipes for compliance with copyleft-style 

licenses
+# Defaults to using symlinks, as it's a quick operation, and one can easily

meta/classes/copyleft_compliance.bbclass new file +3 -1
+# follow the links when making use of the files (e.g. tar with the 
-h arg).
+#
+# By default, includes all GPL and LGPL, and excludes CLOSED and 

Proprietary.
+#

Quoted 8 lines
Quoted 8 lines
meta/classes/copyleft_compliance.bbclass new file +7 -0
+# vi:sts=4:sw=4:et
+
+COPYLEFT_SOURCES_DIR ?= '${DEPLOY_DIR}/copyleft_sources'
+
+COPYLEFT_LICENSE_INCLUDE ?= 'GPL* LGPL*'
+COPYLEFT_LICENSE_INCLUDE[type] = 'list'
+COPYLEFT_LICENSE_INCLUDE[doc] = 'Space separated list of globs 

which include licenses'

If the Ampersand is not accepted in the LICENSE string, then the recipes below are broken.

Quoted 9 lines

From my latest build, at least recipes with "&&" fail... This means that nothing really completes that I have tested.

MAJOR BREAKAGE!!!!

I think it would be better FIRST to fix the recipes, and then introduce checking. BR
Ulf

Some more failing!
meta-angstrom/recipes-angstrom/angstrom/e-wm-config-angstrom.bb:LICENSE = "MIT/BSD" meta-angstrom/recipes-angstrom/angstrom/exquisite-theme-angstrom.bb:LICENSE = "MIT/BSD" meta-openembedded/meta-oe/recipes-graphics/xinput-calibrator/xinput-calibrator_0.7.5.bb:LICENSE = "MIT/X11" meta-smartphone/meta-fso/recipes-freesmartphone/freesmartphone/illume-theme-freesmartphone_git.bb:LICENSE = "MIT/BSD"

BR
Ulf

Quoted 193 lines

meta-bugfix/meta/recipes-connectivity/connman/connman-gnome_0.5.bb:LICENSE = "GPLv2 & LGPLv2.1" meta-openembedded/meta-gnome/recipes-gnome/gobject-introspection/gobject-introspection_0.9.10.bb:LICENSE = "GPLv2+ & LGPLv2+" meta-openembedded/meta-gnome/recipes-gnome/gobject-introspection/gobject-introspection_git.bb:LICENSE = "GPLv2+ & LGPLv2+" meta-openembedded/meta-gnome/recipes-gnome/gnome-menus/gnome-menus_2.30.5.bb:LICENSE = "GPLv2 && LGPLv2" meta-openembedded/meta-gnome/recipes-gnome/gnome-vfs/gnome-vfs_2.24.4.bb:LICENSE = "GPLv2+ & LGPLv2+" meta-openembedded/meta-gnome/recipes-gnome/gtk+/gtk+3_3.0.11.bb:LICENSE = "LGPLv2 & LGPLv2+ & LGPLv2.1+" meta-openembedded/meta-gnome/recipes-gnome/nautilus/nautilus3_3.0.2.bb:LICENSE="GPLv2 && LGPLv2" meta-openembedded/meta-gnome/recipes-gnome/nautilus/nautilus_2.32.2.bb:LICENSE="GPLv2 && LGPLv2" meta-openembedded/meta-gnome/recipes-gnome/bonobo/libbonobo.inc:LICENSE = "GPLv2 && LGPLv2.1" meta-openembedded/meta-gnome/recipes-gnome/bonobo/libbonoboui_2.24.3.bb:LICENSE = "GPLv2 && LGPLv2.1" meta-openembedded/meta-gnome/recipes-gnome/gnome-desktop/gnome-desktop_2.32.1.bb:LICENSE = "GPLv2 & LGPLv2" meta-openembedded/meta-gnome/recipes-gnome/gnome-desktop/gnome-desktop3_3.0.2.bb:LICENSE = "GPLv2 & LGPLv2" meta-openembedded/meta-gnome/recipes-gnome/gnome-panel/gnome-panel_2.32.1.bb:LICENSE = "GPLv2 && LGPLv2 && GFDLv1.1" meta-openembedded/meta-gnome/recipes-gnome/gnome-panel/gnome-panel3_3.0.2.bb:LICENSE = "GPLv2 && LGPLv2 && GFDLv1.1" meta-openembedded/meta-gnome/recipes-gnome/gnome-bluetooth/gnome-bluetooth_2.32.0.bb:LICENSE = "GPLv2 && LGPLv2.1" meta-openembedded/meta-gnome/recipes-gnome/libgnome/libgnome-keyring_2.32.0.bb:LICENSE = "LGPLv2 && GPLv2" meta-openembedded/meta-oe/recipes-multimedia/jack/jack_0.121.0.bb:LICENSE = "GPLv2 && LGPLv2.1" meta-openembedded/meta-oe/recipes-multimedia/audiofile/audiofile_0.2.7.bb:LICENSE = "LGPLv2 && GPLv2" meta-openembedded/meta-oe/recipes-connectivity/obex/openobex_1.5.bb:LICENSE = "GPLv2 && LGPLv2.1" meta-openembedded/meta-oe/recipes-gnome/gtk+/gtkmm.inc:LICENSE = "LGPLv2.1 && GPLv2" meta-openembedded/meta-oe/recipes-devtools/nodejs/nodejs_0.4.12.bb:LICENSE = "MIT && zlib" meta-openembedded/meta-oe/recipes-devtools/python/python-numeric_24.2.bb:LICENSE = "PSF & LLNL" meta-openembedded/meta-oe/recipes-devtools/swig/swig.inc:LICENSE = "BSD && GPLv3" meta-openembedded/meta-oe/recipes-devtools/gcc/gcc-4.5.inc:LICENSE="GCC RUNTIME LIBRARY EXCEPTION & GPLv2 & GPLv3 & LGPLv2.1 & LGPLv3" meta-openembedded/meta-oe/recipes-core/glib-2.0/glibmm.inc:LICENSE = "LGPLv2.1 && GPLv2" meta-openembedded/meta-oe/recipes-core/udev/udev_175.bb:LICENSE = "GPLv2+ & LGPLv2.1+" meta-openembedded/meta-oe/recipes-core/udev/udev_173.bb:LICENSE = "GPLv2+ & LGPLv2.1+" meta-openembedded/meta-oe/recipes-support/ntfs-3g-ntfsprogs/ntfs-3g-ntfsprogs_2011.4.12.bb:LICENSE = "GPLv2 & LGPLv2" meta-openembedded/meta-oe/recipes-support/sg3-utils/sg3-utils_1.31.bb:LICENSE = "GPLv2+ && BSD" meta-openembedded/meta-oe/recipes-support/debianutils/debianutils_2.30.bb:LICENSE = "GPLv2 & BSD & SMAIL_GPL" meta-openembedded/meta-oe/recipes-support/mpfr/mpfr_3.0.0.bb:LICENSE="GPLv3&LGPLv3"

meta-openembedded/meta-oe/recipes-support/fuse/fuse_2.8.6.bb:LICENSE = "GPLv2&LGPLv2"
meta-openembedded/meta-oe/recipes-support/fuse/fuse_2.8.5.bb:LICENSE = "GPLv2&LGPLv2"
meta-openembedded/meta-oe/recipes-support/lvm2/lvm2.inc:LICENSE = "GPLv2 && LGPLv2"
meta-openembedded/meta-oe/recipes-graphics/pango/pangomm_2.28.2.bb:LICENSE = "LGPLv2.1 && GPLv2"
meta-openembedded/meta-oe/recipes-graphics/ttf-fonts/ttf-gentium_1.02.bb:LICENSE_URL = "http://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&item_id=OFL"
meta-smartphone/meta-aurora/recipes-aurora/aurora/aurora-daemon_git.bb:LICENSE = "GPLv2 & Other"
meta-ti/recipes-misc/payload/beaglebone-getting-started.bb:LICENSE = "GPLv2+ && MIT && PD && others"
openembedded-core/meta/recipes-multimedia/flac/flac_1.2.1.bb:LICENSE = "FDLv1.2 & GPLv2+ & LGPLv2.1+ & BSD"
openembedded-core/meta/recipes-multimedia/alsa/alsa-lib_1.0.24.1.bb:LICENSE = "LGPLv2.1 & GPLv2+"
openembedded-core/meta/recipes-multimedia/alsa/alsa-tools_1.0.24.1.bb:LICENSE = "GPLv2 & LGPLv2+"
openembedded-core/meta/recipes-multimedia/pulseaudio/pulseaudio.inc:LICENSE = "GPLv2+ & LGPLv2.1"
openembedded-core/meta/recipes-multimedia/pulseaudio/libatomics-ops_1.2.bb:LICENSE = "GPLv2 & MIT"
openembedded-core/meta/recipes-multimedia/gstreamer/gst-plugins-ugly_0.10.17.bb:LICENSE = "GPLv2+ & LGPLv2.1+ & LGPLv2+"
openembedded-core/meta/recipes-multimedia/gstreamer/gst-ffmpeg_0.10.11.bb:LICENSE = "GPLv2+ & LGPLv2+ & ( (GPLv2+ & LGPLv2.1+) | (GPLv3+ & LGPLv3+) )"
openembedded-core/meta/recipes-multimedia/gstreamer/gst-plugins-base_0.10.35.bb:LICENSE = "GPLv2+ & LGPLv2+"
openembedded-core/meta/recipes-multimedia/gstreamer/gst-plugins-bad_0.10.21.bb:LICENSE = "GPLv2+ & LGPLv2+ & LGPLv2.1+ "
openembedded-core/meta/recipes-multimedia/gstreamer/gst-plugins-good_0.10.30.bb:LICENSE = "GPLv2+ & LGPLv2.1+"
openembedded-core/meta/classes/src_distribute.bbclass: licenses = d.getVar('LICENSE', 1).replace('&', '|')
openembedded-core/meta/classes/license.bbclass: pkged_lic="$(sed -n '/^LICENSE: /{ s/^LICENSE: //; s/[+|&()*]/ /g; s/ */ /g; p }' ${filename})"
openembedded-core/meta/recipes-connectivity/bluez/bluez4.inc:LICENSE = "GPLv2+ & LGPLv2.1+"
openembedded-core/meta/recipes-connectivity/bind/bind_9.8.1.bb:LICENSE = "ISC & BSD"
openembedded-core/meta/recipes-connectivity/wireless-tools/wireless-tools_29.bb:LICENSE = "GPLv2 & (LGPL | MPL | BSD)"
openembedded-core/meta/recipes-connectivity/gypsy/gypsy_git.bb:LICENSE = "GPLv2+ & LGPLv2+"
openembedded-core/meta/recipes-connectivity/gypsy/gypsy_0.8.bb:LICENSE = "GPLv2+ & LGPLv2+"
openembedded-core/meta/recipes-connectivity/avahi/avahi.inc:LICENSE = "GPLv2+ & LGPLv2.1+"
openembedded-core/meta/recipes-connectivity/connman/connman-gnome_0.5.bb:LICENSE = "GPLv2 & LGPLv2.1"
openembedded-core/meta/recipes-connectivity/ppp/ppp_2.4.5.bb:LICENSE = "BSD & GPLv2+ & LGPLv2+ & PD"
openembedded-core/meta/recipes-connectivity/gsm/gsmd.inc:LICENSE = "GPLv2+ & LGPLv2.1+"
openembedded-core/meta/recipes-gnome/gtk+/gtk+.inc:LICENSE = "LGPLv2 & LGPLv2+ & LGPLv2.1+"
openembedded-core/meta/recipes-gnome/libglade/libglade_2.6.4.bb:LICENSE = "LGPLv2 & LGPLv2+"
openembedded-core/meta/recipes-gnome/gnome/gnome-desktop.inc:LICENSE = "GPLv2 & LGPLv2"
openembedded-core/meta/recipes-gnome/gnome/gobject-introspection_git.bb:LICENSE = "GPLv2+ & LGPLv2+"
openembedded-core/meta/recipes-gnome/gnome/gnome-doc-utils.inc:LICENSE = "GPL & LGPL"
openembedded-core/meta/recipes-gnome/gnome/libgnome-keyring_2.32.0.bb:LICENSE = "LGPLv2 & LGPLv2+ & LGPLv2.1+"
openembedded-core/meta/recipes-gnome/gnome/gnome-mime-data_2.18.0.bb:LICENSE = "GPLv2 & GPLv2+"
openembedded-core/meta/recipes-gnome/gnome/gnome-keyring_2.32.1.bb:LICENSE = "GPLv2+ & LGPLv2+ & LGPLv2.1+"
openembedded-core/meta/recipes-extended/quota/quota_4.00-pre1.bb:LICENSE = "BSD & GPLv2+ & LGPLv2.1+"
openembedded-core/meta/recipes-extended/sudo/sudo.inc:LICENSE = "ISC & UCB & Zlib"
openembedded-core/meta/recipes-extended/sysklogd/sysklogd.inc:LICENSE = "GPLv2+ & BSD"
openembedded-core/meta/recipes-extended/xz/xz_5.0.3.bb:LICENSE = "GPLv2+ & GPLv3+ & LGPLv2.1+"
openembedded-core/meta/recipes-extended/cronie/cronie_1.4.8.bb:LICENSE = "ISC & BSD"
openembedded-core/meta/recipes-extended/libidn/libidn_0.6.14.bb:LICENSE = "LGPLv2.1+ & GPLv2+"
openembedded-core/meta/recipes-extended/libidn/libidn_1.22.bb:LICENSE = "LGPLv2.1+ & GPLv3+"
openembedded-core/meta/recipes-extended/iputils/iputils_s20101006.bb:LICENSE = "BSD & GPLv2+"
openembedded-core/meta/recipes-extended/bc/bc_1.06.bb:LICENSE = "GPLv2+ & LGPLv2.1"
openembedded-core/meta/recipes-extended/mailx/mailx_12.5.bb:LICENSE = "BSD & MPL-1"
openembedded-core/meta/recipes-extended/procps/procps.inc:LICENSE = "GPLv2+ & LGPLv2+"
openembedded-core/meta/files/common-licenses/CDDL-1.0:COVERED SOFTWARE IS PROVIDED UNDER THIS LICENSE ON AN &#8220;AS IS&#8221; BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE COVERED SOFTWARE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED SOFTWARE IS WITH YOU. SHOULD ANY COVERED SOFTWARE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY COVERED SOFTWARE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER. openembedded-core/meta/files/common-licenses/CPAL-1.0:COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN &#8220;AS IS&#8221; BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE COVERED CODE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED CODE IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL DEVELOPER, ORIGINAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER. openembedded-core/meta/recipes-devtools/elfutils/elfutils_0.148.bb:LICENSE = "(GPL-2+ & Elfutils-Exception)"
openembedded-core/meta/recipes-devtools/e2fsprogs/e2fsprogs.inc:LICENSE = "GPLv2 & LGPLv2 & BSD & MIT"
openembedded-core/meta/recipes-devtools/valgrind/valgrind_3.6.1.bb:LICENSE = "GPLv2 & GPLv2+ & BSD"
openembedded-core/meta/recipes-devtools/gdb/gdb_7.3.1.bb:LICENSE="GPLv2 & GPLv3 & LGPLv2 & LGPLv3"
openembedded-core/meta/recipes-devtools/python/python-pycairo_1.8.10.bb:LICENSE = "LGPLv2.1 & MPL-1"
openembedded-core/meta/recipes-devtools/gcc/gcc-4.6.inc:LICENSE="GPL-3.0-with-GCC-exception & GPLv3"
openembedded-core/meta/recipes-devtools/squashfs-tools/squashfs-tools_4.2.bb:LICENSE = "GPL-2 & PD"
openembedded-core/meta/recipes-devtools/libtool/libtool-2.4.2.inc:LICENSE = "GPLv2 & LGPLv2.1"
openembedded-core/meta/recipes-devtools/autoconf/autoconf_2.68.bb:LICENSE = "GPLv2 & GPLv3"
openembedded-core/meta/recipes-devtools/qemu/qemu.inc:LICENSE = "GPLv2 & LGPLv2.1"
openembedded-core/meta/recipes-devtools/make/make_3.82.bb:LICENSE="GPLv3&LGPLv2"

openembedded-core/meta/recipes-core/gettext/gettext_0.18.1.1.bb:LICENSE = "GPL-3+ & LGPL-2.1+" openembedded-core/meta/recipes-core/glib-2.0/glib.inc:LICENSE = "LGPLv2+ & BSD & PD" openembedded-core/meta/recipes-core/busybox/busybox.inc:LICENSE = "GPLv2 & BSD-4-Clause" openembedded-core/meta/recipes-core/udev/udev-new.inc:LICENSE = "GPLv2+ & LGPLv2.1+" openembedded-core/meta/recipes-core/sysfsutils/sysfsutils_2.1.0.bb:LICENSE = "GPLv2 & LGPLv2.1" openembedded-core/meta/recipes-core/eglibc/eglibc-locale.inc:LICENSE = "GPLv2 & LGPLv2.1" openembedded-core/meta/recipes-core/eglibc/eglibc-common.inc:LICENSE = "GPLv2 & LGPLv2.1" openembedded-core/meta/recipes-core/util-linux/util-linux.inc:LICENSE = "GPLv2+ & LGPLv2.1+ & BSD" openembedded-core/meta/recipes-kernel/oprofile/oprofile.inc:LICENSE = "LGPLv2.1+ & GPLv2" openembedded-core/meta/recipes-kernel/lttng/lttng-ust_0.15.bb:LICENSE = "LGPLv2.1+ & BSD" openembedded-core/meta/recipes-kernel/lttng/lttng-viewer_0.12.38.bb:LICENSE = "GPLv2 & LGPLv2.1" openembedded-core/meta/recipes-sato/pimlico/contacts.inc:LICENSE = "GPLv2 & GPLv2+ & GPLv3+ " openembedded-core/meta/recipes-sato/pimlico/tasks.inc:LICENSE = "GPLv2 & GPLv2+" openembedded-core/meta/recipes-sato/pimlico/dates.inc:LICENSE = "GPLv2 & GPLv2+ & LGPLv2+" openembedded-core/meta/recipes-sato/sato-screenshot/sato-screenshot_git.bb:LICENSE = "GPLv2 & GPLv2+" openembedded-core/meta/recipes-sato/matchbox-desktop/matchbox-desktop_git.bb:LICENSE = "GPLv2+ & LGPLv2+" openembedded-core/meta/recipes-sato/gtk-engines/gtk-sato-engine.inc:LICENSE = "LGPLv2.1 & LGPLv2+" openembedded-core/meta/recipes-sato/libowl/libowl_git.bb:LICENSE = "GPLv2 & LGPLv2+" openembedded-core/meta/recipes-sato/eds/eds-dbus_2.20.0.bb:LICENSE = "LGPLv2 & LGPLv2+" openembedded-core/meta/recipes-sato/eds/eds-dbus_git.bb:LICENSE = "LGPLv2 & LGPLv2+" openembedded-core/meta/recipes-sato/owl-video-widget/owl-video_git.bb:LICENSE = "LGPLv2.1 & GPLv2+" openembedded-core/meta/recipes-sato/leafpad/leafpad_0.8.18.1.bb:LICENSE = "GPLv2 & GPLv2+" openembedded-core/meta/recipes-sato/webkit/webkit-gtk_svn.bb:LICENSE = "BSD & LGPLv2+" openembedded-core/meta/recipes-sato/pcmanfm/pcmanfm_0.9.10.bb:LICENSE = "GPLv2 & GPLv2+ & LGPLv2.1+" openembedded-core/meta/recipes-support/gmp/gmp_5.0.2.bb:LICENSE="LGPLv3&GPLv3"

openembedded-core/meta/recipes-support/libfm/libfm_0.1.17.bb:LICENSE = "GPLv2 & GPLv2+" openembedded-core/meta/recipes-support/boost/boost.inc:LICENSE = "BSL-1 & MIT & Python-2.0" openembedded-core/meta/recipes-support/gpgme/gpgme_1.3.1.bb:LICENSE = "GPLv2+ & LGPLv2.1+" openembedded-core/meta/recipes-support/beecrypt/beecrypt_4.2.1.bb:LICENSE = "GPLv2 & LGPLv2.1" openembedded-core/meta/recipes-support/libcroco/libcroco_0.6.3.bb:LICENSE = "LGPLv2 & LGPLv2.1" openembedded-core/meta/recipes-support/libgdbus/libgdbus_git.bb:LICENSE = "GPLv2 & LGPLv2.1" openembedded-core/meta/recipes-support/libgpg-error/libgpg-error_1.10.bb:LICENSE = "GPLv2+ & LGPLv2.1+" openembedded-core/meta/recipes-support/atk/atk.inc:LICENSE = "LGPLv2 & LGPLv2+" openembedded-core/meta/recipes-support/gnutls/gnutls.inc:LICENSE = "GPLv3+ & LGPLv2.1+" openembedded-core/meta/recipes-support/gnutls/libtasn1_2.11.bb:LICENSE = "GPLv3+ & LGPLv2.1+" openembedded-core/meta/recipes-support/libgcrypt/libgcrypt.inc:LICENSE = "GPLv2+ & LGPLv2.1+" openembedded-core/meta/recipes-support/liburcu/liburcu_0.6.4.bb:LICENSE = "LGPLv2.1+ & MIT-style" openembedded-core/meta/recipes-support/libassuan/libassuan_2.0.2.bb:LICENSE = "GPLv3 & LGPLv2.1+" openembedded-core/meta/recipes-support/attr/acl.inc:LICENSE = "LGPLv2.1+ & GPLv2+" openembedded-core/meta/recipes-support/attr/attr.inc:LICENSE = "LGPLv2.1+ & GPLv2+" openembedded-core/meta/recipes-support/mpfr/mpfr_3.1.0.bb:LICENSE="GPLv3&LGPLv3"

openembedded-core/meta/recipes-graphics/xorg-util/util-macros_1.15.0.bb:LICENSE = "MIT & MIT-style" openembedded-core/meta/recipes-graphics/xtscal/xtscal_0.6.3.bb:LICENSE = "GPLv2 & GPLv2+" openembedded-core/meta/recipes-graphics/cairo/cairo.inc:LICENSE = "MPL-1 & LGPLv2.1" openembedded-core/meta/recipes-graphics/mesa/mesa-demos_8.0.1.bb:LICENSE = "MIT & PD" openembedded-core/meta/recipes-graphics/xorg-font/font-util_1.2.0.bb:LICENSE = "BSD & MIT" openembedded-core/meta/recipes-graphics/xorg-driver/xf86-video-omapfb_git.bb:LICENSE = "MIT-X & GPLv2+" openembedded-core/meta/recipes-graphics/fontconfig/fontconfig_2.8.0.bb:LICENSE = "MIT-style & MIT & PD" openembedded-core/meta/recipes-graphics/menu-cache/menu-cache_0.3.2.bb:LICENSE = "GPLv2 & GPLv2+" openembedded-core/meta/recipes-graphics/xorg-proto/fixesproto_5.0.bb:LICENSE = "MIT & MIT-style" openembedded-core/meta/recipes-graphics/xorg-proto/xextproto_7.2.0.bb:LICENSE = "MIT & MIT-style" openembedded-core/meta/recipes-graphics/xorg-proto/compositeproto_0.4.2.bb:LICENSE = "MIT & MIT-style" openembedded-core/meta/recipes-graphics/xorg-proto/videoproto_2.3.1.bb:LICENSE = "MIT & MIT-style" openembedded-core/meta/recipes-graphics/xorg-proto/xproto_7.0.22.bb:LICENSE = "MIT & MIT-style" openembedded-core/meta/recipes-graphics/xorg-proto/xineramaproto_1.2.1.bb:LICENSE = "MIT & MIT-style" openembedded-core/meta/recipes-graphics/xorg-proto/inputproto_2.0.2.bb:LICENSE = "MIT & MIT-style" openembedded-core/meta/recipes-graphics/xorg-lib/libxt_1.1.1.bb:LICENSE = "MIT & MIT-style" openembedded-core/meta/recipes-graphics/xorg-lib/libxmu_1.1.0.bb:LICENSE = "MIT & MIT-style" openembedded-core/meta/recipes-graphics/xorg-lib/xtrans_1.2.6.bb:LICENSE = "MIT & MIT-style" openembedded-core/meta/recipes-graphics/xorg-lib/libx11-trim_1.3.4.bb:LICENSE = "MIT & MIT-style & BSD" openembedded-core/meta/recipes-graphics/xorg-lib/pixman_0.24.0.bb:LICENSE = "MIT & MIT-style & PD" openembedded-core/meta/recipes-graphics/xorg-lib/xkeyboard-config_2.1.bb:LICENSE = "MIT & MIT-style" openembedded-core/meta/recipes-graphics/xorg-lib/libpciaccess_0.12.1.bb:LICENSE = "MIT & MIT-style" openembedded-core/meta/recipes-graphics/xorg-lib/libxfont_1.4.4.bb:LICENSE= "MIT & MIT-style & BSD" openembedded-core/meta/recipes-graphics/xorg-lib/libxp_1.0.1.bb:LICENSE = "MIT & MIT-style" openembedded-core/meta/recipes-graphics/xorg-lib/libxi_1.4.3.bb:LICENSE = "MIT & MIT-style" openembedded-core/meta/recipes-graphics/xorg-lib/libx11-trim_1.4.4.bb:LICENSE = "MIT & MIT-style & BSD" openembedded-core/meta/recipes-graphics/xorg-lib/libx11.inc:LICENSE = "MIT & MIT-style & BSD" openembedded-core/meta/recipes-rt/rt-tests/rt-tests_0.83.bb:LICENSE = "GPLv2 & GPLv2+"

Quoted 22 lines
Quoted 15 lines
meta/classes/copyleft_compliance.bbclass new file +4 -0
+
+COPYLEFT_LICENSE_EXCLUDE ?= 'CLOSED Proprietary'
+COPYLEFT_LICENSE_EXCLUDE[type] = 'list'
+COPYLEFT_LICENSE_INCLUDE[doc] = 'Space separated list of globs 

which exclude licenses'

meta/classes/copyleft_compliance.bbclass new file +4 -0
+
+
+def copyleft_should_include(d):
+    """Determine if this recipe's sources should be deployed for 

compliance"""

meta/classes/copyleft_compliance.bbclass new file +5 -0
+    import ast
+    import oe.license
+    from fnmatch import fnmatchcase as fnmatch
+
+    if oe.utils.inherits(d, 'native', 'nativesdk', 'cross', 
Quoted 1 line

'crossdk'):

we do ship some of them in SDK so IMO they should not be excluded.

_______________________________________________
Openembedded-core mailing list
[email protected]
http://lists.linuxtogo.org/cgi-bin/mailman/listinfo/openembedded-core

Signature · 3 lines
Best Regards
Ulf Samuelsson
eMagii
#9 lore raw

Re: [PATCH 4/8] Add copyleft compliance class --- MAJOR BREAKAGE!!!!

In reply to Ulf Samuelsson
Quoted 38 lines · Ulf Samuelsson
Quoted 26 lines · Khem Raj
Quoted 25 lines · Beth Flanagan

From: Christopher Larson<[email protected]>

Deploys sources for recipes for compliance with copyleft-style licenses Defaults to using symlinks, as it's a quick operation, and one can easily follow the links when making use of the files (e.g. tar with the -h arg).

By default, includes all GPL and LGPL, and excludes CLOSED and Proprietary.

---
  meta/classes/copyleft_compliance.bbclass |   94 ++++++++++++++++++++++++++++++
  1 files changed, 94 insertions(+), 0 deletions(-)

create mode 100644 meta/classes/copyleft_compliance.bbclass

meta/classes/copyleft_compliance.bbclass new file +5 -0
new file mode 100644
index 0000000..5d9ab11
@@ -0,0 +1,94 @@
+# Deploy sources for recipes for compliance with copyleft-style licenses
+# Defaults to using symlinks, as it's a quick operation, and one can easily
+# follow the links when making use of the files (e.g. tar with the -h arg).
+#
+# By default, includes all GPL and LGPL, and excludes CLOSED and Proprietary.
Quoted 8 lines

meta/classes/copyleft_compliance.bbclass line 13

Quoted 8 lines
meta/classes/copyleft_compliance.bbclass new file +8 -0
+#
+# vi:sts=4:sw=4:et
+
+COPYLEFT_SOURCES_DIR ?= '${DEPLOY_DIR}/copyleft_sources'
+
+COPYLEFT_LICENSE_INCLUDE ?= 'GPL* LGPL*'
+COPYLEFT_LICENSE_INCLUDE[type] = 'list'
+COPYLEFT_LICENSE_INCLUDE[doc] = 'Space separated list of globs which include licenses'

If the Ampersand is not accepted in the LICENSE string, then the recipes below are broken.

Quoted 7 lines

From my latest build, at least recipes with "&&" fail...
This means that nothing really completes that I have tested.

MAJOR BREAKAGE!!!!

I think it would be better FIRST to fix the recipes, and then introduce checking.

I think the single ampersand is accepted, the double might no longer be. Certainly oe-core does continue to work. I hadn't realised there were incompatibilities introduced by this patch :(

Not sure what we should do about this at this point, probably fix the layers :/.

Cheers,

Richard

#10 lore raw

Re: [PATCH 4/8] Add copyleft compliance class --- MAJOR BREAKAGE!!!!

Quoted 39 lines · Richard Purdie
Quoted 38 lines · Ulf Samuelsson
Quoted 26 lines · Khem Raj
Quoted 25 lines · Beth Flanagan

From: Christopher Larson<[email protected]>

Deploys sources for recipes for compliance with copyleft-style licenses Defaults to using symlinks, as it's a quick operation, and one can easily follow the links when making use of the files (e.g. tar with the -h arg).

By default, includes all GPL and LGPL, and excludes CLOSED and Proprietary.

---
   meta/classes/copyleft_compliance.bbclass |   94 ++++++++++++++++++++++++++++++
   1 files changed, 94 insertions(+), 0 deletions(-)

create mode 100644 meta/classes/copyleft_compliance.bbclass

meta/classes/copyleft_compliance.bbclass new file +5 -0
new file mode 100644
index 0000000..5d9ab11
@@ -0,0 +1,94 @@
+# Deploy sources for recipes for compliance with copyleft-style licenses
+# Defaults to using symlinks, as it's a quick operation, and one can easily
+# follow the links when making use of the files (e.g. tar with the -h arg).
+#
+# By default, includes all GPL and LGPL, and excludes CLOSED and Proprietary.
Quoted 8 lines

meta/classes/copyleft_compliance.bbclass line 13

Quoted 8 lines
meta/classes/copyleft_compliance.bbclass new file +8 -0
+#
+# vi:sts=4:sw=4:et
+
+COPYLEFT_SOURCES_DIR ?= '${DEPLOY_DIR}/copyleft_sources'
+
+COPYLEFT_LICENSE_INCLUDE ?= 'GPL* LGPL*'
+COPYLEFT_LICENSE_INCLUDE[type] = 'list'
+COPYLEFT_LICENSE_INCLUDE[doc] = 'Space separated list of globs which include licenses'

If the Ampersand is not accepted in the LICENSE string, then the recipes below are broken.

Quoted 8 lines
Quoted 7 lines

From my latest build, at least recipes with "&&" fail...
This means that nothing really completes that I have tested.

MAJOR BREAKAGE!!!!

I think it would be better FIRST to fix the recipes, and then introduce checking.

I think the single ampersand is accepted, the double might no longer be.

Yes, the single ampersand works, but the double ampersand will break the build as well as the slash '/'.

Quoted 6 lines

Certainly oe-core does continue to work. I hadn't realised there were incompatibilities introduced by this patch :(

Not sure what we should do about this at this point, probably fix the layers :/.

True, question is who and when ?

Quoted 12 lines

Cheers,

Richard

_______________________________________________
Openembedded-core mailing list
[email protected]
http://lists.linuxtogo.org/cgi-bin/mailman/listinfo/openembedded-core

Signature · 3 lines
Best Regards
Ulf Samuelsson
eMagii
#11 lore raw

Re: [PATCH 4/8] Add copyleft compliance class --- MAJOR BREAKAGE!!!!

Op 9 dec. 2011, om 14:46 heeft Ulf Samuelsson het volgende geschreven:

Quoted 52 lines · Richard Purdie
Quoted 39 lines · Ulf Samuelsson
Quoted 38 lines · Khem Raj
Quoted 26 lines · Beth Flanagan
Quoted 25 lines

From: Christopher Larson<[email protected]>

Deploys sources for recipes for compliance with copyleft-style licenses Defaults to using symlinks, as it's a quick operation, and one can easily follow the links when making use of the files (e.g. tar with the -h arg).

By default, includes all GPL and LGPL, and excludes CLOSED and Proprietary.

---
  meta/classes/copyleft_compliance.bbclass |   94 ++++++++++++++++++++++++++++++
  1 files changed, 94 insertions(+), 0 deletions(-)

create mode 100644 meta/classes/copyleft_compliance.bbclass

meta/classes/copyleft_compliance.bbclass new file +5 -0
new file mode 100644
index 0000000..5d9ab11
@@ -0,0 +1,94 @@
+# Deploy sources for recipes for compliance with copyleft-style licenses
+# Defaults to using symlinks, as it's a quick operation, and one can easily
+# follow the links when making use of the files (e.g. tar with the -h arg).
+#
+# By default, includes all GPL and LGPL, and excludes CLOSED and Proprietary.
Quoted 8 lines

meta/classes/copyleft_compliance.bbclass line 13

Quoted 8 lines
meta/classes/copyleft_compliance.bbclass new file +8 -0
+#
+# vi:sts=4:sw=4:et
+
+COPYLEFT_SOURCES_DIR ?= '${DEPLOY_DIR}/copyleft_sources'
+
+COPYLEFT_LICENSE_INCLUDE ?= 'GPL* LGPL*'
+COPYLEFT_LICENSE_INCLUDE[type] = 'list'
+COPYLEFT_LICENSE_INCLUDE[doc] = 'Space separated list of globs which include licenses'

If the Ampersand is not accepted in the LICENSE string, then the recipes below are broken.

Quoted 8 lines
Quoted 7 lines

From my latest build, at least recipes with "&&" fail...
This means that nothing really completes that I have tested.

MAJOR BREAKAGE!!!!

I think it would be better FIRST to fix the recipes, and then introduce checking.

I think the single ampersand is accepted, the double might no longer be.

Yes, the single ampersand works, but the double ampersand will break the build as well as the slash '/'.

Quoted 7 lines
Quoted 6 lines

Certainly oe-core does continue to work. I hadn't realised there were incompatibilities introduced by this patch :(

Not sure what we should do about this at this point, probably fix the layers :/.

True, question is who and when ?

The people complaining about it and right now.

#12 lore raw

Re: [PATCH 4/8] Add copyleft compliance class --- MAJOR BREAKAGE!!!!

Quoted 71 lines · Koen Kooi

Op 9 dec. 2011, om 14:46 heeft Ulf Samuelsson het volgende geschreven:

Quoted 7 lines · Richard Purdie
Quoted 6 lines · Ulf Samuelsson
Quoted 5 lines · Khem Raj
Quoted 4 lines · Beth Flanagan
Quoted 3 lines

From: Christopher Larson<[email protected]>

Deploys sources for recipes for compliance with copyleft-style

licenses

Quoted 1 line
Quoted 1 line
Quoted 1 line
Quoted 1 line
Quoted 1 line

Defaults to using symlinks, as it's a quick operation, and one can

easily

Quoted 1 line
Quoted 1 line
Quoted 1 line
Quoted 1 line
Quoted 1 line

follow the links when making use of the files (e.g. tar with the -h

arg).

Quoted 2 lines
Quoted 2 lines
Quoted 2 lines
Quoted 2 lines
Quoted 2 lines

By default, includes all GPL and LGPL, and excludes CLOSED and

Proprietary.

Quoted 4 lines
Quoted 4 lines
Quoted 4 lines
Quoted 4 lines
Quoted 4 lines
---
  meta/classes/copyleft_compliance.bbclass |   94

++++++++++++++++++++++++++++++

Quoted 4 lines
Quoted 4 lines
Quoted 4 lines
Quoted 4 lines

Review

Quoted 4 lines
  1 files changed, 94 insertions(+), 0 deletions(-)

create mode 100644 meta/classes/copyleft_compliance.bbclass

(quoted diff) +0 -0

b/meta/classes/copyleft_compliance.bbclass

Quoted 6 lines
Quoted 6 lines
Quoted 6 lines
Quoted 6 lines

meta/classes/copyleft_compliance.bbclass line 1

Quoted 6 lines

new file mode 100644
index 0000000..5d9ab11

meta/classes/copyleft_compliance.bbclass new file +1 -0
@@ -0,0 +1,94 @@
+# Deploy sources for recipes for compliance with copyleft-style

licenses

Quoted 1 line
Quoted 1 line
Quoted 1 line
Quoted 1 line

meta/classes/copyleft_compliance.bbclass line 2

Quoted 1 line
meta/classes/copyleft_compliance.bbclass new file +1 -0
+# Defaults to using symlinks, as it's a quick operation, and one

can easily

Quoted 1 line
Quoted 1 line
Quoted 1 line
Quoted 1 line

meta/classes/copyleft_compliance.bbclass line 3

Quoted 1 line
meta/classes/copyleft_compliance.bbclass new file +1 -0
+# follow the links when making use of the files (e.g. tar with the

-h arg).

Quoted 2 lines
Quoted 2 lines
Quoted 2 lines
Quoted 2 lines

meta/classes/copyleft_compliance.bbclass line 5

Quoted 2 lines
meta/classes/copyleft_compliance.bbclass new file +2 -0
+#
+# By default, includes all GPL and LGPL, and excludes CLOSED and

Proprietary.

Quoted 8 lines
Quoted 8 lines
Quoted 8 lines
Quoted 8 lines

meta/classes/copyleft_compliance.bbclass

Quoted 8 lines
meta/classes/copyleft_compliance.bbclass new file +8 -0
+#
+# vi:sts=4:sw=4:et
+
+COPYLEFT_SOURCES_DIR ?= '${DEPLOY_DIR}/copyleft_sources'
+
+COPYLEFT_LICENSE_INCLUDE ?= 'GPL* LGPL*'
+COPYLEFT_LICENSE_INCLUDE[type] = 'list'
+COPYLEFT_LICENSE_INCLUDE[doc] = 'Space separated list of globs

which include licenses'

Quoted 1 line
Quoted 1 line
Quoted 1 line

If the Ampersand is not accepted in the LICENSE string, then the

recipes

Quoted 11 lines
Quoted 10 lines
Quoted 9 lines

below are broken.

From my latest build, at least recipes with "&&" fail...
This means that nothing really completes that I have tested.

MAJOR BREAKAGE!!!!

I think it would be better FIRST to fix the recipes, and then introduce checking.

I think the single ampersand is accepted, the double might no longer be.

Yes, the single ampersand works, but the double ampersand will break the

build

Quoted 6 lines

as well as the slash '/'.

Quoted 3 lines

Certainly oe-core does continue to work. I hadn't realised there were incompatibilities introduced by this patch :(

Quoted 7 lines
Quoted 4 lines
Quoted 3 lines

Not sure what we should do about this at this point, probably fix the layers :/.

True, question is who and when ?

The people complaining about it and right now.

I know there was a conversation a while back about standardizing this field and documenting it. If anything fell out of it, IDK, If there is any documentation for what is valid form, I've not seen it. If it exists, could someone point me to it? If it doesn't could we get a standards discussion going here about how to move forward with this so we have something documented? I've seen a bunch of different standards here and I really want to get something nailed down as trying to write code for a field that isn't well defined is a pain.

A few things I've been thinking about here.

- LICENSE should be ast parsable.
- license within LICENSE should have no spaces.
- At last count there are 100+ OSI opensource licenses. I've been pulling from spdx.org and trying to use their naming convention while also supporting mappings to non-spdx naming conventions. However there are some LICENSE entries that are just wrong (GPL without a version) and need to be fixed.
- the operands I've been supporting are & or |, with a modifier of +. I've also been supporting parens grouping of license. example: "(Foo-1.0 & Bar-1.0 ) | (Foo-2.0 & Bar-2.0)".
- There is an actual issue with LICENSE in that LICENSE is recipe based. We should probably discuss the ability to support LICENSE_pkg, because the recipe may contain multiple packages some of which don't share a license in LICENSE.
- LICENSE priority should probably be dealt in a config but not in the recipe. To me, it would make more sense as the main use case would probably center around "If I can avoid getting XXX license in this image, please do".

I'll look at this to see if there is a way to handle some of the issues this code introduces better, as I'm sure other 3rd party layers exist that will have the same issue with this.

-b

Quoted 13 lines

-----BEGIN PGP SIGNATURE-----

iEYEARECAAYFAk7iEksACgkQMkyGM64RGpEPYQCeMpX884EmuwpUaIdFrvJ4Pp09 aPoAn08cOAO5X2JMPXSoOEcFBPzDt+0V
=LDRp
-----END PGP SIGNATURE-----

_______________________________________________
Openembedded-core mailing list
[email protected]
http://lists.linuxtogo.org/cgi-bin/mailman/listinfo/openembedded-core

Signature · 3 lines
Elizabeth Flanagan
Yocto Project
Build and Release
#13 lore raw

Re: [PATCH 4/8] Add copyleft compliance class --- MAJOR BREAKAGE!!!!

In reply to Ulf Samuelsson
Quoted 8 lines
Quoted 6 lines

Certainly oe-core does continue to work. I hadn't realised there were incompatibilities introduced by this patch :(

Not sure what we should do about this at this point, probably fix the layers :/.

True, question is who and when ?

layer maintainers. I think this change deserved an early warning so layer maintainers
could have buckled up.

#14 lore raw

PATCH 5/8 gettext-minimal-native: Fix License

In reply to Beth Flanagan

From: Richard Purdie <[email protected]>

Only .m4 macros are included in this recipe so the correct license is FSF-Unlimited as specified in those marcros, not the main gettext license. This patch corrects that mistake.

---
 .../gettext/gettext-minimal-0.18.1.1/COPYING       |  678 +-------------------
 .../gettext/gettext-minimal-native_0.18.1.1.bb     |    4 +-
 2 files changed, 6 insertions(+), 676 deletions(-)
meta/recipes-core/gettext/gettext-minimal-native_0.18.1.1.bb +2 -2
index 71c6045..ab4acaf 100644
@@ -5,11 +5,11 @@ INHIBIT_DEFAULT_DEPS = "1"
 INHIBIT_AUTOTOOLS_DEPS = "1"
 
 LICENSE = "FSF-Unlimited"
-LIC_FILES_CHKSUM = "file://COPYING;md5=d32239bcb673463ab874e80d47fae504"
+LIC_FILES_CHKSUM = "file://COPYING;md5=0854da868a929923087141d9d7aba7d5"
 
 inherit native
 
-PR = "r1"
+PR = "r2"
 
 S = "${WORKDIR}"
 
Signature · 1 line
1.7.1
#15 lore raw

PATCH 6/8 license: manifest and license path

In reply to Beth Flanagan

From: Elizabeth Flanagan <[email protected]>

This is a fairly large commit, so I want to step through some of what this accomplishes:

1. Additional licenses

I've added/modified/corrected some of the common licenses within OE-core in prep. for a major license audit. Most of these are in SPDX format. A few, there is no OSI equivalent.

2. Additional SPDX mappings

I've added some additional SPDX mappings to account for removing some duplicate licenses. (ie GPL-2 and GPL-2.0 were the same) I've also remapped a few things to more accurately reflect what they should be pointing at.

Note: Artistic/LGPL/GPL/MPL. Quite a few LICENSE fields list these licenses. They make no sense and need auditing. In a future commit I have some fixes to particularly egregious LICENSE fields, but a full audit should be done. I've listed to obvious candidates at:

https://wiki.yoctoproject.org/wiki/License_Audit

3. License manifest

We now have a license manifest generation that occurs in rootfs for everything BUT .deb. This requires the changes Paul Eggleton has done to rootfs_* particularly the list_installed_packages function. The manifest is accurate during a parallel bitbake now (Weee!) and is prime for my planned SPDX format manifest during the next period.

4. License manifest on image.

We also want the ability to add licenses to the image. This functionality is also in base-files and will be stripped out in my next commit. The manifest is not added by default and is a two var setting in license.conf:

If I want *just* the manifest on the image (small) then I set:
COPY_LIC_MANIFEST = "1"

This copies the manifest to:

/usr/share/common-licenses/license.manifest

If I want the actual PKG license text on the image (much larger) I need to set both both COPY_LIC_MANIFEST and COPY_LIC_DIRS in license.conf. This will create:

/usr/share/common-licenses/(package name)/(licenses in LIC_SRC_URI)

Word of warning. This can be larger than wanted depending on image and is probably ripe for linking licenses, but I ran out of time this week to get that done.

5. Custom License search path.

We now have the ability to add licenses to the build without touching common-licenses. This is set via license.conf:

LICENSE_PATH += "/path/to/custom/licenses"

You want to make sure the license is unique. license.bbclass picks the first license it finds.

---
 meta/classes/license.bbclass                       |  219 +++++---
 meta/conf/licenses.conf                            |   54 ++-
 meta/files/common-licenses/AFL-1                   |   92 ---
 meta/files/common-licenses/AFL-2                   |  155 ------
 meta/files/common-licenses/AGPL-3                  |  213 -------
 meta/files/common-licenses/APL-1                   |  327 -----------
 meta/files/common-licenses/APSL-1                  |  334 -----------
 meta/files/common-licenses/APSL-2                  |  337 -----------
 meta/files/common-licenses/Adobe                   |   14 +
 meta/files/common-licenses/Apache-1                |   59 --
 meta/files/common-licenses/Apache-2                |  203 -------
 meta/files/common-licenses/Artistic                |  131 -----
 meta/files/common-licenses/Artistic-1              |   97 ----
 meta/files/common-licenses/Artistic-2              |  202 -------
 meta/files/common-licenses/BSL-1                   |   25 -
 meta/files/common-licenses/BitstreamVera           |  160 ++++++
 meta/files/common-licenses/CATOSL-1                |  335 -----------
 meta/files/common-licenses/CC-BY-1                 |  185 -------
 meta/files/common-licenses/CC-BY-2                 |  205 -------
 meta/files/common-licenses/CC-BY-3                 |  283 ----------
 meta/files/common-licenses/CC-BY-NC-1              |  194 -------
 meta/files/common-licenses/CC-BY-NC-2              |  220 --------
 meta/files/common-licenses/CC-BY-NC-3              |  297 ----------
 meta/files/common-licenses/CC-BY-NC-ND-1           |  146 -----
 meta/files/common-licenses/CC-BY-NC-ND-2           |  209 -------
 meta/files/common-licenses/CC-BY-NC-ND-3           |  272 ---------
 meta/files/common-licenses/CC-BY-NC-SA-1           |  209 -------
 meta/files/common-licenses/CC-BY-NC-SA-2           |  242 --------
 meta/files/common-licenses/CC-BY-NC-SA-3           |  320 -----------
 meta/files/common-licenses/CC-BY-ND-2              |  194 -------
 meta/files/common-licenses/CC-BY-ND-3              |  259 ---------
 meta/files/common-licenses/CC-BY-SA-1              |  201 -------
 meta/files/common-licenses/CC-BY-SA-2              |  227 --------
 meta/files/common-licenses/CC-BY-SA-3              |  319 -----------
 meta/files/common-licenses/CDDL-1                  |  313 -----------
 meta/files/common-licenses/CECILL-1                |  462 ----------------
 meta/files/common-licenses/CECILL-2                |  451 ---------------
 meta/files/common-licenses/CPAL-1                  |  435 ---------------
 meta/files/common-licenses/CPL-1                   |  250 ---------
 meta/files/common-licenses/CUA-OPL-1               |  482 ----------------
 meta/files/common-licenses/DSSSL                   |   49 ++
 meta/files/common-licenses/ECL-1                   |   61 --
 meta/files/common-licenses/ECL-2                   |  218 --------
 meta/files/common-licenses/EDL-1.0                 |   13 +
 meta/files/common-licenses/EFL-1                   |   30 -
 meta/files/common-licenses/EFL-2                   |   27 -
 meta/files/common-licenses/EPL-1                   |  204 -------
 meta/files/common-licenses/EUPL-1                  |  302 ----------
 meta/files/common-licenses/Elfutils-Exception      |   12 +
 meta/files/common-licenses/ErlPL-1                 |  293 ----------
 meta/files/common-licenses/FSF-Unlimited           |    4 +
 meta/files/common-licenses/Frameworx-1             |  181 ------
 meta/files/common-licenses/FreeType                |  170 ++++++
 meta/files/common-licenses/GPL-1                   |  259 ---------
 meta/files/common-licenses/GPL-1.0+                |  252 ---------
 meta/files/common-licenses/GPL-2                   |   23 -
 .../common-licenses/GPL-2,0-with-GCC-exception     |   17 -
 .../common-licenses/GPL-2,0-with-font-exception    |   18 -
 meta/files/common-licenses/GPL-2.0+                |  132 -----
 .../common-licenses/GPL-2.0-with-GCC-exception     |   13 +-
 .../common-licenses/GPL-2.0-with-font-exception    |   14 +-
 meta/files/common-licenses/GPL-3                   |   70 ---
 meta/files/common-licenses/GPL-3.0                 |  224 ++++++++-
 meta/files/common-licenses/GPL-3.0+                |    3 -
 meta/files/common-licenses/IPL-1                   |  222 --------
 meta/files/common-licenses/LGPL-2                  |  461 ----------------
 meta/files/common-licenses/LGPL-2.0                |  189 ++++++-
 meta/files/common-licenses/LGPL-2.0+               |  173 ------
 meta/files/common-licenses/LGPL-2.1+               |  176 ------
 meta/files/common-licenses/LGPL-3                  |  147 -----
 meta/files/common-licenses/LGPL-3.0                |   53 +-
 meta/files/common-licenses/LGPL-3.0+               |   66 ---
 meta/files/common-licenses/LPL-1                   |  213 -------
 meta/files/common-licenses/LPPL-1                  |  422 --------------
 meta/files/common-licenses/MIT-style               |    1 -
 meta/files/common-licenses/MPL-1                   |  433 ---------------
 meta/files/common-licenses/NASA-1                  |  246 ---------
 meta/files/common-licenses/NPOSL-3                 |  206 -------
 meta/files/common-licenses/OASIS                   |   13 +
 meta/files/common-licenses/OCLC-2                  |  207 -------
 meta/files/common-licenses/OFL-1                   |   96 ----
 meta/files/common-licenses/OLDAP-2                 |   54 --
 meta/files/common-licenses/OSL-1                   |  172 ------
 meta/files/common-licenses/OSL-1.0                 |    2 +-
 meta/files/common-licenses/OSL-2                   |  171 ------
 meta/files/common-licenses/OSL-3                   |  157 ------
 meta/files/common-licenses/PHP-3                   |   70 ---
 meta/files/common-licenses/Proprietary             |    1 +
 meta/files/common-licenses/Python-2                |  192 -------
 meta/files/common-licenses/QPL-1                   |   96 ----
 meta/files/common-licenses/RPL-1                   |  582 --------------------
 meta/files/common-licenses/RPSL-1                  |  535 ------------------
 meta/files/common-licenses/SPL                     |  519 -----------------
 meta/files/common-licenses/Simple-2                |   53 --
 meta/files/common-licenses/UCB                     |   26 +
 meta/files/common-licenses/VSL-1                   |   54 --
 meta/files/common-licenses/Watcom-1                |  389 -------------
 meta/files/common-licenses/XFree86-1               |   50 --
 meta/files/common-licenses/YPL-1                   |  140 -----
 meta/files/common-licenses/ZPL-1                   |   60 --
 meta/files/common-licenses/ZPL-2                   |   44 --
 meta/files/common-licenses/Zimbra-1                |  140 -----
 meta/files/common-licenses/eCos-2                  |   38 --
 103 files changed, 1119 insertions(+), 17671 deletions(-)
 delete mode 100644 meta/files/common-licenses/AFL-1
 delete mode 100644 meta/files/common-licenses/AFL-2
 delete mode 100644 meta/files/common-licenses/AGPL-3
 delete mode 100644 meta/files/common-licenses/APL-1
 delete mode 100644 meta/files/common-licenses/APSL-1
 delete mode 100644 meta/files/common-licenses/APSL-2
 create mode 100644 meta/files/common-licenses/Adobe
 delete mode 100644 meta/files/common-licenses/Apache-1
 delete mode 100644 meta/files/common-licenses/Apache-2
 delete mode 100644 meta/files/common-licenses/Artistic
 delete mode 100644 meta/files/common-licenses/Artistic-1
 delete mode 100644 meta/files/common-licenses/Artistic-2
 delete mode 100644 meta/files/common-licenses/BSL-1
 create mode 100644 meta/files/common-licenses/BitstreamVera
 delete mode 100644 meta/files/common-licenses/CATOSL-1
 delete mode 100644 meta/files/common-licenses/CC-BY-1
 delete mode 100644 meta/files/common-licenses/CC-BY-2
 delete mode 100644 meta/files/common-licenses/CC-BY-3
 delete mode 100644 meta/files/common-licenses/CC-BY-NC-1
 delete mode 100644 meta/files/common-licenses/CC-BY-NC-2
 delete mode 100644 meta/files/common-licenses/CC-BY-NC-3
 delete mode 100644 meta/files/common-licenses/CC-BY-NC-ND-1
 delete mode 100644 meta/files/common-licenses/CC-BY-NC-ND-2
 delete mode 100644 meta/files/common-licenses/CC-BY-NC-ND-3
 delete mode 100644 meta/files/common-licenses/CC-BY-NC-SA-1
 delete mode 100644 meta/files/common-licenses/CC-BY-NC-SA-2
 delete mode 100644 meta/files/common-licenses/CC-BY-NC-SA-3
 delete mode 100644 meta/files/common-licenses/CC-BY-ND-1
 delete mode 100644 meta/files/common-licenses/CC-BY-ND-2
 delete mode 100644 meta/files/common-licenses/CC-BY-ND-3
 delete mode 100644 meta/files/common-licenses/CC-BY-SA-1
 delete mode 100644 meta/files/common-licenses/CC-BY-SA-2
 delete mode 100644 meta/files/common-licenses/CC-BY-SA-3
 delete mode 100644 meta/files/common-licenses/CDDL-1
 delete mode 100644 meta/files/common-licenses/CECILL-1
 delete mode 100644 meta/files/common-licenses/CECILL-2
 delete mode 100644 meta/files/common-licenses/CPAL-1
 delete mode 100644 meta/files/common-licenses/CPL-1
 delete mode 100644 meta/files/common-licenses/CUA-OPL-1
 create mode 100644 meta/files/common-licenses/DSSSL
 delete mode 100644 meta/files/common-licenses/ECL-1
 delete mode 100644 meta/files/common-licenses/ECL-2
 create mode 100644 meta/files/common-licenses/EDL-1.0
 delete mode 100644 meta/files/common-licenses/EFL-1
 delete mode 100644 meta/files/common-licenses/EFL-2
 delete mode 100644 meta/files/common-licenses/EPL-1
 delete mode 100644 meta/files/common-licenses/EUPL-1
 create mode 100644 meta/files/common-licenses/Elfutils-Exception
 delete mode 100644 meta/files/common-licenses/ErlPL-1
 create mode 100644 meta/files/common-licenses/FSF-Unlimited
 delete mode 100644 meta/files/common-licenses/Frameworx-1
 create mode 100644 meta/files/common-licenses/FreeType
 delete mode 100644 meta/files/common-licenses/GPL-1
 delete mode 100644 meta/files/common-licenses/GPL-1.0+
 delete mode 100644 meta/files/common-licenses/GPL-2
 delete mode 100644 meta/files/common-licenses/GPL-2,0-with-GCC-exception
 delete mode 100644 meta/files/common-licenses/GPL-2,0-with-font-exception
 delete mode 100644 meta/files/common-licenses/GPL-2.0+
 delete mode 100644 meta/files/common-licenses/GPL-3
 delete mode 100644 meta/files/common-licenses/GPL-3.0+
 delete mode 100644 meta/files/common-licenses/IPL-1
 delete mode 100644 meta/files/common-licenses/LGPL-2
 delete mode 100644 meta/files/common-licenses/LGPL-2.0+
 delete mode 100644 meta/files/common-licenses/LGPL-2.1+
 delete mode 100644 meta/files/common-licenses/LGPL-3
 delete mode 100644 meta/files/common-licenses/LGPL-3.0+
 delete mode 100644 meta/files/common-licenses/LPL-1
 delete mode 100644 meta/files/common-licenses/LPPL-1
 delete mode 120000 meta/files/common-licenses/MIT-style
 delete mode 100644 meta/files/common-licenses/MPL-1
 delete mode 100644 meta/files/common-licenses/NASA-1
 delete mode 100644 meta/files/common-licenses/NPOSL-3
 create mode 100644 meta/files/common-licenses/OASIS
 delete mode 100644 meta/files/common-licenses/OCLC-2
 delete mode 100644 meta/files/common-licenses/OFL-1
 delete mode 100644 meta/files/common-licenses/OLDAP-2
 delete mode 100644 meta/files/common-licenses/OSL-1
 delete mode 100644 meta/files/common-licenses/OSL-2
 delete mode 100644 meta/files/common-licenses/OSL-3
 delete mode 100644 meta/files/common-licenses/PHP-3
 create mode 100644 meta/files/common-licenses/Proprietary
 delete mode 100644 meta/files/common-licenses/Python-2
 delete mode 100644 meta/files/common-licenses/QPL-1
 delete mode 100644 meta/files/common-licenses/RPL-1
 delete mode 100644 meta/files/common-licenses/RPSL-1
 delete mode 100644 meta/files/common-licenses/SPL
 delete mode 100644 meta/files/common-licenses/Simple-2
 create mode 100644 meta/files/common-licenses/UCB
 delete mode 100644 meta/files/common-licenses/VSL-1
 delete mode 100644 meta/files/common-licenses/Watcom-1
 delete mode 100644 meta/files/common-licenses/XFree86-1
 delete mode 100644 meta/files/common-licenses/YPL-1
 delete mode 100644 meta/files/common-licenses/ZPL-1
 delete mode 100644 meta/files/common-licenses/ZPL-2
 delete mode 100644 meta/files/common-licenses/Zimbra-1
 delete mode 100644 meta/files/common-licenses/eCos-2
meta/classes/license.bbclass +153 -66
index 8c6e2d2..8c64e4c 100644
@@ -1,17 +1,12 @@
 # Populates LICENSE_DIRECTORY as set in distro config 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.
+# - There is a real issue revolving around license naming standards.
 
 LICENSE_DIRECTORY ??= "${DEPLOY_DIR}/licenses"
 LICSSTATEDIR = "${WORKDIR}/license-destdir/"
 
-addtask populate_lic after do_patch before do_package
+addtask populate_lic after do_patch before do_compile
 do_populate_lic[dirs] = "${LICSSTATEDIR}/${PN}"
 do_populate_lic[cleandirs] = "${LICSSTATEDIR}"
 
@@ -22,33 +17,122 @@ do_populate_lic[cleandirs] = "${LICSSTATEDIR}"
 #
 # We should really discuss standardizing this field, but that's a longer term goal.
 # For now, we can do this and it should grab the most common LICENSE naming variations.
-
-#GPL variations
-SPDXLICENSEMAP[GPL] = "GPL-1"
-SPDXLICENSEMAP[GPLv2] = "GPL-2"
-SPDXLICENSEMAP[GPLv3] = "GPL-3"
+#
+# Changing GPL mapping to GPL-2 as it's not very likely to be GPL-1
+# We should NEVER have a GPL/LGPL without a version!!!!
+# Any mapping to MPL/LGPL/GPL should be fixed
+# see: https://wiki.yoctoproject.org/wiki/License_Audit
+
+# GPL variations
+SPDXLICENSEMAP[GPL-2] = "GPL-2.0"
+SPDXLICENSEMAP[GPLv2] = "GPL-2.0"
+SPDXLICENSEMAP[GPLv2.0] = "GPL-2.0"
+SPDXLICENSEMAP[GPL-3] = "GPL-3.0"
+SPDXLICENSEMAP[GPLv3] = "GPL-3.0"
+SPDXLICENSEMAP[GPLv3.0] = "GPL-3.0"
 
 #LGPL variations
-SPDXLICENSEMAP[LGPL] = "LGPL-2"
-SPDXLICENSEMAP[LGPLv2] = "LGPL-2"
+SPDXLICENSEMAP[LGPLv2] = "LGPL-2.0"
 SPDXLICENSEMAP[LGPL2.1] = "LGPL-2.1"
 SPDXLICENSEMAP[LGPLv2.1] = "LGPL-2.1"
-SPDXLICENSEMAP[LGPLv3] = "LGPL-3"
+SPDXLICENSEMAP[LGPLv3] = "LGPL-3.0"
 
 #MPL variations
-SPDXLICENSEMAP[MPL] = "MPL-1"
-SPDXLICENSEMAP[MPLv1] = "MPL-1"
-SPDXLICENSEMAP[MPLv1.1] = "MPL-1"
+SPDXLICENSEMAP[MPL-1] = "MPL-1.0"
+SPDXLICENSEMAP[MPLv1] = "MPL-1.0"
+SPDXLICENSEMAP[MPLv1.1] = "MPL-1.1"
 
 #MIT variations
 SPDXLICENSEMAP[MIT-X] = "MIT"
+SPDXLICENSEMAP[MIT-style] = "MIT"
 
 #Openssl variations
 SPDXLICENSEMAP[openssl] = "OpenSSL"
 
+#Python variations
+SPDXLICENSEMAP[PSF] = "Python-2.0"
+SPDXLICENSEMAP[PSFv2] = "Python-2.0"
+SPDXLICENSEMAP[Python-2] = "Python-2.0"
+
+#Apache variations
+SPDXLICENSEMAP[Apachev2] = "Apache-2.0"
+SPDXLICENSEMAP[Apache-2] = "Apache-2.0"
+
+#Artistic variations
+SPDXLICENSEMAP[Artisticv1] = "Artistic-1.0"
+SPDXLICENSEMAP[Artistic-1] = "Artistic-1.0"
+
+#Academic variations
+SPDXLICENSEMAP[AFL-2] = "AFL-2.0"
+SPDXLICENSEMAP[AFL-1] = "AFL-1.2"
+SPDXLICENSEMAP[AFLv2] = "AFL-2.0"
+SPDXLICENSEMAP[AFLv1] = "AFL-1.2"
+
 #Other variations
-SPDXLICENSEMAP[AFL2.1] = "AFL-2"
-SPDXLICENSEMAP[EPLv1.0] = "EPL-1"
+SPDXLICENSEMAP[EPLv1.0] = "EPL-1.0"
+
+license_create_manifest() {
+    mkdir -p ${LICENSE_DIRECTORY}/${IMAGE_NAME}
+    # Get list of installed packages
+    list_installed_packages | grep -v "locale" |sort > ${LICENSE_DIRECTORY}/${IMAGE_NAME}/package.manifest
+    INSTALLED_PKGS=`cat ${LICENSE_DIRECTORY}/${IMAGE_NAME}/package.manifest`
+    # list of installed packages is broken for deb
+    if [ ${IMAGE_PKGTYPE} != "deb" ]; then
+
+        for pkg in ${INSTALLED_PKGS}; do
+            # not the best way to do this but licenses are not arch dependant iirc
+            files=`find ${TMPDIR}/pkgdata/*/runtime -name ${pkg}| head -1`
+            for filename in $files; do
+                pkged_pn="$(sed -n 's/^PN: //p' ${filename})"
+                pkged_lic="$(sed -n '/^LICENSE: /{ s/^LICENSE: //; s/[+|&()*]/ /g; s/  */ /g; p }' ${filename})"
+                # check to see if the package name exists in the manifest. if so, bail.
+                if ! grep -q "PACKAGE NAME: ${pkg}" ${filename}; then
+                    # exclude local recipes
+                    if [ ! ${pkged_pn} == "*locale*" ]; then
+                        echo "PACKAGE NAME:" ${pkg} >> ${LICENSE_DIRECTORY}/${IMAGE_NAME}/license.manifest
+                        echo "RECIPE NAME:" ${pkged_pn} >> ${LICENSE_DIRECTORY}/${IMAGE_NAME}/license.manifest
+                        echo "LICENSE: " >> ${LICENSE_DIRECTORY}/${IMAGE_NAME}/license.manifest
+                        for lic in ${pkged_lic}; do
+                            if [ -e "${LICENSE_DIRECTORY}/${pkged_pn}/generic_${lic}" ]; then
+                                echo ${lic}|sed s'/generic_//'g >> ${LICENSE_DIRECTORY}/${IMAGE_NAME}/license.manifest
+                            else
+                                echo "WARNING: The license listed, " ${lic} " was not in the licenses collected for " ${pkged_pn}>> ${LICENSE_DIRECTORY}/${IMAGE_NAME}/license.manifest
+                            fi
+                        done
+                        echo "" >> ${LICENSE_DIRECTORY}/${IMAGE_NAME}/license.manifest
+                    fi
+                fi
+            done
+        done
+    fi
+
+    # Two options here:
+    # - Just copy the manifest
+    # - Copy the manifest and the license directories
+    # This will make your image a bit larger, however 
+    # if you are concerned about license compliance 
+    # and delivery this should cover all your bases
+
+    if [ -n ${COPY_LIC_MANIFEST} ]; then
+        mkdir -p ${IMAGE_ROOTFS}/usr/share/common-licenses/
+        cp ${LICENSE_DIRECTORY}/${IMAGE_NAME}/license.manifest ${IMAGE_ROOTFS}/usr/share/common-licenses/license.manifest
+        if [ -n ${COPY_LIC_DIRS} ]; then
+            for pkg in ${INSTALLED_PKGS}; do
+                mkdir -p ${IMAGE_ROOTFS}/usr/share/common-licenses/${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_*" ]; then
+                        cp ${LICENSE_DIRECTORY}/${pkged_pn}/${lic} ${IMAGE_ROOTFS}/usr/share/common-licenses/${pkg}/${lic}
+                    fi
+                done
+            done
+        fi
+    fi
+
+}
+
 
 python do_populate_lic() {
     """
@@ -59,6 +143,26 @@ python do_populate_lic() {
     import shutil
     import oe.license
 
+    # All the license types for the package
+    license_types = d.getVar('LICENSE', True)
+    # All the license files for the package
+    lic_files = d.getVar('LIC_FILES_CHKSUM', True)
+    pn = d.getVar('PN', True)
+    # The base directory we wrangle licenses to
+    destdir = os.path.join(d.getVar('LICSSTATEDIR', True), pn)
+    # The license files are located in S/LIC_FILE_CHECKSUM.
+    srcdir = d.getVar('S', True)
+    # Directory we store the generic licenses as set in the distro configuration
+    generic_directory = d.getVar('COMMON_LICENSE_DIR', True)
+    license_source_dirs = []
+    license_source_dirs.append(generic_directory)
+    try:
+        additional_lic_dirs = d.getVar('LICENSE_DIR', True).split()
+        for lic_dir in additional_lic_dirs:
+            license_source_dirs.append(lic_dir)
+    except:
+        pass
+
     class FindVisitor(oe.license.LicenseVisitor):
         def visit_Str(self, node):
             #
@@ -70,54 +174,38 @@ python do_populate_lic() {
             find_license(node.s.replace("+", "").replace("*", ""))
             self.generic_visit(node)
 
-    def copy_license(source, destination, file_name):
-        try:
-            bb.copyfile(os.path.join(source, file_name), os.path.join(destination, file_name))
-        except:
-            bb.warn("%s: No generic license file exists for: %s at %s" % (pn, file_name, source))
-            pass
-
-    def link_license(source, destination, file_name):
-        try:
-            os.symlink(os.path.join(source, file_name), os.path.join(destination, "generic_" + file_name))
-        except:
-            bb.warn("%s: Could not symlink: %s at %s to %s at %s" % (pn, file_name, source, file_name, destination))
-            pass
-
     def find_license(license_type):
         try:
             bb.mkdirhier(gen_lic_dest)
         except:
             pass
-
+        spdx_generic = None
+        license_source = None
         # If the generic does not exist we need to check to see if there is an SPDX mapping to it
-        if not os.path.isfile(os.path.join(generic_directory, license_type)):
-            if d.getVarFlag('SPDXLICENSEMAP', license_type) != None:
-                # Great, there is an SPDXLICENSEMAP. We can copy!
-                bb.note("We need to use a SPDXLICENSEMAP for %s" % (license_type))
-                spdx_generic = d.getVarFlag('SPDXLICENSEMAP', license_type)
-                copy_license(generic_directory, gen_lic_dest, spdx_generic)
-                link_license(gen_lic_dest, destdir, spdx_generic)
-            else:
-                # And here is where we warn people that their licenses are lousy
-                bb.warn("%s: No generic license file exists for: %s at %s" % (pn, license_type, generic_directory))
-                bb.warn("%s: There is also no SPDXLICENSEMAP for this license type: %s at %s" % (pn, license_type, generic_directory))
-                pass
-        elif os.path.isfile(os.path.join(generic_directory, license_type)):
-            copy_license(generic_directory, gen_lic_dest, license_type)
-            link_license(gen_lic_dest, destdir, license_type)
-
-    # All the license types for the package
-    license_types = d.getVar('LICENSE', True)
-    # All the license files for the package
-    lic_files = d.getVar('LIC_FILES_CHKSUM', True)
-    pn = d.getVar('PN', True)
-    # The base directory we wrangle licenses to
-    destdir = os.path.join(d.getVar('LICSSTATEDIR', True), pn)
-    # The license files are located in S/LIC_FILE_CHECKSUM.
-    srcdir = d.getVar('S', True)
-    # Directory we store the generic licenses as set in the distro configuration
-    generic_directory = d.getVar('COMMON_LICENSE_DIR', True)
+        for lic_dir in license_source_dirs:
+            if not os.path.isfile(os.path.join(lic_dir, license_type)):
+                if d.getVarFlag('SPDXLICENSEMAP', license_type) != None:
+                    # Great, there is an SPDXLICENSEMAP. We can copy!
+                    bb.debug(1, "We need to use a SPDXLICENSEMAP for %s" % (license_type))
+                    spdx_generic = d.getVarFlag('SPDXLICENSEMAP', license_type)
+                    license_source = lic_dir
+                    break
+            elif os.path.isfile(os.path.join(lic_dir, license_type)):
+                spdx_generic = license_type
+                license_source = lic_dir
+                break
+
+        if spdx_generic and license_source:
+            # we really should copy to generic_ + spdx_generic, however, that ends up messing the manifest
+            # audit up. This should be fixed in emit_pkgdata (or, we actually got and fix all the recipes)
+            ret = bb.copyfile(os.path.join(license_source, spdx_generic), os.path.join(os.path.join(d.getVar('LICSSTATEDIR', True), pn), "generic_" + license_type))
+            # If the copy didn't occur, something horrible went wrong and we fail out
+            if not ret:
+                bb.warn("%s for %s could not be copied for some reason. It may not exist. WARN for now." % (spdx_generic, pn))
+        else:
+            # And here is where we warn people that their licenses are lousy
+            bb.warn("%s: No generic license file exists for: %s in any provider" % (pn, license_type))
+            pass
 
     try:
         bb.mkdirhier(destdir)
@@ -139,11 +227,9 @@ python do_populate_lic() {
         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:
+        if not ret:
             bb.warn("%s could not be copied for some reason. It may not exist. WARN for now." % srclicfile)
 
-    gen_lic_dest = os.path.join(d.getVar('LICENSE_DIRECTORY', True), "common-licenses")
-
     v = FindVisitor()
     try:
         v.visit_string(license_types)
@@ -156,8 +242,9 @@ do_populate_lic[sstate-name] = "populate-lic"
 do_populate_lic[sstate-inputdirs] = "${LICSSTATEDIR}"
 do_populate_lic[sstate-outputdirs] = "${LICENSE_DIRECTORY}/"
 
+ROOTFS_POSTINSTALL_COMMAND += "license_create_manifest; "
+
 python do_populate_lic_setscene () {
 	sstate_setscene(d)
 }
 addtask do_populate_lic_setscene
-
meta/conf/licenses.conf +50 -4

55 lines not on this page · raw message

#16 lore raw

Re: [PATCH 6/8] [YOCTO #1776] license: manifest and license path

Quoted 9 lines · Beth Flanagan
meta/classes/license.bbclass +9 -0
+
+license_create_manifest() {
+    mkdir -p ${LICENSE_DIRECTORY}/${IMAGE_NAME}
+    # Get list of installed packages
+    list_installed_packages | grep -v "locale" |sort > ${LICENSE_DIRECTORY}/${IMAGE_NAME}/package.manifest
+    INSTALLED_PKGS=`cat ${LICENSE_DIRECTORY}/${IMAGE_NAME}/package.manifest`
+    # list of installed packages is broken for deb
+    if [ ${IMAGE_PKGTYPE} != "deb" ]; then
+

meta/classes/license.bbclass do_populate_lic[cleandirs] = "${LICSSTATEDIR}" · line 91

Quoted 10 lines
meta/classes/license.bbclass +10 -0
+        for pkg in ${INSTALLED_PKGS}; do
+            # not the best way to do this but licenses are not arch dependant iirc
+            files=`find ${TMPDIR}/pkgdata/*/runtime -name ${pkg}| head -1`
+            for filename in $files; do
+                pkged_pn="$(sed -n 's/^PN: //p' ${filename})"
+                pkged_lic="$(sed -n '/^LICENSE: /{ s/^LICENSE: //; s/[+|&()*]/ /g; s/  */ /g; p }' ${filename})"
+                # check to see if the package name exists in the manifest. if so, bail.
+                if ! grep -q "PACKAGE NAME: ${pkg}" ${filename}; then
+                    # exclude local recipes
+                    if [ ! ${pkged_pn} == "*locale*" ]; then

The above line is a bashism and is breaking builds with dash as /bin/sh :(

Cheers,

Richard

#17 lore raw

Re: [PATCH 6/8] [YOCTO #1776] license: manifest and license path

Quoted 3 lines · Richard Purdie

The above line is a bashism and is breaking builds with dash as /bin/sh :(

I thought bashism was too deep in oe. I can certainly revert to using dash if thats no longer the case.

#18 lore raw

Re: [PATCH 6/8] [YOCTO #1776] license: manifest and license path

Quoted 8 lines · Khem Raj
Quoted 3 lines · Richard Purdie

The above line is a bashism and is breaking builds with dash as /bin/sh :(

I thought bashism was too deep in oe. I can certainly revert to using dash if thats no longer the case.

Richard made a concerted effort to enable Dash recently based on feedback we received for the Yocto Project. I certainly think we should strive to be POSIX shell compatible where possible.

Regards,
Joshua

Signature · 3 lines
Joshua Lock
        Yocto Project "Johannes factotum"
        Intel Open Source Technology Centre
#19 lore raw

Re: [PATCH 6/8] [YOCTO #1776] license: manifest and license path

Quoted 7 lines · Joshua Lock
Quoted 6 lines · Khem Raj
Quoted 3 lines · Richard Purdie

The above line is a bashism and is breaking builds with dash as /bin/sh :(

Quoted 6 lines
Quoted 2 lines

I thought bashism was too deep in oe. I can certainly revert to using dash if thats no longer the case.

Richard made a concerted effort to enable Dash recently based on feedback we received for the Yocto Project. I certainly think we should strive to be POSIX shell compatible where possible.

agreed

#20 lore raw

Re: [PATCH 6/8] [YOCTO #1776] license: manifest and license path

In reply to Khem Raj
Quoted 8 lines · Khem Raj
Quoted 3 lines · Richard Purdie

The above line is a bashism and is breaking builds with dash as /bin/sh :(

I thought bashism was too deep in oe. I can certainly revert to using dash if thats no longer the case.

Dash works fine now, at least in all my tests, apart from this issue obviously. We droped the sanity check a while ago due to that.

Cheers,

Richard

#21 lore raw

Re: [PATCH 6/8] [YOCTO #1776] license: manifest and license path

In reply to Khem Raj

Op 9 dec. 2011, om 20:57 heeft Khem Raj het volgende geschreven:

Quoted 8 lines
Quoted 3 lines · Richard Purdie

The above line is a bashism and is breaking builds with dash as /bin/sh :(

I thought bashism was too deep in oe. I can certainly revert to using dash if thats no longer the case.

We try to keep OE itself free of bashisms. The biggest problem is package authors using them like the libtool/gtk bashism interaction.

regards,

Koen

#22 lore raw

Re: [PATCH 6/8] [YOCTO #1776] license: manifest and license path

Quoted 5 lines · Koen Kooi

Op 9 dec. 2011, om 20:57 heeft Khem Raj het volgende geschreven:

Quoted 3 lines
Quoted 1 line · Richard Purdie
Quoted 8 lines
Quoted 5 lines
Quoted 2 lines

The above line is a bashism and is breaking builds with dash as /bin/sh :(

I thought bashism was too deep in oe. I can certainly revert to using dash if thats no longer the case.

We try to keep OE itself free of bashisms. The biggest problem is package authors using them like the libtool/gtk bashism interaction.

There is a patch merged which should sort out most of the libtool issues at least. libtool continues to use bash but it references it as /bin/bash, not /bin/sh.

Cheers,

Richard

#23 lore raw

PATCH 7/8 OECore license fixes: meta/*

In reply to Beth Flanagan

From: Elizabeth Flanagan <[email protected]>

This is a quick audit of only the most obviously wrong licenses found within OECore. These fixes fall into four areas:

- LICENSE field had incorrect format so that the parser choked
- LICENSE field has a license with no version
- LICENSE field was actually incorrect
- LICENSE field has an imaginary license that didn't exist

This fixes most of the LICENSE warnings thrown, along with my prior commit adding additional licenses to common-licenses and additional SPDXLICENSEMAP entries.

HOWEVER..... there is much to be done on the license front. For a list of recipes with licenses that need obvious fixing see:

https://wiki.yoctoproject.org/wiki/License_Audit

That said, I would suggest another license audit as I've found enough inconsistencies. A good suggestion is when in doubt, look at how openSuse or Gentoo or Debian license the package.

---
 .../base-files/base-files/licenses/Artistic        |  131 ----
 .../base-files/base-files/licenses/BSD             |   26 -
 .../base-files/base-files/licenses/GFDL-1.2        |  397 ------------
 .../base-files/base-files/licenses/GPL-3           |  676 --------------------
 .../base-files/base-files/licenses/LGPL-2          |  481 --------------
 .../base-files/base-files/licenses/LGPL-2.1        |  510 ---------------
 .../base-files/base-files/licenses/LGPL-3          |  165 -----
 meta/recipes-core/base-files/base-files_3.0.14.bb  |   20 +-
 meta/recipes-core/busybox/busybox.inc              |    3 +-
 meta/recipes-core/busybox/busybox_1.19.3.bb        |    2 +-
 meta/recipes-core/gettext/gettext_0.18.1.1.bb      |    4 +-
 meta/recipes-core/jpeg/jpeg_8c.bb                  |    4 +-
 meta/recipes-devtools/elfutils/elfutils_0.148.bb   |    4 +-
 meta/recipes-devtools/python/python-pyrex_0.9.9.bb |    4 +-
 .../squashfs-tools/squashfs-tools_4.2.bb           |    4 +-
 meta/recipes-devtools/tcf-agent/tcf-agent_svn.bb   |    4 +-
 meta/recipes-devtools/tcltk/tcl_8.5.11.bb          |    4 +-
 .../transfig/transfig-native_3.2.5d.bb             |    4 +-
 meta/recipes-extended/byacc/byacc_20110908.bb      |   10 +-
 meta/recipes-extended/bzip2/bzip2_1.0.6.bb         |    4 +-
 meta/recipes-extended/less/less_444.bb             |    7 +-
 .../tcp-wrappers/tcp-wrappers_7.6.bb               |    4 +-
 meta/recipes-extended/unzip/unzip_6.0.bb           |    4 +-
 meta/recipes-extended/xinetd/xinetd_2.3.14.bb      |    5 +-
 meta/recipes-extended/zip/zip.inc                  |    2 +-
 meta/recipes-extended/zip/zip_3.0.bb               |    2 +-
 .../recipes-gnome/gnome/gnome-icon-theme_2.31.0.bb |    4 +-
 meta/recipes-graphics/clutter/clutter-box2d.inc    |    2 +-
 meta/recipes-graphics/clutter/clutter-box2d_git.bb |    2 +-
 meta/recipes-graphics/freetype/freetype_2.4.6.bb   |    4 +-
 .../ttf-fonts/ttf-bitstream-vera_1.10.bb           |    4 +-
 meta/recipes-graphics/xorg-app/xrandr_1.3.5.bb     |    4 +-
 .../recipes-graphics/xorg-font/font-alias_1.0.3.bb |    4 +-
 meta/recipes-graphics/xorg-font/font-util_1.2.0.bb |    5 +-
 .../linux-firmware/linux-firmware_git.bb           |    5 +
 meta/recipes-multimedia/libtiff/tiff_3.9.5.bb      |    4 +-
 .../matchbox-theme-sato/matchbox-theme-sato.inc    |    2 +-
 .../matchbox-theme-sato/matchbox-theme-sato_0.1.bb |    2 +-
 .../sato-icon-theme/sato-icon-theme.inc            |    2 +-
 .../sato-icon-theme/sato-icon-theme_0.4.1.bb       |    2 +-
 meta/recipes-support/boost/boost.inc               |    4 +-
 41 files changed, 79 insertions(+), 2452 deletions(-)
 delete mode 100644 meta/recipes-core/base-files/base-files/licenses/Artistic
 delete mode 100644 meta/recipes-core/base-files/base-files/licenses/BSD
 delete mode 100644 meta/recipes-core/base-files/base-files/licenses/GFDL-1.2
 delete mode 100644 meta/recipes-core/base-files/base-files/licenses/GPL-3
 delete mode 100644 meta/recipes-core/base-files/base-files/licenses/LGPL-2
 delete mode 100644 meta/recipes-core/base-files/base-files/licenses/LGPL-2.1
 delete mode 100644 meta/recipes-core/base-files/base-files/licenses/LGPL-3
meta/recipes-core/base-files/base-files_3.0.14.bb +8 -12
index 8f5313b..eb40917 100644
@@ -1,9 +1,15 @@
 SUMMARY = "Miscellaneous files for the base system."
 DESCRIPTION = "The base-files package creates the basic system directory structure and provides a small set of key configuration files for the system."
 SECTION = "base"
-PR = "r69"
+PR = "r70"
 LICENSE = "GPLv2"
 LIC_FILES_CHKSUM = "file://licenses/GPL-2;md5=94d55d512a9ba36caa9b7df079bae19f"
+# Removed all license related tasks in this recipe as license.bbclass 
+# now deals with this. In order to get accurate licensing on to the image:
+# Set COPY_LIC_MANIFEST to just copy just the license.manifest to the image
+# For the manifest and the license text for each package:
+# Set COPY_LIC_MANIFEST and COPY_LIC_DIRS
+
 SRC_URI = "file://rotation \
            file://nsswitch.conf \
            file://motd \
@@ -18,14 +24,8 @@ SRC_URI = "file://rotation \
            file://usbd \
            file://share/dot.bashrc \
            file://share/dot.profile \
-           file://licenses/BSD \
            file://licenses/GPL-2 \
-           file://licenses/GPL-3 \
-           file://licenses/LGPL-2 \
-           file://licenses/LGPL-2.1 \
-           file://licenses/LGPL-3 \
-           file://licenses/GFDL-1.2 \
-           file://licenses/Artistic"
+           "
 S = "${WORKDIR}"
 
 INHIBIT_DEFAULT_DEPS = "1"
@@ -103,10 +103,6 @@ do_install () {
 	install -m 0644 ${WORKDIR}/host.conf ${D}${sysconfdir}/host.conf
 	install -m 0644 ${WORKDIR}/motd ${D}${sysconfdir}/motd
 
-	for license in BSD GPL-2 LGPL-2 LGPL-2.1 Artistic GPL-3 LGPL-3 GFDL-1.2; do
-		install -m 0644 ${WORKDIR}/licenses/$license ${D}${datadir}/common-licenses/
-	done
-
 	ln -sf /proc/mounts ${D}${sysconfdir}/mtab
 }
 
meta/recipes-core/busybox/busybox.inc +2 -1
index b948e2c..07ca782 100644
@@ -5,7 +5,8 @@ BUGTRACKER = "https://bugs.busybox.net/"
 
 # bzip2 applet in busybox is based on lightly-modified bzip2 source
 # the GPL is version 2 only
-LICENSE = "GPLv2 & bzip2"
+# bzip2 is not a bzip2 license (no such thing)
+LICENSE = "GPLv2 & BSD-4-Clause"
 LIC_FILES_CHKSUM = "file://LICENSE;md5=de10de48642ab74318e893a61105afbb"
 
 SECTION = "base"
meta/recipes-core/busybox/busybox_1.19.3.bb +1 -1
index 7a54789..7360219 100644
@@ -1,5 +1,5 @@
 require busybox.inc
-PR = "r0"
+PR = "r1"
 
 SRC_URI = "http://www.busybox.net/downloads/busybox-${PV}.tar.bz2;name=tarball \
            file://udhcpscript.patch \
meta/recipes-core/gettext/gettext_0.18.1.1.bb +2 -2
index 9db2eb1..615582e 100644
@@ -2,10 +2,10 @@ SUMMARY = "Utilities and libraries for producing multi-lingual messages."
 DESCRIPTION = "Gettext offers to programmers, translators, and even users, a well integrated set of tools and documentation. Specifically, the GNU `gettext' utilities are a set of tools that provides a framework to help other GNU packages produce multi-lingual messages. These tools include a set of conventions about how programs should be written to support message catalogs, a directory and file naming organization for the message catalogs themselves, a runtime library supporting the retrieval of translated messages, and a few stand-alone programs to massage in various ways the sets of translatable strings, or already translated strings."
 HOMEPAGE = "http://www.gnu.org/software/gettext/gettext.html"
 SECTION = "libs"
-LICENSE = "GPLv3"
+LICENSE = "GPL-3+ & LGPL-2.1+"
 LIC_FILES_CHKSUM = "file://COPYING;md5=d32239bcb673463ab874e80d47fae504"
 
-PR = "r5"
+PR = "r6"
 DEPENDS = "libxml2-native gettext-native virtual/libiconv ncurses expat"
 DEPENDS_virtclass-native = "libxml2-native"
 PROVIDES = "virtual/libintl virtual/gettext"
meta/recipes-core/jpeg/jpeg_8c.bb +2 -2
index df6c5b6..1c242d1 100644
@@ -3,7 +3,7 @@ DESCRIPTION = "libjpeg contains a library for handling the JPEG (JFIF) image for
 HOMEPAGE = "http://www.ijg.org/"
 BUGTRACKER = ""
 
-LICENSE ="jpeg"
+LICENSE ="BSD-3-Clause"
 LIC_FILES_CHKSUM = "file://cdjpeg.h;endline=12;md5=78fa8dbac547bb5b2a0e6457a6cfe21d \
                     file://jpeglib.h;endline=14;md5=22f1e0f8fc71f6f7563146d3b210dbe5 \
                     file://djpeg.c;endline=13;md5=ca89254925da06fef47e4b6468233432"
@@ -13,7 +13,7 @@ SECTION = "libs"
 DEPENDS = "libtool-cross"
 DEPENDS_virtclass-native = "libtool-native"
 
-PR = "r1"
+PR = "r2"
 
 SRC_URI = "http://www.ijg.org/files/jpegsrc.v${PV}.tar.gz \
 	   file://debian-libjpeg7_7-1.diff;"
meta/recipes-devtools/elfutils/elfutils_0.148.bb +2 -2
index 1399eb7..0f4e8ca 100644
@@ -1,12 +1,12 @@
 DESCRIPTION = "A collection of utilities and DSOs to handle compiled objects."
 HOMEPAGE = "https://fedorahosted.org/elfutils"
 SECTION = "base"
-LICENSE = "(GPLv2 & Exception)"
+LICENSE = "(GPL-2+ & Elfutils-Exception)"
 LIC_FILES_CHKSUM = "file://COPYING;md5=0636e73ff0215e8d672dc4c32c317bb3\
                     file://EXCEPTION;md5=570adcb0c1218ab57f2249c67d0ce417"
 DEPENDS = "libtool bzip2 zlib"
 
-PR = "r3"
+PR = "r4"
 
 SRC_URI = "https://fedorahosted.org/releases/e/l/elfutils/elfutils-${PV}.tar.bz2"
 
meta/recipes-devtools/python/python-pyrex_0.9.9.bb +2 -2
index 330f856..7d80554 100644
@@ -2,10 +2,10 @@ DESCRIPTION = "Pyrex is a language specially designed for writing Python extensi
 It's designed to bridge the gap between the nice, high-level, easy-to-use world of Python \
 and the messy, low-level world of C."
 SECTION = "devel/python"
-LICENSE = "Apache-2"
+LICENSE = "Apache-2.0"
 LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=771d472f53f933033f57eeee7808e5bd"
 SRCNAME = "Pyrex"
-PR = "ml1"
+PR = "ml2"
 
 SRC_URI = "\
   http://www.cosc.canterbury.ac.nz/greg.ewing/python/${SRCNAME}/${SRCNAME}-${PV}.tar.gz \
meta/recipes-devtools/squashfs-tools/squashfs-tools_4.2.bb +2 -2
index a2ed8ba..c54081b 100644
@@ -2,12 +2,12 @@
 # and I don't think the kernel supports it any more.
 DESCRIPTION = "Tools to manipulate Squashfs filesystems."
 SECTION = "base"
-LICENSE = "GPLv2 & Public Domain"
+LICENSE = "GPL-2 & PD"
 LIC_FILES_CHKSUM = "file://../COPYING;md5=0636e73ff0215e8d672dc4c32c317bb3 \
                     file://../../7zC.txt;beginline=12;endline=16;md5=2056cd6d919ebc3807602143c7449a7c \
                    "
 DEPENDS = "attr zlib xz"
-PR = "r0"
+PR = "1"
 
 SRC_URI = "${SOURCEFORGE_MIRROR}/squashfs/squashfs${PV}.tar.gz;name=squashfs \
            http://downloads.sourceforge.net/sevenzip/lzma465.tar.bz2;name=lzma \
meta/recipes-devtools/tcf-agent/tcf-agent_svn.bb +2 -2
index 2c11628..c9ac396 100644
@@ -2,13 +2,13 @@ DESCRIPTION = "Target Communication Framework"
 HOMEPAGE = "http://wiki.eclipse.org/TCF"
 BUGTRACKER = "https://bugs.eclipse.org/bugs/"
 
-LICENSE = "EPL-1 | EDLv1.0"
+LICENSE = "EPL-1.0 | EDL-1.0"
 LIC_FILES_CHKSUM = "file://../epl-v10.html;md5=7aa4215a330a0a4f6a1cbf8da1a0879f \
                     file://edl-v10.html;md5=522a390a83dc186513f0500543ad3679"
 
 SRCREV = "1855"
 PV = "0.0+svnr${SRCPV}"
-PR = "r2"
+PR = "r3"
 
 SRC_URI = "svn://dev.eclipse.org/svnroot/dsdp/org.eclipse.tm.tcf/trunk;module=agent;proto=http \
            http://dev.eclipse.org/svnroot/dsdp/org.eclipse.tm.tcf/trunk/epl-v10.html;name=epl \
meta/recipes-devtools/tcltk/tcl_8.5.11.bb +2 -2
index b1424f4..146021a 100644
@@ -1,5 +1,5 @@
 DESCRIPTION = "Tool Command Language"
-LICENSE = "tcl"
+LICENSE = "BSD-3-Clause"
 SECTION = "devel/tcltk"
 HOMEPAGE = "http://tcl.sourceforge.net"
 DEPENDS = "tcl-native"
@@ -11,7 +11,7 @@ LIC_FILES_CHKSUM = "file://../license.terms;md5=a47a9be26d03f925fc1fbd2784f27e11
     file://../win/license.terms;md5=a47a9be26d03f925fc1fbd2784f27e11 \
     "
 
-PR = "r0"
+PR = "r2"
 
 BASE_SRC_URI = "${SOURCEFORGE_MIRROR}/tcl/tcl${PV}-src.tar.gz \
                 file://tcl-add-soname.patch"
meta/recipes-devtools/transfig/transfig-native_3.2.5d.bb +2 -2
index 97441c6..c20a243 100644
@@ -3,9 +3,9 @@ DESCRIPTION = "This package contains utilities (mainly fig2dev) to \
 handle XFig (Facility for Interactive Generation of figures) files."
 HOMEPAGE = "http://www-epb.lbl.gov/xfig/"
 SECTION = "console/utils"
-LICENSE = "xfig"
+LICENSE = "MIT"
 LIC_FILES_CHKSUM = "file://fig2dev/fig2dev.c;endline=16;md5=6bab01e017409cf9ab21d3e953b793f7"
-PR = "r0"
+PR = "r1"
 
 DEPENDS = "imake-native xorg-cf-files-native zlib-native jpeg-native libpng-native libxpm-native"
 
meta/recipes-extended/byacc/byacc_20110908.bb +8 -2
index 5969d0a..5e01c25 100644
@@ -1,5 +1,11 @@
-PR = "r0"
-LICENSE="other-BSD"
+PR = "r1"
+
+# Sigh. This is one of those places where everyone licenses it differently. Someone
+# even apply UCB to it (Free/Net/OpenBSD). The maintainer states that:
+# "I've found no reliable source which states that byacc must bear a UCB copyright."
+# Setting to PD as this is what the upstream has it as.
+
+LICENSE="PD"
 LIC_FILES_CHKSUM = "file://package/debian/copyright;md5=4dc4c30f840a7203fb6edf20b3db849e"
 require byacc.inc
 
meta/recipes-extended/bzip2/bzip2_1.0.6.bb +2 -2
index f5b9ac1..14cd240 100644
@@ -4,9 +4,9 @@ Huffman coding. Compression is generally considerably better than that achieved
 LZ77/LZ78-based compressors, and approaches the performance of the PPM family of statistical compressors."
 HOMEPAGE = "http://www.bzip.org/"
 SECTION = "console/utils"
-LICENSE = "bzip2"
+LICENSE = "BSD-4-Clause"
 LIC_FILES_CHKSUM = "file://LICENSE;beginline=8;endline=37;md5=40d9d1eb05736d1bfc86cfdd9106e6b2"
-PR = "r3"
+PR = "r4"
 
 SRC_URI = "http://www.bzip.org/${PV}/${BPN}-${PV}.tar.gz \
            file://configure.ac \
meta/recipes-extended/less/less_444.bb +5 -2
index c78dbaa..f198692 100644
@@ -7,11 +7,14 @@ SECTION = "console/utils"
 
 # (GPLv2+ (<< 418), GPLv3+ (>= 418)) | less
 # less is a 2-clause BSD-like permissive license
-LICENSE = "GPLv3+ | less"
+# Reading LICENSE and COPYING indicate that GPL-3+ is suffient.
+# openSuse .spec and Debian seem to agree here. setting to GPL-3+
+
+LICENSE = "GPLv3+"
 LIC_FILES_CHKSUM = "file://COPYING;md5=d32239bcb673463ab874e80d47fae504 \
                     file://LICENSE;md5=1237c0f825bb36122b0b2b486ffbe6be"
 DEPENDS = "ncurses"
-PR = "r0"
+PR = "r1"
 
 SRC_URI = "http://www.greenwoodsoftware.com/${BPN}/${BPN}-${PV}.tar.gz"
 
meta/recipes-extended/tcp-wrappers/tcp-wrappers_7.6.bb +2 -2
index 46d9675..985e848 100644
@@ -3,9 +3,9 @@ DESCRIPTION = "Tools for monitoring and filtering incoming requests for tcp \
 	      services."
 SECTION = "console/network"
 
-LICENSE = "tcp-wrappers"
+LICENSE = "BSD"
 LIC_FILES_CHKSUM = "file://DISCLAIMER;md5=071bd69cb78b18888ea5e3da5c3127fa"
-PR ="r7"
+PR ="r8"
 
 
 PACKAGES = "${PN}-dbg libwrap libwrap-doc libwrap-dev ${PN} ${PN}-doc"
meta/recipes-extended/unzip/unzip_6.0.bb +2 -2
index b9eff43..79e450d 100644
@@ -1,10 +1,10 @@
 DESCRIPTION = "A (de)compression library for the ZIP format"
 HOMEPAGE = "http://www.info-zip.org"
 SECTION = "console/utils"
-LICENSE = "Info-ZIP"
+LICENSE = "BSD-3-Clause"
 LIC_FILES_CHKSUM = "file://LICENSE;md5=94caec5a51ef55ef711ee4e8b1c69e29"
 PE = "1"
-PR = "r1"
+PR = "r2"
 
 SRC_URI = "ftp://ftp.info-zip.org/pub/infozip/src/unzip60.tgz \
 	file://avoid-strip.patch"
meta/recipes-extended/xinetd/xinetd_2.3.14.bb +3 -2
index 159cb2c..26ba78f 100644
@@ -2,11 +2,12 @@ DESCRIPTION = "Highly configurable, modular and secure inetd"
 HOMEPAGE = "http://www.xinetd.org"
 
 # xinetd is a BSD-like license
-LICENSE = "xinetd"
+# Apple and Gentoo say BSD here.
+LICENSE = "BSD"
 LIC_FILES_CHKSUM = "file://COPYRIGHT;md5=8ad8615198542444f84d28a6cf226dd8"
 
 DEPENDS = ""
-PR ="r0"
+PR ="r1"
 
 SRC_URI = "http://www.xinetd.org/xinetd-${PV}.tar.gz \
       file://xinetd.init \
meta/recipes-extended/zip/zip.inc +1 -1
index 8cce146..a3bbc93 100644
@@ -2,7 +2,7 @@ DESCRIPTION = "Archiver for .zip files"
 HOMEPAGE = "http://www.info-zip.org"
 SECTION = "console/utils"
 
-LICENSE = "Info-ZIP"
+LICENSE = "BSD-3-Clause"
 LIC_FILES_CHKSUM = "file://LICENSE;md5=04d43c5d70b496c032308106e26ae17d"
 
 SRC_URI = "ftp://ftp.info-zip.org/pub/infozip/src/zip${@d.getVar('PV',1).replace('.', '')}.tgz"
meta/recipes-extended/zip/zip_3.0.bb +1 -1
index b009c24..1238071 100644
@@ -1,6 +1,6 @@
 require zip.inc
 
-PR="r0"
+PR="r1"
 
 # zip-2.32 still uses directory name of zip-2.30
 S = "${WORKDIR}/zip30"
meta/recipes-gnome/gnome/gnome-icon-theme_2.31.0.bb +2 -2
index 587ac40..00ba1d1 100644
@@ -2,14 +2,14 @@ DESCRIPTION = "GNOME 2 default icon themes"
 HOMEPAGE = "http://www.gnome.org/"
 BUGTRACKER = "https://bugzilla.gnome.org/"
 
-LICENSE = "LGPLv3 | BY-SAv3"
+LICENSE = "LGPLv3+ | CC-BY-SA-3.0"
 LIC_FILES_CHKSUM = "file://COPYING;md5=e7e289d90fc8bdceed5e3f142f98229e"
 
 SECTION = "x11/gnome"
 DEPENDS = "icon-naming-utils-native glib-2.0 intltool-native"
 RDEPENDS_${PN} = "hicolor-icon-theme"
 RRECOMMENDS_${PN} = "librsvg-gtk"
-PR = "r1"
+PR = "r2"
 
 FILES_${PN} += "${datadir}/*"
 
meta/recipes-graphics/clutter/clutter-box2d.inc +1 -1
index 599b467..056b091 100644
@@ -1,6 +1,6 @@
 DESCRIPTION = "Clutter Box2D"
 HOMEPAGE = "http://www.clutter-project.org/"
-LICENSE = "LGPL-2.1"
+LICENSE = "LGPLv2.1+"
 
 # The main clutter lib is machine specific so we need to be too
 PACKAGE_ARCH = "${MACHINE_ARCH}"
meta/recipes-graphics/clutter/clutter-box2d_git.bb +1 -1
index 554ce81..d256a28 100644
@@ -4,7 +4,7 @@ LIC_FILES_CHKSUM = "file://box2d/License.txt;md5=e5d39ad91f7dc4692dcdb1d85139ec6
 
 SRCREV = "de5452e56b537a11fd7f9453d048ff4b4793b5a2"
 PV = "0.12.1+git${SRCPV}"
-PR = "r0"
+PR = "r1"
 
 SRC_URI = "git://git.gnome.org/clutter-box2d.git"
 
meta/recipes-graphics/freetype/freetype_2.4.6.bb +2 -2
index 94a389a..f002103 100644
@@ -6,14 +6,14 @@ image generation tools, and many other products as well."
 HOMEPAGE = "http://www.freetype.org/"
 BUGTRACKER = "https://savannah.nongnu.org/bugs/?group=freetype"
 
-LICENSE = "FreeTypeLicense | GPLv2+"
+LICENSE = "FreeType | GPLv2+"
 LIC_FILES_CHKSUM = "file://docs/LICENSE.TXT;md5=28d5381b1bef2649c59f20c20bae4f39 \
                     file://docs/FTL.TXT;md5=d479e83797f699fe873b38dadd0fcd4c \
                     file://docs/GPLv2.TXT;md5=8ef380476f642c20ebf40fecb0add2ec"
 
 SECTION = "libs"
 
-PR = "r1"
+PR = "r2"
 
 SRC_URI = "${SOURCEFORGE_MIRROR}/freetype/freetype-${PV}.tar.bz2 \
            file://no-hardcode.patch"
meta/recipes-graphics/ttf-fonts/ttf-bitstream-vera_1.10.bb +2 -2
index 682184a..6214c16 100644
@@ -5,9 +5,9 @@ and bold).  In addition Fontconfig/Xft2 can artificially oblique the \
 serif faces for you: this loses hinting and distorts the faces slightly, \
 but is visibly different than normal and bold, and reasonably pleasing."
 SECTION = "x11/fonts"
-LICENSE = "Bitstream_Vera"
+LICENSE = "BitstreamVera"
 LIC_FILES_CHKSUM = "file://COPYRIGHT.TXT;md5=27d7484b1e18d0ee4ce538644a3f04be"
-PR = "r5"
+PR = "r6"
 RDEPENDS_${PN} = "fontconfig-utils"
 
 inherit allarch
meta/recipes-graphics/xorg-app/xrandr_1.3.5.bb +2 -2
index afb45cb..4410865 100644
@@ -6,11 +6,11 @@ DESCRIPTION = "Xrandr is used to set the size, orientation and/or \
 reflection of the outputs for a screen. It can also set the screen \
 size."
 
-LICENSE= "BSD-X"
+LICENSE= "MIT"
 LIC_FILES_CHKSUM = "file://COPYING;md5=fe1608bdb33cf8c62a4438f7d34679b3"
 DEPENDS += "libxrandr libxrender"
 PE = "1"
-PR = "r0"
+PR = "r1"
 
 SRC_URI[md5sum] = "9735173a84dca9b05e06fd4686196b07"
 SRC_URI[sha256sum] = "1059ff7a9ad0df8e00a765ffa4e08a505304c02663112da370ac7082030b980e"
meta/recipes-graphics/xorg-font/font-alias_1.0.3.bb +2 -2
index 7005291..a212f19 100644
@@ -2,7 +2,7 @@ DESCRIPTION = "X font aliases."
 
 require xorg-font-common.inc
 
-LICENSE = "Font-Alias"
+LICENSE = "MIT"
 LIC_FILES_CHKSUM = "file://COPYING;md5=bf0158b89be493d523d69d9f29265038 \
                     file://cyrillic/fonts.alias;md5=f40795b0640d6785826aecd3b16f6124 \
                     file://75dpi/fonts.alias;md5=6bc48023f2ae7f3bfc105db7b0ee6b49 \
@@ -18,7 +18,7 @@ RDEPENDS_${PN}_virtclass-native = "font-util-native"
 inherit allarch
 
 PE = "1"
-PR = "${INC_PR}.2"
+PR = "${INC_PR}.3"
 
 SRC_URI[md5sum] = "6d25f64796fef34b53b439c2e9efa562"
 SRC_URI[sha256sum] = "8b453b2aae1cfa8090009ca037037b8c5e333550651d5a158b7264ce1d472c9a"
meta/recipes-graphics/xorg-font/font-util_1.2.0.bb +3 -2
index 8834708..2c5ba41 100644
@@ -2,7 +2,8 @@ DESCRIPTION = "X.Org font package creation/installation utilities"
 
 require xorg-font-common.inc
 
-LICENSE = "BSD & MIT-style & Unicode"
+#Unicode is MIT
+LICENSE = "BSD & MIT"
 LIC_FILES_CHKSUM = "file://COPYING;md5=c0067273d90f6336008cb2504e14bd32 \
                     file://ucs2any.c;endline=28;md5=8357dc567fc628bd12696f15b2a33bcb \
                     file://bdftruncate.c;endline=26;md5=4f82ffc101a1b165eae9c6998abff937 \
@@ -13,7 +14,7 @@ DEPENDS_virtclass-native = "util-macros-native"
 RDEPENDS_${PN} = "mkfontdir mkfontscale encodings"
 RDEPENDS_${PN}_virtclass-native = "mkfontdir-native mkfontscale-native"
 
-PR = "${INC_PR}.1"
+PR = "${INC_PR}.2"
 
 do_configure_prepend() {
         sed -i "s#MAPFILES_PATH=\`pkg-config#MAPFILES_PATH=\`PKG_CONFIG_PATH=\"${STAGING_LIBDIR_NATIVE}/pkg-config\" pkg-config#g" fontutil.m4.in
meta/recipes-kernel/linux-firmware/linux-firmware_git.bb +5 -0
index 224cec0..1534cd9 100644
@@ -1,5 +1,10 @@
 DESCRIPTION = "Firmware files for use with Linux kernel"
 SECTION = "kernel"
+# Notes:
+# This is kind of a mess. Each bit of firmware has their own license. Some free
+# some not. Leaving this as Proprietary for now, but this recipe should be probably
+# be rethought out a bit more around how it deals with licenses.
+
 LICENSE = "Proprietary"
 
 LIC_FILES_CHKSUM = "file://LICENSE.radeon_rlc;md5=4c243f7854d2884b483abda991adef43 \
meta/recipes-multimedia/libtiff/tiff_3.9.5.bb +2 -2
index c646c15..7d60326 100644
@@ -1,9 +1,9 @@
 DESCRIPTION = "This software provides support for the Tag Image File Format (TIFF)"
-LICENSE = "${PN}"
+LICENSE = "BSD-2-Clause"
 LIC_FILES_CHKSUM = "file://COPYRIGHT;md5=34da3db46fab7501992f9615d7e158cf"
 HOMEPAGE = "http://www.remotesensing.org/libtiff/"
 DEPENDS = "zlib jpeg lzo"
-PR = "r0"
+PR = "r1"
 
 SRC_URI = "ftp://ftp.remotesensing.org/pub/libtiff/tiff-${PV}.tar.gz \
            file://libtool2.patch"
meta/recipes-sato/matchbox-theme-sato/matchbox-theme-sato.inc +1 -1
index 032dc2d..f031ce0 100644
@@ -2,7 +2,7 @@ DESCRIPTION = "Matchbox window manager Sato themes"
 HOMEPAGE = "http://www.matchbox-project.org/"
 BUGTRACKER = "http://bugzilla.openedhand.com/"
 
-LICENSE = "CCPL"
+LICENSE = "CC-BY-SA-3.0"
 LIC_FILES_CHKSUM = "file://COPYING;md5=aae86bb34b0a83716ca09f4e783d6ba4"
 
 DEPENDS = "matchbox-wm"
meta/recipes-sato/matchbox-theme-sato/matchbox-theme-sato_0.1.bb +1 -1
index e00386f..f6786dd 100644
@@ -1,6 +1,6 @@
 require matchbox-theme-sato.inc
 
-PR = "r0"
+PR = "r1"
 
 SRC_URI = "http://pokylinux.org/releases/sato/matchbox-theme-sato-0.1.tar.gz"
 
meta/recipes-sato/sato-icon-theme/sato-icon-theme.inc +1 -1
index 75e029c..9fd1012 100644
@@ -2,7 +2,7 @@ DESCRIPTION = "Sato Icon Theme"
 HOMEPAGE = "http://www.o-hand.com"
 BUGTRACKER = "http://bugzilla.openedhand.com/"
 
-LICENSE = "CCPL"
+LICENSE = "CC-BY-SA-3.0"
 LIC_FILES_CHKSUM = "file://COPYING;md5=56a830bbe6e4697fe6cbbae01bb7c2b2"
 
 SECTION = "x11"
meta/recipes-sato/sato-icon-theme/sato-icon-theme_0.4.1.bb +1 -1
index 54e4627..652424a 100644
@@ -2,7 +2,7 @@ require sato-icon-theme.inc
 
 DEPENDS += "icon-naming-utils-native"
 
-PR = "r1"
+PR = "r2"
 
 SRC_URI = "http://pokylinux.org/releases/sato/${BPN}-${PV}.tar.gz \
            file://iconpath-option.patch"
meta/recipes-support/boost/boost.inc +2 -2
index fecdb97..cc26ef9 100644
@@ -8,7 +8,7 @@ HOMEPAGE = "http://www.boost.org/"
 SECTION = "libs"
 DEPENDS = "boost-native zlib"
 DEPENDS_virtclass-native = ""
-LICENSE = "Boost"
+LICENSE = "BSL-1 & MIT & Python-2.0"
 
 ARM_INSTRUCTION_SET = "arm"
 
@@ -16,7 +16,7 @@ BOOST_VER = "${@"_".join(d.getVar("PV",1).split("."))}"
 BOOST_MAJ = "${@"_".join(d.getVar("PV",1).split(".")[0:2])}"
 BOOST_P = "boost_${BOOST_VER}"
 
-INC_PR = "r0"
+INC_PR = "r1"
 
 SRC_URI = "${SOURCEFORGE_MIRROR}/${BPN}/${BOOST_P}.tar.bz2"
 
Signature · 1 line
1.7.1
#24 lore raw

Abbreviation of OpenEmbedded-Core (was: [PATCH 7/8] OECore license fixes: meta/*)

Dear OE folks,

Am Mittwoch, den 07.12.2011, 11:34 -0800 schrieb Beth Flanagan:

Quoted 4 lines

From: Elizabeth Flanagan <[email protected]>

This is a quick audit of only the most obviously wrong licenses found within OECore. These fixes fall into four areas:

could we agree on the spelling of the abbreviation of OpenEmbedded-Core?

In the files in the repository everything is spelled OE-Core so I guess that should be it. The Wiki uses OE-Core [1] and Elisabeth’s commit message uses OECore.

[…]

Thanks,

Paul

[1] http://www.openembedded.org/wiki/Oe-core

#25 lore raw

Re: Abbreviation of OpenEmbedded-Core

Quoted 1 line · Paul Menzel

Dear OE folks,

OE-Core folks?

Quoted 11 lines

Am Mittwoch, den 07.12.2011, 11:34 -0800 schrieb Beth Flanagan:

Quoted 4 lines

From: Elizabeth Flanagan <[email protected]>

This is a quick audit of only the most obviously wrong licenses found within OECore. These fixes fall into four areas:

could we agree on the spelling of the abbreviation of OpenEmbedded-Core?

In the files in the repository everything is spelled OE-Core so I guess that should be it. The Wiki uses OE-Core [1] and Elisabeth’s commit message uses OECore.

I think we do have an accord here. Consistent usage in the 'code' and documentation emphasises that. What makes you think we don't agree?

It's probably that Elizabeth's commit message was a typo. I certainly make enough of those.

Regards,
Joshua

Signature · 3 lines
Joshua Lock
        Yocto Project "Johannes factotum"
        Intel Open Source Technology Centre
#26 lore raw

Re: Abbreviation of OpenEmbedded-Core

Am Mittwoch, den 07.12.2011, 13:30 -0800 schrieb Joshua Lock:

Quoted 4 lines · Paul Menzel
Quoted 1 line

Dear OE folks,

OE-Core folks?

I still would call the community OpenEmbedded community.

Quoted 10 lines
Quoted 10 lines

Am Mittwoch, den 07.12.2011, 11:34 -0800 schrieb Beth Flanagan:

Quoted 4 lines

From: Elizabeth Flanagan <[email protected]>

This is a quick audit of only the most obviously wrong licenses found within OECore. These fixes fall into four areas:

could we agree on the spelling of the abbreviation of OpenEmbedded-Core?

In the files in the repository everything is spelled OE-Core so I guess that should be it. The Wiki uses OE-Core [1] and Elisabeth’s commit

I meant the Wiki uses OE-core.

Quoted 7 lines
Quoted 1 line

message uses OECore.

I think we do have an accord here. Consistent usage in the 'code' and documentation emphasises that. What makes you think we don't agree?

It's probably that Elizabeth's commit message was a typo. I certainly make enough of those.

Sorry for the confusion. The spelling is (pairwise) different in the three examples I have given.

Oh, now I see the mailing list tag is OE-core. So this should all be unified.

Thanks,

Paul

#27 lore raw

Re: [PATCH 7/8] OECore license fixes: meta/*

In reply to Beth Flanagan

meta/recipes-extended/less/less_444.bb SECTION = "console/utils" · line 13

Quoted 13 lines · Beth Flanagan
meta/recipes-extended/less/less_444.bb +4 -1
index c78dbaa..f198692 100644
@@ -7,11 +7,14 @@ SECTION = "console/utils"
 
 # (GPLv2+ (<< 418), GPLv3+ (>= 418)) | less
 # less is a 2-clause BSD-like permissive license
-LICENSE = "GPLv3+ | less"
+# Reading LICENSE and COPYING indicate that GPL-3+ is suffient.
+# openSuse .spec and Debian seem to agree here. setting to GPL-3+
+
+LICENSE = "GPLv3+"

This change is rather misleading. The point of the "Less License" (effectively 2-clause BSD) option given by the README is that it provides a non-GPLv3 route for distributing the binaries -- i.e. makes the package usable by people who can't tolerate GPLv3 for whatever reason. If the recipe is marked as simply GPLv3+ then it will appear unusable to those folks.

If we have to pick just a single license for less then it seems that the BSD one would be a better choice than GPLv3+.

p.

#28 lore raw

Re: [PATCH 7/8] OECore license fixes: meta/*

Quoted 22 lines · Phil Blundell

meta/recipes-extended/less/less_444.bb SECTION = "console/utils" · line 13

Quoted 13 lines · Beth Flanagan
meta/recipes-extended/less/less_444.bb +4 -1
index c78dbaa..f198692 100644
@@ -7,11 +7,14 @@ SECTION = "console/utils"
 
  # (GPLv2+ (<< 418), GPLv3+ (>= 418)) | less
  # less is a 2-clause BSD-like permissive license
-LICENSE = "GPLv3+ | less"
+# Reading LICENSE and COPYING indicate that GPL-3+ is suffient.
+# openSuse .spec and Debian seem to agree here. setting to GPL-3+
+
+LICENSE = "GPLv3+"

This change is rather misleading.  The point of the "Less License" (effectively 2-clause BSD) option given by the README is that it provides a non-GPLv3 route for distributing the binaries -- i.e. makes the package usable by people who can't tolerate GPLv3 for whatever reason.  If the recipe is marked as simply GPLv3+ then it will appear unusable to those folks.

Quoted 4 lines

If we have to pick just a single license for less then it seems that the BSD one would be a better choice than GPLv3+.

p.

I have an email out to the author to verify if it would be ok to use BSD-2-Clause. If so, we can switch it to that. If not, we'll add less as a license type.

Sound ok?

-b

Quoted 7 lines

_______________________________________________
Openembedded-core mailing list
[email protected]
http://lists.linuxtogo.org/cgi-bin/mailman/listinfo/openembedded-core

Signature · 3 lines
Elizabeth Flanagan
Yocto Project
Build and Release
#29 lore raw

Re: [PATCH 7/8] OECore license fixes: meta/*

In reply to Beth Flanagan
Quoted 9 lines · Beth Flanagan

From: Elizabeth Flanagan <[email protected]>

This is a quick audit of only the most obviously wrong licenses found within OECore. These fixes fall into four areas:

- LICENSE field had incorrect format so that the parser choked
- LICENSE field has a license with no version
- LICENSE field was actually incorrect
- LICENSE field has an imaginary license that didn't exist

[...]

meta/recipes-extended/bzip2/bzip2_1.0.6.bb Huffman coding. Compression is generally considerably better than that achieved · line 7

Quoted 10 lines
meta/recipes-extended/bzip2/bzip2_1.0.6.bb +1 -1
index f5b9ac1..14cd240 100644
@@ -4,9 +4,9 @@ Huffman coding. Compression is generally considerably better than that achieved
 LZ77/LZ78-based compressors, and approaches the performance of the PPM family of statistical compressors."
 HOMEPAGE = "http://www.bzip.org/"
 SECTION = "console/utils"
-LICENSE = "bzip2"
+LICENSE = "BSD-4-Clause"

This (and the corresponding change to busybox) doesn't seem quite right. Although it is true that the bzip2 licence does have four clauses and is approximately BSD-ish, these four clauses are not actually the same as the ones in the traditional 4-clause BSD licence.

The four clauses that the bzip2 licence actually has are (to quote LICENSE):

1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.

2. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required.

3. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.

4. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission.

Whereas, the four clauses from the original BSD are:

1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.

2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.

3. All advertising materials mentioning features or use of this software must display the following acknowledgement:
This product includes software developed by the <organization>.

4. Neither the name of the <organization> nor the
names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.

Clauses 1 and 4 are clearly the same thing (or very nearly identical) but clauses 2 and 3 are significantly different in both wording and intent. In particular the bzip2 license contains no equivalent to the objectionable "advertising clause".

p.

#30 lore raw

Re: [PATCH 7/8] OECore license fixes: meta/*

Quoted 5 lines · Phil Blundell

This (and the corresponding change to busybox) doesn't seem quite right. Although it is true that the bzip2 licence does have four clauses and is approximately BSD-ish, these four clauses are not actually the same as the ones in the traditional 4-clause BSD licence.

That's correct, thanks for the catch. When I was going through these, I relied on a lot on what others had listed the package as. OBS lists it as BSD (3 clause I believe). Gentoo lists it as bzip2.
I dislike having singular licenses but in this case, due to clause 2 and 3, the correct path here is to change it back to bzip2, add the bzip2 text to the license directory and then email the bzip2 developers and ask them if BSD-4-clause is appropriate or not. I'll do that today.

-b

Quoted 49 lines

The four clauses that the bzip2 licence actually has are (to quote LICENSE):

1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.

2. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required.

3. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.

4. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission.

Whereas, the four clauses from the original BSD are:

1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.

2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.

3. All advertising materials mentioning features or use of this software must display the following acknowledgement:
This product includes software developed by the <organization>.

4. Neither the name of the <organization> nor the
names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.

Clauses 1 and 4 are clearly the same thing (or very nearly identical) but clauses 2 and 3 are significantly different in both wording and intent. In particular the bzip2 license contains no equivalent to the objectionable "advertising clause".

p.

_______________________________________________
Openembedded-core mailing list
[email protected]
http://lists.linuxtogo.org/cgi-bin/mailman/listinfo/openembedded-core

Signature · 3 lines
Elizabeth Flanagan
Yocto Project
Build and Release
#31 lore raw

Re: [PATCH 7/8] OECore license fixes: meta/*

Quoted 7 lines · Elizabeth
Quoted 5 lines · Phil Blundell

This (and the corresponding change to busybox) doesn't seem quite right. Although it is true that the bzip2 licence does have four clauses and is approximately BSD-ish, these four clauses are not actually the same as the ones in the traditional 4-clause BSD licence.

Quoted 8 lines

That's correct, thanks for the catch. When I was going through these, I relied on a lot on what others had listed the package as. OBS lists it as BSD (3 clause I believe). Gentoo lists it as bzip2.
I dislike having singular licenses but in this case, due to clause 2 and 3, the correct path here is to change it back to bzip2, add the bzip2 text to the license directory and then email the bzip2 developers and ask them if BSD-4-clause is appropriate or not. I'll do that today.

If you're going to ask the maintainers about varying the license wording, it might be better to ask for BSD-3-Clause rather than the 4-clause one. Having it licensed under terms which include the advertising clause would be a bit of a pain.

p.

#32 lore raw

PATCH 8/8 package.bbclass: Adding license collection

In reply to Beth Flanagan

From: Elizabeth Flanagan <[email protected]>

emite_package_data needs to have LICENSE, as pkgdata is as an audit of licenses collected during do_populate_license.

---
 meta/classes/package.bbclass |    1 +
 1 files changed, 1 insertions(+), 0 deletions(-)
meta/classes/package.bbclass +1 -0
index 256cdc1..39c1d4b 100644
@@ -1065,6 +1065,7 @@ python emit_pkgdata() {
 		write_if_exists(sf, pkg, 'PR')
 		write_if_exists(sf, pkg, 'PKGV')
 		write_if_exists(sf, pkg, 'PKGR')
+		write_if_exists(sf, pkg, 'LICENSE')
 		write_if_exists(sf, pkg, 'DESCRIPTION')
 		write_if_exists(sf, pkg, 'SUMMARY')
 		write_if_exists(sf, pkg, 'RDEPENDS')
Signature · 1 line
1.7.1
#33 lore raw
In reply to Beth Flanagan
Quoted 20 lines · Beth Flanagan

These are the changes from the RFCs Chris Larson and I sent out this weekend merged into one branch along with a gettext minimal fix from RP. I've trimmed the diffs in the PULL down some as there are a number of license text diffs that cause send-patch-request to choke.

The following changes since commit f17e0ae38b2e6c4cbe7f0f9d76c3e1a386335fd1:

conf/machine: Don't poke around providers which aren't machine specific/safe (2011-12-06 22:47:09 +0000)

are available in the git repository at:
git://git.yoctoproject.org/poky-contrib eflanagan/consolidated_license
http://git.yoctoproject.org/cgit.cgi/poky-contrib/log/?h=eflanagan/consolidated_license

Christopher Larson (4):
oe.test_types: move into an oe.tests package
license: split license parsing into oe.license
oe.license: add license flattening code
Add copyleft compliance class

Quoted 7 lines

Elizabeth Flanagan (3):
[YOCTO #1776] license: manifest and license path OECore license fixes: meta/* package.bbclass: Adding license collection

Richard Purdie (1):
gettext-minimal-native: Fix License

Merged to master, thanks.

I appreciate there is some feedback but I think Chris' plan of building upon this set of commits is a good one.

Cheers,

Richard