summaryrefslogtreecommitdiff
path: root/meta/classes/rootfs_ipk.bbclass
diff options
context:
space:
mode:
Diffstat (limited to 'meta/classes/rootfs_ipk.bbclass')
-rw-r--r--meta/classes/rootfs_ipk.bbclass187
1 files changed, 110 insertions, 77 deletions
diff --git a/meta/classes/rootfs_ipk.bbclass b/meta/classes/rootfs_ipk.bbclass
index 66d3712b8..15800864a 100644
--- a/meta/classes/rootfs_ipk.bbclass
+++ b/meta/classes/rootfs_ipk.bbclass
@@ -5,17 +5,24 @@
# See image.bbclass for a usage of this.
#
-ROOTFS_PKGMANAGE = "opkg opkg-collateral"
+EXTRAOPKGCONFIG ?= ""
+ROOTFS_PKGMANAGE = "opkg opkg-collateral ${EXTRAOPKGCONFIG}"
ROOTFS_PKGMANAGE_BOOTSTRAP = "run-postinsts"
-do_rootfs[depends] += "opkg-native:do_populate_staging opkg-utils-native:do_populate_staging"
+do_rootfs[depends] += "opkg-native:do_populate_sysroot opkg-utils-native:do_populate_sysroot"
do_rootfs[recrdeptask] += "do_package_write_ipk"
-IPKG_ARGS = "-f ${IPKGCONF_TARGET} -o ${IMAGE_ROOTFS}"
+IPKG_ARGS = "-f ${IPKGCONF_TARGET} -o ${IMAGE_ROOTFS} --force-overwrite"
OPKG_PREPROCESS_COMMANDS = "package_update_index_ipk; package_generate_ipkg_conf"
-OPKG_POSTPROCESS_COMMANDS = "ipk_insert_feed_uris"
+OPKG_POSTPROCESS_COMMANDS = "ipk_insert_feed_uris; rootfs_install_all_locales; "
+
+opkglibdir = "${localstatedir}/lib/opkg"
+
+# Which packages to not install on the basis of a recommendation
+BAD_RECOMMENDATIONS ?= ""
+MULTILIBRE_ALLOW_REP = "${opkglibdir}"
fakeroot rootfs_ipk_do_rootfs () {
set -x
@@ -26,81 +33,78 @@ fakeroot rootfs_ipk_do_rootfs () {
${OPKG_PREPROCESS_COMMANDS}
mkdir -p ${T}/
- mkdir -p ${IMAGE_ROOTFS}/usr/lib/opkg/
+
+ STATUS=${IMAGE_ROOTFS}${opkglibdir}/status
+ mkdir -p ${IMAGE_ROOTFS}${opkglibdir}
opkg-cl ${IPKG_ARGS} update
- # 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
- opkg-cl ${IPKG_ARGS} install $i
- done
+ # prime the status file with bits that we don't want
+ for i in ${BAD_RECOMMENDATIONS}; do
+ pkginfo="`opkg-cl ${IPKG_ARGS} info $i`"
+ if [ ! -z "$pkginfo" ]; then
+ echo "$pkginfo" | grep -e '^Package:' -e '^Architecture:' -e '^Version:' >> $STATUS
+ echo "Status: deinstall hold not-installed" >> $STATUS
+ echo >> $STATUS
+ else
+ echo "Requested ignored recommendation $i is not a package"
fi
- fi
- if [ ! -z "${PACKAGE_INSTALL}" ]; then
- opkg-cl ${IPKG_ARGS} install ${PACKAGE_INSTALL}
- fi
+ done
- if [ ! -z "${PACKAGE_INSTALL_ATTEMPTONLY}" ]; then
- opkg-cl ${IPKG_ARGS} install ${PACKAGE_INSTALL_ATTEMPTONLY} > "${WORKDIR}/temp/log.do_rootfs_attemptonly.${PID}" || true
- fi
+ #install
+ export INSTALL_PACKAGES_ATTEMPTONLY_IPK="${PACKAGE_INSTALL_ATTEMPTONLY}"
+ export INSTALL_PACKAGES_LINGUAS_IPK="${LINGUAS_INSTALL}"
+ export INSTALL_TASK_IPK="rootfs"
+
+ export INSTALL_ROOTFS_IPK="${IMAGE_ROOTFS}"
+ export INSTALL_CONF_IPK="${IPKGCONF_TARGET}"
+ export INSTALL_PACKAGES_IPK="${PACKAGE_INSTALL}"
+ #post install
export D=${IMAGE_ROOTFS}
export OFFLINE_ROOT=${IMAGE_ROOTFS}
export IPKG_OFFLINE_ROOT=${IMAGE_ROOTFS}
export OPKG_OFFLINE_ROOT=${IPKG_OFFLINE_ROOT}
- mkdir -p ${IMAGE_ROOTFS}/etc/opkg/
- grep "^arch" ${IPKGCONF_TARGET} >${IMAGE_ROOTFS}/etc/opkg/arch.conf
+ package_install_internal_ipk
+
+ # Distro specific packages should create this
+ #mkdir -p ${IMAGE_ROOTFS}/etc/opkg/
+ #grep "^arch" ${IPKGCONF_TARGET} >${IMAGE_ROOTFS}/etc/opkg/arch.conf
${OPKG_POSTPROCESS_COMMANDS}
${ROOTFS_POSTINSTALL_COMMAND}
- for i in ${IMAGE_ROOTFS}${libdir}/opkg/info/*.preinst; do
- if [ -f $i ] && ! sh $i; then
- opkg-cl ${IPKG_ARGS} flag unpacked `basename $i .preinst`
+ if ${@base_contains("IMAGE_FEATURES", "read-only-rootfs", "true", "false" ,d)}; then
+ if grep Status:.install.ok.unpacked ${STATUS}; then
+ echo "Some packages could not be configured offline and rootfs is read-only."
+ exit 1
fi
- done
- for i in ${IMAGE_ROOTFS}${libdir}/opkg/info/*.postinst; do
- if [ -f $i ] && ! sh $i configure; then
- opkg-cl ${IPKG_ARGS} flag unpacked `basename $i .postinst`
- fi
- done
+ fi
install -d ${IMAGE_ROOTFS}/${sysconfdir}
echo ${BUILDNAME} > ${IMAGE_ROOTFS}/${sysconfdir}/version
${ROOTFS_POSTPROCESS_COMMAND}
- rm -f ${IMAGE_ROOTFS}${libdir}/opkg/lists/*
-
- log_check rootfs
-}
+ rm -f ${IMAGE_ROOTFS}${opkglibdir}/lists/*
+ if ${@base_contains("IMAGE_FEATURES", "package-management", "false", "true", d)}; then
+ if ! grep Status:.install.ok.unpacked ${STATUS}; then
+ # All packages were successfully configured.
+ # update-rc.d, base-passwd are no further use, remove them now
+ opkg-cl ${IPKG_ARGS} --force-depends remove update-rc.d base-passwd || true
-rootfs_ipk_log_check() {
- target="$1"
- lf_path="$2"
-
- 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
+ # Also delete the status files
+ rm -rf ${IMAGE_ROOTFS}${opkglibdir}
fi
- done
- test "$do_exit" = 1 && exit 1
- true
+ fi
+ set +x
+ log_check rootfs
}
rootfs_ipk_write_manifest() {
manifest=${DEPLOY_DIR_IMAGE}/${IMAGE_NAME}.rootfs.manifest
- cp ${IMAGE_ROOTFS}/usr/lib/opkg/status $manifest
+ cp ${IMAGE_ROOTFS}${opkglibdir}/status $manifest
sed '/Depends/d' -i $manifest
sed '/Status/d' -i $manifest
@@ -113,29 +117,47 @@ rootfs_ipk_write_manifest() {
}
remove_packaging_data_files() {
- rm -rf ${IMAGE_ROOTFS}/usr/lib/opkg/
+ rm -rf ${IMAGE_ROOTFS}${opkglibdir}
+ # We need the directory for the package manager lock
+ mkdir ${IMAGE_ROOTFS}${opkglibdir}
}
-install_all_locales() {
+list_installed_packages() {
+ grep ^Package: ${IMAGE_ROOTFS}${opkglibdir}/status | sed "s/^Package: //"
+}
- PACKAGES_TO_INSTALL=""
+get_package_filename() {
+ set +x
+ info=`opkg-cl ${IPKG_ARGS} info $1 | grep -B 7 -A 7 "^Status.* \(\(installed\)\|\(unpacked\)\)" || true`
+ name=`echo "${info}" | awk '/^Package/ {printf $2"_"}'`
+ name=$name`echo "${info}" | awk -F: '/^Version/ {printf $NF"_"}' | sed 's/^\s*//g'`
+ name=$name`echo "${info}" | awk '/^Archi/ {print $2".ipk"}'`
+ set -x
- INSTALLED_PACKAGES=`grep ^Package: ${IMAGE_ROOTFS}${libdir}/opkg/status |sed "s/^Package: //"|egrep -v -- "(-locale-|-dev$|-doc$|^kernel|^glibc|^ttf|^task|^perl|^python)"`
+ fullname=`find ${DEPLOY_DIR_IPK} -name "$name" || true`
+ if [ "$fullname" = "" ] ; then
+ echo $name
+ else
+ echo $fullname
+ fi
+}
+
+list_package_depends() {
+ opkg-cl ${IPKG_ARGS} info $1 | grep ^Depends | sed -e 's/^Depends: //' -e 's/,//g' -e 's:([=<>]* [^ )]*)::g'
+}
- 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() {
+ opkg-cl ${IPKG_ARGS} info $1 | grep ^Recommends | sed -e 's/^Recommends: //' -e 's/,//g' -e 's:([=<>]* [^ )]*)::g'
+}
+
+rootfs_check_package_exists() {
+ if [ `opkg-cl ${IPKG_ARGS} info $1 | wc -l` -gt 2 ]; then
+ echo $1
+ fi
+}
+
+rootfs_install_packages() {
+ opkg-cl ${IPKG_ARGS} install $PACKAGES_TO_INSTALL
}
ipk_insert_feed_uris () {
@@ -153,18 +175,29 @@ ipk_insert_feed_uris () {
# insert new feed-sources
echo "src/gz $feed_name $feed_uri" >> ${IPKGCONF_TARGET}
- done
+ done
+
+ # Allow to use package deploy directory contents as quick devel-testing
+ # feed. This creates individual feed configs for each arch subdir of those
+ # specified as compatible for the current machine.
+ # NOTE: Development-helper feature, NOT a full-fledged feed.
+ if [ -n "${FEED_DEPLOYDIR_BASE_URI}" ]; then
+ for arch in ${PACKAGE_ARCHS}
+ do
+ echo "src/gz local-$arch ${FEED_DEPLOYDIR_BASE_URI}/$arch" >> ${IMAGE_ROOTFS}/etc/opkg/local-$arch-feed.conf
+ done
+ fi
}
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_ipk", "")
flags = flags.replace("do_deploy", "")
- flags = flags.replace("do_populate_staging", "")
- bb.data.setVarFlag('do_rootfs', 'recrdeptask', flags, d)
- bb.data.setVar('OPKG_PREPROCESS_COMMANDS', "package_generate_archlist\nipk_insert_feed_uris", d)
- bb.data.setVar('OPKG_POSTPROCESS_COMMANDS', '', d)
+ flags = flags.replace("do_populate_sysroot", "")
+ d.setVarFlag('do_rootfs', 'recrdeptask', flags)
+ d.setVar('OPKG_PREPROCESS_COMMANDS', "package_generate_archlist\nipk_insert_feed_uris")
+ d.setVar('OPKG_POSTPROCESS_COMMANDS', '')
}