[OE-core] [PATCH] package_rpm: Fix useradd preinst ordering issues

Steve Sakoman sakoman at gmail.com
Thu Apr 12 15:36:36 UTC 2012


On Thu, Apr 12, 2012 at 6:39 AM, Steve Sakoman <sakoman at gmail.com> wrote:

> FWIW, after pulling current poky this morning all of my image builds
> are failing with errors like this:
>
> | Installing base dependencies first (base-passwd, base-files and
> shadow) since rpm is special
> | error: Failed dependencies:
> |       /bin/sh is needed by base-passwd-3.5.24-r0.armv7a
> |       /bin/sh is needed by shadow-4.1.4.3-r8.armv7a
> |       /bin/sh is needed by libgcc1-4.6.3+svnr184847-r24.armv7a
> |       /bin/sh is needed by libc6-2.13-r23+svnr15508.armv7a
>
> I'll investigate, but since it is late in the release process thought
> I would mention the issue.

I have no idea if this is the proper fix, but adding bash to the list
of packages to install first fixed the issue for me:

diff --git a/meta/classes/package_rpm.bbclass b/meta/classes/package_rpm.bbclass
index fd00fb1..a5f0b06 100644
--- a/meta/classes/package_rpm.bbclass
+++ b/meta/classes/package_rpm.bbclass
@@ -475,7 +475,8 @@ EOF
                echo "Skipping pre install due to exisitng image"
        else
                echo "# Initial Install manifest" >
${target_rootfs}/install/initial_install.manifest
-               echo "Installing base dependencies first (base-passwd,
base-files and shadow) since rpm is special"
+               echo "Installing base dependencies first (bash,
base-passwd, base-files and shadow) since rpm is special"
+               grep /bash-[0-9]
${target_rootfs}/install/total_solution.manifest >>
${target_rootfs}/install/initial_install.manife
                grep /base-passwd-[0-9]
${target_rootfs}/install/total_solution.manifest >>
${target_rootfs}/install/initial_install
                grep /base-files-[0-9]
${target_rootfs}/install/total_solution.manifest >>
${target_rootfs}/install/initial_install.
                grep /shadow-[0-9]
${target_rootfs}/install/total_solution.manifest >>
${target_rootfs}/install/initial_install.mani

I'm concerned we are on a slippery slope here!

Steve


>>> diff --git a/meta/classes/package_rpm.bbclass
>>> b/meta/classes/package_rpm.bbclass
>>> index 16a2c87..1b0f6f2 100644
>>> --- a/meta/classes/package_rpm.bbclass
>>> +++ b/meta/classes/package_rpm.bbclass
>>> @@ -166,22 +167,23 @@ rpm_common_comand () {
>>>  # install or remove the pkg
>>>  rpm_update_pkg () {
>>>
>>> +    manifest=$1
>>> +    btmanifest=$manifest.bt
>>>      local target_rootfs="${INSTALL_ROOTFS_RPM}"
>>>
>>>      # Save the rpm's build time for incremental image generation, and the
>>> file
>>>      # would be moved to ${T}
>>> -    rm -f ${target_rootfs}/install/total_solution_bt.manifest
>>> -    for i in `cat ${target_rootfs}/install/total_solution.manifest`; do
>>> +    rm -f $btmanifest
>>> +    for i in `cat $manifest`; do
>>>          # Use "rpm" rather than "${RPM}" here, since we don't need the
>>>          # '--dbpath' option
>>> -        echo "$i `rpm -qp --qf '%{BUILDTIME}\n' $i`">>  \
>>> -            ${target_rootfs}/install/total_solution_bt.manifest
>>> +        echo "$i `rpm -qp --qf '%{BUILDTIME}\n' $i`">>  $btmanifest
>>>      done
>>>
>>>      # Only install the different pkgs if incremental image generation is
>>> set
>>>      if [ "${INC_RPM_IMAGE_GEN}" = "1" -a -f
>>> ${T}/total_solution_bt.manifest -a \
>>>          "${IMAGE_PKGTYPE}" = "rpm" ]; then
>>> -        cur_list="${target_rootfs}/install/total_solution_bt.manifest"
>>> +        cur_list="$btmanifest"
>>>          pre_list="${T}/total_solution_bt.manifest"
>>>          sort -u $cur_list -o $cur_list
>>>          sort -u $pre_list -o $pre_list
>>> @@ -203,8 +205,7 @@ rpm_update_pkg () {
>>>              -Uvh ${target_rootfs}/install/incremental.manifest
>>>      else
>>>          # Attempt to install
>>> -        rpm_common_comand --replacepkgs \
>>> -            -Uhv ${target_rootfs}/install/total_solution.manifest
>>> +        rpm_common_comand --replacepkgs -Uhv $manifest
>>>      fi
>>>  }
>>>
>>> @@ -440,14 +441,7 @@ package_install_internal_rpm () {
>>>
>>>        fi
>>>
>>> -       # If base-passwd or shadow are in the list of packages to install,
>>> -       # ensure they are installed first to support later packages that
>>> -       # may create custom users/groups (fixes Yocto bug #2127)
>>> -       infile=${target_rootfs}/install/install_solution.manifest
>>> -       outfile=${target_rootfs}/install/total_solution.manifest
>>> -       cat $infile | grep /base-passwd-[0-9]>  $outfile || true
>>> -       cat $infile | grep /shadow-[0-9]>>  $outfile || true
>>> -       cat $infile | grep -v /shadow-[0-9] | grep -v /base-passwd-[0-9]>>
>>>  $outfile || true
>>> +       cat ${target_rootfs}/install/install_solution.manifest>
>>>  ${target_rootfs}/install/total_solution.manifest
>>>        cat ${target_rootfs}/install/install_multilib_solution.manifest>>
>>>  ${target_rootfs}/install/total_solution.manifest
>>>
>>>        # Construct install scriptlet wrapper
>>> @@ -474,8 +468,45 @@ EOF
>>>
>>>        chmod 0755 ${WORKDIR}/scriptlet_wrapper
>>>
>>> -    rpm_update_pkg
>>> +       # RPM is special. It can't handle dependencies and preinstall
>>> scripts correctly. Its
>>> +       # probably a feature. The only way to convince rpm to actually run
>>> the preinstall scripts
>>> +       # for base-passwd and shadow first before installing packages that
>>> depend on these packages
>>> +       # is to do two image installs, installing one set of packages,
>>> then the other.
>>> +       if [ "${INC_RPM_IMAGE_GEN}" = "1" -a -f
>>> ${T}/total_solution_bt.manifest ]; then
>>> +               echo "Skipping pre install due to exisitng image"
>>> +       else
>>> +               echo "# Intial Install manifest">
>>>  ${target_rootfs}/install/initial_install.manifest
>>> +               echo "Installing base dependencies first (base-passwd,
>>> base-files and shadow) since rpm is special"
>>> +               grep /base-passwd-[0-9]
>>> ${target_rootfs}/install/total_solution.manifest>>
>>>  ${target_rootfs}/install/initial_install.manifest || true
>>> +               grep /base-files-[0-9]
>>> ${target_rootfs}/install/total_solution.manifest>>
>>>  ${target_rootfs}/install/initial_install.manifest || true
>>> +               grep /shadow-[0-9]
>>> ${target_rootfs}/install/total_solution.manifest>>
>>>  ${target_rootfs}/install/initial_install.manifest || true
>>> +
>>> +               # Generate an install solution by doing a --justdb
>>> install, then recreate it with
>>> +               # an actual package install!
>>> +               mkdir -p ${target_rootfs}/initial
>>> +
>>> +               ${RPM} --predefine "_rpmds_sysinfo_path
>>> ${target_rootfs}/etc/rpm/sysinfo" \
>>> +                       --predefine "_rpmrc_platform_path
>>> ${target_rootfs}/etc/rpm/platform" \
>>> +                       -D "_dbpath ${target_rootfs}/initial" -D "`cat
>>> ${confbase}-base_archs.macro`" \
>>> +                       -D "__dbi_txn create nofsync" \
>>> +                       -U --justdb --noscripts --notriggers
>>> --noparentdirs --nolinktos --ignoresize \
>>> +                       ${target_rootfs}/install/initial_install.manifest
>>> +
>>> +               ${RPM} -D "_dbpath ${target_rootfs}/initial" -qa --yaml \
>>> +                       -D "__dbi_txn create nofsync private" \
>>> +                       | grep -i 'Packageorigin' | cut -d : -f 2>
>>>  ${target_rootfs}/install/initial_solution.manifest
>>> +
>>> +               rpm_update_pkg
>>> ${target_rootfs}/install/initial_solution.manifest
>>> +
>>> +               grep -Fv -f
>>> ${target_rootfs}/install/initial_solution.manifest
>>> ${target_rootfs}/install/total_solution.manifest>
>>>  ${target_rootfs}/install/total_solution.manifest.new
>>> +               mv ${target_rootfs}/install/total_solution.manifest.new
>>> ${target_rootfs}/install/total_solution.manifest
>>> +
>>> +               rm -rf ${target_rootfs}/initial
>>> +       fi
>>> +
>>> +       echo "Installing main solution manifest
>>> (${target_rootfs}/install/total_solution.manifest)"
>>>
>>> +       rpm_update_pkg ${target_rootfs}/install/total_solution.manifest
>>>  }
>>>
>>>  python write_specfile () {
>>>
>>
>>
>> _______________________________________________
>> Openembedded-core mailing list
>> Openembedded-core at lists.openembedded.org
>> http://lists.linuxtogo.org/cgi-bin/mailman/listinfo/openembedded-core




More information about the Openembedded-core mailing list