diff options
| -rw-r--r-- | bitbake/ChangeLog | 6 | ||||
| -rw-r--r-- | bitbake/lib/bb/fetch/git.py | 5 | ||||
| -rw-r--r-- | bitbake/lib/bb/fetch/wget.py | 6 | ||||
| -rw-r--r-- | bitbake/lib/bb/runqueue.py | 4 | ||||
| -rw-r--r-- | bitbake/lib/bb/taskdata.py | 41 |
5 files changed, 41 insertions, 21 deletions
diff --git a/bitbake/ChangeLog b/bitbake/ChangeLog index 4f3eafe2ba..8f251475aa 100644 --- a/bitbake/ChangeLog +++ b/bitbake/ChangeLog | |||
| @@ -35,6 +35,12 @@ Changes in BitBake 1.8.x: | |||
| 35 | - Add support for "-e target" (#3432) | 35 | - Add support for "-e target" (#3432) |
| 36 | - Fix shell showdata command (#3259) | 36 | - Fix shell showdata command (#3259) |
| 37 | - Fix shell data updating problems (#1880) | 37 | - Fix shell data updating problems (#1880) |
| 38 | - Properly raise errors for invalid source URI protocols | ||
| 39 | - Change the wget fetcher failure handling to avoid lockfile problems | ||
| 40 | - Add git branch support | ||
| 41 | - Add support for branches in git fetcher (Otavio Salvador, Michael Lauer) | ||
| 42 | - Make taskdata and runqueue errors more user friendly | ||
| 43 | - Add norecurse and fullpath options to cvs fetcher | ||
| 38 | 44 | ||
| 39 | Changes in Bitbake 1.8.8: | 45 | Changes in Bitbake 1.8.8: |
| 40 | - Rewrite svn fetcher to make adding extra operations easier | 46 | - Rewrite svn fetcher to make adding extra operations easier |
diff --git a/bitbake/lib/bb/fetch/git.py b/bitbake/lib/bb/fetch/git.py index 21259a23b0..9cc7f4e086 100644 --- a/bitbake/lib/bb/fetch/git.py +++ b/bitbake/lib/bb/fetch/git.py | |||
| @@ -50,6 +50,8 @@ class Git(Fetch): | |||
| 50 | if 'protocol' in ud.parm: | 50 | if 'protocol' in ud.parm: |
| 51 | ud.proto = ud.parm['protocol'] | 51 | ud.proto = ud.parm['protocol'] |
| 52 | 52 | ||
| 53 | ud.branch = ud.parm.get("branch", "") | ||
| 54 | |||
| 53 | tag = Fetch.srcrev_internal_helper(ud, d) | 55 | tag = Fetch.srcrev_internal_helper(ud, d) |
| 54 | if tag is True: | 56 | if tag is True: |
| 55 | ud.tag = self.latest_revision(url, ud, d) | 57 | ud.tag = self.latest_revision(url, ud, d) |
| @@ -130,7 +132,8 @@ class Git(Fetch): | |||
| 130 | 132 | ||
| 131 | def _latest_revision(self, url, ud, d): | 133 | def _latest_revision(self, url, ud, d): |
| 132 | 134 | ||
| 133 | output = runfetchcmd("git ls-remote %s://%s%s" % (ud.proto, ud.host, ud.path), d, True) | 135 | bb.msg.note(1, bb.msg.domain.Fetcher, "Calling git ls-remote %s://%s%s %s" % (ud.proto, ud.host, ud.path, ud.branch ) ) |
| 136 | output = runfetchcmd("git ls-remote %s://%s%s %s" % (ud.proto, ud.host, ud.path, ud.branch), d, True) | ||
| 134 | return output.split()[0] | 137 | return output.split()[0] |
| 135 | 138 | ||
| 136 | def _build_revision(self, url, ud, d): | 139 | def _build_revision(self, url, ud, d): |
diff --git a/bitbake/lib/bb/fetch/wget.py b/bitbake/lib/bb/fetch/wget.py index 2d590ad0b2..f8ade45da7 100644 --- a/bitbake/lib/bb/fetch/wget.py +++ b/bitbake/lib/bb/fetch/wget.py | |||
| @@ -66,10 +66,10 @@ class Wget(Fetch): | |||
| 66 | if ret != 0: | 66 | if ret != 0: |
| 67 | return False | 67 | return False |
| 68 | 68 | ||
| 69 | # check if sourceforge did send us to the mirror page | 69 | # Sanity check since wget can pretend it succeed when it didn't |
| 70 | # Also, this used to happen if sourceforge sent us to the mirror page | ||
| 70 | if not os.path.exists(ud.localpath): | 71 | if not os.path.exists(ud.localpath): |
| 71 | os.system("rm %s*" % ud.localpath) # FIXME shell quote it | 72 | bb.msg.debug(2, bb.msg.domain.Fetcher, "The fetch command for %s returned success but %s doesn't exist?..." % (uri, ud.localpath)) |
| 72 | bb.msg.debug(2, bb.msg.domain.Fetcher, "sourceforge.net send us to the mirror on %s" % ud.basename) | ||
| 73 | return False | 73 | return False |
| 74 | 74 | ||
| 75 | return True | 75 | return True |
diff --git a/bitbake/lib/bb/runqueue.py b/bitbake/lib/bb/runqueue.py index 68ef3a722f..9d27d539c1 100644 --- a/bitbake/lib/bb/runqueue.py +++ b/bitbake/lib/bb/runqueue.py | |||
| @@ -564,7 +564,7 @@ class RunQueue: | |||
| 564 | # Check to make sure we still have tasks to run | 564 | # Check to make sure we still have tasks to run |
| 565 | if len(self.runq_fnid) == 0: | 565 | if len(self.runq_fnid) == 0: |
| 566 | if not taskData.abort: | 566 | if not taskData.abort: |
| 567 | bb.msg.note(1, bb.msg.domain.RunQueue, "All possible tasks have been run but build incomplete (--continue mode). See errors above for incomplete tasks.") | 567 | bb.msg.note(1, bb.msg.domain.RunQueue, "All buildable tasks have been run but the build is incomplete (--continue mode). Errors for the tasks that failed will have been printed above.") |
| 568 | return | 568 | return |
| 569 | bb.msg.fatal(bb.msg.domain.RunQueue, "No active tasks and not in --continue mode?! Please report this bug.") | 569 | bb.msg.fatal(bb.msg.domain.RunQueue, "No active tasks and not in --continue mode?! Please report this bug.") |
| 570 | 570 | ||
| @@ -630,7 +630,7 @@ class RunQueue: | |||
| 630 | for prov in prov_list: | 630 | for prov in prov_list: |
| 631 | if len(prov_list[prov]) > 1 and prov not in self.multi_provider_whitelist: | 631 | if len(prov_list[prov]) > 1 and prov not in self.multi_provider_whitelist: |
| 632 | error = True | 632 | error = True |
| 633 | bb.msg.error(bb.msg.domain.RunQueue, "Multiple files due to be built which all provide %s (%s)" % (prov, " ".join(prov_list[prov]))) | 633 | bb.msg.error(bb.msg.domain.RunQueue, "Multiple .bb files are due to be built which each provide %s (%s).\n This usually means one provides something the other doesn't and should." % (prov, " ".join(prov_list[prov]))) |
| 634 | #if error: | 634 | #if error: |
| 635 | # bb.msg.fatal(bb.msg.domain.RunQueue, "Corrupted metadata configuration detected, aborting...") | 635 | # bb.msg.fatal(bb.msg.domain.RunQueue, "Corrupted metadata configuration detected, aborting...") |
| 636 | 636 | ||
diff --git a/bitbake/lib/bb/taskdata.py b/bitbake/lib/bb/taskdata.py index 74a8b84bd5..3dac6c26af 100644 --- a/bitbake/lib/bb/taskdata.py +++ b/bitbake/lib/bb/taskdata.py | |||
| @@ -330,7 +330,7 @@ class TaskData: | |||
| 330 | self.add_provider_internal(cfgData, dataCache, item) | 330 | self.add_provider_internal(cfgData, dataCache, item) |
| 331 | except bb.providers.NoProvider: | 331 | except bb.providers.NoProvider: |
| 332 | if self.abort: | 332 | if self.abort: |
| 333 | bb.msg.error(bb.msg.domain.Provider, "No providers of build target %s (for %s)" % (item, self.get_dependees_str(item))) | 333 | bb.msg.error(bb.msg.domain.Provider, "Nothing PROVIDES '%s' (but '%s' DEPENDS on or otherwise requires it)" % (item, self.get_dependees_str(item))) |
| 334 | raise | 334 | raise |
| 335 | targetid = self.getbuild_id(item) | 335 | targetid = self.getbuild_id(item) |
| 336 | self.remove_buildtarget(targetid) | 336 | self.remove_buildtarget(targetid) |
| @@ -348,7 +348,7 @@ class TaskData: | |||
| 348 | return | 348 | return |
| 349 | 349 | ||
| 350 | if not item in dataCache.providers: | 350 | if not item in dataCache.providers: |
| 351 | bb.msg.note(2, bb.msg.domain.Provider, "No providers of build target %s (for %s)" % (item, self.get_dependees_str(item))) | 351 | bb.msg.note(2, bb.msg.domain.Provider, "Nothing PROVIDES '%s' (but '%s' DEPENDS on or otherwise requires it)" % (item, self.get_dependees_str(item))) |
| 352 | bb.event.fire(bb.event.NoProvider(item, cfgData)) | 352 | bb.event.fire(bb.event.NoProvider(item, cfgData)) |
| 353 | raise bb.providers.NoProvider(item) | 353 | raise bb.providers.NoProvider(item) |
| 354 | 354 | ||
| @@ -365,7 +365,7 @@ class TaskData: | |||
| 365 | eligible.remove(p) | 365 | eligible.remove(p) |
| 366 | 366 | ||
| 367 | if not eligible: | 367 | if not eligible: |
| 368 | bb.msg.note(2, bb.msg.domain.Provider, "No providers of build target %s after filtering (for %s)" % (item, self.get_dependees_str(item))) | 368 | bb.msg.note(2, bb.msg.domain.Provider, "No buildable provider PROVIDES '%s' but '%s' DEPENDS on or otherwise requires it. Enable debugging and see earlier logs to find unbuildable providers." % (item, self.get_dependees_str(item))) |
| 369 | bb.event.fire(bb.event.NoProvider(item, cfgData)) | 369 | bb.event.fire(bb.event.NoProvider(item, cfgData)) |
| 370 | raise bb.providers.NoProvider(item) | 370 | raise bb.providers.NoProvider(item) |
| 371 | 371 | ||
| @@ -376,7 +376,7 @@ class TaskData: | |||
| 376 | providers_list.append(dataCache.pkg_fn[fn]) | 376 | providers_list.append(dataCache.pkg_fn[fn]) |
| 377 | bb.msg.note(1, bb.msg.domain.Provider, "multiple providers are available for %s (%s);" % (item, ", ".join(providers_list))) | 377 | bb.msg.note(1, bb.msg.domain.Provider, "multiple providers are available for %s (%s);" % (item, ", ".join(providers_list))) |
| 378 | bb.msg.note(1, bb.msg.domain.Provider, "consider defining PREFERRED_PROVIDER_%s" % item) | 378 | bb.msg.note(1, bb.msg.domain.Provider, "consider defining PREFERRED_PROVIDER_%s" % item) |
| 379 | bb.event.fire(bb.event.MultipleProviders(item,providers_list,cfgData)) | 379 | bb.event.fire(bb.event.MultipleProviders(item, providers_list, cfgData)) |
| 380 | self.consider_msgs_cache.append(item) | 380 | self.consider_msgs_cache.append(item) |
| 381 | 381 | ||
| 382 | for fn in eligible: | 382 | for fn in eligible: |
| @@ -405,7 +405,7 @@ class TaskData: | |||
| 405 | all_p = bb.providers.getRuntimeProviders(dataCache, item) | 405 | all_p = bb.providers.getRuntimeProviders(dataCache, item) |
| 406 | 406 | ||
| 407 | if not all_p: | 407 | if not all_p: |
| 408 | bb.msg.error(bb.msg.domain.Provider, "No providers of runtime build target %s (for %s)" % (item, self.get_rdependees_str(item))) | 408 | bb.msg.error(bb.msg.domain.Provider, "'%s' RDEPENDS/RRECOMMENDS or otherwise requires the runtime entity '%s' but it wasn't found in any PACKAGE or RPROVIDES variables" % (self.get_rdependees_str(item), item)) |
| 409 | bb.event.fire(bb.event.NoProvider(item, cfgData, runtime=True)) | 409 | bb.event.fire(bb.event.NoProvider(item, cfgData, runtime=True)) |
| 410 | raise bb.providers.NoRProvider(item) | 410 | raise bb.providers.NoRProvider(item) |
| 411 | 411 | ||
| @@ -417,7 +417,7 @@ class TaskData: | |||
| 417 | eligible.remove(p) | 417 | eligible.remove(p) |
| 418 | 418 | ||
| 419 | if not eligible: | 419 | if not eligible: |
| 420 | bb.msg.error(bb.msg.domain.Provider, "No providers of runtime build target %s after filtering (for %s)" % (item, self.get_rdependees_str(item))) | 420 | bb.msg.error(bb.msg.domain.Provider, "'%s' RDEPENDS/RRECOMMENDS or otherwise requires the runtime entity '%s' but it wasn't found in any PACKAGE or RPROVIDES variables of any buildable targets.\nEnable debugging and see earlier logs to find unbuildable targets." % (self.get_rdependees_str(item), item)) |
| 421 | bb.event.fire(bb.event.NoProvider(item, cfgData, runtime=True)) | 421 | bb.event.fire(bb.event.NoProvider(item, cfgData, runtime=True)) |
| 422 | raise bb.providers.NoRProvider(item) | 422 | raise bb.providers.NoRProvider(item) |
| 423 | 423 | ||
| @@ -446,7 +446,7 @@ class TaskData: | |||
| 446 | fnid = self.getfn_id(fn) | 446 | fnid = self.getfn_id(fn) |
| 447 | if fnid in self.failed_fnids: | 447 | if fnid in self.failed_fnids: |
| 448 | continue | 448 | continue |
| 449 | bb.msg.debug(2, bb.msg.domain.Provider, "adding %s to satisfy runtime %s" % (fn, item)) | 449 | bb.msg.debug(2, bb.msg.domain.Provider, "adding '%s' to satisfy runtime '%s'" % (fn, item)) |
| 450 | self.add_runtime_target(fn, item) | 450 | self.add_runtime_target(fn, item) |
| 451 | self.add_tasks(fn, dataCache) | 451 | self.add_tasks(fn, dataCache) |
| 452 | 452 | ||
| @@ -459,7 +459,9 @@ class TaskData: | |||
| 459 | """ | 459 | """ |
| 460 | if fnid in self.failed_fnids: | 460 | if fnid in self.failed_fnids: |
| 461 | return | 461 | return |
| 462 | bb.msg.debug(1, bb.msg.domain.Provider, "Removing failed file %s" % self.fn_index[fnid]) | 462 | if not missing_list: |
| 463 | missing_list = [fnid] | ||
| 464 | bb.msg.debug(1, bb.msg.domain.Provider, "File '%s' is unbuildable, removing..." % self.fn_index[fnid]) | ||
| 463 | self.failed_fnids.append(fnid) | 465 | self.failed_fnids.append(fnid) |
| 464 | for target in self.build_targets: | 466 | for target in self.build_targets: |
| 465 | if fnid in self.build_targets[target]: | 467 | if fnid in self.build_targets[target]: |
| @@ -477,13 +479,17 @@ class TaskData: | |||
| 477 | Mark a build target as failed (unbuildable) | 479 | Mark a build target as failed (unbuildable) |
| 478 | Trigger removal of any files that have this as a dependency | 480 | Trigger removal of any files that have this as a dependency |
| 479 | """ | 481 | """ |
| 480 | bb.msg.note(2, bb.msg.domain.Provider, "Removing failed build target %s" % self.build_names_index[targetid]) | 482 | if not missing_list: |
| 483 | missing_list = [self.build_names_index[targetid]] | ||
| 484 | else: | ||
| 485 | missing_list = [self.build_names_index[targetid]] + missing_list | ||
| 486 | bb.msg.note(2, bb.msg.domain.Provider, "Target '%s' is unbuildable, removing...\nMissing or unbuildable dependency chain was: %s" % (self.build_names_index[targetid], missing_list)) | ||
| 481 | self.failed_deps.append(targetid) | 487 | self.failed_deps.append(targetid) |
| 482 | dependees = self.get_dependees(targetid) | 488 | dependees = self.get_dependees(targetid) |
| 483 | for fnid in dependees: | 489 | for fnid in dependees: |
| 484 | self.fail_fnid(fnid, [self.build_names_index[targetid]]+missing_list) | 490 | self.fail_fnid(fnid, missing_list) |
| 485 | if self.abort and targetid in self.external_targets: | 491 | if self.abort and targetid in self.external_targets: |
| 486 | bb.msg.error(bb.msg.domain.Provider, "No buildable providers available for required build target %s ('%s')" % (self.build_names_index[targetid], missing_list)) | 492 | bb.msg.error(bb.msg.domain.Provider, "Required build target '%s' has no buildable providers.\nMissing or unbuildable dependency chain was: %s" % (self.build_names_index[targetid], missing_list)) |
| 487 | raise bb.providers.NoProvider | 493 | raise bb.providers.NoProvider |
| 488 | 494 | ||
| 489 | def remove_runtarget(self, targetid, missing_list = []): | 495 | def remove_runtarget(self, targetid, missing_list = []): |
| @@ -491,17 +497,22 @@ class TaskData: | |||
| 491 | Mark a run target as failed (unbuildable) | 497 | Mark a run target as failed (unbuildable) |
| 492 | Trigger removal of any files that have this as a dependency | 498 | Trigger removal of any files that have this as a dependency |
| 493 | """ | 499 | """ |
| 494 | bb.msg.note(1, bb.msg.domain.Provider, "Removing failed runtime build target %s ('%s')" % (self.run_names_index[targetid], missing_list)) | 500 | if not missing_list: |
| 501 | missing_list = [self.run_names_index[targetid]] | ||
| 502 | else: | ||
| 503 | missing_list = [self.run_names_index[targetid]] + missing_list | ||
| 504 | |||
| 505 | bb.msg.note(1, bb.msg.domain.Provider, "Runtime target '%s' is unbuildable, removing...\nMissing or unbuildable dependency chain was: %s" % (self.run_names_index[targetid], missing_list)) | ||
| 495 | self.failed_rdeps.append(targetid) | 506 | self.failed_rdeps.append(targetid) |
| 496 | dependees = self.get_rdependees(targetid) | 507 | dependees = self.get_rdependees(targetid) |
| 497 | for fnid in dependees: | 508 | for fnid in dependees: |
| 498 | self.fail_fnid(fnid, [self.run_names_index[targetid]]+missing_list) | 509 | self.fail_fnid(fnid, missing_list) |
| 499 | 510 | ||
| 500 | def add_unresolved(self, cfgData, dataCache): | 511 | def add_unresolved(self, cfgData, dataCache): |
| 501 | """ | 512 | """ |
| 502 | Resolve all unresolved build and runtime targets | 513 | Resolve all unresolved build and runtime targets |
| 503 | """ | 514 | """ |
| 504 | bb.msg.note(1, bb.msg.domain.TaskData, "Resolving missing task queue dependencies") | 515 | bb.msg.note(1, bb.msg.domain.TaskData, "Resolving any missing task queue dependencies") |
| 505 | while 1: | 516 | while 1: |
| 506 | added = 0 | 517 | added = 0 |
| 507 | for target in self.get_unresolved_build_targets(dataCache): | 518 | for target in self.get_unresolved_build_targets(dataCache): |
| @@ -511,7 +522,7 @@ class TaskData: | |||
| 511 | except bb.providers.NoProvider: | 522 | except bb.providers.NoProvider: |
| 512 | targetid = self.getbuild_id(target) | 523 | targetid = self.getbuild_id(target) |
| 513 | if self.abort and targetid in self.external_targets: | 524 | if self.abort and targetid in self.external_targets: |
| 514 | bb.msg.error(bb.msg.domain.Provider, "No providers of build target %s (for %s)" % (target, self.get_dependees_str(target))) | 525 | bb.msg.error(bb.msg.domain.Provider, "Nothing PROVIDES '%s' (but '%s' DEPENDS on or otherwise requires it)" % (target, self.get_dependees_str(target))) |
| 515 | raise | 526 | raise |
| 516 | self.remove_buildtarget(targetid) | 527 | self.remove_buildtarget(targetid) |
| 517 | for target in self.get_unresolved_run_targets(dataCache): | 528 | for target in self.get_unresolved_run_targets(dataCache): |
