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