mirror of
git://git.yoctoproject.org/poky.git
synced 2025-07-19 21:09:03 +02:00

This adds SPDX license headers in place of the wide assortment of things currently in our script headers. We default to GPL-2.0-only except for the oeqa code where it was clearly submitted and marked as MIT on the most part or some scripts which had the "or later" GPL versioning. The patch also drops other obsolete bits of file headers where they were encoountered such as editor modelines, obsolete maintainer information or the phrase "All rights reserved" which is now obsolete and not required in copyright headers (in this case its actually confusing for licensing as all rights were not reserved). More work is needed for OE-Core but this takes care of the bulk of the scripts and meta/lib directories. The top level LICENSE files are tweaked to match the new structure and the SPDX naming. (From OE-Core rev: f8c9c511b5f1b7dbd45b77f345cb6c048ae6763e) Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
143 lines
5.8 KiB
Python
143 lines
5.8 KiB
Python
# Recipe creation tool - kernel module support plugin
|
|
#
|
|
# Copyright (C) 2016 Intel Corporation
|
|
#
|
|
# SPDX-License-Identifier: GPL-2.0-only
|
|
#
|
|
|
|
import re
|
|
import logging
|
|
from recipetool.create import RecipeHandler, read_pkgconfig_provides, validate_pv
|
|
|
|
logger = logging.getLogger('recipetool')
|
|
|
|
tinfoil = None
|
|
|
|
def tinfoil_init(instance):
|
|
global tinfoil
|
|
tinfoil = instance
|
|
|
|
|
|
class KernelModuleRecipeHandler(RecipeHandler):
|
|
def process(self, srctree, classes, lines_before, lines_after, handled, extravalues):
|
|
import bb.process
|
|
if 'buildsystem' in handled:
|
|
return False
|
|
|
|
module_inc_re = re.compile(r'^#include\s+<linux/module.h>$')
|
|
makefiles = []
|
|
is_module = False
|
|
|
|
makefiles = []
|
|
|
|
files = RecipeHandler.checkfiles(srctree, ['*.c', '*.h'], recursive=True, excludedirs=['contrib', 'test', 'examples'])
|
|
if files:
|
|
for cfile in files:
|
|
# Look in same dir or parent for Makefile
|
|
for makefile in [os.path.join(os.path.dirname(cfile), 'Makefile'), os.path.join(os.path.dirname(os.path.dirname(cfile)), 'Makefile')]:
|
|
if makefile in makefiles:
|
|
break
|
|
else:
|
|
if os.path.exists(makefile):
|
|
makefiles.append(makefile)
|
|
break
|
|
else:
|
|
continue
|
|
with open(cfile, 'r', errors='surrogateescape') as f:
|
|
for line in f:
|
|
if module_inc_re.match(line.strip()):
|
|
is_module = True
|
|
break
|
|
if is_module:
|
|
break
|
|
|
|
if is_module:
|
|
classes.append('module')
|
|
handled.append('buildsystem')
|
|
# module.bbclass and the classes it inherits do most of the hard
|
|
# work, but we need to tweak it slightly depending on what the
|
|
# Makefile does (and there is a range of those)
|
|
# Check the makefile for the appropriate install target
|
|
install_lines = []
|
|
compile_lines = []
|
|
in_install = False
|
|
in_compile = False
|
|
install_target = None
|
|
with open(makefile, 'r', errors='surrogateescape') as f:
|
|
for line in f:
|
|
if line.startswith('install:'):
|
|
if not install_lines:
|
|
in_install = True
|
|
install_target = 'install'
|
|
elif line.startswith('modules_install:'):
|
|
install_lines = []
|
|
in_install = True
|
|
install_target = 'modules_install'
|
|
elif line.startswith('modules:'):
|
|
compile_lines = []
|
|
in_compile = True
|
|
elif line.startswith(('all:', 'default:')):
|
|
if not compile_lines:
|
|
in_compile = True
|
|
elif line:
|
|
if line[0] == '\t':
|
|
if in_install:
|
|
install_lines.append(line)
|
|
elif in_compile:
|
|
compile_lines.append(line)
|
|
elif ':' in line:
|
|
in_install = False
|
|
in_compile = False
|
|
|
|
def check_target(lines, install):
|
|
kdirpath = ''
|
|
manual_install = False
|
|
for line in lines:
|
|
splitline = line.split()
|
|
if splitline[0] in ['make', 'gmake', '$(MAKE)']:
|
|
if '-C' in splitline:
|
|
idx = splitline.index('-C') + 1
|
|
if idx < len(splitline):
|
|
kdirpath = splitline[idx]
|
|
break
|
|
elif install and splitline[0] == 'install':
|
|
if '.ko' in line:
|
|
manual_install = True
|
|
return kdirpath, manual_install
|
|
|
|
kdirpath = None
|
|
manual_install = False
|
|
if install_lines:
|
|
kdirpath, manual_install = check_target(install_lines, install=True)
|
|
if compile_lines and not kdirpath:
|
|
kdirpath, _ = check_target(compile_lines, install=False)
|
|
|
|
if manual_install or not install_lines:
|
|
lines_after.append('EXTRA_OEMAKE_append_task-install = " -C ${STAGING_KERNEL_DIR} M=${S}"')
|
|
elif install_target and install_target != 'modules_install':
|
|
lines_after.append('MODULES_INSTALL_TARGET = "install"')
|
|
|
|
warnmsg = None
|
|
kdirvar = None
|
|
if kdirpath:
|
|
res = re.match(r'\$\(([^$)]+)\)', kdirpath)
|
|
if res:
|
|
kdirvar = res.group(1)
|
|
if kdirvar != 'KERNEL_SRC':
|
|
lines_after.append('EXTRA_OEMAKE += "%s=${STAGING_KERNEL_DIR}"' % kdirvar)
|
|
elif kdirpath.startswith('/lib/'):
|
|
warnmsg = 'Kernel path in install makefile is hardcoded - you will need to patch the makefile'
|
|
if not kdirvar and not warnmsg:
|
|
warnmsg = 'Unable to find means of passing kernel path into install makefile - if kernel path is hardcoded you will need to patch the makefile'
|
|
if warnmsg:
|
|
warnmsg += '. Note that the variable KERNEL_SRC will be passed in as the kernel source path.'
|
|
logger.warning(warnmsg)
|
|
lines_after.append('# %s' % warnmsg)
|
|
|
|
return True
|
|
|
|
return False
|
|
|
|
def register_recipe_handlers(handlers):
|
|
handlers.append((KernelModuleRecipeHandler(), 15))
|