<div dir="ltr">Small problem: we always build rpm-native as we need it for some tools, but rpmlibdir is only defined in package_rpm.bbclass which doesn't have to be inherited.<div><br></div><div>This leads to just --with-path-database= being passed to configure. What's the behaviour of RPM when this happens? What does it default to? If it's going to be safe (ie a sane default is used), please update the commit message to explain this.</div><div><br></div><div>Ross</div></div><div class="gmail_extra"><br><div class="gmail_quote">On 22 December 2016 at 10:23, David Vincent <span dir="ltr"><<a href="mailto:freesilicon@gmail.com" target="_blank">freesilicon@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class="">When using a custom RPM data directory instead of the default dir<br>
'/var/lib/rpm', the final image did not contain any of the database<br>
files in the expected location. This commit takes into account the<br>
'rpmlibdir' variable set into 'rootfs_rpm.bbclass'.<br>
<br>
Changes since v4:<br>
- Remove boolean in d.getVar() calls.<br>
<br>
</span>Changes since v5:<br>
- Also modify rpm recipe to build the database in the correct<br>
location and avoid errors during rootfs creation.<br>
<span class=""><br>
Signed-off-by: David Vincent <<a href="mailto:freesilicon@gmail.com">freesilicon@gmail.com</a>><br>
---<br>
meta/lib/oe/package_manager.py | 23 +++++++++++++----------<br>
meta/lib/oe/rootfs.py | 3 ++-<br>
</span> meta/recipes-devtools/rpm/<a href="http://rpm_5.4.16.bb" rel="noreferrer" target="_blank">rpm_<wbr>5.4.16.bb</a> | 2 ++<br>
3 files changed, 17 insertions(+), 11 deletions(-)<br>
<br>
diff --git a/meta/lib/oe/package_manager.<wbr>py b/meta/lib/oe/package_manager.<wbr>py<br>
index e557473999..3f2878c394 100644<br>
<div><div class="h5">--- a/meta/lib/oe/package_manager.<wbr>py<br>
+++ b/meta/lib/oe/package_manager.<wbr>py<br>
@@ -356,7 +356,8 @@ class RpmPkgsList(PkgsList):<br>
super(RpmPkgsList, self).__init__(d, rootfs_dir)<br>
<br>
self.rpm_cmd = bb.utils.which(os.getenv('<wbr>PATH'), "rpm")<br>
- self.image_rpmlib = os.path.join(self.rootfs_dir, 'var/lib/rpm')<br>
+ self.rpm_libdir = self.d.getVar('rpmlibdir')<br>
+ self.image_rpmlib = os.path.join(self.rootfs_dir, self.rpm_libdir[1:])<br>
<br>
self.ml_prefix_list, self.ml_os_list = \<br>
RpmIndexer(d, rootfs_dir).get_ml_prefix_and_<wbr>os_list(arch_var, os_var)<br>
@@ -416,7 +417,7 @@ class RpmPkgsList(PkgsList):<br>
<br>
def list_pkgs(self):<br>
cmd = [self.rpm_cmd, '--root', self.rootfs_dir]<br>
- cmd.extend(['-D', '_dbpath /var/lib/rpm'])<br>
+ cmd.extend(['-D', '_dbpath', self.rpm_libdir])<br>
cmd.extend(['-qa', '--qf', '[%{NAME} %{ARCH} %{VERSION} %{PACKAGEORIGIN}\n]'])<br>
<br>
try:<br>
@@ -683,7 +684,8 @@ class RpmPM(PackageManager):<br>
self.solution_manifest = self.d.expand('${T}/saved/%s_<wbr>solution' %<br>
self.task_name)<br>
self.saved_rpmlib = self.d.expand('${T}/saved/%s' % self.task_name)<br>
- self.image_rpmlib = os.path.join(self.target_<wbr>rootfs, 'var/lib/rpm')<br>
+ self.rpm_libdir = self.d.getVar('rpmlibdir')<br>
+ self.image_rpmlib = os.path.join(self.target_<wbr>rootfs, self.rpm_libdir[1:])<br>
<br>
if not os.path.exists(self.d.expand('<wbr>${T}/saved')):<br>
bb.utils.mkdirhier(self.d.<wbr>expand('${T}/saved'))<br>
@@ -954,7 +956,7 @@ class RpmPM(PackageManager):<br>
open(db_config_dir, 'w+').write(DB_CONFIG_CONTENT)<br>
<br>
# Create database so that smart doesn't complain (lazy init)<br>
- cmd = [self.rpm_cmd, '--root', self.target_rootfs, '--dbpath', '/var/lib/rpm', '-qa']<br>
+ cmd = [self.rpm_cmd, '--root', self.target_rootfs, '--dbpath', self.rpm_libdir, '-qa']<br>
try:<br>
subprocess.check_output(cmd, stderr=subprocess.STDOUT)<br>
except subprocess.CalledProcessError as e:<br>
@@ -963,20 +965,19 @@ class RpmPM(PackageManager):<br>
# Import GPG key to RPM database of the target system<br>
if self.d.getVar('RPM_SIGN_<wbr>PACKAGES') == '1':<br>
pubkey_path = self.d.getVar('RPM_GPG_PUBKEY'<wbr>)<br>
- cmd = [self.rpm_cmd, '--root', self.target_rootfs, '--dbpath', '/var/lib/rpm', '--import', pubkey_path]<br>
+ cmd = [self.rpm_cmd, '--root', self.target_rootfs, '--dbpath', self.rpm_libdir, '--import', pubkey_path]<br>
try:<br>
subprocess.check_output(cmd, stderr=subprocess.STDOUT)<br>
except subprocess.CalledProcessError as e:<br>
bb.fatal("Import GPG key failed. Command '%s' "<br>
"returned %d:\n%s" % (' '.join(cmd), e.returncode, e.output.decode("utf-8")))<br>
<br>
-<br>
# Configure smart<br>
bb.note("configuring Smart settings")<br>
bb.utils.remove(os.path.join(<wbr>self.target_rootfs, 'var/lib/smart'),<br>
True)<br>
self._invoke_smart(['config', '--set', 'rpm-root=%s' % self.target_rootfs])<br>
- self._invoke_smart(['config', '--set', 'rpm-dbpath=/var/lib/rpm'])<br>
+ self._invoke_smart(['config', '--set', 'rpm-dbpath=%s' % self.rpm_libdir])<br>
self._invoke_smart(['config', '--set', 'rpm-extra-macros._var=%s' %<br>
self.d.getVar('localstatedir')<wbr>])<br>
cmd = ["config", "--set", "rpm-extra-macros._tmppath=/%<wbr>s/tmp" % self.install_dir_name]<br>
@@ -1236,7 +1237,7 @@ class RpmPM(PackageManager):<br>
<br>
if not with_dependencies:<br>
cmd = [self.rpm_cmd] + ["-e", "--nodeps", "--root=%s" %<br>
- self.target_rootfs, "--dbpath=/var/lib/rpm",<br>
+ self.target_rootfs, "--dbpath=%s" % self.rpm_libdir,<br>
"--define='_cross_scriptlet_<wbr>wrapper %s'" %<br>
self.scriptlet_wrapper,<br>
"--define='_tmppath /%s/tmp'" % self.install_dir_name] + pkgs<br>
@@ -1384,7 +1385,8 @@ class RpmPM(PackageManager):<br>
saved_dir = self.target_rootfs + self.d.expand('${sysconfdir}/<wbr>rpm-postinsts/') + new_pkg<br>
<br>
cmd = self.rpm_cmd + ' -q --scripts --root ' + self.target_rootfs<br>
- cmd += ' --dbpath=/var/lib/rpm ' + new_pkg<br>
+ cmd += ' --dbpath=%s ' % self.rpm_libdir<br>
+ cmd += new_pkg<br>
cmd += ' | sed -n -e "/^postinstall scriptlet (using .*):$/,/^.* scriptlet (using .*):$/ {/.*/p}"'<br>
cmd += ' | sed -e "/postinstall scriptlet (using \(.*\)):$/d"'<br>
cmd += ' -e "/^.* scriptlet (using .*):$/d" > %s' % saved_dir<br>
@@ -1416,7 +1418,8 @@ class RpmPM(PackageManager):<br>
'''<br>
def unlock_rpm_db(self):<br>
# Remove rpm db lock files<br>
- rpm_db_locks = glob.glob('%s/var/lib/rpm/__<wbr>db.*' % self.target_rootfs)<br>
+ rpm_db_locks = glob.glob('%s%s/__db.*' % (self.target_rootfs,<br>
+ self.rpm_libdir))<br>
for f in rpm_db_locks:<br>
bb.utils.remove(f, True)<br>
<br>
diff --git a/meta/lib/oe/rootfs.py b/meta/lib/oe/rootfs.py<br>
</div></div>index d9a473006a..6eb05feb6c 100644<br>
<span class="">--- a/meta/lib/oe/rootfs.py<br>
+++ b/meta/lib/oe/rootfs.py<br>
@@ -429,6 +429,7 @@ class RpmRootfs(Rootfs):<br>
<br>
def _create(self):<br>
pkgs_to_install = self.manifest.parse_initial_<wbr>manifest()<br>
+ rpm_libdir = self.d.getVar('rpmlibdir')<br>
rpm_pre_process_cmds = self.d.getVar('RPM_PREPROCESS_<wbr>COMMANDS')<br>
rpm_post_process_cmds = self.d.getVar('RPM_<wbr>POSTPROCESS_COMMANDS')<br>
<br>
@@ -476,7 +477,7 @@ class RpmRootfs(Rootfs):<br>
if self.progress_reporter:<br>
self.progress_reporter.next_<wbr>stage()<br>
<br>
- self._setup_dbg_rootfs(['/etc/<wbr>rpm', '/var/lib/rpm', '/var/lib/smart'])<br>
+ self._setup_dbg_rootfs(['/etc/<wbr>rpm', rpm_libdir, '/var/lib/smart'])<br>
<br>
execute_pre_post_process(self.<wbr>d, rpm_post_process_cmds)<br>
<br>
</span>diff --git a/meta/recipes-devtools/rpm/<a href="http://rpm_5.4.16.bb" rel="noreferrer" target="_blank">rp<wbr>m_5.4.16.bb</a> b/meta/recipes-devtools/rpm/<a href="http://rpm_5.4.16.bb" rel="noreferrer" target="_blank">rp<wbr>m_5.4.16.bb</a><br>
index 3df4d1ff1d..12181d89b1 100644<br>
--- a/meta/recipes-devtools/rpm/<a href="http://rpm_5.4.16.bb" rel="noreferrer" target="_blank">rp<wbr>m_5.4.16.bb</a><br>
+++ b/meta/recipes-devtools/rpm/<a href="http://rpm_5.4.16.bb" rel="noreferrer" target="_blank">rp<wbr>m_5.4.16.bb</a><br>
@@ -342,6 +342,7 @@ EXTRA_OECONF += "--verbose \<br>
--enable-build-warnings \<br>
--enable-build-debug \<br>
--enable-maintainer-mode \<br>
+ --with-path-database=${<wbr>rpmlibdir} \<br>
--with-path-macros=${rpm_<wbr>macros} \<br>
--with-path-lib=${libdir}/rpm \<br>
--with-bugreport=<a href="http://bugzilla.yoctoproject.org" rel="noreferrer" target="_blank">http://<wbr>bugzilla.yoctoproject.org</a> \<br>
@@ -384,6 +385,7 @@ FILES_${PN} = "${bindir}/rpm \<br>
${localstatedir}/lib/wdj \<br>
${bindir}/rpm.real \<br>
${bindir}/rpmconstant.real \<br>
+ ${rpmlibdir} \<br>
"<br>
<br>
FILES_${PN}-common = "${bindir}/rpm2cpio \<br>
<span class="HOEnZb"><font color="#888888">--<br>
2.11.0<br>
<br>
</font></span></blockquote></div><br></div>