summaryrefslogtreecommitdiff
path: root/meta/classes/rootfs_rpm.bbclass
diff options
context:
space:
mode:
Diffstat (limited to 'meta/classes/rootfs_rpm.bbclass')
-rw-r--r--meta/classes/rootfs_rpm.bbclass331
1 files changed, 164 insertions, 167 deletions
diff --git a/meta/classes/rootfs_rpm.bbclass b/meta/classes/rootfs_rpm.bbclass
index 1e8ad6d9e..9039b21a0 100644
--- a/meta/classes/rootfs_rpm.bbclass
+++ b/meta/classes/rootfs_rpm.bbclass
@@ -2,170 +2,129 @@
# Creates a root filesystem out of rpm packages
#
-ROOTFS_PKGMANAGE = "rpm yum"
+ROOTFS_PKGMANAGE = "rpm zypper"
-ROOTFS_PKGMANAGE_BOOTSTRAP = "run-postinsts"
+# Add 50Meg of extra space for zypper database space
+IMAGE_ROOTFS_EXTRA_SPACE_append = "${@base_contains("PACKAGE_INSTALL", "zypper", " + 51200", "" ,d)}"
-do_rootfs[depends] += "rpm-native:do_populate_staging yum-native:do_populate_staging createrepo-native:do_populate_staging fakechroot-native:do_populate_staging"
+# Postinstalls on device are handled within this class at present
+ROOTFS_PKGMANAGE_BOOTSTRAP = ""
-# Needed for update-alternatives
-do_rootfs[depends] += "opkg-native:do_populate_staging"
-
-do_rootfs[recrdeptask] += "do_package_write_rpm"
+do_rootfs[depends] += "rpm-native:do_populate_sysroot"
-YUMCONF = "${IMAGE_ROOTFS}/etc/yum.conf"
-YUMARGS = "--disablerepo=* --enablerepo=poky-feed-* --installroot ${IMAGE_ROOTFS}"
-export YUM_ARCH_FORCE = "${TARGET_ARCH}"
-
-AWKPOSTINSTSCRIPT = "${STAGING_BINDIR_NATIVE}/extract-postinst.awk"
+# Needed for update-alternatives
+do_rootfs[depends] += "opkg-native:do_populate_sysroot"
-RPM_PREPROCESS_COMMANDS = ""
-RPM_POSTPROCESS_COMMANDS = "rpm_insert_feeds_uris"
+# Creating the repo info in do_rootfs
+#do_rootfs[depends] += "createrepo-native:do_populate_sysroot"
-rpm_insert_feeds_uris () {
+do_rootfs[recrdeptask] += "do_package_write_rpm"
- echo "Building from feeds activated!"
+RPM_PREPROCESS_COMMANDS = "package_update_index_rpm; package_generate_rpm_conf; "
+RPM_POSTPROCESS_COMMANDS = "rootfs_install_all_locales; "
- mkdir -p ${IMAGE_ROOTFS}/etc/yum/repos.d/
- for line in ${RPM_FEED_URIS}
- do
- # strip leading and trailing spaces/tabs, then split into name and uri
- line_clean="`echo "$line"|sed 's/^[ \t]*//;s/[ \t]*$//'`"
- feed_name="`echo "$line_clean" | sed -n 's/\(.*\)##\(.*\)/\1/p'`"
- feed_uri="`echo "$line_clean" | sed -n 's/\(.*\)##\(.*\)/\2/p'`"
+#
+# Allow distributions to alter when [postponed] package install scripts are run
+#
+POSTINSTALL_INITPOSITION ?= "98"
- echo "Added $feed_name feed with URL $feed_uri"
+rpmlibdir = "/var/lib/rpm"
+opkglibdir = "${localstatedir}/lib/opkg"
- FEED_FILE=${IMAGE_ROOTFS}/etc/yum/repos.d/$feed_name
+RPMOPTS="--dbpath ${rpmlibdir} --define='_openall_before_chroot 1'"
+RPM="rpm ${RPMOPTS}"
- echo "[poky-feed-$feed_name]" >> $FEED_FILE
- echo "name = $feed_name" >> $FEED_FILE
- echo "baseurl = $feed_uri" >> $FEED_FILE
- echo "gpgcheck = 0" >> $FEED_FILE
- done
-}
+# 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}
-
- mkdir -p ${IMAGE_ROOTFS}/etc/rpm/
- echo "${TARGET_ARCH}-linux" >${IMAGE_ROOTFS}/etc/rpm/platform
+ set +x
- # Generate an apprpriate yum.conf
- rm -rf ${YUMCONF}
- cat > ${YUMCONF} << EOF
-[main]
-cachedir=/var/cache2/yum
-keepcache=1
-debuglevel=10
-logfile=/var/log2/yum.log
-exactarch=0
-obsoletes=1
-tolerant=1
+ ${RPM_PREPROCESS_COMMANDS}
-EOF
+ #createrepo "${DEPLOY_DIR_RPM}"
- #priority=1
- mkdir -p ${IMAGE_ROOTFS}${DEPLOY_DIR_RPM}
+ # install packages
+ # This needs to work in the same way as populate_sdk_rpm.bbclass!
+ export INSTALL_ROOTFS_RPM="${IMAGE_ROOTFS}"
+ export INSTALL_PLATFORM_RPM="${TARGET_ARCH}"
+ export INSTALL_CONFBASE_RPM="${RPMCONF_TARGET_BASE}"
+ export INSTALL_PACKAGES_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="rootfs_rpm_do_rootfs"
- for arch in ${PACKAGE_ARCHS}; do
- if [ ! -d ${DEPLOY_DIR_RPM}/$arch ]; then
- continue;
- fi
- createrepo ${DEPLOY_DIR_RPM}/$arch
+ # Setup base system configuration
+ mkdir -p ${INSTALL_ROOTFS_RPM}/etc/rpm/
- echo "[poky-feed-$arch]" >> ${YUMCONF}
- echo "name = Poky RPM $arch Feed" >> ${YUMCONF}
- echo "baseurl=file://${DEPLOY_DIR_RPM}/$arch" >> ${YUMCONF}
- echo "gpgcheck=0" >> ${YUMCONF}
- echo "" >> ${YUMCONF}
- #priority=$(expr $priority + 5)
-
- # Copy the packages into the target image
- # Ugly ugly ugly but rpm is braindead and can't see outside the chroot
- # when installing :(
- cp -r ${DEPLOY_DIR_RPM}/$arch ${IMAGE_ROOTFS}${DEPLOY_DIR_RPM}/
- done
+ mkdir -p ${INSTALL_ROOTFS_RPM}${rpmlibdir}
+ mkdir -p ${INSTALL_ROOTFS_RPM}${rpmlibdir}/log
+ # After change the __db.* cache size, log file will not be generated automatically,
+ # that will raise some warnings, so touch a bare log for rpm write into it.
+ touch ${INSTALL_ROOTFS_RPM}${rpmlibdir}/log/log.0000000001
+ cat > ${INSTALL_ROOTFS_RPM}${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
- #mkdir -p ${IMAGE_ROOTFS}/var/lib/rpm
- #rpm --root ${IMAGE_ROOTFS} --initdb
- #rpm --root ${IMAGE_ROOTFS} --dbpath ${IMAGE_ROOTFS}/var/lib/rpm -ihv --nodeps --ignoreos
- #rpm -ihv --root ${IMAGE_ROOTFS} ${PACKAGE_INSTALL}
+# ================ Logging
- #package_update_index_rpm
- #package_generate_ipkg_conf
+# ================ Memory Pool
+set_mp_mmapsize 268435456
- # Uclibc builds don't provide this stuff...
- if [ x${TARGET_OS} = "xlinux" ] || [ x${TARGET_OS} = "xlinux-gnueabi" ] ; then
- if [ ! -z "${LINGUAS_INSTALL}" ]; then
- for i in ${LINGUAS_INSTALL}; do
- fakechroot yum ${YUMARGS} -y install $i
- done
- fi
- fi
- if [ ! -z "${PACKAGE_INSTALL}" ]; then
- fakechroot yum ${YUMARGS} -y install ${PACKAGE_INSTALL}
- fi
-
- if [ ! -z "${PACKAGE_INSTALL_ATTEMPTONLY}" ]; then
- fakechroot yum ${YUMARGS} -y install ${PACKAGE_INSTALL_ATTEMPTONLY} > ${WORKDIR}/temp/log.do_rootfs-attemptonly.${PID} || true
- fi
+# ================ Locking
+set_lk_max_locks 16384
+set_lk_max_lockers 16384
+set_lk_max_objects 16384
+mutex_set_max 163840
- # Add any recommended packages to the image
- # (added as an extra script since yum itself doesn't support this)
- yum-install-recommends.py ${IMAGE_ROOTFS} "fakechroot yum ${YUMARGS} -y install"
+# ================ Replication
+EOF
- # Symlinks created under fakeroot are wrong, now we have to fix them...
- cd ${IMAGE_ROOTFS}
- for f in `find . -type l -print`
- do
- link=`readlink $f | sed -e 's#${IMAGE_ROOTFS}##'`
- rm $f
- ln -s $link $f
+ # List must be prefered to least preferred order
+ INSTALL_PLATFORM_EXTRA_RPM=""
+ for each_arch in ${MULTILIB_PACKAGE_ARCHS} ${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}
- #mkdir -p ${IMAGE_ROOTFS}/etc/opkg/
- #grep "^arch" ${IPKGCONF_TARGET} >${IMAGE_ROOTFS}/etc/opkg/arch.conf
-
${ROOTFS_POSTINSTALL_COMMAND}
- mkdir -p ${IMAGE_ROOTFS}/etc/rpm-postinsts/
- rpm --root ${IMAGE_ROOTFS} -aq --queryformat 'Name: %{NAME}\n' --scripts > ${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
+ # Report delayed package scriptlets
+ for i in ${IMAGE_ROOTFS}/etc/rpm-postinsts/*; do
+ echo "Delayed package scriptlet: `head -n 3 $i | tail -n 1`"
done
install -d ${IMAGE_ROOTFS}/${sysconfdir}/rcS.d
# Stop $i getting expanded below...
i=\$i
- cat > ${IMAGE_ROOTFS}${sysconfdir}/rcS.d/S98configure << EOF
+ cat > ${IMAGE_ROOTFS}${sysconfdir}/rcS.d/S${POSTINSTALL_INITPOSITION}run-postinsts << EOF
#!/bin/sh
-for i in /etc/rpm-postinsts/*.sh; do
+for i in /etc/rpm-postinsts/*; do
echo "Running postinst $i..."
- if [ -f $i ] && sh $i; then
- # rm $i
- mv $i $i.done
+ if [ -f $i ] && $i; then
+ rm $i
else
echo "ERROR: postinst $i failed."
fi
done
-rm -f ${sysconfdir}/rcS.d/S98configure
+rm -f ${sysconfdir}/rcS.d/S${POSTINSTALL_INITPOSITION}run-postinsts
EOF
- chmod 0755 ${IMAGE_ROOTFS}${sysconfdir}/rcS.d/S98configure
+ chmod 0755 ${IMAGE_ROOTFS}${sysconfdir}/rcS.d/S${POSTINSTALL_INITPOSITION}run-postinsts
install -d ${IMAGE_ROOTFS}/${sysconfdir}
echo ${BUILDNAME} > ${IMAGE_ROOTFS}/${sysconfdir}/version
@@ -176,71 +135,109 @@ EOF
rm -rf ${IMAGE_ROOTFS}/var/cache2/
rm -rf ${IMAGE_ROOTFS}/var/run2/
rm -rf ${IMAGE_ROOTFS}/var/log2/
- rm -rf ${IMAGE_ROOTFS}${DEPLOY_DIR_RPM}/
# remove lock files
- rm -f ${IMAGE_ROOTFS}/var/lib/rpm/__db.*
+ rm -f ${IMAGE_ROOTFS}${rpmlibdir}/__db.*
- # remove no longer used yum.conf
- rm -f ${IMAGE_ROOTFS}/etc/yum.conf
+ # Move manifests into the directory with the logs
+ mv ${IMAGE_ROOTFS}/install/*.manifest ${T}/
- log_check rootfs
-}
+ # Remove all remaining resolver files
+ rm -rf ${IMAGE_ROOTFS}/install
-rootfs_rpm_log_check() {
- target="$1"
- lf_path="$2"
+ log_check rootfs
- lf_txt="`cat $lf_path`"
- for keyword_die in "Cannot find package" "exit 1" ERR Fail
- 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"
- echo -e "log_check: Matched keyword: [$keyword_die]\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
+ # 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}/usr/lib/opkg/
+ rm -rf ${IMAGE_ROOTFS}${rpmlibdir}
+ rm -rf ${IMAGE_ROOTFS}${opkglibdir}
+}
+
+RPM_QUERY_CMD = '${RPM} --root ${IMAGE_ROOTFS} -D "_dbpath ${rpmlibdir}" \
+ -D "__dbi_txn create nofsync private"'
+
+list_installed_packages() {
+ ${RPM_QUERY_CMD} -qa --qf "[%{NAME}\n]"
+}
+
+get_package_filename() {
+ resolve_package_rpm ${RPMCONF_TARGET_BASE}-base_archs.conf $1
}
-install_all_locales() {
+list_package_depends() {
+ pkglist=`list_installed_packages`
+
+ # REQUIRE* lists "soft" requirements (which we know as recommends and RPM refers to
+ # as "suggests") so filter these out with the help of awk
+ for req in `${RPM_QUERY_CMD} -q --qf "[%{REQUIRENAME} %{REQUIREFLAGS}\n]" $1 | awk '{ if( and($2, 0x80000) == 0) print $1 }'`; do
+ if echo "$req" | grep -q "^rpmlib" ; then continue ; fi
- PACKAGES_TO_INSTALL=""
+ realpkg=""
+ for dep in $pkglist; do
+ if [ "$dep" = "$req" ] ; then
+ realpkg="1"
+ echo $req
+ break
+ fi
+ done
- INSTALLED_PACKAGES=`grep ^Package: ${IMAGE_ROOTFS}${libdir}/opkg/status |sed "s/^Package: //"|egrep -v -- "(-locale-|-dev$|-doc$|^kernel|^glibc|^ttf|^task|^perl|^python)"`
+ if [ "$realdep" = "" ] ; then
+ ${RPM_QUERY_CMD} -q --whatprovides $req --qf "%{NAME}\n"
+ fi
+ done
+}
- for pkg in $INSTALLED_PACKAGES
- do
- for lang in ${IMAGE_LOCALES}
- do
- if [ `opkg-cl ${IPKG_ARGS} info $pkg-locale-$lang | wc -l` -gt 2 ]
- then
- PACKAGES_TO_INSTALL="$PACKAGES_TO_INSTALL $pkg-locale-$lang"
- fi
- done
- done
- if [ "$PACKAGES_TO_INSTALL" != "" ]
- then
- opkg-cl ${IPKG_ARGS} install $PACKAGES_TO_INSTALL
- fi
+list_package_recommends() {
+ ${RPM_QUERY_CMD} -q --suggests $1
+}
+
+rootfs_check_package_exists() {
+ resolve_package_rpm ${RPMCONF_TARGET_BASE}-base_archs.conf $1
+}
+
+rootfs_install_packages() {
+ # The pkg to be installed here is not controlled by the
+ # package_install_internal_rpm, so it may have already been
+ # installed(e.g, installed in the first time when generate the
+ # rootfs), use '--replacepkgs' to always install them
+ for pkg in $@; do
+ ${RPM} --root ${IMAGE_ROOTFS} -D "_dbpath ${rpmlibdir}" \
+ -D "__dbi_txn create nofsync private" \
+ --noscripts --notriggers --noparentdirs --nolinktos \
+ --replacepkgs -Uhv $pkg || true
+ done
}
python () {
- import bb
- if bb.data.getVar('BUILD_IMAGES_FROM_FEEDS', d, True):
- flags = bb.data.getVarFlag('do_rootfs', 'recrdeptask', d)
+ if d.getVar('BUILD_IMAGES_FROM_FEEDS', True):
+ flags = d.getVarFlag('do_rootfs', 'recrdeptask')
flags = flags.replace("do_package_write_rpm", "")
flags = flags.replace("do_deploy", "")
- flags = flags.replace("do_populate_staging", "")
- bb.data.setVarFlag('do_rootfs', 'recrdeptask', flags, d)
- bb.data.setVar('RPM_PREPROCESS_COMMANDS', "rpm_insert_feed_uris", d)
- bb.data.setVar('RPM_POSTPROCESS_COMMANDS', '', d)
+ flags = flags.replace("do_populate_sysroot", "")
+ d.setVarFlag('do_rootfs', 'recrdeptask', flags)
+ d.setVar('RPM_PREPROCESS_COMMANDS', '')
+ d.setVar('RPM_POSTPROCESS_COMMANDS', '')
+
+ ml_package_archs = ""
+ ml_prefix_list = ""
+ multilibs = d.getVar('MULTILIBS', True) or ""
+ for ext in multilibs.split():
+ eext = ext.split(':')
+ if len(eext) > 1 and eext[0] == 'multilib':
+ localdata = bb.data.createCopy(d)
+ default_tune = localdata.getVar("DEFAULTTUNE_virtclass-multilib-" + eext[1], False)
+ if default_tune:
+ localdata.setVar("DEFAULTTUNE", default_tune)
+ package_archs = localdata.getVar("PACKAGE_ARCHS", True) or ""
+ package_archs = " ".join([i in "all noarch any".split() and i or eext[1]+"_"+i for i in package_archs.split()])
+ ml_package_archs += " " + package_archs
+ ml_prefix_list += " " + eext[1]
+ #bb.note("ML_PACKAGE_ARCHS %s %s %s" % (eext[1], localdata.getVar("PACKAGE_ARCHS", True) or "(none)", overrides))
+ d.setVar('MULTILIB_PACKAGE_ARCHS', ml_package_archs)
+ d.setVar('MULTILIB_PREFIX_LIST', ml_prefix_list)
}