create_kernel.py 3.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. # Recipe creation tool - kernel support plugin
  2. #
  3. # Copyright (C) 2016 Intel Corporation
  4. #
  5. # SPDX-License-Identifier: GPL-2.0-only
  6. #
  7. import re
  8. import logging
  9. from recipetool.create import RecipeHandler, read_pkgconfig_provides, validate_pv
  10. logger = logging.getLogger('recipetool')
  11. tinfoil = None
  12. def tinfoil_init(instance):
  13. global tinfoil
  14. tinfoil = instance
  15. class KernelRecipeHandler(RecipeHandler):
  16. def process(self, srctree, classes, lines_before, lines_after, handled, extravalues):
  17. import bb.process
  18. if 'buildsystem' in handled:
  19. return False
  20. for tell in ['arch', 'firmware', 'Kbuild', 'Kconfig']:
  21. if not os.path.exists(os.path.join(srctree, tell)):
  22. return False
  23. handled.append('buildsystem')
  24. del lines_after[:]
  25. del classes[:]
  26. template = os.path.join(tinfoil.config_data.getVar('COREBASE'), 'meta-skeleton', 'recipes-kernel', 'linux', 'linux-yocto-custom.bb')
  27. def handle_var(varname, origvalue, op, newlines):
  28. if varname in ['SRCREV', 'SRCREV_machine']:
  29. while newlines[-1].startswith('#'):
  30. del newlines[-1]
  31. try:
  32. stdout, _ = bb.process.run('git rev-parse HEAD', cwd=srctree, shell=True)
  33. except bb.process.ExecutionError as e:
  34. stdout = None
  35. if stdout:
  36. return stdout.strip(), op, 0, True
  37. elif varname == 'LINUX_VERSION':
  38. makefile = os.path.join(srctree, 'Makefile')
  39. if os.path.exists(makefile):
  40. kversion = -1
  41. kpatchlevel = -1
  42. ksublevel = -1
  43. kextraversion = ''
  44. with open(makefile, 'r', errors='surrogateescape') as f:
  45. for i, line in enumerate(f):
  46. if i > 10:
  47. break
  48. if line.startswith('VERSION ='):
  49. kversion = int(line.split('=')[1].strip())
  50. elif line.startswith('PATCHLEVEL ='):
  51. kpatchlevel = int(line.split('=')[1].strip())
  52. elif line.startswith('SUBLEVEL ='):
  53. ksublevel = int(line.split('=')[1].strip())
  54. elif line.startswith('EXTRAVERSION ='):
  55. kextraversion = line.split('=')[1].strip()
  56. version = ''
  57. if kversion > -1 and kpatchlevel > -1:
  58. version = '%d.%d' % (kversion, kpatchlevel)
  59. if ksublevel > -1:
  60. version += '.%d' % ksublevel
  61. version += kextraversion
  62. if version:
  63. return version, op, 0, True
  64. elif varname == 'SRC_URI':
  65. while newlines[-1].startswith('#'):
  66. del newlines[-1]
  67. elif varname == 'COMPATIBLE_MACHINE':
  68. while newlines[-1].startswith('#'):
  69. del newlines[-1]
  70. machine = tinfoil.config_data.getVar('MACHINE')
  71. return machine, op, 0, True
  72. return origvalue, op, 0, True
  73. with open(template, 'r') as f:
  74. varlist = ['SRCREV', 'SRCREV_machine', 'SRC_URI', 'LINUX_VERSION', 'COMPATIBLE_MACHINE']
  75. (_, newlines) = bb.utils.edit_metadata(f, varlist, handle_var)
  76. lines_before[:] = [line.rstrip('\n') for line in newlines]
  77. return True
  78. def register_recipe_handlers(handlers):
  79. handlers.append((KernelRecipeHandler(), 100))