csl-versions.inc 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  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]
  20. return last_line
  21. def csl_get_main_version(d):
  22. version = csl_get_version(d)
  23. if version != 'UNKNOWN':
  24. return version.split()[-1].rstrip(')')
  25. else:
  26. return version
  27. def csl_get_gcc_version(d):
  28. version = csl_get_version(d)
  29. if version != 'UNKNOWN':
  30. return version.split()[2]
  31. else:
  32. return version
  33. def csl_get_libc_version(d):
  34. syspath = d.expand('${EXTERNAL_TOOLCHAIN}/${CSL_TARGET_SYS}')
  35. if not syspath:
  36. return 'UNKNOWN'
  37. libpath = syspath + '/libc/lib/'
  38. if not os.path.exists(libpath):
  39. libpath = syspath + '/libc/sgxx-glibc/lib/'
  40. if os.path.exists(libpath):
  41. for file in os.listdir(libpath):
  42. if file.find('libc-') == 0:
  43. return file[5:-3]
  44. return 'UNKNOWN'
  45. def csl_get_kernel_version(d):
  46. syspath = d.expand('${EXTERNAL_TOOLCHAIN}/${CSL_TARGET_SYS}')
  47. if not syspath:
  48. return 'UNKNOWN'
  49. vf = syspath + '/libc/usr/include/linux/version.h'
  50. if not os.path.exists(vf):
  51. vf = syspath + '/libc/sgxx-glibc/usr/include/linux/version.h'
  52. try:
  53. f = open(vf, 'r')
  54. except (OSError, IOError):
  55. return 'UNKNOWN'
  56. l = f.readlines();
  57. f.close();
  58. for s in l:
  59. if s.find('LINUX_VERSION_CODE') > 0:
  60. ver = int(s.split()[2])
  61. maj = ver / 65536
  62. ver = ver % 65536
  63. min = ver / 256
  64. ver = ver % 256
  65. return str(maj)+'.'+str(min)+'.'+str(ver)
  66. return 'UNKNOWN'
  67. def csl_get_gdb_version(d):
  68. try:
  69. stdout, stderr = csl_run(d, 'gdb', '-v')
  70. except bb.process.CmdError:
  71. return 'UNKNOWN'
  72. else:
  73. first_line = stdout.splitlines()[0]
  74. return first_line.split()[-1]
  75. python csl_version_handler () {
  76. d = e.data
  77. ld = d.createCopy()
  78. ld.finalize()
  79. d.setVar('CSL_VER_MAIN', csl_get_main_version(ld))
  80. d.setVar('CSL_VER_GCC', csl_get_gcc_version(ld))
  81. d.setVar('CSL_VER_LIBC', csl_get_libc_version(ld))
  82. d.setVar('CSL_VER_KERNEL', csl_get_kernel_version(ld))
  83. d.setVar('CSL_VER_GDB', csl_get_gdb_version(ld))
  84. }
  85. addhandler csl_version_handler
  86. csl_version_handler[eventmask] = "bb.event.ConfigParsed"
  87. # Ensure that any variable which includes the --sysroot (CC, CXX, etc) also
  88. # depends on the toolchain version
  89. TOOLCHAIN_OPTIONS[vardeps] += "CSL_VER_MAIN CSL_VER_GCC"