mirror of
https://git.yoctoproject.org/poky
synced 2026-02-14 12:43:03 +01:00
When a package is built, some installation scripts must be performed on the target. In the case of a complete image, these scripts are run by a separate step at init time, but only during the first boot (other package install scripts can just be run when the package is installed on the target). This patch lets the distribution (or user) decide when these postponed install scripts should run. The default is normally near the end of init, but there may be times when it's beneficial to run them earlier so the "when" can be overridden. (From OE-Core rev: a46466893407d44dd16ab37ae70e1bee14bdde0a) Signed-off-by: Gary Thomas <gary@mlbassoc.com> Signed-off-by: Saul Wold <sgw@linux.intel.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
207 lines
6.1 KiB
Plaintext
207 lines
6.1 KiB
Plaintext
#
|
|
# Creates a root filesystem out of rpm packages
|
|
#
|
|
|
|
ROOTFS_PKGMANAGE = "rpm zypper"
|
|
# Postinstalls on device are handled within this class at present
|
|
ROOTFS_PKGMANAGE_BOOTSTRAP = ""
|
|
|
|
do_rootfs[depends] += "rpm-native:do_populate_sysroot"
|
|
|
|
# Needed for update-alternatives
|
|
do_rootfs[depends] += "opkg-native:do_populate_sysroot"
|
|
|
|
# Creating the repo info in do_rootfs
|
|
#do_rootfs[depends] += "createrepo-native:do_populate_sysroot"
|
|
|
|
do_rootfs[recrdeptask] += "do_package_write_rpm"
|
|
|
|
AWKPOSTINSTSCRIPT = "${COREBASE}/scripts/rootfs_rpm-extract-postinst.awk"
|
|
|
|
RPM_PREPROCESS_COMMANDS = "package_update_index_rpm; package_generate_rpm_conf; "
|
|
RPM_POSTPROCESS_COMMANDS = ""
|
|
|
|
# To test the install_all_locales.. enable the following...
|
|
#RPM_POSTPROCESS_COMMANDS = "install_all_locales; "
|
|
#
|
|
#IMAGE_LOCALES="en-gb"
|
|
|
|
#
|
|
# Allow distributions to alter when [postponed] package install scripts are run
|
|
#
|
|
POSTINSTALL_INITPOSITION ?= "98"
|
|
|
|
rpmlibdir = "/var/lib/rpm"
|
|
opkglibdir = "${localstatedir}/lib/opkg"
|
|
|
|
RPMOPTS="--dbpath ${rpmlibdir} --define='_openall_before_chroot 1'"
|
|
RPM="rpm ${RPMOPTS}"
|
|
|
|
# RPM doesn't work with multiple rootfs generation at once due to collisions in the use of files
|
|
# in ${DEPLOY_DIR_RPM}. This can be removed if package_update_index_rpm can be called concurrently
|
|
do_rootfs[lockfiles] += "${DEPLOY_DIR_RPM}/rpm.lock"
|
|
|
|
fakeroot rootfs_rpm_do_rootfs () {
|
|
#set +x
|
|
|
|
${RPM_PREPROCESS_COMMANDS}
|
|
|
|
#createrepo "${DEPLOY_DIR_RPM}"
|
|
|
|
# Setup base system configuration
|
|
mkdir -p ${IMAGE_ROOTFS}/etc/rpm/
|
|
|
|
mkdir -p ${IMAGE_ROOTFS}${rpmlibdir}
|
|
mkdir -p ${IMAGE_ROOTFS}${rpmlibdir}/log
|
|
cat > ${IMAGE_ROOTFS}${rpmlibdir}/DB_CONFIG << EOF
|
|
# ================ Environment
|
|
set_data_dir .
|
|
set_create_dir .
|
|
set_lg_dir ./log
|
|
set_tmp_dir ./tmp
|
|
|
|
# -- thread_count must be >= 8
|
|
set_thread_count 64
|
|
|
|
# ================ Logging
|
|
|
|
# ================ Memory Pool
|
|
set_mp_mmapsize 268435456
|
|
|
|
# ================ Locking
|
|
set_lk_max_locks 16384
|
|
set_lk_max_lockers 16384
|
|
set_lk_max_objects 16384
|
|
mutex_set_max 163840
|
|
|
|
# ================ Replication
|
|
EOF
|
|
|
|
#install pacakges
|
|
export INSTALL_ROOTFS_RPM="${IMAGE_ROOTFS}"
|
|
export INSTALL_PLATFORM_RPM="${TARGET_ARCH}"
|
|
export INSTALL_CONFBASE_RPM="${RPMCONF_TARGET_BASE}"
|
|
export INSTALL_PACKAGES_NORMAL_RPM="${PACKAGE_INSTALL}"
|
|
export INSTALL_PACKAGES_ATTEMPTONLY_RPM="${PACKAGE_INSTALL_ATTEMPTONLY}"
|
|
export INSTALL_PACKAGES_LINGUAS_RPM="${LINGUAS_INSTALL}"
|
|
export INSTALL_PROVIDENAME_RPM=""
|
|
export INSTALL_TASK_RPM="populate_sdk"
|
|
|
|
# List must be prefered to least preferred order
|
|
INSTALL_PLATFORM_EXTRA_RPM=""
|
|
for each_arch in ${PACKAGE_ARCHS} ; do
|
|
INSTALL_PLATFORM_EXTRA_RPM="$each_arch $INSTALL_PLATFORM_EXTRA_RPM"
|
|
done
|
|
export INSTALL_PLATFORM_RPM
|
|
|
|
package_install_internal_rpm
|
|
|
|
export D=${IMAGE_ROOTFS}
|
|
export OFFLINE_ROOT=${IMAGE_ROOTFS}
|
|
export IPKG_OFFLINE_ROOT=${IMAGE_ROOTFS}
|
|
export OPKG_OFFLINE_ROOT=${IMAGE_ROOTFS}
|
|
|
|
${ROOTFS_POSTINSTALL_COMMAND}
|
|
|
|
mkdir -p ${IMAGE_ROOTFS}/etc/rpm-postinsts/
|
|
${RPM} --root ${IMAGE_ROOTFS} -D '_dbpath ${rpmlibdir}' -qa \
|
|
-D "__dbi_txn create nofsync private" \
|
|
--qf 'Name: %{NAME}\n%|POSTIN?{postinstall scriptlet%|POSTINPROG?{ (using %{POSTINPROG})}|:\n%{POSTIN}\n}:{%|POSTINPROG?{postinstall program: %{POSTINPROG}\n}|}|' \
|
|
> ${IMAGE_ROOTFS}/etc/rpm-postinsts/combined
|
|
awk -f ${AWKPOSTINSTSCRIPT} < ${IMAGE_ROOTFS}/etc/rpm-postinsts/combined
|
|
rm ${IMAGE_ROOTFS}/etc/rpm-postinsts/combined
|
|
|
|
for i in ${IMAGE_ROOTFS}/etc/rpm-postinsts/*.sh; do
|
|
if [ -f $i ] && sh $i; then
|
|
# rm $i
|
|
mv $i $i.done
|
|
fi
|
|
done
|
|
|
|
install -d ${IMAGE_ROOTFS}/${sysconfdir}/rcS.d
|
|
# Stop $i getting expanded below...
|
|
i=\$i
|
|
cat > ${IMAGE_ROOTFS}${sysconfdir}/rcS.d/S${POSTINSTALL_INITPOSITION}configure << EOF
|
|
#!/bin/sh
|
|
for i in /etc/rpm-postinsts/*.sh; do
|
|
echo "Running postinst $i..."
|
|
if [ -f $i ] && sh $i; then
|
|
# rm $i
|
|
mv $i $i.done
|
|
else
|
|
echo "ERROR: postinst $i failed."
|
|
fi
|
|
done
|
|
rm -f ${sysconfdir}/rcS.d/S${POSTINSTALL_INITPOSITION}configure
|
|
EOF
|
|
chmod 0755 ${IMAGE_ROOTFS}${sysconfdir}/rcS.d/S${POSTINSTALL_INITPOSITION}configure
|
|
|
|
install -d ${IMAGE_ROOTFS}/${sysconfdir}
|
|
echo ${BUILDNAME} > ${IMAGE_ROOTFS}/${sysconfdir}/version
|
|
|
|
${RPM_POSTPROCESS_COMMANDS}
|
|
${ROOTFS_POSTPROCESS_COMMAND}
|
|
|
|
rm -rf ${IMAGE_ROOTFS}/var/cache2/
|
|
rm -rf ${IMAGE_ROOTFS}/var/run2/
|
|
rm -rf ${IMAGE_ROOTFS}/var/log2/
|
|
|
|
# remove lock files
|
|
rm -f ${IMAGE_ROOTFS}${rpmlibdir}/__db.*
|
|
|
|
# Move manifests into the directory with the logs
|
|
mv ${IMAGE_ROOTFS}/install/*.manifest ${T}/
|
|
|
|
# Remove all remaining resolver files
|
|
rm -rf ${IMAGE_ROOTFS}/install
|
|
|
|
log_check rootfs
|
|
|
|
# Workaround so the parser knows we need the resolve_package function!
|
|
if false ; then
|
|
resolve_package_rpm foo ${RPMCONF_TARGET_BASE}.conf || true
|
|
fi
|
|
}
|
|
|
|
remove_packaging_data_files() {
|
|
rm -rf ${IMAGE_ROOTFS}${rpmlibdir}
|
|
rm -rf ${IMAGE_ROOTFS}${opkglibdir}
|
|
}
|
|
|
|
|
|
install_all_locales() {
|
|
PACKAGES_TO_INSTALL=""
|
|
|
|
# Generate list of installed packages...
|
|
INSTALLED_PACKAGES=$( \
|
|
${RPM} --root ${IMAGE_ROOTFS} -D "_dbpath ${rpmlibdir}" \
|
|
-D "__dbi_txn create nofsync private" \
|
|
-qa --qf "[%{NAME}\n]" | egrep -v -- "(-locale-|-dev$|-doc$|^kernel|^glibc|^ttf|^task|^perl|^python)" \
|
|
)
|
|
|
|
# This would likely be faster if we did it in one transaction
|
|
# but this should be good enough for the few users of this function...
|
|
for pkg in $INSTALLED_PACKAGES; do
|
|
for lang in ${IMAGE_LOCALES}; do
|
|
pkg_name=$(resolve_package_rpm $pkg-locale-$lang ${RPMCONF_TARGET_BASE}.conf)
|
|
if [ -n "$pkg_name" ]; then
|
|
${RPM} --root ${IMAGE_ROOTFS} -D "_dbpath ${rpmlibdir}" \
|
|
-D "__dbi_txn create nofsync private" \
|
|
--noscripts --notriggers --noparentdirs --nolinktos \
|
|
-Uhv $pkg_name || true
|
|
fi
|
|
done
|
|
done
|
|
}
|
|
|
|
python () {
|
|
if bb.data.getVar('BUILD_IMAGES_FROM_FEEDS', d, True):
|
|
flags = bb.data.getVarFlag('do_rootfs', 'recrdeptask', d)
|
|
flags = flags.replace("do_package_write_rpm", "")
|
|
flags = flags.replace("do_deploy", "")
|
|
flags = flags.replace("do_populate_sysroot", "")
|
|
bb.data.setVarFlag('do_rootfs', 'recrdeptask', flags, d)
|
|
bb.data.setVar('RPM_PREPROCESS_COMMANDS', '', d)
|
|
bb.data.setVar('RPM_POSTPROCESS_COMMANDS', '', d)
|
|
}
|