generic-poky/meta/classes/image.bbclass

309 lines
12 KiB
Plaintext
Raw Normal View History

inherit rootfs_${IMAGE_PKGTYPE}
inherit populate_sdk_ext
TOOLCHAIN_TARGET_TASK += "${PACKAGE_INSTALL}"
Rework installation of dev, dbg, doc, and locale packages Use a similar mechanism that was previously used to install locales at rootfs generation time to install other "complementary" packages (e.g. *-dev packages) - i.e. install all of the explicitly requested packages and their dependencies, then get a list of the packages that were installed, and use that list to install the complementary packages. This has been implemented by using a list of globs which should make it easier to extend in future. The previous locale package installation code assumed that the locale packages did not have any dependencies that were not already installed; now that we are installing non-locale packages this is no longer correct. In practice only the rpm backend actually made use of this assumption, so it needed to be changed to call into the existing package backend code to do the complementary package installation rather than calling rpm directly. This fixes the doc-pkgs IMAGE_FEATURES feature to work correctly, and also ensures that all dev/dbg packages get installed for dev-pkgs/dbg-pkgs respectively even if the dependency chains between those packages was not ensuring that already. The code has also been adapted to work correctly with the new SDK-from-image functionality. To that end, an SDKIMAGE_FEATURES variable has been added to allow specifying what extra image features should go into the SDK (extra, because by virtue of installing all of the packages in the image into the target part of the SDK, we already include all of IMAGE_FEATURES) with a default value of "dev-pkgs dbg-pkgs". Fixes [YOCTO #2614]. (From OE-Core rev: 72d1048a8381fa4a8c4c0d082047536727b4be47) Signed-off-by: Paul Eggleton <paul.eggleton@linux.intel.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
2012-07-09 13:15:08 +00:00
TOOLCHAIN_TARGET_TASK_ATTEMPTONLY += "${PACKAGE_INSTALL_ATTEMPTONLY}"
POPULATE_SDK_POST_TARGET_COMMAND += "rootfs_sysroot_relativelinks; "
inherit gzipnative
LICENSE = "MIT"
PACKAGES = ""
DEPENDS += "${MLPREFIX}qemuwrapper-cross ${MLPREFIX}depmodwrapper-cross"
RDEPENDS += "${PACKAGE_INSTALL} ${LINGUAS_INSTALL}"
RRECOMMENDS += "${PACKAGE_INSTALL_ATTEMPTONLY}"
INHIBIT_DEFAULT_DEPS = "1"
TESTIMAGECLASS = "${@base_conditional('TEST_IMAGE', '1', 'testimage-auto', '', d)}"
inherit ${TESTIMAGECLASS}
# IMAGE_FEATURES may contain any available package group
IMAGE_FEATURES ?= ""
IMAGE_FEATURES[type] = "list"
IMAGE_FEATURES[validitems] += "debug-tweaks read-only-rootfs empty-root-password allow-empty-password post-install-logging"
# Generate companion debugfs?
IMAGE_GEN_DEBUGFS ?= "0"
# rootfs bootstrap install
ROOTFS_BOOTSTRAP_INSTALL = "${@bb.utils.contains("IMAGE_FEATURES", "package-management", "", "${ROOTFS_PKGMANAGE_BOOTSTRAP}",d)}"
# packages to install from features
FEATURE_INSTALL = "${@' '.join(oe.packagegroup.required_packages(oe.data.typed_value('IMAGE_FEATURES', d), d))}"
FEATURE_INSTALL[vardepvalue] = "${FEATURE_INSTALL}"
FEATURE_INSTALL_OPTIONAL = "${@' '.join(oe.packagegroup.optional_packages(oe.data.typed_value('IMAGE_FEATURES', d), d))}"
FEATURE_INSTALL_OPTIONAL[vardepvalue] = "${FEATURE_INSTALL_OPTIONAL}"
# Define some very basic feature package groups
FEATURE_PACKAGES_package-management = "${ROOTFS_PKGMANAGE}"
SPLASH ?= "psplash"
FEATURE_PACKAGES_splash = "${SPLASH}"
Rework installation of dev, dbg, doc, and locale packages Use a similar mechanism that was previously used to install locales at rootfs generation time to install other "complementary" packages (e.g. *-dev packages) - i.e. install all of the explicitly requested packages and their dependencies, then get a list of the packages that were installed, and use that list to install the complementary packages. This has been implemented by using a list of globs which should make it easier to extend in future. The previous locale package installation code assumed that the locale packages did not have any dependencies that were not already installed; now that we are installing non-locale packages this is no longer correct. In practice only the rpm backend actually made use of this assumption, so it needed to be changed to call into the existing package backend code to do the complementary package installation rather than calling rpm directly. This fixes the doc-pkgs IMAGE_FEATURES feature to work correctly, and also ensures that all dev/dbg packages get installed for dev-pkgs/dbg-pkgs respectively even if the dependency chains between those packages was not ensuring that already. The code has also been adapted to work correctly with the new SDK-from-image functionality. To that end, an SDKIMAGE_FEATURES variable has been added to allow specifying what extra image features should go into the SDK (extra, because by virtue of installing all of the packages in the image into the target part of the SDK, we already include all of IMAGE_FEATURES) with a default value of "dev-pkgs dbg-pkgs". Fixes [YOCTO #2614]. (From OE-Core rev: 72d1048a8381fa4a8c4c0d082047536727b4be47) Signed-off-by: Paul Eggleton <paul.eggleton@linux.intel.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
2012-07-09 13:15:08 +00:00
IMAGE_INSTALL_COMPLEMENTARY = '${@complementary_globs("IMAGE_FEATURES", d)}'
def check_image_features(d):
valid_features = (d.getVarFlag('IMAGE_FEATURES', 'validitems', True) or "").split()
valid_features += d.getVarFlags('COMPLEMENTARY_GLOB').keys()
for var in d:
if var.startswith("PACKAGE_GROUP_"):
bb.warn("PACKAGE_GROUP is deprecated, please use FEATURE_PACKAGES instead")
valid_features.append(var[14:])
elif var.startswith("FEATURE_PACKAGES_"):
valid_features.append(var[17:])
valid_features.sort()
features = set(oe.data.typed_value('IMAGE_FEATURES', d))
for feature in features:
if feature not in valid_features:
if bb.utils.contains('EXTRA_IMAGE_FEATURES', feature, True, False, d):
raise bb.parse.SkipRecipe("'%s' in IMAGE_FEATURES (added via EXTRA_IMAGE_FEATURES) is not a valid image feature. Valid features: %s" % (feature, ' '.join(valid_features)))
else:
raise bb.parse.SkipRecipe("'%s' in IMAGE_FEATURES is not a valid image feature. Valid features: %s" % (feature, ' '.join(valid_features)))
IMAGE_INSTALL ?= ""
IMAGE_INSTALL[type] = "list"
export PACKAGE_INSTALL ?= "${IMAGE_INSTALL} ${ROOTFS_BOOTSTRAP_INSTALL} ${FEATURE_INSTALL}"
PACKAGE_INSTALL_ATTEMPTONLY ?= "${FEATURE_INSTALL_OPTIONAL}"
# Images are generally built explicitly, do not need to be part of world.
EXCLUDE_FROM_WORLD = "1"
USE_DEVFS ?= "1"
USE_DEPMOD ?= "1"
PID = "${@os.getpid()}"
PACKAGE_ARCH = "${MACHINE_ARCH}"
LDCONFIGDEPEND ?= "ldconfig-native:do_populate_sysroot"
LDCONFIGDEPEND_libc-uclibc = ""
LDCONFIGDEPEND_libc-musl = ""
image.bbclass: Allow to remove do_rootfs -> virtual/kernel:do_packagedata dependency * this is causing dependency loops in some cases e.g. linux-hp-tenderloin depends on initramfs-android-image, but commit 41f0f86ec0a3e0b6f6c9bb4ef71a4215c00bf66c Author: Richard Purdie <richard.purdie@linuxfoundation.org> Date: Tue Jan 27 15:24:52 2015 +0000 Subject: image: Add missing depends on virtual/kernel for depmod data adds also dependency between <image>.do_rootfs and virtual/kernel:do_packagedata causing this dependency loop: Dependency loop #1 found: Task 78 (meta-smartphone/meta-hp/recipes-kernel/linux/linux-hp-tenderloin_git.bb, do_install) (dependent Tasks ['linux-hp-tenderloin, do_compile', 'pseudo, do_populate_sysroot']) Task 88 (meta-smartphone/meta-hp/recipes-kernel/linux/linux-hp-tenderloin_git.bb, do_package) (dependent Tasks ['rpm, do_populate_sysroot', 'pseudo, do_populate_sysroot', 'linux-hp-tenderloin, do_install', 'initramfs-android-image.bb, do_packagedata', 'glibc, do_packagedata', 'file, do_populate_sysroot', 'gcc-runtime, do_packagedata']) Task 89 (meta-smartphone/meta-hp/recipes-kernel/linux/linux-hp-tenderloin_git.bb, do_package_write_ipk) (dependent Tasks ['linux-hp-tenderloin, do_package', 'opkg-utils, do_populate_sysroot', 'linux-hp-tenderloin, do_packagedata', 'pseudo, do_populate_sysroot']) Task 560 (meta-smartphone/meta-android/recipes-core/images/initramfs-android-image.bb, do_rootfs) (dependent Tasks ['bash, do_package_write_ipk', 'run-postinsts, do_package_write_ipk', 'db, do_package_write_ipk', 'update-rc.d, do_populate_sysroot', 'android-tools-conf, do_package_write_ipk', 'base-passwd, do_package_write_ipk', 'initramfs-boot-android, do_package_write_ipk', 'expat, do_package_write_ipk', 'bzip2, do_packagedata', 'glibc-initial, do_packagedata', 'openssl, do_package_write_ipk', 'bzip2, do_package_write_ipk', 'busybox, do_packagedata', 'zlib, do_packagedata', 'qemuwrapper-cross, do_packagedata', 'base-passwd, do_packagedata', 'busybox, do_package_write_ipk', 'zlib, do_package_write_ipk', 'qemuwrapper-cross, do_package_write_ipk', 'gcc-runtime, do_package_write_ipk', 'gettext, do_packagedata', 'initramfs-boot-android, do_packagedata', 'gettext, do_package_write_ipk', 'libgcc-initial, do_packagedata', 'expat, do_packagedata', 'gdbm, do_packagedata', 'depmodwrapper-cross, do_package_write_ipk', 'libgcc-initial, do_package_write_ipk', 'glibc-initial, do_package_write_ipk', 'linux-libc-headers, do_packagedata', 'glibc, do_packagedata', 'initramfs-android-image.bb, do_packagedata', 'glibc, do_package_write_ipk', 'sqlite3, do_packagedata', 'initramfs-android-image.bb, do_package_write_ipk', 'sqlite3, do_package_write_ipk', 'android-tools-conf, do_packagedata', 'ncurses, do_packagedata', 'openssl, do_packagedata', 'android-tools, do_packagedata', 'ncurses, do_package_write_ipk', 'cryptodev-linux, do_packagedata', 'android-tools, do_package_write_ipk', 'pseudo, do_populate_sysroot', 'cryptodev-linux, do_package_write_ipk', 'linux-libc-headers, do_package_write_ipk', 'depmodwrapper-cross, do_packagedata', 'linux-hp-tenderloin, do_packagedata', 'readline, do_package_write_ipk', 'opkg-utils, do_packagedata', 'linux-hp-tenderloin, do_package_write_ipk', 'python, do_packagedata', 'gdbm, do_package_write_ipk', 'opkg, do_populate_sysroot', 'python, do_package_write_ipk', 'libtool-cross, do_packagedata', 'db, do_packagedata', 'libgcc, do_packagedata', 'libtool-cross, do_package_write_ipk', 'update-rc.d, do_packagedata', 'update-rc.d, do_package_write_ipk', 'libgcc, do_package_write_ipk', 'opkg-utils, do_populate_sysroot', 'makedevs, do_populate_sysroot', 'readline, do_packagedata', 'base-files, do_packagedata', 'gcc-runtime, do_packagedata', 'opkg-utils, do_package_write_ipk', 'base-files, do_package_write_ipk', 'ldconfig-native, do_populate_sysroot', 'bash, do_packagedata', 'run-postinsts, do_packagedata']) Task 82 (meta-smartphone/meta-hp/recipes-kernel/linux/linux-hp-tenderloin_git.bb, do_compile) (dependent Tasks ['initramfs-android-image.bb, do_rootfs', 'linux-hp-tenderloin, do_configure']) (From OE-Core rev: 2e3c8fd70694dcf9553b5e4c50a57b617a9130b6) Signed-off-by: Martin Jansa <Martin.Jansa@gmail.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
2015-04-20 13:04:44 +00:00
# This is needed to have depmod data in PKGDATA_DIR,
# but if you're building small initramfs image
# e.g. to include it in your kernel, you probably
# don't want this dependency, which is causing dependency loop
KERNELDEPMODDEPEND ?= "virtual/kernel:do_packagedata"
do_rootfs[depends] += " \
makedevs-native:do_populate_sysroot virtual/fakeroot-native:do_populate_sysroot ${LDCONFIGDEPEND} \
virtual/update-alternatives-native:do_populate_sysroot update-rc.d-native:do_populate_sysroot \
image.bbclass: Allow to remove do_rootfs -> virtual/kernel:do_packagedata dependency * this is causing dependency loops in some cases e.g. linux-hp-tenderloin depends on initramfs-android-image, but commit 41f0f86ec0a3e0b6f6c9bb4ef71a4215c00bf66c Author: Richard Purdie <richard.purdie@linuxfoundation.org> Date: Tue Jan 27 15:24:52 2015 +0000 Subject: image: Add missing depends on virtual/kernel for depmod data adds also dependency between <image>.do_rootfs and virtual/kernel:do_packagedata causing this dependency loop: Dependency loop #1 found: Task 78 (meta-smartphone/meta-hp/recipes-kernel/linux/linux-hp-tenderloin_git.bb, do_install) (dependent Tasks ['linux-hp-tenderloin, do_compile', 'pseudo, do_populate_sysroot']) Task 88 (meta-smartphone/meta-hp/recipes-kernel/linux/linux-hp-tenderloin_git.bb, do_package) (dependent Tasks ['rpm, do_populate_sysroot', 'pseudo, do_populate_sysroot', 'linux-hp-tenderloin, do_install', 'initramfs-android-image.bb, do_packagedata', 'glibc, do_packagedata', 'file, do_populate_sysroot', 'gcc-runtime, do_packagedata']) Task 89 (meta-smartphone/meta-hp/recipes-kernel/linux/linux-hp-tenderloin_git.bb, do_package_write_ipk) (dependent Tasks ['linux-hp-tenderloin, do_package', 'opkg-utils, do_populate_sysroot', 'linux-hp-tenderloin, do_packagedata', 'pseudo, do_populate_sysroot']) Task 560 (meta-smartphone/meta-android/recipes-core/images/initramfs-android-image.bb, do_rootfs) (dependent Tasks ['bash, do_package_write_ipk', 'run-postinsts, do_package_write_ipk', 'db, do_package_write_ipk', 'update-rc.d, do_populate_sysroot', 'android-tools-conf, do_package_write_ipk', 'base-passwd, do_package_write_ipk', 'initramfs-boot-android, do_package_write_ipk', 'expat, do_package_write_ipk', 'bzip2, do_packagedata', 'glibc-initial, do_packagedata', 'openssl, do_package_write_ipk', 'bzip2, do_package_write_ipk', 'busybox, do_packagedata', 'zlib, do_packagedata', 'qemuwrapper-cross, do_packagedata', 'base-passwd, do_packagedata', 'busybox, do_package_write_ipk', 'zlib, do_package_write_ipk', 'qemuwrapper-cross, do_package_write_ipk', 'gcc-runtime, do_package_write_ipk', 'gettext, do_packagedata', 'initramfs-boot-android, do_packagedata', 'gettext, do_package_write_ipk', 'libgcc-initial, do_packagedata', 'expat, do_packagedata', 'gdbm, do_packagedata', 'depmodwrapper-cross, do_package_write_ipk', 'libgcc-initial, do_package_write_ipk', 'glibc-initial, do_package_write_ipk', 'linux-libc-headers, do_packagedata', 'glibc, do_packagedata', 'initramfs-android-image.bb, do_packagedata', 'glibc, do_package_write_ipk', 'sqlite3, do_packagedata', 'initramfs-android-image.bb, do_package_write_ipk', 'sqlite3, do_package_write_ipk', 'android-tools-conf, do_packagedata', 'ncurses, do_packagedata', 'openssl, do_packagedata', 'android-tools, do_packagedata', 'ncurses, do_package_write_ipk', 'cryptodev-linux, do_packagedata', 'android-tools, do_package_write_ipk', 'pseudo, do_populate_sysroot', 'cryptodev-linux, do_package_write_ipk', 'linux-libc-headers, do_package_write_ipk', 'depmodwrapper-cross, do_packagedata', 'linux-hp-tenderloin, do_packagedata', 'readline, do_package_write_ipk', 'opkg-utils, do_packagedata', 'linux-hp-tenderloin, do_package_write_ipk', 'python, do_packagedata', 'gdbm, do_package_write_ipk', 'opkg, do_populate_sysroot', 'python, do_package_write_ipk', 'libtool-cross, do_packagedata', 'db, do_packagedata', 'libgcc, do_packagedata', 'libtool-cross, do_package_write_ipk', 'update-rc.d, do_packagedata', 'update-rc.d, do_package_write_ipk', 'libgcc, do_package_write_ipk', 'opkg-utils, do_populate_sysroot', 'makedevs, do_populate_sysroot', 'readline, do_packagedata', 'base-files, do_packagedata', 'gcc-runtime, do_packagedata', 'opkg-utils, do_package_write_ipk', 'base-files, do_package_write_ipk', 'ldconfig-native, do_populate_sysroot', 'bash, do_packagedata', 'run-postinsts, do_packagedata']) Task 82 (meta-smartphone/meta-hp/recipes-kernel/linux/linux-hp-tenderloin_git.bb, do_compile) (dependent Tasks ['initramfs-android-image.bb, do_rootfs', 'linux-hp-tenderloin, do_configure']) (From OE-Core rev: 2e3c8fd70694dcf9553b5e4c50a57b617a9130b6) Signed-off-by: Martin Jansa <Martin.Jansa@gmail.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
2015-04-20 13:04:44 +00:00
${KERNELDEPMODDEPEND} \
"
do_rootfs[recrdeptask] += "do_packagedata"
def command_variables(d):
return ['ROOTFS_POSTPROCESS_COMMAND','ROOTFS_PREPROCESS_COMMAND','ROOTFS_POSTINSTALL_COMMAND','OPKG_PREPROCESS_COMMANDS','OPKG_POSTPROCESS_COMMANDS','IMAGE_POSTPROCESS_COMMAND',
'IMAGE_PREPROCESS_COMMAND','ROOTFS_POSTPROCESS_COMMAND','POPULATE_SDK_POST_HOST_COMMAND','POPULATE_SDK_POST_TARGET_COMMAND','SDK_POSTPROCESS_COMMAND','RPM_PREPROCESS_COMMANDS',
'RPM_POSTPROCESS_COMMANDS']
python () {
variables = command_variables(d)
for var in variables:
if d.getVar(var, False):
d.setVarFlag(var, 'func', '1')
}
def fstype_variables(d):
import oe.image
image = oe.image.Image(d)
alltypes, fstype_groups, cimages = image._get_image_types()
fstype_vars = set()
for fstype_group in fstype_groups:
for fstype in fstype_group:
fstype_vars.add('IMAGE_CMD_' + fstype)
if fstype in cimages:
for ctype in cimages[fstype]:
fstype_vars.add('COMPRESS_CMD_' + ctype)
return sorted(fstype_vars)
def rootfs_variables(d):
from oe.rootfs import variable_depends
variables = ['IMAGE_DEVICE_TABLES','BUILD_IMAGES_FROM_FEEDS','IMAGE_TYPES_MASKED','IMAGE_ROOTFS_ALIGNMENT','IMAGE_OVERHEAD_FACTOR','IMAGE_ROOTFS_SIZE','IMAGE_ROOTFS_EXTRA_SPACE',
'IMAGE_ROOTFS_MAXSIZE','IMAGE_NAME','IMAGE_LINK_NAME','IMAGE_MANIFEST','DEPLOY_DIR_IMAGE','RM_OLD_IMAGE','IMAGE_FSTYPES','IMAGE_INSTALL_COMPLEMENTARY','IMAGE_LINGUAS','SDK_OS',
'SDK_OUTPUT','SDKPATHNATIVE','SDKTARGETSYSROOT','SDK_DIR','SDK_VENDOR','SDKIMAGE_INSTALL_COMPLEMENTARY','SDK_PACKAGE_ARCHS','SDK_OUTPUT','SDKTARGETSYSROOT','MULTILIBRE_ALLOW_REP',
'MULTILIB_TEMP_ROOTFS','MULTILIB_VARIANTS','MULTILIBS','ALL_MULTILIB_PACKAGE_ARCHS','MULTILIB_GLOBAL_VARIANTS','BAD_RECOMMENDATIONS','NO_RECOMMENDATIONS','PACKAGE_ARCHS',
'PACKAGE_CLASSES','TARGET_VENDOR','TARGET_VENDOR','TARGET_ARCH','TARGET_OS','OVERRIDES','BBEXTENDVARIANT','FEED_DEPLOYDIR_BASE_URI','INTERCEPT_DIR','USE_DEVFS',
'COMPRESSIONTYPES', 'IMAGE_GEN_DEBUGFS']
variables.extend(fstype_variables(d))
variables.extend(command_variables(d))
variables.extend(variable_depends(d))
return " ".join(variables)
do_rootfs[vardeps] += "${@rootfs_variables(d)}"
do_build[depends] += "virtual/kernel:do_deploy"
def build_live(d):
if bb.utils.contains("IMAGE_FSTYPES", "live", "live", "0", d) == "0": # live is not set but hob might set iso or hddimg
d.setVar('NOISO', bb.utils.contains('IMAGE_FSTYPES', "iso", "0", "1", d))
d.setVar('NOHDD', bb.utils.contains('IMAGE_FSTYPES', "hddimg", "0", "1", d))
if d.getVar('NOISO', True) == "0" or d.getVar('NOHDD', True) == "0":
return "image-live"
return ""
return "image-live"
IMAGE_TYPE_live = "${@build_live(d)}"
inherit ${IMAGE_TYPE_live}
IMAGE_TYPE_vm = '${@bb.utils.contains_any("IMAGE_FSTYPES", ["vmdk", "vdi", "qcow2", "hdddirect"], "image-vm", "", d)}'
inherit ${IMAGE_TYPE_vm}
python () {
deps = " " + imagetypes_getdepends(d)
d.appendVarFlag('do_rootfs', 'depends', deps)
deps = ""
for dep in (d.getVar('EXTRA_IMAGEDEPENDS', True) or "").split():
deps += " %s:do_populate_sysroot" % dep
d.appendVarFlag('do_build', 'depends', deps)
#process IMAGE_FEATURES, we must do this before runtime_mapping_rename
#Check for replaces image features
features = set(oe.data.typed_value('IMAGE_FEATURES', d))
remain_features = features.copy()
for feature in features:
replaces = set((d.getVar("IMAGE_FEATURES_REPLACES_%s" % feature, True) or "").split())
remain_features -= replaces
#Check for conflict image features
for feature in remain_features:
conflicts = set((d.getVar("IMAGE_FEATURES_CONFLICTS_%s" % feature, True) or "").split())
temp = conflicts & remain_features
if temp:
bb.fatal("%s contains conflicting IMAGE_FEATURES %s %s" % (d.getVar('PN', True), feature, ' '.join(list(temp))))
d.setVar('IMAGE_FEATURES', ' '.join(list(remain_features)))
check_image_features(d)
kernel.bbclass, image.bbclass: Implement kernel INITRAMFS dependency and bundling This patch aims to fix the following two cases for the INITRAMFS generation. 1) Allow an image recipe to specify a paired INITRAMFS recipe such as core-image-minimal-initramfs. This allows building a base image which always generates the needed initramfs image in one step 2) Allow building a single binary which contains a kernel and the initramfs. A key requirement of the initramfs is to be able to add kernel modules. The current implementation of the INITRAMFS_IMAGE variable has a circular dependency when using kernel modules in the initramfs image.bb file that is caused by kernel.bbclass trying to build the initramfs before the kernel's do_install rule. The solution for this problem is to have the kernel's do_bundle_initramfs_image task depend on the do_rootfs from the INITRAMFS_IMAGE and not some intermediate point. The image.bbclass will also sets up dependencies to make the initramfs creation task run last. The code to bundle the kernel and initramfs together has been added. At a high level, all it is doing is invoking a second compilation of the kernel but changing the value of CONFIG_INITRAMFS_SOURCE to point to the generated initramfs from the image recipe. [YOCTO #4072] (From OE-Core rev: 609d5a9ab9e58bb1c2bcc2145399fbc8b701b85a) Signed-off-by: Jason Wessel <jason.wessel@windriver.com> Acked-by: Bruce Ashfield <bruce.ashfield@windriver.com> Signed-off-by: Saul Wold <sgw@linux.intel.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
2013-08-22 23:04:27 +00:00
initramfs_image = d.getVar('INITRAMFS_IMAGE', True) or ""
if initramfs_image != "":
d.appendVarFlag('do_build', 'depends', " %s:do_bundle_initramfs" % d.getVar('PN', True))
d.appendVarFlag('do_bundle_initramfs', 'depends', " %s:do_rootfs" % initramfs_image)
}
IMAGE_CLASSES += "image_types"
inherit ${IMAGE_CLASSES}
IMAGE_POSTPROCESS_COMMAND ?= ""
# some default locales
IMAGE_LINGUAS ?= "de-de fr-fr en-gb"
LINGUAS_INSTALL ?= "${@" ".join(map(lambda s: "locale-base-%s" % s, d.getVar('IMAGE_LINGUAS', True).split()))}"
# Prefer image, but use the fallback files for lookups if the image ones
# aren't yet available.
PSEUDO_PASSWD = "${IMAGE_ROOTFS}:${STAGING_DIR_NATIVE}"
inherit rootfs-postcommands
PACKAGE_EXCLUDE ??= ""
PACKAGE_EXCLUDE[type] = "list"
fakeroot python do_rootfs () {
from oe.rootfs import create_rootfs
from oe.manifest import create_manifest
# Handle package exclusions
excl_pkgs = d.getVar("PACKAGE_EXCLUDE", True).split()
inst_pkgs = d.getVar("PACKAGE_INSTALL", True).split()
inst_attempt_pkgs = d.getVar("PACKAGE_INSTALL_ATTEMPTONLY", True).split()
d.setVar('PACKAGE_INSTALL_ORIG', ' '.join(inst_pkgs))
d.setVar('PACKAGE_INSTALL_ATTEMPTONLY', ' '.join(inst_attempt_pkgs))
for pkg in excl_pkgs:
if pkg in inst_pkgs:
bb.warn("Package %s, set to be excluded, is in %s PACKAGE_INSTALL (%s). It will be removed from the list." % (pkg, d.getVar('PN', True), inst_pkgs))
inst_pkgs.remove(pkg)
if pkg in inst_attempt_pkgs:
bb.warn("Package %s, set to be excluded, is in %s PACKAGE_INSTALL_ATTEMPTONLY (%s). It will be removed from the list." % (pkg, d.getVar('PN', True), inst_pkgs))
inst_attempt_pkgs.remove(pkg)
d.setVar("PACKAGE_INSTALL", ' '.join(inst_pkgs))
d.setVar("PACKAGE_INSTALL_ATTEMPTONLY", ' '.join(inst_attempt_pkgs))
# Ensure we handle package name remapping
# We have to delay the runtime_mapping_rename until just before rootfs runs
# otherwise, the multilib renaming could step in and squash any fixups that
# may have occurred.
pn = d.getVar('PN', True)
runtime_mapping_rename("PACKAGE_INSTALL", pn, d)
runtime_mapping_rename("PACKAGE_INSTALL_ATTEMPTONLY", pn, d)
runtime_mapping_rename("BAD_RECOMMENDATIONS", pn, d)
# Generate the initial manifest
create_manifest(d)
# Generate rootfs
create_rootfs(d)
}
do_rootfs[dirs] = "${TOPDIR}"
do_rootfs[cleandirs] += "${S}"
do_rootfs[umask] = "022"
addtask rootfs before do_build
fakeroot python do_image () {
from oe.image import create_image
from oe.image import Image
from oe.utils import execute_pre_post_process
i = Image(d)
pre_process_cmds = d.getVar("IMAGE_PREPROCESS_COMMAND", True)
execute_pre_post_process(d, pre_process_cmds)
i._remove_old_symlinks()
i.create()
}
do_image[dirs] = "${TOPDIR}"
do_image[umask] = "022"
addtask do_image after do_rootfs before do_build
fakeroot python do_image_complete () {
from oe.utils import execute_pre_post_process
post_process_cmds = d.getVar("IMAGE_POSTPROCESS_COMMAND", True)
execute_pre_post_process(d, post_process_cmds)
}
do_image_complete[dirs] = "${TOPDIR}"
do_image_complete[umask] = "022"
addtask do_image_complete after do_image before do_build
MULTILIBRE_ALLOW_REP =. "${base_bindir}|${base_sbindir}|${bindir}|${sbindir}|${libexecdir}|${sysconfdir}|${nonarch_base_libdir}/udev|/lib/modules/[^/]*/modules.*|"
MULTILIB_CHECK_FILE = "${WORKDIR}/multilib_check.py"
MULTILIB_TEMP_ROOTFS = "${WORKDIR}/multilib"
do_fetch[noexec] = "1"
do_unpack[noexec] = "1"
do_patch[noexec] = "1"
do_configure[noexec] = "1"
do_compile[noexec] = "1"
do_install[noexec] = "1"
do_populate_sysroot[noexec] = "1"
do_package[noexec] = "1"
do_package_qa[noexec] = "1"
do_packagedata[noexec] = "1"
do_package_write_ipk[noexec] = "1"
do_package_write_deb[noexec] = "1"
do_package_write_rpm[noexec] = "1"
kernel.bbclass, image.bbclass: Implement kernel INITRAMFS dependency and bundling This patch aims to fix the following two cases for the INITRAMFS generation. 1) Allow an image recipe to specify a paired INITRAMFS recipe such as core-image-minimal-initramfs. This allows building a base image which always generates the needed initramfs image in one step 2) Allow building a single binary which contains a kernel and the initramfs. A key requirement of the initramfs is to be able to add kernel modules. The current implementation of the INITRAMFS_IMAGE variable has a circular dependency when using kernel modules in the initramfs image.bb file that is caused by kernel.bbclass trying to build the initramfs before the kernel's do_install rule. The solution for this problem is to have the kernel's do_bundle_initramfs_image task depend on the do_rootfs from the INITRAMFS_IMAGE and not some intermediate point. The image.bbclass will also sets up dependencies to make the initramfs creation task run last. The code to bundle the kernel and initramfs together has been added. At a high level, all it is doing is invoking a second compilation of the kernel but changing the value of CONFIG_INITRAMFS_SOURCE to point to the generated initramfs from the image recipe. [YOCTO #4072] (From OE-Core rev: 609d5a9ab9e58bb1c2bcc2145399fbc8b701b85a) Signed-off-by: Jason Wessel <jason.wessel@windriver.com> Acked-by: Bruce Ashfield <bruce.ashfield@windriver.com> Signed-off-by: Saul Wold <sgw@linux.intel.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
2013-08-22 23:04:27 +00:00
# Allow the kernel to be repacked with the initramfs and boot image file as a single file
do_bundle_initramfs[depends] += "virtual/kernel:do_bundle_initramfs"
do_bundle_initramfs[nostamp] = "1"
do_bundle_initramfs[noexec] = "1"
do_bundle_initramfs () {
:
}
addtask bundle_initramfs after do_rootfs