<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&#39;t have to be inherited.<div><br></div><div>This leads to just --with-path-database= being passed to configure.  What&#39;s the behaviour of RPM when this happens? What does it default to?  If it&#39;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">&lt;<a href="mailto:freesilicon@gmail.com" target="_blank">freesilicon@gmail.com</a>&gt;</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>
&#39;/var/lib/rpm&#39;, the final image did not contain any of the database<br>
files in the expected location. This commit takes into account the<br>
&#39;rpmlibdir&#39; variable set into &#39;rootfs_rpm.bbclass&#39;.<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 &lt;<a href="mailto:freesilicon@gmail.com">freesilicon@gmail.com</a>&gt;<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(&#39;<wbr>PATH&#39;), &quot;rpm&quot;)<br>
-        self.image_rpmlib = os.path.join(self.rootfs_dir, &#39;var/lib/rpm&#39;)<br>
+        self.rpm_libdir = self.d.getVar(&#39;rpmlibdir&#39;)<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, &#39;--root&#39;, self.rootfs_dir]<br>
-        cmd.extend([&#39;-D&#39;, &#39;_dbpath /var/lib/rpm&#39;])<br>
+        cmd.extend([&#39;-D&#39;, &#39;_dbpath&#39;, self.rpm_libdir])<br>
         cmd.extend([&#39;-qa&#39;, &#39;--qf&#39;, &#39;[%{NAME} %{ARCH} %{VERSION} %{PACKAGEORIGIN}\n]&#39;])<br>
<br>
         try:<br>
@@ -683,7 +684,8 @@ class RpmPM(PackageManager):<br>
         self.solution_manifest = self.d.expand(&#39;${T}/saved/%s_<wbr>solution&#39; %<br>
                                                self.task_name)<br>
         self.saved_rpmlib = self.d.expand(&#39;${T}/saved/%s&#39; % self.task_name)<br>
-        self.image_rpmlib = os.path.join(self.target_<wbr>rootfs, &#39;var/lib/rpm&#39;)<br>
+        self.rpm_libdir = self.d.getVar(&#39;rpmlibdir&#39;)<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(&#39;<wbr>${T}/saved&#39;)):<br>
             bb.utils.mkdirhier(self.d.<wbr>expand(&#39;${T}/saved&#39;))<br>
@@ -954,7 +956,7 @@ class RpmPM(PackageManager):<br>
             open(db_config_dir, &#39;w+&#39;).write(DB_CONFIG_CONTENT)<br>
<br>
         # Create database so that smart doesn&#39;t complain (lazy init)<br>
-        cmd = [self.rpm_cmd, &#39;--root&#39;, self.target_rootfs, &#39;--dbpath&#39;, &#39;/var/lib/rpm&#39;, &#39;-qa&#39;]<br>
+        cmd = [self.rpm_cmd, &#39;--root&#39;, self.target_rootfs, &#39;--dbpath&#39;, self.rpm_libdir, &#39;-qa&#39;]<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(&#39;RPM_SIGN_<wbr>PACKAGES&#39;) == &#39;1&#39;:<br>
             pubkey_path = self.d.getVar(&#39;RPM_GPG_PUBKEY&#39;<wbr>)<br>
-            cmd = [self.rpm_cmd, &#39;--root&#39;, self.target_rootfs, &#39;--dbpath&#39;, &#39;/var/lib/rpm&#39;, &#39;--import&#39;, pubkey_path]<br>
+            cmd = [self.rpm_cmd, &#39;--root&#39;, self.target_rootfs, &#39;--dbpath&#39;, self.rpm_libdir, &#39;--import&#39;, pubkey_path]<br>
             try:<br>
                 subprocess.check_output(cmd, stderr=subprocess.STDOUT)<br>
             except subprocess.CalledProcessError as e:<br>
                 bb.fatal(&quot;Import GPG key failed. Command &#39;%s&#39; &quot;<br>
                         &quot;returned %d:\n%s&quot; % (&#39; &#39;.join(cmd), e.returncode, e.output.decode(&quot;utf-8&quot;)))<br>
<br>
-<br>
         # Configure smart<br>
         bb.note(&quot;configuring Smart settings&quot;)<br>
         bb.utils.remove(os.path.join(<wbr>self.target_rootfs, &#39;var/lib/smart&#39;),<br>
                         True)<br>
         self._invoke_smart([&#39;config&#39;, &#39;--set&#39;, &#39;rpm-root=%s&#39; % self.target_rootfs])<br>
-        self._invoke_smart([&#39;config&#39;, &#39;--set&#39;, &#39;rpm-dbpath=/var/lib/rpm&#39;])<br>
+        self._invoke_smart([&#39;config&#39;, &#39;--set&#39;, &#39;rpm-dbpath=%s&#39; % self.rpm_libdir])<br>
         self._invoke_smart([&#39;config&#39;, &#39;--set&#39;, &#39;rpm-extra-macros._var=%s&#39; %<br>
                            self.d.getVar(&#39;localstatedir&#39;)<wbr>])<br>
         cmd = [&quot;config&quot;, &quot;--set&quot;, &quot;rpm-extra-macros._tmppath=/%<wbr>s/tmp&quot; % self.install_dir_name]<br>
@@ -1236,7 +1237,7 @@ class RpmPM(PackageManager):<br>
<br>
         if not with_dependencies:<br>
             cmd = [self.rpm_cmd] + [&quot;-e&quot;, &quot;--nodeps&quot;, &quot;--root=%s&quot; %<br>
-                    self.target_rootfs, &quot;--dbpath=/var/lib/rpm&quot;,<br>
+                    self.target_rootfs, &quot;--dbpath=%s&quot; % self.rpm_libdir,<br>
                     &quot;--define=&#39;_cross_scriptlet_<wbr>wrapper %s&#39;&quot; %<br>
                     self.scriptlet_wrapper,<br>
                     &quot;--define=&#39;_tmppath /%s/tmp&#39;&quot; % self.install_dir_name] + pkgs<br>
@@ -1384,7 +1385,8 @@ class RpmPM(PackageManager):<br>
         saved_dir = self.target_rootfs + self.d.expand(&#39;${sysconfdir}/<wbr>rpm-postinsts/&#39;) + new_pkg<br>
<br>
         cmd = self.rpm_cmd + &#39; -q --scripts --root &#39; + self.target_rootfs<br>
-        cmd += &#39; --dbpath=/var/lib/rpm &#39; + new_pkg<br>
+        cmd += &#39; --dbpath=%s &#39; %  self.rpm_libdir<br>
+        cmd += new_pkg<br>
         cmd += &#39; | sed -n -e &quot;/^postinstall scriptlet (using .*):$/,/^.* scriptlet (using .*):$/ {/.*/p}&quot;&#39;<br>
         cmd += &#39; | sed -e &quot;/postinstall scriptlet (using \(.*\)):$/d&quot;&#39;<br>
         cmd += &#39; -e &quot;/^.* scriptlet (using .*):$/d&quot; &gt; %s&#39; % saved_dir<br>
@@ -1416,7 +1418,8 @@ class RpmPM(PackageManager):<br>
     &#39;&#39;&#39;<br>
     def unlock_rpm_db(self):<br>
         # Remove rpm db lock files<br>
-        rpm_db_locks = glob.glob(&#39;%s/var/lib/rpm/__<wbr>db.*&#39; % self.target_rootfs)<br>
+        rpm_db_locks = glob.glob(&#39;%s%s/__db.*&#39; % (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(&#39;rpmlibdir&#39;)<br>
         rpm_pre_process_cmds = self.d.getVar(&#39;RPM_PREPROCESS_<wbr>COMMANDS&#39;)<br>
         rpm_post_process_cmds = self.d.getVar(&#39;RPM_<wbr>POSTPROCESS_COMMANDS&#39;)<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([&#39;/etc/<wbr>rpm&#39;, &#39;/var/lib/rpm&#39;, &#39;/var/lib/smart&#39;])<br>
+        self._setup_dbg_rootfs([&#39;/etc/<wbr>rpm&#39;, rpm_libdir, &#39;/var/lib/smart&#39;])<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 += &quot;--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} =  &quot;${bindir}/rpm \<br>
                ${localstatedir}/lib/wdj \<br>
                ${bindir}/rpm.real \<br>
                ${bindir}/rpmconstant.real \<br>
+               ${rpmlibdir} \<br>
                &quot;<br>
<br>
 FILES_${PN}-common = &quot;${bindir}/rpm2cpio \<br>
<span class="HOEnZb"><font color="#888888">--<br>
2.11.0<br>
<br>
</font></span></blockquote></div><br></div>