csl-versions.inc 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. def csl_run(d, cmd, *args):
  2. import bb.process
  3. import subprocess
  4. topdir = d.getVar('TOPDIR', True)
  5. toolchain_path = d.getVar('EXTERNAL_TOOLCHAIN', True)
  6. if not toolchain_path:
  7. return 'UNKNOWN', 'UNKNOWN'
  8. target_prefix = d.getVar('TARGET_PREFIX', True)
  9. path = os.path.join(toolchain_path, 'bin', target_prefix + cmd)
  10. args = [path] + list(args)
  11. return bb.process.run(args, cwd=topdir, stderr=subprocess.PIPE)
  12. def csl_get_version(d):
  13. try:
  14. stdout, stderr = csl_run(d, 'gcc', '-v')
  15. except bb.process.CmdError as exc:
  16. bb.error('Failed to obtain CodeSourcery toolchain version: %s' % exc)
  17. return 'UNKNOWN'
  18. else:
  19. last_line = stderr.splitlines()[-1].rstrip()
  20. return last_line
  21. def csl_get_main_version(d):
  22. version = csl_get_version(d)
  23. if version != 'UNKNOWN':
  24. main_version = version.split()[-1].rstrip(')')
  25. if main_version == 'Preview':
  26. main_version = version.split()[-3]
  27. return main_version
  28. else:
  29. return version
  30. def csl_get_gcc_version(d):
  31. version = csl_get_version(d)
  32. if version != 'UNKNOWN':
  33. return version.split()[2]
  34. else:
  35. return version
  36. def csl_get_libc_version(d):
  37. sysroot = d.getVar('EXTERNAL_TOOLCHAIN_SYSROOT', True)
  38. if not sysroot:
  39. return 'UNKNOWN'
  40. libpath = os.path.join(sysroot, 'lib')
  41. if os.path.exists(libpath):
  42. for file in os.listdir(libpath):
  43. if file.find('libc-') == 0:
  44. return file[5:-3]
  45. return 'UNKNOWN'
  46. def csl_get_kernel_version(d):
  47. sysroot = d.getVar('EXTERNAL_TOOLCHAIN_SYSROOT', True)
  48. if not sysroot:
  49. return 'UNKNOWN'
  50. vf = os.path.join(sysroot, 'usr/include/linux/version.h')
  51. try:
  52. f = open(vf, 'r')
  53. except (OSError, IOError):
  54. return 'UNKNOWN'
  55. with f:
  56. for line in f.readlines():
  57. if 'LINUX_VERSION_CODE' in line:
  58. ver = int(line.split()[2])
  59. maj = ver / 65536
  60. ver = ver % 65536
  61. min = ver / 256
  62. ver = ver % 256
  63. return '%s.%s.%s' % (maj, min, ver)
  64. return 'UNKNOWN'
  65. def csl_get_gdb_version(d):
  66. try:
  67. stdout, stderr = csl_run(d, 'gdb', '-v')
  68. except bb.process.CmdError:
  69. return 'UNKNOWN'
  70. else:
  71. first_line = stdout.splitlines()[0]
  72. return first_line.split()[-1]
  73. python csl_version_handler () {
  74. d = e.data
  75. ld = d.createCopy()
  76. ld.finalize()
  77. d.setVar('CSL_VER_MAIN', csl_get_main_version(ld))
  78. d.setVar('CSL_VER_GCC', csl_get_gcc_version(ld))
  79. d.setVar('CSL_VER_LIBC', csl_get_libc_version(ld))
  80. d.setVar('CSL_VER_KERNEL', csl_get_kernel_version(ld))
  81. d.setVar('CSL_VER_GDB', csl_get_gdb_version(ld))
  82. }
  83. csl_version_handler[eventmask] = "bb.event.ConfigParsed"
  84. addhandler csl_version_handler
  85. # Ensure that any variable which includes the --sysroot (CC, CXX, etc) also
  86. # depends on the toolchain version
  87. TOOLCHAIN_OPTIONS[vardeps] += "CSL_VER_MAIN CSL_VER_GCC"