ext-sdk-prepare.py 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. #!/usr/bin/env python3
  2. # Prepare the build system within the extensible SDK
  3. import sys
  4. import os
  5. import subprocess
  6. import signal
  7. def reenable_sigint():
  8. signal.signal(signal.SIGINT, signal.SIG_DFL)
  9. def run_command_interruptible(cmd):
  10. """
  11. Run a command with output displayed on the console, but ensure any Ctrl+C is
  12. processed only by the child process.
  13. """
  14. signal.signal(signal.SIGINT, signal.SIG_IGN)
  15. try:
  16. ret = subprocess.call(cmd, shell=True, preexec_fn=reenable_sigint)
  17. finally:
  18. signal.signal(signal.SIGINT, signal.SIG_DFL)
  19. return ret
  20. def get_last_consolelog():
  21. '''Return the most recent console log file'''
  22. logdir = os.path.join(os.path.dirname(os.path.realpath(__file__)), 'tmp', 'log', 'cooker')
  23. if os.path.exists(logdir):
  24. mcdir = os.listdir(logdir)
  25. if mcdir:
  26. logdir = os.path.join(logdir, mcdir[0])
  27. logfiles = [os.path.join(logdir, fn) for fn in os.listdir(logdir)]
  28. logfiles.sort(key=os.path.getmtime)
  29. if logfiles:
  30. return os.path.join(logdir, logfiles[-1])
  31. return None
  32. def main():
  33. if len(sys.argv) < 2:
  34. print('Please specify output log file')
  35. return 1
  36. logfile = sys.argv[1]
  37. if len(sys.argv) < 3:
  38. sdk_targets = []
  39. else:
  40. sdk_targets = ' '.join(sys.argv[2:]).split()
  41. prserv = os.path.join(os.path.dirname(os.path.realpath(__file__)), 'conf', 'prserv.inc')
  42. if os.path.isfile(prserv):
  43. with open(logfile, 'a') as logf:
  44. logf.write('Importing PR data...\n')
  45. ret = run_command_interruptible('bitbake-prserv-tool import %s' % prserv)
  46. lastlog = get_last_consolelog()
  47. if lastlog:
  48. with open(lastlog, 'r') as f:
  49. for line in f:
  50. logf.write(line)
  51. if ret:
  52. print('ERROR: PR data import failed: error log written to %s' % logfile)
  53. return ret
  54. if not sdk_targets:
  55. # Just do a parse so the cache is primed
  56. ret = run_command_interruptible('bitbake -p --quiet')
  57. return ret
  58. with open(logfile, 'a') as logf:
  59. logf.write('Preparing SDK for %s...\n' % ', '.join(sdk_targets))
  60. ret = run_command_interruptible('BB_SETSCENE_ENFORCE=1 bitbake --quiet %s' % ' '.join(sdk_targets))
  61. if not ret:
  62. ret = run_command_interruptible('bitbake --quiet build-sysroots -c build_native_sysroot && bitbake --quiet build-sysroots -c build_target_sysroot')
  63. lastlog = get_last_consolelog()
  64. if lastlog:
  65. with open(lastlog, 'r') as f:
  66. for line in f:
  67. logf.write(line)
  68. if ret:
  69. print('ERROR: SDK preparation failed: error log written to %s' % logfile)
  70. return ret
  71. if __name__ == "__main__":
  72. try:
  73. ret = main()
  74. except Exception:
  75. ret = 1
  76. import traceback
  77. traceback.print_exc()
  78. sys.exit(ret)