mirror of
https://git.yoctoproject.org/poky
synced 2026-05-30 00:20:08 +00:00
Activate the new python rootfs/image creation routines
This commit will: * remove old bash code common to all backends; * create a new do_rootfs() python function that will use the new rootfs/image creation routines; * allow creation of dpkg based images; * fail for rpm/opkg (not implemented yet); (From OE-Core rev: a83144bac8d67704ff66f5dc0fc56f5b63979694) Signed-off-by: Laurentiu Palcu <laurentiu.palcu@intel.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
committed by
Richard Purdie
parent
85cc53a5a0
commit
7fc9bdaeed
+11
-251
@@ -151,32 +151,11 @@ python () {
|
|||||||
d.appendVarFlag('do_bundle_initramfs', 'depends', " %s:do_rootfs" % initramfs_image)
|
d.appendVarFlag('do_bundle_initramfs', 'depends', " %s:do_rootfs" % initramfs_image)
|
||||||
}
|
}
|
||||||
|
|
||||||
#
|
|
||||||
# Get a list of files containing device tables to create.
|
|
||||||
# * IMAGE_DEVICE_TABLE is the old name to an absolute path to a device table file
|
|
||||||
# * IMAGE_DEVICE_TABLES is a new name for a file, or list of files, seached
|
|
||||||
# for in the BBPATH
|
|
||||||
# If neither are specified then the default name of files/device_table-minimal.txt
|
|
||||||
# is searched for in the BBPATH (same as the old version.)
|
|
||||||
#
|
|
||||||
def get_devtable_list(d):
|
|
||||||
devtable = d.getVar('IMAGE_DEVICE_TABLE', True)
|
|
||||||
if devtable != None:
|
|
||||||
return devtable
|
|
||||||
str = ""
|
|
||||||
devtables = d.getVar('IMAGE_DEVICE_TABLES', True)
|
|
||||||
if devtables == None:
|
|
||||||
devtables = 'files/device_table-minimal.txt'
|
|
||||||
for devtable in devtables.split():
|
|
||||||
str += " %s" % bb.utils.which(d.getVar('BBPATH', True), devtable)
|
|
||||||
return str
|
|
||||||
|
|
||||||
IMAGE_CLASSES ?= "image_types"
|
IMAGE_CLASSES ?= "image_types"
|
||||||
inherit ${IMAGE_CLASSES}
|
inherit ${IMAGE_CLASSES}
|
||||||
|
|
||||||
IMAGE_POSTPROCESS_COMMAND ?= ""
|
IMAGE_POSTPROCESS_COMMAND ?= ""
|
||||||
MACHINE_POSTPROCESS_COMMAND ?= ""
|
MACHINE_POSTPROCESS_COMMAND ?= ""
|
||||||
ROOTFS_POSTPROCESS_COMMAND_prepend = "run_intercept_scriptlets; "
|
|
||||||
# Allow dropbear/openssh to accept logins from accounts with an empty password string if debug-tweaks is enabled
|
# Allow dropbear/openssh to accept logins from accounts with an empty password string if debug-tweaks is enabled
|
||||||
ROOTFS_POSTPROCESS_COMMAND += '${@base_contains("IMAGE_FEATURES", "debug-tweaks", "ssh_allow_empty_password; ", "",d)}'
|
ROOTFS_POSTPROCESS_COMMAND += '${@base_contains("IMAGE_FEATURES", "debug-tweaks", "ssh_allow_empty_password; ", "",d)}'
|
||||||
# Enable postinst logging if debug-tweaks is enabled
|
# Enable postinst logging if debug-tweaks is enabled
|
||||||
@@ -197,7 +176,7 @@ LINGUAS_INSTALL ?= "${@" ".join(map(lambda s: "locale-base-%s" % s, d.getVar('IM
|
|||||||
|
|
||||||
PSEUDO_PASSWD = "${IMAGE_ROOTFS}"
|
PSEUDO_PASSWD = "${IMAGE_ROOTFS}"
|
||||||
|
|
||||||
do_rootfs[dirs] = "${TOPDIR} ${WORKDIR}/intercept_scripts"
|
do_rootfs[dirs] = "${TOPDIR}"
|
||||||
do_rootfs[lockfiles] += "${IMAGE_ROOTFS}.lock"
|
do_rootfs[lockfiles] += "${IMAGE_ROOTFS}.lock"
|
||||||
do_rootfs[cleandirs] += "${S} ${WORKDIR}/intercept_scripts"
|
do_rootfs[cleandirs] += "${S} ${WORKDIR}/intercept_scripts"
|
||||||
|
|
||||||
@@ -205,63 +184,6 @@ do_rootfs[cleandirs] += "${S} ${WORKDIR}/intercept_scripts"
|
|||||||
# task, so that we have a single fakeroot context for the whole process.
|
# task, so that we have a single fakeroot context for the whole process.
|
||||||
do_rootfs[umask] = "022"
|
do_rootfs[umask] = "022"
|
||||||
|
|
||||||
|
|
||||||
run_intercept_scriptlets () {
|
|
||||||
if [ -d ${WORKDIR}/intercept_scripts ]; then
|
|
||||||
cd ${WORKDIR}/intercept_scripts
|
|
||||||
echo "Running intercept scripts:"
|
|
||||||
for script in *; do
|
|
||||||
[ "$script" = "*" ] && break
|
|
||||||
[ "$script" = "postinst_intercept" ] || [ ! -x "$script" ] && continue
|
|
||||||
echo "> Executing $script"
|
|
||||||
./$script && continue
|
|
||||||
echo "WARNING: intercept script \"$script\" failed, falling back to running postinstalls at first boot"
|
|
||||||
#
|
|
||||||
# If we got here, than the intercept has failed. Next, we must
|
|
||||||
# mark the postinstalls as "unpacked". For rpm is a little bit
|
|
||||||
# different, we just have to save the package postinstalls in
|
|
||||||
# /etc/rpm-postinsts
|
|
||||||
#
|
|
||||||
pkgs="$(cat ./$script|grep "^##PKGS"|cut -d':' -f2)" || continue
|
|
||||||
case ${IMAGE_PKGTYPE} in
|
|
||||||
"rpm")
|
|
||||||
[ -d ${IMAGE_ROOTFS}${sysconfdir}/rpm-postinsts/ ] || mkdir ${IMAGE_ROOTFS}${sysconfdir}/rpm-postinsts/
|
|
||||||
v_expr=$(echo ${MULTILIB_GLOBAL_VARIANTS}|tr ' ' '|')
|
|
||||||
for p in $pkgs; do
|
|
||||||
# remove any multilib prefix from the package name (RPM
|
|
||||||
# does not use it like this)
|
|
||||||
new_p=$(echo $p | sed -r "s/^($v_expr)-//")
|
|
||||||
|
|
||||||
# extract the postinstall scriptlet from rpm package and
|
|
||||||
# save it in /etc/rpm-postinsts
|
|
||||||
echo " * postponing $new_p"
|
|
||||||
rpm -q --scripts --root=${IMAGE_ROOTFS} --dbpath=/var/lib/rpm $new_p |\
|
|
||||||
sed -n -e '/^postinstall scriptlet (using .*):$/,/^.* scriptlet (using .*):$/ {/.*/p}' |\
|
|
||||||
sed -e 's/postinstall scriptlet (using \(.*\)):$/#!\1/' -e '/^.* scriptlet (using .*):$/d'\
|
|
||||||
> ${IMAGE_ROOTFS}${sysconfdir}/rpm-postinsts/$new_p
|
|
||||||
chmod +x ${IMAGE_ROOTFS}${sysconfdir}/rpm-postinsts/$new_p
|
|
||||||
done
|
|
||||||
# move to the next intercept script
|
|
||||||
continue
|
|
||||||
;;
|
|
||||||
"ipk")
|
|
||||||
status_file="${IMAGE_ROOTFS}${OPKGLIBDIR}/opkg/status"
|
|
||||||
;;
|
|
||||||
"deb")
|
|
||||||
status_file="${IMAGE_ROOTFS}/var/lib/dpkg/status"
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
# the next piece of code is run only for ipk/dpkg
|
|
||||||
sed_expr=""
|
|
||||||
for p in $pkgs; do
|
|
||||||
echo " * postponing $p"
|
|
||||||
sed_expr="$sed_expr -e \"/^Package: ${p}$/,/^Status: install.* installed$/ {s/installed/unpacked/}\""
|
|
||||||
done
|
|
||||||
eval sed -i $sed_expr $status_file
|
|
||||||
done
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# A hook function to support read-only-rootfs IMAGE_FEATURES
|
# A hook function to support read-only-rootfs IMAGE_FEATURES
|
||||||
# Currently, it only supports sysvinit system.
|
# Currently, it only supports sysvinit system.
|
||||||
read_only_rootfs_hook () {
|
read_only_rootfs_hook () {
|
||||||
@@ -328,72 +250,19 @@ python rootfs_runtime_mapping() {
|
|||||||
}
|
}
|
||||||
do_rootfs[prefuncs] += "rootfs_runtime_mapping"
|
do_rootfs[prefuncs] += "rootfs_runtime_mapping"
|
||||||
|
|
||||||
fakeroot do_rootfs () {
|
fakeroot python do_rootfs () {
|
||||||
#set -x
|
from oe.rootfs import create_rootfs
|
||||||
# When use the rpm incremental image generation, don't remove the rootfs
|
from oe.image import create_image
|
||||||
if [ "${INC_RPM_IMAGE_GEN}" != "1" -o "${IMAGE_PKGTYPE}" != "rpm" ]; then
|
from oe.manifest import create_manifest
|
||||||
rm -rf ${IMAGE_ROOTFS}
|
|
||||||
elif [ -d ${T}/saved_rpmlib/var/lib/rpm ]; then
|
|
||||||
# Move the rpmlib back
|
|
||||||
if [ ! -d ${IMAGE_ROOTFS}/var/lib/rpm ]; then
|
|
||||||
mkdir -p ${IMAGE_ROOTFS}/var/lib/
|
|
||||||
mv ${T}/saved_rpmlib/var/lib/rpm ${IMAGE_ROOTFS}/var/lib/
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
rm -rf ${MULTILIB_TEMP_ROOTFS}
|
|
||||||
mkdir -p ${IMAGE_ROOTFS}
|
|
||||||
mkdir -p ${DEPLOY_DIR_IMAGE}
|
|
||||||
|
|
||||||
cp ${COREBASE}/meta/files/deploydir_readme.txt ${DEPLOY_DIR_IMAGE}/README_-_DO_NOT_DELETE_FILES_IN_THIS_DIRECTORY.txt || true
|
# generate the initial manifest
|
||||||
|
create_manifest(d)
|
||||||
|
|
||||||
# copy the intercept scripts
|
# generate rootfs
|
||||||
cp ${COREBASE}/scripts/postinst-intercepts/* ${WORKDIR}/intercept_scripts/
|
create_rootfs(d)
|
||||||
|
|
||||||
rootfs_${IMAGE_PKGTYPE}_do_rootfs
|
# generate final images
|
||||||
|
create_image(d)
|
||||||
if [ "${USE_DEVFS}" != "1" ]; then
|
|
||||||
for devtable in ${@get_devtable_list(d)}; do
|
|
||||||
# Always return ture since there maybe already one when use the
|
|
||||||
# incremental image generation
|
|
||||||
makedevs -r ${IMAGE_ROOTFS} -D $devtable
|
|
||||||
done
|
|
||||||
fi
|
|
||||||
|
|
||||||
# remove unneeded packages/files from the final image
|
|
||||||
rootfs_uninstall_unneeded
|
|
||||||
|
|
||||||
insert_feed_uris
|
|
||||||
|
|
||||||
if [ "x${LDCONFIGDEPEND}" != "x" ]; then
|
|
||||||
# Run ldconfig on the image to create a valid cache
|
|
||||||
# (new format for cross arch compatibility)
|
|
||||||
echo executing: ldconfig -r ${IMAGE_ROOTFS} -c new -v
|
|
||||||
ldconfig -r ${IMAGE_ROOTFS} -c new -v
|
|
||||||
fi
|
|
||||||
|
|
||||||
# (re)create kernel modules dependencies
|
|
||||||
# This part is done by kernel-module-* postinstall scripts but if image do
|
|
||||||
# not contains modules at all there are few moments in boot sequence with
|
|
||||||
# "unable to open modules.dep" message.
|
|
||||||
if [ -e ${STAGING_KERNEL_DIR}/kernel-abiversion ]; then
|
|
||||||
KERNEL_VERSION=`cat ${STAGING_KERNEL_DIR}/kernel-abiversion`
|
|
||||||
|
|
||||||
mkdir -p ${IMAGE_ROOTFS}/lib/modules/$KERNEL_VERSION
|
|
||||||
depmodwrapper -a -b ${IMAGE_ROOTFS} $KERNEL_VERSION
|
|
||||||
fi
|
|
||||||
|
|
||||||
${IMAGE_PREPROCESS_COMMAND}
|
|
||||||
|
|
||||||
${@get_imagecmds(d)}
|
|
||||||
|
|
||||||
${IMAGE_POSTPROCESS_COMMAND}
|
|
||||||
|
|
||||||
${MACHINE_POSTPROCESS_COMMAND}
|
|
||||||
|
|
||||||
if [ -n "${IMAGE_LINK_NAME}" -a -f "${IMAGE_MANIFEST}" ]; then
|
|
||||||
rm -f ${DEPLOY_DIR_IMAGE}/${IMAGE_LINK_NAME}.manifest
|
|
||||||
ln -s ${IMAGE_NAME}.rootfs.manifest ${DEPLOY_DIR_IMAGE}/${IMAGE_LINK_NAME}.manifest
|
|
||||||
fi
|
|
||||||
}
|
}
|
||||||
|
|
||||||
insert_feed_uris () {
|
insert_feed_uris () {
|
||||||
@@ -414,23 +283,6 @@ insert_feed_uris () {
|
|||||||
done
|
done
|
||||||
}
|
}
|
||||||
|
|
||||||
log_check() {
|
|
||||||
for target in $*
|
|
||||||
do
|
|
||||||
lf_path="`dirname ${BB_LOGFILE}`/log.do_$target.${PID}"
|
|
||||||
|
|
||||||
echo "log_check: Using $lf_path as logfile"
|
|
||||||
|
|
||||||
if test -e "$lf_path"
|
|
||||||
then
|
|
||||||
${IMAGE_PKGTYPE}_log_check $target $lf_path
|
|
||||||
else
|
|
||||||
echo "Cannot find logfile [$lf_path]"
|
|
||||||
fi
|
|
||||||
echo "Logfile is clean"
|
|
||||||
done
|
|
||||||
}
|
|
||||||
|
|
||||||
MULTILIBRE_ALLOW_REP =. "${base_bindir}|${base_sbindir}|${bindir}|${sbindir}|${libexecdir}|"
|
MULTILIBRE_ALLOW_REP =. "${base_bindir}|${base_sbindir}|${bindir}|${sbindir}|${libexecdir}|"
|
||||||
MULTILIB_CHECK_FILE = "${WORKDIR}/multilib_check.py"
|
MULTILIB_CHECK_FILE = "${WORKDIR}/multilib_check.py"
|
||||||
MULTILIB_TEMP_ROOTFS = "${WORKDIR}/multilib"
|
MULTILIB_TEMP_ROOTFS = "${WORKDIR}/multilib"
|
||||||
@@ -473,98 +325,6 @@ multilib_sanity_check() {
|
|||||||
echo $@ | python ${MULTILIB_CHECK_FILE}
|
echo $@ | python ${MULTILIB_CHECK_FILE}
|
||||||
}
|
}
|
||||||
|
|
||||||
get_split_linguas() {
|
|
||||||
for translation in ${IMAGE_LINGUAS}; do
|
|
||||||
translation_split=$(echo ${translation} | awk -F '-' '{print $1}')
|
|
||||||
echo ${translation}
|
|
||||||
echo ${translation_split}
|
|
||||||
done | sort | uniq
|
|
||||||
}
|
|
||||||
|
|
||||||
rootfs_install_complementary() {
|
|
||||||
# Install complementary packages based upon the list of currently installed packages
|
|
||||||
# e.g. locales, *-dev, *-dbg, etc. This will only attempt to install these packages,
|
|
||||||
# if they don't exist then no error will occur.
|
|
||||||
# Note: every backend needs to call this function explicitly after the normal
|
|
||||||
# package installation
|
|
||||||
|
|
||||||
# Get list of installed packages
|
|
||||||
list_installed_packages arch > ${WORKDIR}/installed_pkgs.txt
|
|
||||||
|
|
||||||
# Apply the globs to all the packages currently installed
|
|
||||||
if [ -n "$1" -a "$1" = "populate_sdk" ] ; then
|
|
||||||
GLOBS="${SDKIMAGE_INSTALL_COMPLEMENTARY}"
|
|
||||||
elif [ -n "$1" ]; then
|
|
||||||
GLOBS="$@"
|
|
||||||
else
|
|
||||||
GLOBS="${IMAGE_INSTALL_COMPLEMENTARY}"
|
|
||||||
# Add locales
|
|
||||||
SPLIT_LINGUAS=`get_split_linguas`
|
|
||||||
PACKAGES_TO_INSTALL=""
|
|
||||||
for lang in $SPLIT_LINGUAS ; do
|
|
||||||
GLOBS="$GLOBS *-locale-$lang"
|
|
||||||
done
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ "$GLOBS" != "" ] ; then
|
|
||||||
# Use the magic script to do all the work for us :)
|
|
||||||
: > ${WORKDIR}/complementary_pkgs.txt
|
|
||||||
oe-pkgdata-util glob ${PKGDATA_DIR} ${WORKDIR}/installed_pkgs.txt "$GLOBS" >> ${WORKDIR}/complementary_pkgs.txt
|
|
||||||
|
|
||||||
# Install the packages, if any
|
|
||||||
sed -i '/^$/d' ${WORKDIR}/complementary_pkgs.txt
|
|
||||||
if [ -s ${WORKDIR}/complementary_pkgs.txt ]; then
|
|
||||||
echo "Installing complementary packages"
|
|
||||||
rootfs_install_packages ${WORKDIR}/complementary_pkgs.txt
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Workaround for broken shell function dependencies
|
|
||||||
if false ; then
|
|
||||||
get_split_linguas
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
rootfs_uninstall_unneeded () {
|
|
||||||
if ${@base_contains("IMAGE_FEATURES", "package-management", "false", "true", d)}; then
|
|
||||||
if [ -z "$(delayed_postinsts)" ]; then
|
|
||||||
# All packages were successfully configured.
|
|
||||||
# update-rc.d, base-passwd, run-postinsts are no further use, remove them now
|
|
||||||
remove_run_postinsts=false
|
|
||||||
if [ -e ${IMAGE_ROOTFS}${sbindir}/run-postinsts ]; then
|
|
||||||
remove_run_postinsts=true
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Remove package only if it's installed
|
|
||||||
pkgs_to_remove="update-rc.d base-passwd update-alternatives shadow ${ROOTFS_BOOTSTRAP_INSTALL}"
|
|
||||||
for pkg in $pkgs_to_remove; do
|
|
||||||
# regexp for pkg, to be used in grep and sed
|
|
||||||
pkg_regexp="^`echo $pkg | sed 's/\./\\\./'` "
|
|
||||||
if grep -q "$pkg_regexp" ${WORKDIR}/installed_pkgs.txt; then
|
|
||||||
rootfs_uninstall_packages $pkg
|
|
||||||
sed -i "/$pkg_regexp/d" ${WORKDIR}/installed_pkgs.txt
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
# Need to remove rc.d files for run-postinsts by hand since opkg won't
|
|
||||||
# call postrm scripts in offline root mode.
|
|
||||||
if $remove_run_postinsts; then
|
|
||||||
update-rc.d -f -r ${IMAGE_ROOTFS} run-postinsts remove
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
# Some packages were not successfully configured, save them only
|
|
||||||
# if we have run-postinsts script present. Otherwise, they're
|
|
||||||
# useless
|
|
||||||
if [ -e ${IMAGE_ROOTFS}${sbindir}/run-postinsts ]; then
|
|
||||||
save_postinsts
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Since no package manager is present in the image the metadata is not needed
|
|
||||||
remove_packaging_data_files
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# This function is intended to disallow empty root password if 'debug-tweaks' is not in IMAGE_FEATURES.
|
# This function is intended to disallow empty root password if 'debug-tweaks' is not in IMAGE_FEATURES.
|
||||||
zap_empty_root_password () {
|
zap_empty_root_password () {
|
||||||
if [ -e ${IMAGE_ROOTFS}/etc/shadow ]; then
|
if [ -e ${IMAGE_ROOTFS}/etc/shadow ]; then
|
||||||
|
|||||||
@@ -1,122 +1,9 @@
|
|||||||
def get_imagecmds(d):
|
|
||||||
cmds = "\n"
|
|
||||||
old_overrides = d.getVar('OVERRIDES', 0)
|
|
||||||
|
|
||||||
alltypes = d.getVar('IMAGE_FSTYPES', True).split()
|
|
||||||
types = []
|
|
||||||
ctypes = d.getVar('COMPRESSIONTYPES', True).split()
|
|
||||||
cimages = {}
|
|
||||||
|
|
||||||
# Image type b depends on a having been generated first
|
|
||||||
def addtypedepends(a, b):
|
|
||||||
if a in alltypes:
|
|
||||||
alltypes.remove(a)
|
|
||||||
if b not in alltypes:
|
|
||||||
alltypes.append(b)
|
|
||||||
alltypes.append(a)
|
|
||||||
|
|
||||||
# The elf image depends on the cpio.gz image already having
|
|
||||||
# been created, so we add that explicit ordering here.
|
|
||||||
addtypedepends("elf", "cpio.gz")
|
|
||||||
|
|
||||||
# jffs2 sumtool'd images need jffs2
|
|
||||||
addtypedepends("sum.jffs2", "jffs2")
|
|
||||||
|
|
||||||
# Filter out all the compressed images from alltypes
|
|
||||||
for type in alltypes:
|
|
||||||
basetype = None
|
|
||||||
for ctype in ctypes:
|
|
||||||
if type.endswith("." + ctype):
|
|
||||||
basetype = type[:-len("." + ctype)]
|
|
||||||
if basetype not in types:
|
|
||||||
types.append(basetype)
|
|
||||||
if basetype not in cimages:
|
|
||||||
cimages[basetype] = []
|
|
||||||
if ctype not in cimages[basetype]:
|
|
||||||
cimages[basetype].append(ctype)
|
|
||||||
break
|
|
||||||
if not basetype and type not in types:
|
|
||||||
types.append(type)
|
|
||||||
|
|
||||||
# Live and VMDK images will be processed via inheriting
|
|
||||||
# bbclass and does not get processed here.
|
|
||||||
# vmdk depend on live images also depend on ext3 so ensure its present
|
|
||||||
# Note: we need to ensure ext3 is in alltypes, otherwise, subimages may
|
|
||||||
# not contain ext3 and the .rootfs.ext3 file won't be created.
|
|
||||||
if "vmdk" in types:
|
|
||||||
if "ext3" not in types:
|
|
||||||
types.append("ext3")
|
|
||||||
if "ext3" not in alltypes:
|
|
||||||
alltypes.append("ext3")
|
|
||||||
types.remove("vmdk")
|
|
||||||
if "live" in types or "iso" in types or "hddimg" in types:
|
|
||||||
if "ext3" not in types:
|
|
||||||
types.append("ext3")
|
|
||||||
if "ext3" not in alltypes:
|
|
||||||
alltypes.append("ext3")
|
|
||||||
if "live" in types:
|
|
||||||
types.remove("live")
|
|
||||||
if "iso" in types:
|
|
||||||
types.remove("iso")
|
|
||||||
if "hddimg" in types:
|
|
||||||
types.remove("hddimg")
|
|
||||||
|
|
||||||
if d.getVar('IMAGE_LINK_NAME', True):
|
|
||||||
if d.getVar('RM_OLD_IMAGE', True) == "1":
|
|
||||||
# Remove the old image
|
|
||||||
cmds += "\trm -f `find ${DEPLOY_DIR_IMAGE} -maxdepth 1 -type l -name ${IMAGE_LINK_NAME}'.*' -exec readlink -f {} \;`"
|
|
||||||
# Remove the symlink
|
|
||||||
cmds += "\n\trm -f ${DEPLOY_DIR_IMAGE}/${IMAGE_LINK_NAME}.*"
|
|
||||||
|
|
||||||
for type in types:
|
|
||||||
ccmd = []
|
|
||||||
subimages = []
|
|
||||||
localdata = bb.data.createCopy(d)
|
|
||||||
localdata.setVar('OVERRIDES', '%s:%s' % (type, old_overrides))
|
|
||||||
bb.data.update_data(localdata)
|
|
||||||
localdata.setVar('type', type)
|
|
||||||
if type in cimages:
|
|
||||||
for ctype in cimages[type]:
|
|
||||||
ccmd.append("\t" + localdata.getVar("COMPRESS_CMD_" + ctype, True))
|
|
||||||
subimages.append(type + "." + ctype)
|
|
||||||
if type not in alltypes:
|
|
||||||
ccmd.append(localdata.expand("\trm ${IMAGE_NAME}.rootfs.${type}"))
|
|
||||||
else:
|
|
||||||
subimages.append(type)
|
|
||||||
localdata.setVar('ccmd', "\n".join(ccmd))
|
|
||||||
localdata.setVar('subimages', " ".join(subimages))
|
|
||||||
cmd = localdata.getVar("IMAGE_CMD", True)
|
|
||||||
localdata.setVar('cmd', cmd)
|
|
||||||
cmds += "\n" + localdata.getVar("runimagecmd", True)
|
|
||||||
return cmds
|
|
||||||
|
|
||||||
# The default aligment of the size of the rootfs is set to 1KiB. In case
|
# The default aligment of the size of the rootfs is set to 1KiB. In case
|
||||||
# you're using the SD card emulation of a QEMU system simulator you may
|
# you're using the SD card emulation of a QEMU system simulator you may
|
||||||
# set this value to 2048 (2MiB alignment).
|
# set this value to 2048 (2MiB alignment).
|
||||||
IMAGE_ROOTFS_ALIGNMENT ?= "1"
|
IMAGE_ROOTFS_ALIGNMENT ?= "1"
|
||||||
|
|
||||||
runimagecmd () {
|
|
||||||
# Image generation code for image type ${type}
|
|
||||||
# The base_size gets calculated:
|
|
||||||
# - initial size determined by `du -ks` of the IMAGE_ROOTFS
|
|
||||||
# - then multiplied by the IMAGE_OVERHEAD_FACTOR
|
|
||||||
# - tested against IMAGE_ROOTFS_SIZE
|
|
||||||
# - round up ROOTFS_SIZE to IMAGE_ROOTFS_ALIGNMENT
|
|
||||||
ROOTFS_SIZE=`du -ks ${IMAGE_ROOTFS} | awk '{base_size = $1 * ${IMAGE_OVERHEAD_FACTOR}; base_size = ((base_size > ${IMAGE_ROOTFS_SIZE} ? base_size : ${IMAGE_ROOTFS_SIZE}) + ${IMAGE_ROOTFS_EXTRA_SPACE}); if (base_size != int(base_size)) base_size = int(base_size + 1); base_size = base_size + ${IMAGE_ROOTFS_ALIGNMENT} - 1; base_size -= base_size % ${IMAGE_ROOTFS_ALIGNMENT}; print base_size }'`
|
|
||||||
${cmd}
|
|
||||||
# Now create the needed compressed versions
|
|
||||||
cd ${DEPLOY_DIR_IMAGE}/
|
|
||||||
${ccmd}
|
|
||||||
# And create the symlinks
|
|
||||||
if [ -n "${IMAGE_LINK_NAME}" ]; then
|
|
||||||
for type in ${subimages}; do
|
|
||||||
if [ -e ${IMAGE_NAME}.rootfs.$type ]; then
|
|
||||||
ln -s ${IMAGE_NAME}.rootfs.$type ${DEPLOY_DIR_IMAGE}/${IMAGE_LINK_NAME}.$type
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
def imagetypes_getdepends(d):
|
def imagetypes_getdepends(d):
|
||||||
def adddep(depstr, deps):
|
def adddep(depstr, deps):
|
||||||
for i in (depstr or "").split():
|
for i in (depstr or "").split():
|
||||||
|
|||||||
@@ -14,38 +14,6 @@ APTCONF_TARGET = "${WORKDIR}"
|
|||||||
|
|
||||||
APT_ARGS = "${@['', '--no-install-recommends'][d.getVar("NO_RECOMMENDATIONS", True) == "1"]}"
|
APT_ARGS = "${@['', '--no-install-recommends'][d.getVar("NO_RECOMMENDATIONS", True) == "1"]}"
|
||||||
|
|
||||||
#
|
|
||||||
# Update the Packages index files in ${DEPLOY_DIR_DEB}
|
|
||||||
#
|
|
||||||
package_update_index_deb () {
|
|
||||||
|
|
||||||
local debarchs=""
|
|
||||||
|
|
||||||
if [ ! -z "${DEPLOY_KEEP_PACKAGES}" ]; then
|
|
||||||
return
|
|
||||||
fi
|
|
||||||
|
|
||||||
for arch in ${PACKAGE_ARCHS} ${SDK_PACKAGE_ARCHS}; do
|
|
||||||
if [ -e ${DEPLOY_DIR_DEB}/$arch ]; then
|
|
||||||
debarchs="$debarchs $arch"
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
found=0
|
|
||||||
for arch in $debarchs; do
|
|
||||||
if [ ! -d ${DEPLOY_DIR_DEB}/$arch ]; then
|
|
||||||
continue;
|
|
||||||
fi
|
|
||||||
cd ${DEPLOY_DIR_DEB}/$arch
|
|
||||||
dpkg-scanpackages . | gzip > Packages.gz
|
|
||||||
echo "Label: $arch" > Release
|
|
||||||
found=1
|
|
||||||
done
|
|
||||||
if [ "$found" != "1" ]; then
|
|
||||||
bbfatal "There are no packages in ${DEPLOY_DIR_DEB}!"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# install a bunch of packages using apt
|
# install a bunch of packages using apt
|
||||||
# the following shell variables needs to be set before calling this func:
|
# the following shell variables needs to be set before calling this func:
|
||||||
@@ -57,120 +25,6 @@ package_update_index_deb () {
|
|||||||
# INSTALL_PACKAGES_LINGUAS_DEB - additional packages for uclibc
|
# INSTALL_PACKAGES_LINGUAS_DEB - additional packages for uclibc
|
||||||
# INSTALL_TASK_DEB - task name
|
# INSTALL_TASK_DEB - task name
|
||||||
|
|
||||||
package_install_internal_deb () {
|
|
||||||
|
|
||||||
local target_rootfs="${INSTALL_ROOTFS_DEB}"
|
|
||||||
local dpkg_arch="${INSTALL_BASEARCH_DEB}"
|
|
||||||
local archs="${INSTALL_ARCHS_DEB}"
|
|
||||||
local package_to_install="${INSTALL_PACKAGES_NORMAL_DEB}"
|
|
||||||
local package_attemptonly="${INSTALL_PACKAGES_ATTEMPTONLY_DEB}"
|
|
||||||
local package_linguas="${INSTALL_PACKAGES_LINGUAS_DEB}"
|
|
||||||
local task="${INSTALL_TASK_DEB}"
|
|
||||||
|
|
||||||
mkdir -p ${APTCONF_TARGET}/apt
|
|
||||||
rm -f ${APTCONF_TARGET}/apt/sources.list.rev
|
|
||||||
rm -f ${APTCONF_TARGET}/apt/preferences
|
|
||||||
|
|
||||||
priority=1
|
|
||||||
for arch in $archs; do
|
|
||||||
if [ ! -d ${DEPLOY_DIR_DEB}/$arch ]; then
|
|
||||||
continue;
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo "deb file:${DEPLOY_DIR_DEB}/$arch/ ./" >> ${APTCONF_TARGET}/apt/sources.list.rev
|
|
||||||
(echo "Package: *"
|
|
||||||
echo "Pin: release l=$arch"
|
|
||||||
echo "Pin-Priority: $(expr 800 + $priority)"
|
|
||||||
echo) >> ${APTCONF_TARGET}/apt/preferences
|
|
||||||
priority=$(expr $priority + 5)
|
|
||||||
done
|
|
||||||
|
|
||||||
for pkg in ${PACKAGE_EXCLUDE}; do
|
|
||||||
(echo "Package: $pkg"
|
|
||||||
echo "Pin: release *"
|
|
||||||
echo "Pin-Priority: -1"
|
|
||||||
echo) >> ${APTCONF_TARGET}/apt/preferences
|
|
||||||
done
|
|
||||||
|
|
||||||
tac ${APTCONF_TARGET}/apt/sources.list.rev > ${APTCONF_TARGET}/apt/sources.list
|
|
||||||
|
|
||||||
# The params in deb package control don't allow character `_', so
|
|
||||||
# change the arch's `_' to `-' in it.
|
|
||||||
dpkg_arch=`echo ${dpkg_arch} | sed 's/_/-/g'`
|
|
||||||
cat "${STAGING_ETCDIR_NATIVE}/apt/apt.conf.sample" \
|
|
||||||
| sed -e "s#Architecture \".*\";#Architecture \"${dpkg_arch}\";#" \
|
|
||||||
| sed -e "s:#ROOTFS#:${target_rootfs}:g" \
|
|
||||||
| sed -e "s:#APTCONF#:${APTCONF_TARGET}/apt:g" \
|
|
||||||
> "${APTCONF_TARGET}/apt/apt.conf"
|
|
||||||
|
|
||||||
export APT_CONFIG="${APTCONF_TARGET}/apt/apt.conf"
|
|
||||||
|
|
||||||
mkdir -p ${target_rootfs}/var/lib/dpkg/info
|
|
||||||
mkdir -p ${target_rootfs}/var/lib/dpkg/updates
|
|
||||||
|
|
||||||
> ${target_rootfs}/var/lib/dpkg/status
|
|
||||||
> ${target_rootfs}/var/lib/dpkg/available
|
|
||||||
|
|
||||||
apt-get update
|
|
||||||
|
|
||||||
if [ ! -z "${package_linguas}" ]; then
|
|
||||||
for i in ${package_linguas}; do
|
|
||||||
apt-get ${APT_ARGS} install $i --force-yes --allow-unauthenticated
|
|
||||||
if [ $? -ne 0 ]; then
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
fi
|
|
||||||
|
|
||||||
# normal install
|
|
||||||
if [ ! -z "${package_to_install}" ]; then
|
|
||||||
apt-get ${APT_ARGS} install ${package_to_install} --force-yes --allow-unauthenticated
|
|
||||||
if [ $? -ne 0 ]; then
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Attempt to correct the probable broken dependencies in place.
|
|
||||||
apt-get ${APT_ARGS} -f install
|
|
||||||
if [ $? -ne 0 ]; then
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
rm -f `dirname ${BB_LOGFILE}`/log.do_${task}-attemptonly.${PID}
|
|
||||||
if [ ! -z "${package_attemptonly}" ]; then
|
|
||||||
for i in ${package_attemptonly}; do
|
|
||||||
apt-get ${APT_ARGS} install $i --force-yes --allow-unauthenticated >> `dirname ${BB_LOGFILE}`/log.do_${task}-attemptonly.${PID} 2>&1 || true
|
|
||||||
done
|
|
||||||
fi
|
|
||||||
|
|
||||||
find ${target_rootfs} -name \*.dpkg-new | for i in `cat`; do
|
|
||||||
mv $i `echo $i | sed -e's,\.dpkg-new$,,'`
|
|
||||||
done
|
|
||||||
|
|
||||||
# Mark all packages installed
|
|
||||||
sed -i -e "s/Status: install ok unpacked/Status: install ok installed/;" ${target_rootfs}/var/lib/dpkg/status
|
|
||||||
}
|
|
||||||
|
|
||||||
deb_log_check() {
|
|
||||||
target="$1"
|
|
||||||
lf_path="$2"
|
|
||||||
|
|
||||||
lf_txt="`cat $lf_path`"
|
|
||||||
for keyword_die in "^E:"
|
|
||||||
do
|
|
||||||
if (echo "$lf_txt" | grep -v log_check | grep "$keyword_die") >/dev/null 2>&1
|
|
||||||
then
|
|
||||||
echo "log_check: There were error messages in the logfile"
|
|
||||||
printf "log_check: Matched keyword: [$keyword_die]\n\n"
|
|
||||||
echo "$lf_txt" | grep -v log_check | grep -C 5 -i "$keyword_die"
|
|
||||||
echo ""
|
|
||||||
do_exit=1
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
test "$do_exit" = 1 && exit 1
|
|
||||||
true
|
|
||||||
}
|
|
||||||
|
|
||||||
python do_package_deb () {
|
python do_package_deb () {
|
||||||
import re, copy
|
import re, copy
|
||||||
import textwrap
|
import textwrap
|
||||||
|
|||||||
@@ -21,118 +21,3 @@ DEB_POSTPROCESS_COMMANDS = ""
|
|||||||
|
|
||||||
opkglibdir = "${localstatedir}/lib/opkg"
|
opkglibdir = "${localstatedir}/lib/opkg"
|
||||||
|
|
||||||
deb_package_setflag() {
|
|
||||||
sed -i -e "/^Package: $2\$/{n; s/Status: install ok .*/Status: install ok $1/;}" ${IMAGE_ROOTFS}/var/lib/dpkg/status
|
|
||||||
}
|
|
||||||
|
|
||||||
deb_package_getflag() {
|
|
||||||
cat ${IMAGE_ROOTFS}/var/lib/dpkg/status | sed -n -e "/^Package: $2\$/{n; s/Status: install ok .*/$1/; p}"
|
|
||||||
}
|
|
||||||
|
|
||||||
fakeroot rootfs_deb_do_rootfs () {
|
|
||||||
set +e
|
|
||||||
|
|
||||||
mkdir -p ${IMAGE_ROOTFS}/var/lib/dpkg/alternatives
|
|
||||||
|
|
||||||
# update index
|
|
||||||
package_update_index_deb
|
|
||||||
|
|
||||||
#install packages
|
|
||||||
export INSTALL_ROOTFS_DEB="${IMAGE_ROOTFS}"
|
|
||||||
export INSTALL_BASEARCH_DEB="${DPKG_ARCH}"
|
|
||||||
export INSTALL_ARCHS_DEB="${PACKAGE_ARCHS}"
|
|
||||||
export INSTALL_PACKAGES_NORMAL_DEB="${PACKAGE_INSTALL}"
|
|
||||||
export INSTALL_PACKAGES_ATTEMPTONLY_DEB="${PACKAGE_INSTALL_ATTEMPTONLY}"
|
|
||||||
export INSTALL_PACKAGES_LINGUAS_DEB="${LINGUAS_INSTALL}"
|
|
||||||
export INSTALL_TASK_DEB="rootfs"
|
|
||||||
|
|
||||||
package_install_internal_deb
|
|
||||||
${DEB_POSTPROCESS_COMMANDS}
|
|
||||||
|
|
||||||
rootfs_install_complementary
|
|
||||||
|
|
||||||
export D=${IMAGE_ROOTFS}
|
|
||||||
export OFFLINE_ROOT=${IMAGE_ROOTFS}
|
|
||||||
export IPKG_OFFLINE_ROOT=${IMAGE_ROOTFS}
|
|
||||||
export OPKG_OFFLINE_ROOT=${IMAGE_ROOTFS}
|
|
||||||
export INTERCEPT_DIR=${WORKDIR}/intercept_scripts
|
|
||||||
export NATIVE_ROOT=${STAGING_DIR_NATIVE}
|
|
||||||
|
|
||||||
# Attempt to run preinsts
|
|
||||||
# Mark packages with preinst failures as unpacked
|
|
||||||
for i in ${IMAGE_ROOTFS}/var/lib/dpkg/info/*.preinst; do
|
|
||||||
if [ -f $i ] && ! sh $i; then
|
|
||||||
deb_package_setflag unpacked `basename $i .preinst`
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
# Attempt to run postinsts
|
|
||||||
# Mark packages with postinst failures as unpacked
|
|
||||||
for i in ${IMAGE_ROOTFS}/var/lib/dpkg/info/*.postinst; do
|
|
||||||
if [ -f $i ] && ! sh $i configure; then
|
|
||||||
deb_package_setflag unpacked `basename $i .postinst`
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
set -e
|
|
||||||
|
|
||||||
install -d ${IMAGE_ROOTFS}/${sysconfdir}
|
|
||||||
echo ${BUILDNAME} > ${IMAGE_ROOTFS}/${sysconfdir}/version
|
|
||||||
|
|
||||||
# Hacks to allow opkg's update-alternatives and opkg to coexist for now
|
|
||||||
mkdir -p ${IMAGE_ROOTFS}${opkglibdir}
|
|
||||||
if [ -e ${IMAGE_ROOTFS}/var/lib/dpkg/alternatives ]; then
|
|
||||||
rmdir ${IMAGE_ROOTFS}/var/lib/dpkg/alternatives
|
|
||||||
fi
|
|
||||||
ln -s ${opkglibdir}/alternatives ${IMAGE_ROOTFS}/var/lib/dpkg/alternatives
|
|
||||||
ln -s /var/lib/dpkg/info ${IMAGE_ROOTFS}${opkglibdir}/info
|
|
||||||
ln -s /var/lib/dpkg/status ${IMAGE_ROOTFS}${opkglibdir}/status
|
|
||||||
|
|
||||||
${ROOTFS_POSTPROCESS_COMMAND}
|
|
||||||
|
|
||||||
if ${@base_contains("IMAGE_FEATURES", "read-only-rootfs", "true", "false" ,d)}; then
|
|
||||||
delayed_postinsts="$(delayed_postinsts)"
|
|
||||||
if [ -n "$delayed_postinsts" ]; then
|
|
||||||
bberror "The following packages could not be configured offline and rootfs is read-only: $delayed_postinsts"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
log_check rootfs
|
|
||||||
}
|
|
||||||
|
|
||||||
rootfs_deb_do_rootfs[vardeps] += "delayed_postinsts"
|
|
||||||
|
|
||||||
delayed_postinsts () {
|
|
||||||
cat ${IMAGE_ROOTFS}/var/lib/dpkg/status|grep -e "^Package:" -e "^Status:"|sed -ne 'N;s/Package: \(.*\)\nStatus:.*unpacked/\1/p'
|
|
||||||
}
|
|
||||||
|
|
||||||
save_postinsts () {
|
|
||||||
# Scripts need to be ordered when executed, this ensures numeric order
|
|
||||||
# If we ever run into needing more the 899 scripts, we'll have to
|
|
||||||
# change num to start with 1000.
|
|
||||||
num=100
|
|
||||||
for p in $(delayed_postinsts); do
|
|
||||||
install -d ${IMAGE_ROOTFS}${sysconfdir}/deb-postinsts
|
|
||||||
cp ${IMAGE_ROOTFS}/var/lib/dpkg/info/$p.postinst ${IMAGE_ROOTFS}${sysconfdir}/deb-postinsts/$num-$p
|
|
||||||
num=`echo \$((num+1))`
|
|
||||||
done
|
|
||||||
}
|
|
||||||
|
|
||||||
remove_packaging_data_files() {
|
|
||||||
rm -rf ${IMAGE_ROOTFS}${opkglibdir}
|
|
||||||
rm -rf ${IMAGE_ROOTFS}/var/lib/dpkg/
|
|
||||||
}
|
|
||||||
|
|
||||||
rootfs_install_packages() {
|
|
||||||
${STAGING_BINDIR_NATIVE}/apt-get ${APT_ARGS} install `cat $1` --force-yes --allow-unauthenticated
|
|
||||||
|
|
||||||
# Mark all packages installed
|
|
||||||
sed -i -e "s/Status: install ok unpacked/Status: install ok installed/;" $INSTALL_ROOTFS_DEB/var/lib/dpkg/status
|
|
||||||
}
|
|
||||||
|
|
||||||
rootfs_uninstall_packages() {
|
|
||||||
# for some reason, --root doesn't really work here... We use --admindir&--instdir instead.
|
|
||||||
${STAGING_BINDIR_NATIVE}/dpkg --admindir=${IMAGE_ROOTFS}/var/lib/dpkg --instdir=${IMAGE_ROOTFS} -r --force-depends $@
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user