diff options
| -rw-r--r-- | bitbake/lib/bb/cooker.py | 40 | ||||
| -rw-r--r-- | bitbake/lib/bb/tests/utils.py | 33 | ||||
| -rw-r--r-- | bitbake/lib/bb/utils.py | 22 |
3 files changed, 69 insertions, 26 deletions
diff --git a/bitbake/lib/bb/cooker.py b/bitbake/lib/bb/cooker.py index f77c6c0532..0bbbc09c33 100644 --- a/bitbake/lib/bb/cooker.py +++ b/bitbake/lib/bb/cooker.py | |||
| @@ -1096,42 +1096,30 @@ class BBCooker: | |||
| 1096 | # Check dependencies and store information for priority calculation | 1096 | # Check dependencies and store information for priority calculation |
| 1097 | deps = self.data.getVar("LAYERDEPENDS_%s" % c, True) | 1097 | deps = self.data.getVar("LAYERDEPENDS_%s" % c, True) |
| 1098 | if deps: | 1098 | if deps: |
| 1099 | depnamelist = [] | 1099 | try: |
| 1100 | deplist = deps.split() | 1100 | deplist = bb.utils.explode_dep_versions2(deps) |
| 1101 | for dep in deplist: | 1101 | except bb.utils.VersionStringException as vse: |
| 1102 | depsplit = dep.split(':') | 1102 | bb.fatal('Error parsing LAYERDEPENDS_%s: %s' % (c, str(vse))) |
| 1103 | if len(depsplit) > 1: | 1103 | for dep, oplist in deplist.iteritems(): |
| 1104 | try: | ||
| 1105 | depver = int(depsplit[1]) | ||
| 1106 | except ValueError: | ||
| 1107 | parselog.error("invalid version value in LAYERDEPENDS_%s: \"%s\"", c, dep) | ||
| 1108 | errors = True | ||
| 1109 | continue | ||
| 1110 | else: | ||
| 1111 | depver = None | ||
| 1112 | dep = depsplit[0] | ||
| 1113 | depnamelist.append(dep) | ||
| 1114 | |||
| 1115 | if dep in collection_list: | 1104 | if dep in collection_list: |
| 1116 | if depver: | 1105 | for opstr in oplist: |
| 1117 | layerver = self.data.getVar("LAYERVERSION_%s" % dep, True) | 1106 | layerver = self.data.getVar("LAYERVERSION_%s" % dep, True) |
| 1107 | (op, depver) = opstr.split() | ||
| 1118 | if layerver: | 1108 | if layerver: |
| 1119 | try: | 1109 | try: |
| 1120 | lver = int(layerver) | 1110 | res = bb.utils.vercmp_string_op(layerver, depver, op) |
| 1121 | except ValueError: | 1111 | except bb.utils.VersionStringException as vse: |
| 1122 | parselog.error("invalid value for LAYERVERSION_%s: \"%s\"", c, layerver) | 1112 | bb.fatal('Error parsing LAYERDEPENDS_%s: %s' % (c, str(vse))) |
| 1123 | errors = True | 1113 | if not res: |
| 1124 | continue | 1114 | parselog.error("Layer '%s' depends on version %s of layer '%s', but version %s is currently enabled in your configuration. Check that you are using the correct matching versions/branches of these two layers.", c, opstr, dep, layerver) |
| 1125 | if lver != depver: | ||
| 1126 | parselog.error("Layer '%s' depends on version %d of layer '%s', but version %d is enabled in your configuration", c, depver, dep, lver) | ||
| 1127 | errors = True | 1115 | errors = True |
| 1128 | else: | 1116 | else: |
| 1129 | parselog.error("Layer '%s' depends on version %d of layer '%s', which exists in your configuration but does not specify a version", c, depver, dep) | 1117 | parselog.error("Layer '%s' depends on version %s of layer '%s', which exists in your configuration but does not specify a version. Check that you are using the correct matching versions/branches of these two layers.", c, opstr, dep) |
| 1130 | errors = True | 1118 | errors = True |
| 1131 | else: | 1119 | else: |
| 1132 | parselog.error("Layer '%s' depends on layer '%s', but this layer is not enabled in your configuration", c, dep) | 1120 | parselog.error("Layer '%s' depends on layer '%s', but this layer is not enabled in your configuration", c, dep) |
| 1133 | errors = True | 1121 | errors = True |
| 1134 | collection_depends[c] = depnamelist | 1122 | collection_depends[c] = deplist.keys() |
| 1135 | else: | 1123 | else: |
| 1136 | collection_depends[c] = [] | 1124 | collection_depends[c] = [] |
| 1137 | 1125 | ||
diff --git a/bitbake/lib/bb/tests/utils.py b/bitbake/lib/bb/tests/utils.py index cf145f0d7a..507de2de3c 100644 --- a/bitbake/lib/bb/tests/utils.py +++ b/bitbake/lib/bb/tests/utils.py | |||
| @@ -55,3 +55,36 @@ class VerCmpString(unittest.TestCase): | |||
| 55 | result = bb.utils.explode_dep_versions2("foo ( =1.10 )") | 55 | result = bb.utils.explode_dep_versions2("foo ( =1.10 )") |
| 56 | self.assertEqual(result, correctresult) | 56 | self.assertEqual(result, correctresult) |
| 57 | 57 | ||
| 58 | def test_vercmp_string_op(self): | ||
| 59 | compareops = [('1', '1', '=', True), | ||
| 60 | ('1', '1', '==', True), | ||
| 61 | ('1', '1', '!=', False), | ||
| 62 | ('1', '1', '>', False), | ||
| 63 | ('1', '1', '<', False), | ||
| 64 | ('1', '1', '>=', True), | ||
| 65 | ('1', '1', '<=', True), | ||
| 66 | ('1', '0', '=', False), | ||
| 67 | ('1', '0', '==', False), | ||
| 68 | ('1', '0', '!=', True), | ||
| 69 | ('1', '0', '>', True), | ||
| 70 | ('1', '0', '<', False), | ||
| 71 | ('1', '0', '>>', True), | ||
| 72 | ('1', '0', '<<', False), | ||
| 73 | ('1', '0', '>=', True), | ||
| 74 | ('1', '0', '<=', False), | ||
| 75 | ('0', '1', '=', False), | ||
| 76 | ('0', '1', '==', False), | ||
| 77 | ('0', '1', '!=', True), | ||
| 78 | ('0', '1', '>', False), | ||
| 79 | ('0', '1', '<', True), | ||
| 80 | ('0', '1', '>>', False), | ||
| 81 | ('0', '1', '<<', True), | ||
| 82 | ('0', '1', '>=', False), | ||
| 83 | ('0', '1', '<=', True)] | ||
| 84 | |||
| 85 | for arg1, arg2, op, correctresult in compareops: | ||
| 86 | result = bb.utils.vercmp_string_op(arg1, arg2, op) | ||
| 87 | self.assertEqual(result, correctresult, 'vercmp_string_op("%s", "%s", "%s") != %s' % (arg1, arg2, op, correctresult)) | ||
| 88 | |||
| 89 | # Check that clearly invalid operator raises an exception | ||
| 90 | self.assertRaises(bb.utils.VersionStringException, bb.utils.vercmp_string_op, '0', '0', '$') | ||
diff --git a/bitbake/lib/bb/utils.py b/bitbake/lib/bb/utils.py index 7ba1234578..5ac9bcfbd4 100644 --- a/bitbake/lib/bb/utils.py +++ b/bitbake/lib/bb/utils.py | |||
| @@ -131,6 +131,28 @@ def vercmp_string(a, b): | |||
| 131 | tb = split_version(b) | 131 | tb = split_version(b) |
| 132 | return vercmp(ta, tb) | 132 | return vercmp(ta, tb) |
| 133 | 133 | ||
| 134 | def vercmp_string_op(a, b, op): | ||
| 135 | """ | ||
| 136 | Compare two versions and check if the specified comparison operator matches the result of the comparison. | ||
| 137 | This function is fairly liberal about what operators it will accept since there are a variety of styles | ||
| 138 | depending on the context. | ||
| 139 | """ | ||
| 140 | res = vercmp_string(a, b) | ||
| 141 | if op in ('=', '=='): | ||
| 142 | return res == 0 | ||
| 143 | elif op == '<=': | ||
| 144 | return res <= 0 | ||
| 145 | elif op == '>=': | ||
| 146 | return res >= 0 | ||
| 147 | elif op in ('>', '>>'): | ||
| 148 | return res > 0 | ||
| 149 | elif op in ('<', '<<'): | ||
| 150 | return res < 0 | ||
| 151 | elif op == '!=': | ||
| 152 | return res != 0 | ||
| 153 | else: | ||
| 154 | raise VersionStringException('Unsupported comparison operator "%s"' % op) | ||
| 155 | |||
| 134 | def explode_deps(s): | 156 | def explode_deps(s): |
| 135 | """ | 157 | """ |
| 136 | Take an RDEPENDS style string of format: | 158 | Take an RDEPENDS style string of format: |
