external_global.bbclass 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. def fixed_oe_import(d, modules=None):
  2. import importlib
  3. import sys
  4. def inject(name, value):
  5. """Make a python object accessible from the metadata"""
  6. if hasattr(bb.utils, "_context"):
  7. bb.utils._context[name] = value
  8. else:
  9. __builtins__[name] = value
  10. bbpath = d.getVar("BBPATH").split(":")
  11. layerpaths = [os.path.join(dir, "lib") for dir in bbpath]
  12. sys.path[0:0] = layerpaths
  13. if modules is None:
  14. import oe.data
  15. modules = oe.data.typed_value("OE_IMPORTS", d)
  16. has_reloaded = set()
  17. for toimport in modules:
  18. # If we're importing something in a namespace package, and it's
  19. # already been imported, reload it, to ensure any namespace package
  20. # extensions to __path__ are picked up
  21. imp_project = toimport
  22. while True:
  23. try:
  24. imp_project, _ = imp_project.rsplit(".", 1)
  25. except ValueError:
  26. break
  27. if imp_project in sys.modules and imp_project not in has_reloaded:
  28. mod = sys.modules[imp_project]
  29. if hasattr(mod, '__path__'):
  30. bb.debug(1, 'Reloading %s' % imp_project)
  31. importlib.reload(mod)
  32. has_reloaded.add(imp_project)
  33. project = toimport.split(".", 1)[0]
  34. imported = importlib.import_module(toimport)
  35. sys.modules[toimport] = imported
  36. inject(project, sys.modules[project])
  37. bb.debug(1, 'Imported and injected %s' % toimport)
  38. return ""
  39. EXTERNAL_IMPORTED := "${@fixed_oe_import(d, ['oe.external'])}"
  40. EXTERNAL_TOOLCHAIN_SYSROOT ?= "${@external_run(d, '${EXTERNAL_CC}', *(TARGET_CC_ARCH.split() + ['-print-sysroot'])).rstrip()}"
  41. EXTERNAL_TOOLCHAIN_LIBROOT ?= "${@external_run(d, '${EXTERNAL_CC}', *(TARGET_CC_ARCH.split() + ['-print-file-name=crtbegin.o'])).rstrip().replace('/crtbegin.o', '')}"
  42. EXTERNAL_HEADERS_MULTILIB_SUFFIX ?= "${@external_run(d, '${EXTERNAL_CC}', *(TARGET_CC_ARCH.split() + ['-print-sysroot-headers-suffix'])).rstrip()}"
  43. EXTERNAL_LIBC_KERNEL_VERSION ?= "${@external_get_kernel_version(d, "${EXTERNAL_TOOLCHAIN_SYSROOT}${prefix}")}"
  44. EXTERNAL_INSTALL_SOURCE_PATHS = "\
  45. ${EXTERNAL_TOOLCHAIN_SYSROOT} \
  46. ${EXTERNAL_TOOLCHAIN}/${EXTERNAL_TARGET_SYS} \
  47. ${EXTERNAL_TOOLCHAIN_SYSROOT}/.. \
  48. ${EXTERNAL_TOOLCHAIN} \
  49. ${D} \
  50. "
  51. # Potential locations within the external toolchain sysroot
  52. FILES_PREMIRRORS = "\
  53. ${bindir}/|/usr/${baselib}/bin/\n \
  54. "
  55. FILES_MIRRORS = "\
  56. ${base_libdir}/|/usr/${baselib}/\n \
  57. ${libexecdir}/|/usr/libexec/\n \
  58. ${libexecdir}/|/usr/${baselib}/${PN}\n \
  59. ${mandir}/|/usr/share/man/\n \
  60. ${mandir}/|/usr/man/\n \
  61. ${mandir}/|/man/\n \
  62. ${mandir}/|/share/doc/*-${EXTERNAL_TARGET_SYS}/man/\n \
  63. ${prefix}/|${base_prefix}/\n \
  64. "
  65. EXTERNAL_CC ?= "${EXTERNAL_TARGET_SYS}-gcc"
  66. def external_run(d, *args):
  67. """Convenience wrapper"""
  68. if (not d.getVar('TCMODE', True).startswith('external') or
  69. not d.getVar('EXTERNAL_TOOLCHAIN', True)):
  70. return 'UNKNOWN'
  71. sys.path.append(os.path.join(d.getVar('LAYERDIR_external-toolchain', True), 'lib'))
  72. import oe.external
  73. return oe.external.run(d, *args)
  74. external_run[vardepsexclude] += "LAYERDIR_external-toolchain"
  75. def external_get_kernel_version(d, p):
  76. if (not d.getVar('TCMODE', True).startswith('external') or
  77. not d.getVar('EXTERNAL_TOOLCHAIN', True)):
  78. return 'UNKNOWN'
  79. import re
  80. for fn in ['include/linux/utsrelease.h', 'include/generated/utsrelease.h',
  81. 'include/linux/version.h']:
  82. fn = os.path.join(p, fn)
  83. if os.path.exists(fn):
  84. break
  85. else:
  86. return ''
  87. try:
  88. f = open(fn)
  89. except IOError:
  90. pass
  91. else:
  92. with f:
  93. lines = f.readlines()
  94. for line in lines:
  95. m = re.match(r'#define LINUX_VERSION_CODE (\d+)$', line)
  96. if m:
  97. code = int(m.group(1))
  98. a = code >> 16
  99. b = (code >> 8) & 0xFF
  100. return '%d.%d' % (a, b)
  101. bb.debug(1, 'external_global.bbclass: failed to find kernel version header in {}'.format(p))
  102. return ''