diff options
Diffstat (limited to 'bitbake/lib/bb/utils.py')
| -rw-r--r-- | bitbake/lib/bb/utils.py | 62 |
1 files changed, 47 insertions, 15 deletions
diff --git a/bitbake/lib/bb/utils.py b/bitbake/lib/bb/utils.py index d032ab299e..a537338326 100644 --- a/bitbake/lib/bb/utils.py +++ b/bitbake/lib/bb/utils.py | |||
| @@ -147,26 +147,58 @@ def explode_dep_versions(s): | |||
| 147 | r = {} | 147 | r = {} |
| 148 | l = s.replace(",", "").split() | 148 | l = s.replace(",", "").split() |
| 149 | lastdep = None | 149 | lastdep = None |
| 150 | lastcmp = "" | ||
| 150 | lastver = "" | 151 | lastver = "" |
| 152 | incmp = False | ||
| 151 | inversion = False | 153 | inversion = False |
| 152 | for i in l: | 154 | for i in l: |
| 153 | if i[0] == '(': | 155 | if i[0] == '(': |
| 156 | incmp = True | ||
| 157 | i = i[1:].strip() | ||
| 158 | if not i: | ||
| 159 | continue | ||
| 160 | |||
| 161 | if incmp: | ||
| 162 | incmp = False | ||
| 154 | inversion = True | 163 | inversion = True |
| 155 | lastver = i[1:] or "" | 164 | # This list is based on behavior and supported comparisons from deb, opkg and rpm. |
| 156 | #j = [] | 165 | # |
| 157 | elif inversion and i.endswith(')'): | 166 | # Even though =<, <<, ==, !=, =>, and >> may not be supported, |
| 158 | inversion = False | 167 | # we list each possibly valid item. |
| 159 | lastver = lastver + " " + (i[:-1] or "") | 168 | # The build system is responsible for validation of what it supports. |
| 160 | if lastdep in r and r[lastdep] and r[lastdep] != lastver: | 169 | if i.startswith(('<=', '=<', '<<', '==', '!=', '>=', '=>', '>>')): |
| 161 | raise ValueError("Error, item %s appeared in dependency string '%s' multiple times with different values. explode_dep_versions cannot cope with this." % (lastdep, s)) | 170 | lastcmp = i[0:2] |
| 162 | r[lastdep] = lastver | 171 | i = i[2:] |
| 163 | elif not inversion: | 172 | elif i.startswith(('<', '>', '=')): |
| 164 | if not (i in r and r[i]): | 173 | lastcmp = i[0:1] |
| 165 | r[i] = None | 174 | i = i[1:] |
| 166 | lastdep = i | 175 | else: |
| 167 | lastver = "" | 176 | # This is an unsupported case! |
| 168 | elif inversion: | 177 | lastcmp = (i or "") |
| 169 | lastver = lastver + " " + i | 178 | i = "" |
| 179 | i.strip() | ||
| 180 | if not i: | ||
| 181 | continue | ||
| 182 | |||
| 183 | if inversion: | ||
| 184 | if i.endswith(')'): | ||
| 185 | i = i[:-1] or "" | ||
| 186 | inversion = False | ||
| 187 | if lastver and i: | ||
| 188 | lastver += " " | ||
| 189 | if i: | ||
| 190 | lastver += i | ||
| 191 | if lastdep in r and r[lastdep] and r[lastdep] != lastver: | ||
| 192 | raise ValueError("Error, item %s appeared in dependency string '%s' multiple times with different values. explode_dep_versions cannot cope with this." % (lastdep, s)) | ||
| 193 | r[lastdep] = lastcmp + " " + lastver | ||
| 194 | continue | ||
| 195 | |||
| 196 | #if not inversion: | ||
| 197 | lastdep = i | ||
| 198 | lastver = "" | ||
| 199 | lastcmp = "" | ||
| 200 | if not (i in r and r[i]): | ||
| 201 | r[lastdep] = None | ||
| 170 | 202 | ||
| 171 | return r | 203 | return r |
| 172 | 204 | ||
