diff options
Diffstat (limited to 'meta/classes/rootfs_rpm.bbclass')
| -rw-r--r-- | meta/classes/rootfs_rpm.bbclass | 331 |
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) } |
