2013-03-02 17:06:56 +00:00
|
|
|
pkg_postinst_modules () {
|
|
|
|
if [ -z "$D" ]; then
|
|
|
|
depmod -a ${KERNEL_VERSION}
|
|
|
|
else
|
2014-01-10 12:57:02 +00:00
|
|
|
# image.bbclass will call depmodwrapper after everything is installed,
|
|
|
|
# no need to do it here as well
|
|
|
|
:
|
2013-03-02 17:06:56 +00:00
|
|
|
fi
|
|
|
|
}
|
|
|
|
|
|
|
|
pkg_postrm_modules () {
|
|
|
|
if [ -z "$D" ]; then
|
|
|
|
depmod -a ${KERNEL_VERSION}
|
|
|
|
else
|
|
|
|
depmodwrapper -a -b $D ${KERNEL_VERSION}
|
|
|
|
fi
|
|
|
|
}
|
|
|
|
|
|
|
|
autoload_postinst_fragment() {
|
|
|
|
if [ x"$D" = "x" ]; then
|
|
|
|
modprobe %s || true
|
|
|
|
fi
|
|
|
|
}
|
|
|
|
|
|
|
|
do_install_append() {
|
|
|
|
install -d ${D}${sysconfdir}/modules-load.d/ ${D}${sysconfdir}/modprobe.d/
|
|
|
|
}
|
|
|
|
|
|
|
|
PACKAGESPLITFUNCS_prepend = "split_kernel_module_packages "
|
|
|
|
|
|
|
|
KERNEL_MODULES_META_PACKAGE ?= "kernel-modules"
|
|
|
|
|
|
|
|
python split_kernel_module_packages () {
|
|
|
|
import re
|
|
|
|
|
|
|
|
modinfoexp = re.compile("([^=]+)=(.*)")
|
|
|
|
kerverrexp = re.compile('^(.*-hh.*)[\.\+].*$')
|
|
|
|
depmodpat0 = re.compile("^(.*\.k?o):..*$")
|
|
|
|
depmodpat1 = re.compile("^(.*\.k?o):\s*(.*\.k?o)\s*$")
|
|
|
|
depmodpat2 = re.compile("^(.*\.k?o):\s*(.*\.k?o)\s*\\\$")
|
|
|
|
depmodpat3 = re.compile("^\t(.*\.k?o)\s*\\\$")
|
|
|
|
depmodpat4 = re.compile("^\t(.*\.k?o)\s*$")
|
|
|
|
|
|
|
|
def extract_modinfo(file):
|
|
|
|
import tempfile, subprocess
|
|
|
|
tempfile.tempdir = d.getVar("WORKDIR", True)
|
|
|
|
tf = tempfile.mkstemp()
|
|
|
|
tmpfile = tf[1]
|
|
|
|
cmd = "%sobjcopy -j .modinfo -O binary %s %s" % (d.getVar("HOST_PREFIX", True) or "", file, tmpfile)
|
|
|
|
subprocess.call(cmd, shell=True)
|
|
|
|
f = open(tmpfile)
|
|
|
|
l = f.read().split("\000")
|
|
|
|
f.close()
|
|
|
|
os.close(tf[0])
|
|
|
|
os.unlink(tmpfile)
|
|
|
|
vals = {}
|
|
|
|
for i in l:
|
|
|
|
m = modinfoexp.match(i)
|
|
|
|
if not m:
|
|
|
|
continue
|
|
|
|
vals[m.group(1)] = m.group(2)
|
|
|
|
return vals
|
|
|
|
|
|
|
|
def parse_depmod():
|
|
|
|
|
|
|
|
dvar = d.getVar('PKGD', True)
|
|
|
|
|
|
|
|
kernelver = d.getVar('KERNEL_VERSION', True)
|
|
|
|
kernelver_stripped = kernelver
|
|
|
|
m = kerverrexp.match(kernelver)
|
|
|
|
if m:
|
|
|
|
kernelver_stripped = m.group(1)
|
kernel: move source and build output to work-shared
commit 3b3f7e785e279 [kernel: Rearrange for 1.8] began the process of
moving the kernel source and build artefacts out of sstate control and
into a shared location.
This changed triggered some workflow issues, as well as bugs related
to the kernel source containing build output, and hence being dirty and
breaking kernel rebuilds.
To solve these issues, and to make it clear that the kernel is not under
sstate control, we move the source and build outputs to:
work-shared/MACHINE/kernel-source
work-shared/MACHINE/kernel-build-artifacts
Where kernel-build-artifacts is the kernel build output and
kernel-source is kept "pristine". The build-artifacts contain everything
that is required to build external modules against the kernel source,
and includes the defconfig, the kernel-abiversion, System.map files and
output from "make scripts".
External module builds should either pass O= on the command line, or
set KBUILD_OUTPUT to point to the build-artifacts. module-base.bbclass
takes care of setting KBUILD_OUTPUT, so most existing external module
recipes are transparently adapted to the new source/build layout.
recipes that depend on the kernel source must have a depedency on the
do_shared_workdir task:
do_configure[depends] += "virtual/kernel:do_shared_workdir"
With this dependency added, the STAGING_KERNEL_DIR will be populated and
available to the rest of the build.
(From OE-Core rev: 6a1ff0e7eacef595738f2fed086986fd622ec32a)
Signed-off-by: Bruce Ashfield <bruce.ashfield@windriver.com>
Signed-off-by: Ross Burton <ross.burton@intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
2015-01-15 11:54:15 +00:00
|
|
|
staging_kernel_dir = d.getVar("STAGING_KERNEL_BUILDDIR", True)
|
2013-03-02 17:06:56 +00:00
|
|
|
system_map_file = "%s/boot/System.map-%s" % (dvar, kernelver)
|
|
|
|
if not os.path.exists(system_map_file):
|
|
|
|
system_map_file = "%s/System.map-%s" % (staging_kernel_dir, kernelver)
|
|
|
|
if not os.path.exists(system_map_file):
|
|
|
|
bb.fatal("System.map-%s does not exist in '%s/boot' nor STAGING_KERNEL_DIR '%s'" % (kernelver, dvar, staging_kernel_dir))
|
|
|
|
|
|
|
|
cmd = "depmod -n -a -b %s -F %s %s" % (dvar, system_map_file, kernelver_stripped)
|
|
|
|
f = os.popen(cmd, 'r')
|
|
|
|
|
|
|
|
deps = {}
|
|
|
|
line = f.readline()
|
|
|
|
while line:
|
|
|
|
if not depmodpat0.match(line):
|
|
|
|
line = f.readline()
|
|
|
|
continue
|
|
|
|
m1 = depmodpat1.match(line)
|
|
|
|
if m1:
|
|
|
|
deps[m1.group(1)] = m1.group(2).split()
|
|
|
|
else:
|
|
|
|
m2 = depmodpat2.match(line)
|
|
|
|
if m2:
|
|
|
|
deps[m2.group(1)] = m2.group(2).split()
|
|
|
|
line = f.readline()
|
|
|
|
m3 = depmodpat3.match(line)
|
|
|
|
while m3:
|
|
|
|
deps[m2.group(1)].extend(m3.group(1).split())
|
|
|
|
line = f.readline()
|
|
|
|
m3 = depmodpat3.match(line)
|
|
|
|
m4 = depmodpat4.match(line)
|
|
|
|
deps[m2.group(1)].extend(m4.group(1).split())
|
|
|
|
line = f.readline()
|
|
|
|
f.close()
|
|
|
|
return deps
|
|
|
|
|
|
|
|
def get_dependencies(file, pattern, format):
|
|
|
|
# file no longer includes PKGD
|
|
|
|
file = file.replace(d.getVar('PKGD', True) or '', '', 1)
|
|
|
|
# instead is prefixed with /lib/modules/${KERNEL_VERSION}
|
|
|
|
file = file.replace("/lib/modules/%s/" % d.getVar('KERNEL_VERSION', True) or '', '', 1)
|
|
|
|
|
2013-05-07 12:56:04 +00:00
|
|
|
if file in module_deps:
|
2013-03-02 17:06:56 +00:00
|
|
|
dependencies = []
|
|
|
|
for i in module_deps[file]:
|
|
|
|
m = re.match(pattern, os.path.basename(i))
|
|
|
|
if not m:
|
|
|
|
continue
|
|
|
|
on = legitimize_package_name(m.group(1))
|
|
|
|
dependency_pkg = format % on
|
|
|
|
dependencies.append(dependency_pkg)
|
|
|
|
return dependencies
|
|
|
|
return []
|
|
|
|
|
|
|
|
def frob_metadata(file, pkg, pattern, format, basename):
|
|
|
|
vals = extract_modinfo(file)
|
|
|
|
|
|
|
|
dvar = d.getVar('PKGD', True)
|
|
|
|
|
|
|
|
# If autoloading is requested, output /etc/modules-load.d/<name>.conf and append
|
|
|
|
# appropriate modprobe commands to the postinst
|
2014-06-13 15:46:25 +00:00
|
|
|
autoloadlist = (d.getVar("KERNEL_MODULE_AUTOLOAD", True) or "").split()
|
2013-03-02 17:06:56 +00:00
|
|
|
autoload = d.getVar('module_autoload_%s' % basename, True)
|
2014-07-21 21:40:47 +00:00
|
|
|
if autoload and autoload == basename:
|
|
|
|
bb.warn("module_autoload_%s was replaced by KERNEL_MODULE_AUTOLOAD for cases where basename == module name, please drop it" % basename)
|
|
|
|
if autoload and basename not in autoloadlist:
|
|
|
|
bb.warn("module_autoload_%s is defined but '%s' isn't included in KERNEL_MODULE_AUTOLOAD, please add it there" % (basename, basename))
|
2014-06-13 15:46:25 +00:00
|
|
|
if basename in autoloadlist:
|
2013-03-02 17:06:56 +00:00
|
|
|
name = '%s/etc/modules-load.d/%s.conf' % (dvar, basename)
|
|
|
|
f = open(name, 'w')
|
2014-07-21 21:40:47 +00:00
|
|
|
if autoload:
|
|
|
|
for m in autoload.split():
|
|
|
|
f.write('%s\n' % m)
|
|
|
|
else:
|
|
|
|
f.write('%s\n' % basename)
|
2013-03-02 17:06:56 +00:00
|
|
|
f.close()
|
|
|
|
postinst = d.getVar('pkg_postinst_%s' % pkg, True)
|
|
|
|
if not postinst:
|
|
|
|
bb.fatal("pkg_postinst_%s not defined" % pkg)
|
|
|
|
postinst += d.getVar('autoload_postinst_fragment', True) % autoload
|
|
|
|
d.setVar('pkg_postinst_%s' % pkg, postinst)
|
|
|
|
|
|
|
|
# Write out any modconf fragment
|
2014-06-13 15:46:25 +00:00
|
|
|
modconflist = (d.getVar("KERNEL_MODULE_PROBECONF", True) or "").split()
|
2013-03-02 17:06:56 +00:00
|
|
|
modconf = d.getVar('module_conf_%s' % basename, True)
|
2014-06-13 15:46:25 +00:00
|
|
|
if modconf and basename in modconflist:
|
2013-03-02 17:06:56 +00:00
|
|
|
name = '%s/etc/modprobe.d/%s.conf' % (dvar, basename)
|
|
|
|
f = open(name, 'w')
|
|
|
|
f.write("%s\n" % modconf)
|
|
|
|
f.close()
|
2014-06-13 15:46:25 +00:00
|
|
|
elif modconf:
|
|
|
|
bb.error("Please ensure module %s is listed in KERNEL_MODULE_PROBECONF since module_conf_%s is set" % (basename, basename))
|
2013-03-02 17:06:56 +00:00
|
|
|
|
|
|
|
files = d.getVar('FILES_%s' % pkg, True)
|
|
|
|
files = "%s /etc/modules-load.d/%s.conf /etc/modprobe.d/%s.conf" % (files, basename, basename)
|
|
|
|
d.setVar('FILES_%s' % pkg, files)
|
|
|
|
|
2013-05-07 12:56:04 +00:00
|
|
|
if "description" in vals:
|
2013-03-02 17:06:56 +00:00
|
|
|
old_desc = d.getVar('DESCRIPTION_' + pkg, True) or ""
|
|
|
|
d.setVar('DESCRIPTION_' + pkg, old_desc + "; " + vals["description"])
|
|
|
|
|
|
|
|
rdepends = bb.utils.explode_dep_versions2(d.getVar('RDEPENDS_' + pkg, True) or "")
|
|
|
|
for dep in get_dependencies(file, pattern, format):
|
|
|
|
if not dep in rdepends:
|
|
|
|
rdepends[dep] = []
|
|
|
|
d.setVar('RDEPENDS_' + pkg, bb.utils.join_deps(rdepends, commasep=False))
|
|
|
|
|
|
|
|
module_deps = parse_depmod()
|
|
|
|
module_regex = '^(.*)\.k?o$'
|
|
|
|
module_pattern = 'kernel-module-%s'
|
|
|
|
|
|
|
|
postinst = d.getVar('pkg_postinst_modules', True)
|
|
|
|
postrm = d.getVar('pkg_postrm_modules', True)
|
|
|
|
|
|
|
|
modules = do_split_packages(d, root='/lib/modules', file_regex=module_regex, output_pattern=module_pattern, description='%s kernel module', postinst=postinst, postrm=postrm, recursive=True, hook=frob_metadata, extra_depends='kernel-%s' % (d.getVar("KERNEL_VERSION", True)))
|
|
|
|
if modules:
|
|
|
|
metapkg = d.getVar('KERNEL_MODULES_META_PACKAGE', True)
|
2013-03-06 00:52:31 +00:00
|
|
|
d.appendVar('RDEPENDS_' + metapkg, ' '+' '.join(modules))
|
2013-03-02 17:06:56 +00:00
|
|
|
|
|
|
|
# If modules-load.d and modprobe.d are empty at this point, remove them to
|
|
|
|
# avoid warnings. removedirs only raises an OSError if an empty
|
|
|
|
# directory cannot be removed.
|
|
|
|
dvar = d.getVar('PKGD', True)
|
|
|
|
for dir in ["%s/etc/modprobe.d" % (dvar), "%s/etc/modules-load.d" % (dvar), "%s/etc" % (dvar)]:
|
|
|
|
if len(os.listdir(dir)) == 0:
|
|
|
|
os.rmdir(dir)
|
|
|
|
}
|
2014-06-13 15:46:25 +00:00
|
|
|
|
|
|
|
do_package[vardeps] += '${@" ".join(map(lambda s: "module_conf_" + s, (d.getVar("KERNEL_MODULE_PROBECONF", True) or "").split()))}'
|