diff options
-rw-r--r-- | meta/classes/rootfs_rpm.bbclass | 158 | ||||
-rw-r--r-- | scripts/rootfs_rpm-extract-postinst.awk | 11 |
2 files changed, 78 insertions, 91 deletions
diff --git a/meta/classes/rootfs_rpm.bbclass b/meta/classes/rootfs_rpm.bbclass index be86f29200..388387a52c 100644 --- a/meta/classes/rootfs_rpm.bbclass +++ b/meta/classes/rootfs_rpm.bbclass | |||
@@ -2,130 +2,103 @@ | |||
2 | # Creates a root filesystem out of rpm packages | 2 | # Creates a root filesystem out of rpm packages |
3 | # | 3 | # |
4 | 4 | ||
5 | ROOTFS_PKGMANAGE = "rpm yum" | 5 | ROOTFS_PKGMANAGE = "rpm" |
6 | |||
7 | ROOTFS_PKGMANAGE_BOOTSTRAP = "run-postinsts" | 6 | ROOTFS_PKGMANAGE_BOOTSTRAP = "run-postinsts" |
8 | 7 | ||
9 | do_rootfs[depends] += "rpm-native:do_populate_sysroot python-urlgrabber-native:do_populate_sysroot yum-metadata-parser-native:do_populate_sysroot yum-native:do_populate_sysroot createrepo-native:do_populate_sysroot fakechroot-native:do_populate_sysroot" | 8 | RPMOPTS="--dbpath /var/lib/rpm --define='_openall_before_chroot 1'" |
9 | RPM="${BUILD_ARCH}-${BUILD_OS}-rpm ${RPMOPTS}" | ||
10 | |||
11 | do_rootfs[depends] += "rpm-native:do_populate_sysroot" | ||
10 | 12 | ||
11 | # Needed for update-alternatives | 13 | # Needed for update-alternatives |
12 | do_rootfs[depends] += "opkg-native:do_populate_sysroot" | 14 | do_rootfs[depends] += "opkg-native:do_populate_sysroot" |
13 | 15 | ||
14 | do_rootfs[recrdeptask] += "do_package_write_rpm" | 16 | do_rootfs[recrdeptask] += "do_package_write_rpm" |
15 | 17 | ||
16 | YUMCONF = "${IMAGE_ROOTFS}/etc/yum.conf" | 18 | AWKPOSTINSTSCRIPT = "${POKYBASE}/scripts/rootfs_rpm-extract-postinst.awk" |
17 | YUMARGS = "--disablerepo=* --enablerepo=poky-feed-* --installroot ${IMAGE_ROOTFS}" | ||
18 | export YUM_ARCH_FORCE = "${TARGET_ARCH}" | ||
19 | |||
20 | AWKPOSTINSTSCRIPT = "${STAGING_BINDIR_NATIVE}/extract-postinst.awk" | ||
21 | 19 | ||
22 | RPM_PREPROCESS_COMMANDS = "" | 20 | RPM_PREPROCESS_COMMANDS = "" |
23 | RPM_POSTPROCESS_COMMANDS = "rpm_insert_feeds_uris" | 21 | RPM_POSTPROCESS_COMMANDS = "" |
24 | |||
25 | rpm_insert_feeds_uris () { | ||
26 | |||
27 | echo "Building from feeds activated!" | ||
28 | |||
29 | mkdir -p ${IMAGE_ROOTFS}/etc/yum/repos.d/ | ||
30 | for line in ${RPM_FEED_URIS} | ||
31 | do | ||
32 | # strip leading and trailing spaces/tabs, then split into name and uri | ||
33 | line_clean="`echo "$line"|sed 's/^[ \t]*//;s/[ \t]*$//'`" | ||
34 | feed_name="`echo "$line_clean" | sed -n 's/\(.*\)##\(.*\)/\1/p'`" | ||
35 | feed_uri="`echo "$line_clean" | sed -n 's/\(.*\)##\(.*\)/\2/p'`" | ||
36 | |||
37 | echo "Added $feed_name feed with URL $feed_uri" | ||
38 | |||
39 | FEED_FILE=${IMAGE_ROOTFS}/etc/yum/repos.d/$feed_name | ||
40 | |||
41 | echo "[poky-feed-$feed_name]" >> $FEED_FILE | ||
42 | echo "name = $feed_name" >> $FEED_FILE | ||
43 | echo "baseurl = $feed_uri" >> $FEED_FILE | ||
44 | echo "gpgcheck = 0" >> $FEED_FILE | ||
45 | done | ||
46 | } | ||
47 | 22 | ||
48 | fakeroot rootfs_rpm_do_rootfs () { | 23 | fakeroot rootfs_rpm_do_rootfs () { |
49 | set -x | 24 | set -x |
50 | 25 | ||
51 | ${RPM_PREPROCESS_COMMANDS} | 26 | ${RPM_PREPROCESS_COMMANDS} |
52 | 27 | ||
28 | # Setup base system configuration | ||
53 | mkdir -p ${IMAGE_ROOTFS}/etc/rpm/ | 29 | mkdir -p ${IMAGE_ROOTFS}/etc/rpm/ |
54 | echo "${TARGET_ARCH}-linux" >${IMAGE_ROOTFS}/etc/rpm/platform | 30 | echo "${TARGET_ARCH}-linux" >${IMAGE_ROOTFS}/etc/rpm/platform |
55 | 31 | ||
56 | # Generate an apprpriate yum.conf | 32 | # Instantiate the dep solver database |
57 | rm -rf ${YUMCONF} | 33 | mkdir -p ${IMAGE_ROOTFS}/var/lib/rpm_solver |
58 | cat > ${YUMCONF} << EOF | ||
59 | [main] | ||
60 | cachedir=/var/cache2/yum | ||
61 | keepcache=1 | ||
62 | debuglevel=10 | ||
63 | logfile=/var/log2/yum.log | ||
64 | exactarch=0 | ||
65 | obsoletes=1 | ||
66 | tolerant=1 | ||
67 | |||
68 | EOF | ||
69 | |||
70 | #priority=1 | ||
71 | mkdir -p ${IMAGE_ROOTFS}${DEPLOY_DIR_RPM} | ||
72 | 34 | ||
35 | # Generate dep_solver manifest | ||
36 | cat /dev/null > ${IMAGE_ROOTFS}/var/lib/rpm_solver/dep_solver.manifest | ||
37 | echo "# Dynamically generated install manifest -- avoid small file bug" >> ${IMAGE_ROOTFS}/var/lib/rpm_solver/dep_solver.manifest | ||
73 | for arch in ${PACKAGE_ARCHS}; do | 38 | for arch in ${PACKAGE_ARCHS}; do |
74 | if [ ! -d ${DEPLOY_DIR_RPM}/$arch ]; then | 39 | [ -d ${DEPLOY_DIR_RPM}/$arch ] && find ${DEPLOY_DIR_RPM}/$arch -type f >> ${IMAGE_ROOTFS}/var/lib/rpm_solver/dep_solver.manifest |
75 | continue; | ||
76 | fi | ||
77 | createrepo ${DEPLOY_DIR_RPM}/$arch | ||
78 | |||
79 | echo "[poky-feed-$arch]" >> ${YUMCONF} | ||
80 | echo "name = Poky RPM $arch Feed" >> ${YUMCONF} | ||
81 | echo "baseurl=file://${DEPLOY_DIR_RPM}/$arch" >> ${YUMCONF} | ||
82 | echo "gpgcheck=0" >> ${YUMCONF} | ||
83 | echo "" >> ${YUMCONF} | ||
84 | #priority=$(expr $priority + 5) | ||
85 | |||
86 | # Copy the packages into the target image | ||
87 | # Ugly ugly ugly but rpm is braindead and can't see outside the chroot | ||
88 | # when installing :( | ||
89 | cp -r ${DEPLOY_DIR_RPM}/$arch ${IMAGE_ROOTFS}${DEPLOY_DIR_RPM}/ | ||
90 | done | 40 | done |
41 | |||
42 | ${RPM} --root ${IMAGE_ROOTFS} --dbpath /var/lib/rpm_solver --initdb | ||
43 | ${RPM} --root ${IMAGE_ROOTFS} --dbpath /var/lib/rpm_solver -Uhv ${IMAGE_ROOTFS}/var/lib/rpm_solver/dep_solver.manifest --justdb --nodeps --noparentdirs --nolinktos | ||
91 | 44 | ||
92 | 45 | # Resolve Dependencies and Install | |
93 | #mkdir -p ${IMAGE_ROOTFS}/var/lib/rpm | ||
94 | #rpm --root ${IMAGE_ROOTFS} --initdb | ||
95 | #rpm --root ${IMAGE_ROOTFS} --dbpath ${IMAGE_ROOTFS}/var/lib/rpm -ihv --nodeps --ignoreos | ||
96 | #rpm -ihv --root ${IMAGE_ROOTFS} ${PACKAGE_INSTALL} | ||
97 | |||
98 | #package_update_index_rpm | ||
99 | #package_generate_ipkg_conf | ||
100 | |||
101 | # Uclibc builds don't provide this stuff... | ||
102 | if [ x${TARGET_OS} = "xlinux" ] || [ x${TARGET_OS} = "xlinux-gnueabi" ] ; then | 46 | if [ x${TARGET_OS} = "xlinux" ] || [ x${TARGET_OS} = "xlinux-gnueabi" ] ; then |
103 | if [ ! -z "${LINGUAS_INSTALL}" ]; then | 47 | if [ ! -z "${LINGUAS_INSTALL}" ]; then |
104 | for i in ${LINGUAS_INSTALL}; do | 48 | for i in ${LINGUAS_INSTALL}; do |
105 | fakechroot yum ${YUMARGS} -y install $i | 49 | : # Do not support locales yet |
106 | done | 50 | done |
107 | fi | 51 | fi |
108 | fi | 52 | fi |
53 | |||
109 | if [ ! -z "${PACKAGE_INSTALL}" ]; then | 54 | if [ ! -z "${PACKAGE_INSTALL}" ]; then |
110 | fakechroot yum ${YUMARGS} -y install ${PACKAGE_INSTALL} | 55 | # Create the install manifest, starting with the PACKAGE_INSTALL packages |
56 | touch ${IMAGE_ROOTFS}/install.manifest | ||
57 | for each in ${PACKAGE_INSTALL} ; do | ||
58 | # Map package name to filename | ||
59 | pkg_name=$(${RPM} --root ${IMAGE_ROOTFS} --dbpath /var/lib/rpm_solver -q --qf "%{NAME}-%{VERSION}-%{RELEASE}.%{ARCH}" $each) | ||
60 | echo Processing "$each $pkg_name" | ||
61 | # Map filename to full path | ||
62 | [ -n "$pkg_name" ] && grep "/"$pkg_name ${IMAGE_ROOTFS}/var/lib/rpm_solver/dep_solver.manifest >> ${IMAGE_ROOTFS}/install.manifest | ||
63 | done | ||
111 | fi | 64 | fi |
112 | 65 | ||
66 | # Attempt to resolve dependencies and add missing packages to the install.manifest | ||
67 | # Loop over the resolution until there is nothing else to resolve... | ||
68 | # We log the solver.logs so we can track the dep solver process for debugging... | ||
69 | resolver=1 | ||
70 | while [ $resolver -gt 0 ]; do | ||
71 | (${RPM} --root ${IMAGE_ROOTFS} \ | ||
72 | --define '_solve_dbpath /var/lib/rpm_solver' --define '_solve_name_fmt add:%{___NVRA}.rpm' --aid \ | ||
73 | -Uhv --noparentdirs --nolinktos --test ${IMAGE_ROOTFS}/install.manifest > ${IMAGE_ROOTFS}/solver.log.$resolver 2>&1 || :) | ||
74 | |||
75 | resolve_continue=false | ||
76 | for each in `cat ${IMAGE_ROOTFS}/solver.log.$resolver | grep "add:" | cut -d : -f 2` ; do | ||
77 | pkg_name=$each | ||
78 | echo Processing "$each $pkg_name" | ||
79 | # Map filename to full path | ||
80 | [ -n "$pkg_name" ] && grep "/"$pkg_name ${IMAGE_ROOTFS}/var/lib/rpm_solver/dep_solver.manifest >> ${IMAGE_ROOTFS}/install.manifest | ||
81 | resolve_continue=true | ||
82 | done | ||
83 | if [ "$resolve_continue" == "true" ]; then | ||
84 | resolver=$(expr $resolver + 1) | ||
85 | else | ||
86 | resolver=0 | ||
87 | fi | ||
88 | done | ||
89 | |||
90 | # Attempt install | ||
91 | ${RPM} --root ${IMAGE_ROOTFS} \ | ||
92 | --define '_solve_dbpath /var/lib/rpm_solver' --define '_solve_name_fmt add:%{___NVRA}.rpm' --aid \ | ||
93 | -Uhv --noparentdirs --nolinktos --noscripts ${IMAGE_ROOTFS}/install.manifest | ||
94 | |||
113 | if [ ! -z "${PACKAGE_INSTALL_ATTEMPTONLY}" ]; then | 95 | if [ ! -z "${PACKAGE_INSTALL_ATTEMPTONLY}" ]; then |
114 | fakechroot yum ${YUMARGS} -y install ${PACKAGE_INSTALL_ATTEMPTONLY} > ${WORKDIR}/temp/log.do_rootfs-attemptonly.${PID} || true | 96 | : # fakechroot yum ${YUMARGS} -y install ${PACKAGE_INSTALL_ATTEMPTONLY} > ${WORKDIR}/temp/log.do_rootfs-attemptonly.${PID} || true |
115 | fi | 97 | fi |
116 | 98 | ||
117 | # Add any recommended packages to the image | 99 | # Add any recommended packages to the image |
118 | # (added as an extra script since yum itself doesn't support this) | 100 | # (added as an extra script since yum itself doesn't support this) |
119 | yum-install-recommends.py ${IMAGE_ROOTFS} "fakechroot yum ${YUMARGS} -y install" | 101 | : # yum-install-recommends.py ${IMAGE_ROOTFS} "fakechroot yum ${YUMARGS} -y install" |
120 | |||
121 | # Symlinks created under fakeroot are wrong, now we have to fix them... | ||
122 | cd ${IMAGE_ROOTFS} | ||
123 | for f in `find . -type l -print` | ||
124 | do | ||
125 | link=`readlink $f | sed -e 's#${IMAGE_ROOTFS}##'` | ||
126 | rm $f | ||
127 | ln -s $link $f | ||
128 | done | ||
129 | 102 | ||
130 | export D=${IMAGE_ROOTFS} | 103 | export D=${IMAGE_ROOTFS} |
131 | export OFFLINE_ROOT=${IMAGE_ROOTFS} | 104 | export OFFLINE_ROOT=${IMAGE_ROOTFS} |
@@ -138,7 +111,7 @@ EOF | |||
138 | ${ROOTFS_POSTINSTALL_COMMAND} | 111 | ${ROOTFS_POSTINSTALL_COMMAND} |
139 | 112 | ||
140 | mkdir -p ${IMAGE_ROOTFS}/etc/rpm-postinsts/ | 113 | mkdir -p ${IMAGE_ROOTFS}/etc/rpm-postinsts/ |
141 | rpm --root ${IMAGE_ROOTFS} -aq --queryformat 'Name: %{NAME}\n' --scripts > ${IMAGE_ROOTFS}/etc/rpm-postinsts/combined | 114 | ${RPM} --root ${IMAGE_ROOTFS} -qa --queryformat 'Name: %{NAME}\n' --scripts > ${IMAGE_ROOTFS}/etc/rpm-postinsts/combined |
142 | awk -f ${AWKPOSTINSTSCRIPT} < ${IMAGE_ROOTFS}/etc/rpm-postinsts/combined | 115 | awk -f ${AWKPOSTINSTSCRIPT} < ${IMAGE_ROOTFS}/etc/rpm-postinsts/combined |
143 | rm ${IMAGE_ROOTFS}/etc/rpm-postinsts/combined | 116 | rm ${IMAGE_ROOTFS}/etc/rpm-postinsts/combined |
144 | 117 | ||
@@ -176,13 +149,16 @@ EOF | |||
176 | rm -rf ${IMAGE_ROOTFS}/var/cache2/ | 149 | rm -rf ${IMAGE_ROOTFS}/var/cache2/ |
177 | rm -rf ${IMAGE_ROOTFS}/var/run2/ | 150 | rm -rf ${IMAGE_ROOTFS}/var/run2/ |
178 | rm -rf ${IMAGE_ROOTFS}/var/log2/ | 151 | rm -rf ${IMAGE_ROOTFS}/var/log2/ |
179 | rm -rf ${IMAGE_ROOTFS}${DEPLOY_DIR_RPM}/ | ||
180 | 152 | ||
181 | # remove lock files | 153 | # remove lock files |
182 | rm -f ${IMAGE_ROOTFS}/var/lib/rpm/__db.* | 154 | rm -f ${IMAGE_ROOTFS}/var/lib/rpm/__db.* |
183 | 155 | ||
184 | # remove no longer used yum.conf | 156 | # remove resolver files and manifests |
185 | rm -f ${IMAGE_ROOTFS}/etc/yum.conf | 157 | rm -f ${IMAGE_ROOTFS}/install.manifest |
158 | rm -f ${IMAGE_ROOTFS}/solver.log.* | ||
159 | |||
160 | # Remove resolver DB | ||
161 | rm -rf ${IMAGE_ROOTFS}/var/lib/rpm_solver | ||
186 | 162 | ||
187 | log_check rootfs | 163 | log_check rootfs |
188 | } | 164 | } |
diff --git a/scripts/rootfs_rpm-extract-postinst.awk b/scripts/rootfs_rpm-extract-postinst.awk new file mode 100644 index 0000000000..8f2836b32c --- /dev/null +++ b/scripts/rootfs_rpm-extract-postinst.awk | |||
@@ -0,0 +1,11 @@ | |||
1 | /Name:.*/ { | ||
2 | package = substr($0, 7) | ||
3 | next | ||
4 | } | ||
5 | /postinstall.*scriptlet .*/ { | ||
6 | next | ||
7 | } | ||
8 | { | ||
9 | print $0 >> ENVIRON["D"] "/etc/rpm-postinsts/" package ".sh" | ||
10 | } | ||
11 | |||