diff options
Diffstat (limited to 'meta/classes/license.bbclass')
-rw-r--r-- | meta/classes/license.bbclass | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/meta/classes/license.bbclass b/meta/classes/license.bbclass index 4b98e29916..10a937b10c 100644 --- a/meta/classes/license.bbclass +++ b/meta/classes/license.bbclass | |||
@@ -282,6 +282,69 @@ def incompatible_license(d,dont_want_license): | |||
282 | return True | 282 | return True |
283 | return False | 283 | return False |
284 | 284 | ||
285 | |||
286 | def check_license_flags(d): | ||
287 | """ | ||
288 | This function checks if a recipe has any LICENSE_FLAGs that | ||
289 | aren't whitelisted. | ||
290 | |||
291 | If it does, it returns the first LICENSE_FLAG missing from the | ||
292 | whitelist, or all the LICENSE_FLAGs if there is no whitelist. | ||
293 | |||
294 | If everything is is properly whitelisted, it returns None. | ||
295 | """ | ||
296 | |||
297 | def license_flag_matches(flag, whitelist, pn): | ||
298 | """ | ||
299 | Return True if flag matches something in whitelist, None if not. | ||
300 | |||
301 | Before we test a flag against the whitelist, we append _${PN} | ||
302 | to it. We then try to match that string against the | ||
303 | whitelist. This covers the normal case, where we expect | ||
304 | LICENSE_FLAGS to be a simple string like 'commercial', which | ||
305 | the user typically matches exactly in the whitelist by | ||
306 | explicitly appending the package name e.g 'commercial_foo'. | ||
307 | If we fail the match however, we then split the flag across | ||
308 | '_' and append each fragment and test until we either match or | ||
309 | run out of fragments. | ||
310 | """ | ||
311 | flag_pn = ("%s_%s" % (flag, pn)) | ||
312 | for candidate in whitelist: | ||
313 | if flag_pn == candidate: | ||
314 | return True | ||
315 | |||
316 | flag_cur = "" | ||
317 | flagments = flag_pn.split("_") | ||
318 | flagments.pop() # we've already tested the full string | ||
319 | for flagment in flagments: | ||
320 | if flag_cur: | ||
321 | flag_cur += "_" | ||
322 | flag_cur += flagment | ||
323 | for candidate in whitelist: | ||
324 | if flag_cur == candidate: | ||
325 | return True | ||
326 | return False | ||
327 | |||
328 | def all_license_flags_match(license_flags, whitelist): | ||
329 | """ Return first unmatched flag, None if all flags match """ | ||
330 | pn = d.getVar('PN', True) | ||
331 | split_whitelist = whitelist.split() | ||
332 | for flag in license_flags.split(): | ||
333 | if not license_flag_matches(flag, split_whitelist, pn): | ||
334 | return flag | ||
335 | return None | ||
336 | |||
337 | license_flags = d.getVar('LICENSE_FLAGS', True) | ||
338 | if license_flags: | ||
339 | whitelist = d.getVar('LICENSE_FLAGS_WHITELIST', True) | ||
340 | if not whitelist: | ||
341 | return license_flags | ||
342 | unmatched_flag = all_license_flags_match(license_flags, whitelist) | ||
343 | if unmatched_flag: | ||
344 | return unmatched_flag | ||
345 | return None | ||
346 | |||
347 | |||
285 | SSTATETASKS += "do_populate_lic" | 348 | SSTATETASKS += "do_populate_lic" |
286 | do_populate_lic[sstate-name] = "populate-lic" | 349 | do_populate_lic[sstate-name] = "populate-lic" |
287 | do_populate_lic[sstate-inputdirs] = "${LICSSTATEDIR}" | 350 | do_populate_lic[sstate-inputdirs] = "${LICSSTATEDIR}" |