All of lore.kernel.org
 help / color / mirror / Atom feed
* Re: [PATCH 03/22] update-alternatives.bbclass: Add missing runtime dependency
  2012-12-04 17:14 ` [PATCH 03/22] update-alternatives.bbclass: Add missing runtime dependency Mark Hatle
@ 2012-12-04 17:04   ` Martin Jansa
  2012-12-04 17:34     ` Mark Hatle
  0 siblings, 1 reply; 37+ messages in thread
From: Martin Jansa @ 2012-12-04 17:04 UTC (permalink / raw)
  To: Mark Hatle; +Cc: openembedded-core

[-- Attachment #1: Type: text/plain, Size: 1836 bytes --]

On Tue, Dec 04, 2012 at 11:14:35AM -0600, Mark Hatle wrote:
> When using update-alternatives, there should be a runtime dependency on
> update-alternatives.  Without this, it's possible to get into a situation
> where the package is not installable.
> 
> Signed-off-by: Mark Hatle <mark.hatle@windriver.com>
> ---
>  meta/classes/update-alternatives.bbclass |    6 ++++++
>  1 files changed, 6 insertions(+), 0 deletions(-)
> 
> diff --git a/meta/classes/update-alternatives.bbclass b/meta/classes/update-alternatives.bbclass
> index 4e1ff27..e432506 100644
> --- a/meta/classes/update-alternatives.bbclass
> +++ b/meta/classes/update-alternatives.bbclass
> @@ -304,6 +304,12 @@ python populate_packages_prepend () {
>              alt_remove_links += '\tupdate-alternatives --remove  %s %s\n' % (alt_name, alt_target)
>  
>          if alt_setup_links:
> +            # RDEPENDS setup
> +            bb.note('adding runtime requirement for update-alternatives for %s' % pkg)
> +            rdepends = d.getVar('RDEPENDS_%s' % pkg, True) or ""
> +            rdepends += ' ' + d.getVar('MLPREFIX') + 'update-alternatives'
> +            d.setVar("RDEPENDS_%s" % pkg, rdepends)
> +

I guess you should use VIRTUAL-RUNTIME_update-alternatives here

Cheers,

>              bb.note('adding update-alternatives calls to postinst/postrm for %s' % pkg)
>              bb.note('%s' % alt_setup_links)
>              postinst = (d.getVar('pkg_postinst_%s' % pkg, True) or d.getVar('pkg_postinst', True)) or '#!/bin/sh\n'
> -- 
> 1.7.3.4
> 
> 
> _______________________________________________
> Openembedded-core mailing list
> Openembedded-core@lists.openembedded.org
> http://lists.linuxtogo.org/cgi-bin/mailman/listinfo/openembedded-core

-- 
Martin 'JaMa' Jansa     jabber: Martin.Jansa@gmail.com

[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 205 bytes --]

^ permalink raw reply	[flat|nested] 37+ messages in thread

* [PATCH 00/22] Misc fixes
@ 2012-12-04 17:14 Mark Hatle
  2012-12-04 17:14 ` [PATCH 01/22] cpio: Split RMT from cpio Mark Hatle
                   ` (21 more replies)
  0 siblings, 22 replies; 37+ messages in thread
From: Mark Hatle @ 2012-12-04 17:14 UTC (permalink / raw)
  To: openembedded-core

While working on the Smart integration PaulE and I fixed a number of 
small defect that we found.  Some of the RPM package defects were not 
visible with the previous integration (it had silently worked around 
them), while other issues are small and nobody seems to have noticed 
them before.

The following changes since commit 24b954253dd1aa626835352c4dc8d085a19aae35:

  xserver-xorg: restore packaging for the DRI/DRI2/DBE extensions (2012-12-03 16:38:28 +0000)

are available in the git repository at:
  git://git.yoctoproject.org/poky-contrib mhatle/misc
  http://git.yoctoproject.org/cgit.cgi//log/?h=mhatle/misc

Mark Hatle (13):
  cpio: Split RMT from cpio
  tar: Split RMT from tar
  update-alternatives.bbclass: Add missing runtime dependency
  package_rpm.bbclass: Add the runtime dependencies to the pre/post
    scriptlets
  rpm: Move rpmdb_loadcvt from base to dev package
  rpm: Fix rpm relocation macro usage
  rpm: Fixup platform matching code
  rpm: Fix Upstream-Status fields
  python-smartpm: Fix incorrect comparison arguments
  package_deb: Dependencies with a ( or ) in them are invalid in debs
  pkgconfig: Add a manual dependency of pkgconfig(pkg-config)
  pseudo: Rework target, native and nativesdk pseudo intergration
  license.bbclass: Avoid grep error message

Paul Eggleton (9):
  rpm: enable _openall_before_chroot by default
  createrepo: implement support for recommends
  python-smartpm: add support for recommends
  python-smartpm: style fixes
  python-smartpm: fix package metadata not being read from rpm-md feeds
  python-smartpm: don't create /var/tmp on every rpm database open
  python-smartpm: support nolinktos and noparentdirs rpm options
  python-smartpm: allow setting arbitrary macros in smart config
  shadow: add runtime dependency on base-passwd

 meta/classes/license.bbclass                       |    3 +-
 meta/classes/package_deb.bbclass                   |   10 +
 meta/classes/package_rpm.bbclass                   |   86 +-
 meta/classes/update-alternatives.bbclass           |    6 +
 meta/recipes-devtools/pkgconfig/pkgconfig.inc      |    5 +
 meta/recipes-devtools/pkgconfig/pkgconfig_0.25.bb  |    2 +-
 meta/recipes-devtools/pkgconfig/pkgconfig_git.bb   |    1 +
 meta/recipes-devtools/pseudo/pseudo.inc            |   58 +-
 meta/recipes-devtools/pseudo/pseudo_1.4.1.bb       |    2 +-
 meta/recipes-devtools/pseudo/pseudo_git.bb         |    2 +-
 .../python/python-smartpm/smart-dflags.patch       |   40 +
 .../python-smartpm/smart-metadata-match.patch      |   28 +
 .../python/python-smartpm/smart-missingok.patch    |   43 -
 .../python/python-smartpm/smart-recommends.patch   | 1362 ++++++++++++++++++++
 .../python-smartpm/smart-rpm-extra-macros.patch    |   27 +
 .../python/python-smartpm/smart-rpm-md-parse.patch |   26 +
 .../python/python-smartpm/smart-tmpdir.patch       |   30 +
 .../python/python-smartpm_1.4.1.bb                 |   57 +-
 .../rpm/rpm/python-rpm-rpmsense.patch              |    2 +-
 .../rpm/rpm/rpm-db_buffer_small.patch              |    2 +-
 meta/recipes-devtools/rpm/rpm/rpm-platform2.patch  |   56 +
 .../rpm/rpm/rpm-reloc-macros.patch                 |   31 +
 .../rpm/rpm/rpm-stub-out-git_strerror.patch        |    2 +-
 .../rpm/rpm/rpm-uuid-include.patch                 |    2 +
 meta/recipes-devtools/rpm/rpm_5.4.9.bb             |   11 +-
 meta/recipes-extended/cpio/cpio_2.11.bb            |    2 +-
 meta/recipes-extended/cpio/cpio_2.8.bb             |    2 +-
 meta/recipes-extended/cpio/cpio_v2.inc             |   11 +-
 meta/recipes-extended/shadow/shadow_4.1.4.3.bb     |    5 +-
 meta/recipes-extended/tar/tar.inc                  |   11 +-
 meta/recipes-extended/tar/tar_1.17.bb              |    2 +-
 meta/recipes-extended/tar/tar_1.26.bb              |    2 +-
 .../createrepo/createrepo/recommends.patch         |   71 +
 .../createrepo/createrepo_0.4.11.bb                |    3 +-
 34 files changed, 1852 insertions(+), 151 deletions(-)
 create mode 100644 meta/recipes-devtools/python/python-smartpm/smart-dflags.patch
 create mode 100644 meta/recipes-devtools/python/python-smartpm/smart-metadata-match.patch
 delete mode 100644 meta/recipes-devtools/python/python-smartpm/smart-missingok.patch
 create mode 100644 meta/recipes-devtools/python/python-smartpm/smart-recommends.patch
 create mode 100644 meta/recipes-devtools/python/python-smartpm/smart-rpm-extra-macros.patch
 create mode 100644 meta/recipes-devtools/python/python-smartpm/smart-rpm-md-parse.patch
 create mode 100644 meta/recipes-devtools/python/python-smartpm/smart-tmpdir.patch
 create mode 100644 meta/recipes-devtools/rpm/rpm/rpm-platform2.patch
 create mode 100644 meta/recipes-devtools/rpm/rpm/rpm-reloc-macros.patch
 create mode 100644 meta/recipes-support/createrepo/createrepo/recommends.patch

-- 
1.7.3.4




^ permalink raw reply	[flat|nested] 37+ messages in thread

* [PATCH 01/22] cpio: Split RMT from cpio
  2012-12-04 17:14 [PATCH 00/22] Misc fixes Mark Hatle
@ 2012-12-04 17:14 ` Mark Hatle
  2012-12-04 17:14 ` [PATCH 02/22] tar: Split RMT from tar Mark Hatle
                   ` (20 subsequent siblings)
  21 siblings, 0 replies; 37+ messages in thread
From: Mark Hatle @ 2012-12-04 17:14 UTC (permalink / raw)
  To: openembedded-core

After the recent change of the libexecdir definition, the update-alternatives
for the libexec rmt broke.  Fix this by moving rmt from libexec to /sbin.  Also
split the rmt app from cpio as it's likely not useful to many users.

Signed-off-by: Mark Hatle <mark.hatle@windriver.com>
---
 meta/recipes-extended/cpio/cpio_2.11.bb |    2 +-
 meta/recipes-extended/cpio/cpio_2.8.bb  |    2 +-
 meta/recipes-extended/cpio/cpio_v2.inc  |   11 +++++++++--
 3 files changed, 11 insertions(+), 4 deletions(-)

diff --git a/meta/recipes-extended/cpio/cpio_2.11.bb b/meta/recipes-extended/cpio/cpio_2.11.bb
index 9b37dcd..5f88b30 100644
--- a/meta/recipes-extended/cpio/cpio_2.11.bb
+++ b/meta/recipes-extended/cpio/cpio_2.11.bb
@@ -3,7 +3,7 @@ include cpio_v2.inc
 LICENSE = "GPLv3"
 LIC_FILES_CHKSUM = "file://COPYING;md5=f27defe1e96c2e1ecd4e0c9be8967949"
 
-PR = "r3"
+PR = "r4"
 
 SRC_URI += "file://remove-gets.patch \
            "
diff --git a/meta/recipes-extended/cpio/cpio_2.8.bb b/meta/recipes-extended/cpio/cpio_2.8.bb
index cabc1cd..b6da207 100644
--- a/meta/recipes-extended/cpio/cpio_2.8.bb
+++ b/meta/recipes-extended/cpio/cpio_2.8.bb
@@ -3,7 +3,7 @@ require cpio_v2.inc
 LICENSE = "GPLv2"
 LIC_FILES_CHKSUM = "file://COPYING;md5=b7f772ea3a2489231cb4872656cac34b"
 
-PR = "r2"
+PR = "r3"
 
 SRC_URI += "file://m4extensions.patch \
     file://avoid_heap_overflow.patch \
diff --git a/meta/recipes-extended/cpio/cpio_v2.inc b/meta/recipes-extended/cpio/cpio_v2.inc
index 3b3402b..30446b0 100644
--- a/meta/recipes-extended/cpio/cpio_v2.inc
+++ b/meta/recipes-extended/cpio/cpio_v2.inc
@@ -14,6 +14,8 @@ inherit autotools gettext
 
 S = "${WORKDIR}/cpio-${PV}"
 
+EXTRA_OECONF += "DEFAULT_RMT_DIR=${base_sbindir}"
+
 do_install () {
     autotools_do_install
     install -d ${D}${base_bindir}/
@@ -21,13 +23,18 @@ do_install () {
     rmdir ${D}${bindir}/
 }
 
+PACKAGES =+ "${PN}-rmt"
+
+FILES_${PN}-rmt = "${base_sbindir}/rmt*"
+
 inherit update-alternatives
 
 ALTERNATIVE_PRIORITY = "100"
 
-ALTERNATIVE_${PN} = "cpio rmt"
+ALTERNATIVE_${PN} = "cpio"
+ALTERNATIVE_${PN}-rmt = "rmt"
 
 ALTERNATIVE_LINK_NAME[cpio] = "${base_bindir}/cpio"
 
 ALTERNATIVE_PRIORITY[rmt] = "50"
-ALTERNATIVE_LINK_NAME[rmt] = "${libexecdir}/rmt"
+ALTERNATIVE_LINK_NAME[rmt] = "${base_sbindir}/rmt"
-- 
1.7.3.4




^ permalink raw reply related	[flat|nested] 37+ messages in thread

* [PATCH 02/22] tar: Split RMT from tar
  2012-12-04 17:14 [PATCH 00/22] Misc fixes Mark Hatle
  2012-12-04 17:14 ` [PATCH 01/22] cpio: Split RMT from cpio Mark Hatle
@ 2012-12-04 17:14 ` Mark Hatle
  2012-12-04 17:14 ` [PATCH 03/22] update-alternatives.bbclass: Add missing runtime dependency Mark Hatle
                   ` (19 subsequent siblings)
  21 siblings, 0 replies; 37+ messages in thread
From: Mark Hatle @ 2012-12-04 17:14 UTC (permalink / raw)
  To: openembedded-core

After the recent change of the libexecdir definition, the update-alternatives
for the libexec rmt broke.  Fix this by moving rmt from libexec to /sbin.  Also
split the rmt app from tar as it's likely not useful to many users.

Signed-off-by: Mark Hatle <mark.hatle@windriver.com>
---
 meta/recipes-extended/tar/tar.inc     |   11 +++++++++--
 meta/recipes-extended/tar/tar_1.17.bb |    2 +-
 meta/recipes-extended/tar/tar_1.26.bb |    2 +-
 3 files changed, 11 insertions(+), 4 deletions(-)

diff --git a/meta/recipes-extended/tar/tar.inc b/meta/recipes-extended/tar/tar.inc
index b50425e..f49c7de 100644
--- a/meta/recipes-extended/tar/tar.inc
+++ b/meta/recipes-extended/tar/tar.inc
@@ -8,6 +8,8 @@ SRC_URI = "${GNU_MIRROR}/tar/tar-${PV}.tar.bz2"
 
 inherit autotools gettext
 
+EXTRA_OECONF += "DEFAULT_RMT_DIR=${base_sbindir}"
+
 EXTRAINSTALL = "do_install_extra"
 
 do_install () {
@@ -21,11 +23,16 @@ do_install_extra () {
     rmdir ${D}${bindir}/
 }
 
+PACKAGES =+ "${PN}-rmt"
+
+FILES_${PN}-rmt = "${base_sbindir}/rmt*"
+
 inherit update-alternatives
 
 ALTERNATIVE_PRIORITY = "100"
 
-ALTERNATIVE_${PN} = "tar rmt"
+ALTERNATIVE_${PN} = "tar"
+ALTERNATIVE_${PN}-rmt = "rmt"
 
 ALTERNATIVE_LINK_NAME[tar] = "${base_bindir}/tar"
-ALTERNATIVE_LINK_NAME[rmt] = "${libexecdir}/rmt"
+ALTERNATIVE_LINK_NAME[rmt] = "${base_sbindir}/rmt"
diff --git a/meta/recipes-extended/tar/tar_1.17.bb b/meta/recipes-extended/tar/tar_1.17.bb
index 9425f14d..b9ca206 100644
--- a/meta/recipes-extended/tar/tar_1.17.bb
+++ b/meta/recipes-extended/tar/tar_1.17.bb
@@ -3,7 +3,7 @@ require tar.inc
 LICENSE = "GPLv2"
 LIC_FILES_CHKSUM = "file://COPYING;md5=59530bdf33659b29e73d4adb9f9f6552"
 
-PR = "r2"
+PR = "r3"
 
 SRC_URI += "file://m4extensions.patch \
     file://gcc43build.patch \
diff --git a/meta/recipes-extended/tar/tar_1.26.bb b/meta/recipes-extended/tar/tar_1.26.bb
index 4c8ab2c..03a35c3 100644
--- a/meta/recipes-extended/tar/tar_1.26.bb
+++ b/meta/recipes-extended/tar/tar_1.26.bb
@@ -3,7 +3,7 @@ require tar.inc
 LICENSE = "GPLv3"
 LIC_FILES_CHKSUM = "file://COPYING;md5=d32239bcb673463ab874e80d47fae504"
 
-PR = "r3"
+PR = "r4"
 
 SRC_URI += "file://remove-gets.patch \
            "
-- 
1.7.3.4




^ permalink raw reply related	[flat|nested] 37+ messages in thread

* [PATCH 03/22] update-alternatives.bbclass: Add missing runtime dependency
  2012-12-04 17:14 [PATCH 00/22] Misc fixes Mark Hatle
  2012-12-04 17:14 ` [PATCH 01/22] cpio: Split RMT from cpio Mark Hatle
  2012-12-04 17:14 ` [PATCH 02/22] tar: Split RMT from tar Mark Hatle
@ 2012-12-04 17:14 ` Mark Hatle
  2012-12-04 17:04   ` Martin Jansa
  2012-12-04 17:14 ` [PATCH 04/22] package_rpm.bbclass: Add the runtime dependencies to the pre/post scriptlets Mark Hatle
                   ` (18 subsequent siblings)
  21 siblings, 1 reply; 37+ messages in thread
From: Mark Hatle @ 2012-12-04 17:14 UTC (permalink / raw)
  To: openembedded-core

When using update-alternatives, there should be a runtime dependency on
update-alternatives.  Without this, it's possible to get into a situation
where the package is not installable.

Signed-off-by: Mark Hatle <mark.hatle@windriver.com>
---
 meta/classes/update-alternatives.bbclass |    6 ++++++
 1 files changed, 6 insertions(+), 0 deletions(-)

diff --git a/meta/classes/update-alternatives.bbclass b/meta/classes/update-alternatives.bbclass
index 4e1ff27..e432506 100644
--- a/meta/classes/update-alternatives.bbclass
+++ b/meta/classes/update-alternatives.bbclass
@@ -304,6 +304,12 @@ python populate_packages_prepend () {
             alt_remove_links += '\tupdate-alternatives --remove  %s %s\n' % (alt_name, alt_target)
 
         if alt_setup_links:
+            # RDEPENDS setup
+            bb.note('adding runtime requirement for update-alternatives for %s' % pkg)
+            rdepends = d.getVar('RDEPENDS_%s' % pkg, True) or ""
+            rdepends += ' ' + d.getVar('MLPREFIX') + 'update-alternatives'
+            d.setVar("RDEPENDS_%s" % pkg, rdepends)
+
             bb.note('adding update-alternatives calls to postinst/postrm for %s' % pkg)
             bb.note('%s' % alt_setup_links)
             postinst = (d.getVar('pkg_postinst_%s' % pkg, True) or d.getVar('pkg_postinst', True)) or '#!/bin/sh\n'
-- 
1.7.3.4




^ permalink raw reply related	[flat|nested] 37+ messages in thread

* [PATCH 04/22] package_rpm.bbclass: Add the runtime dependencies to the pre/post scriptlets
  2012-12-04 17:14 [PATCH 00/22] Misc fixes Mark Hatle
                   ` (2 preceding siblings ...)
  2012-12-04 17:14 ` [PATCH 03/22] update-alternatives.bbclass: Add missing runtime dependency Mark Hatle
@ 2012-12-04 17:14 ` Mark Hatle
  2012-12-04 17:14 ` [PATCH 05/22] rpm: enable _openall_before_chroot by default Mark Hatle
                   ` (17 subsequent siblings)
  21 siblings, 0 replies; 37+ messages in thread
From: Mark Hatle @ 2012-12-04 17:14 UTC (permalink / raw)
  To: openembedded-core

When the scriptlets are processed in RPM, they have a different dependency
set then the core package.  OE has no way to specify dependencies for the
pre/post scriptlists, so we simply make the runtime dependencies scriptlets
as well.

Signed-off-by: Mark Hatle <mark.hatle@windriver.com>
---
 meta/classes/package_rpm.bbclass |   86 ++++++++++++++++++++++++--------------
 1 files changed, 55 insertions(+), 31 deletions(-)

diff --git a/meta/classes/package_rpm.bbclass b/meta/classes/package_rpm.bbclass
index 1ff92ce..200a941 100644
--- a/meta/classes/package_rpm.bbclass
+++ b/meta/classes/package_rpm.bbclass
@@ -730,10 +730,10 @@ python write_specfile () {
     srcrconflicts  = []
     srcrobsoletes  = []
 
-    srcpreinst  = []
-    srcpostinst = []
-    srcprerm    = []
-    srcpostrm   = []
+    srcrpreinst  = []
+    srcrpostinst = []
+    srcrprerm    = []
+    srcrpostrm   = []
 
     spec_preamble_top = []
     spec_preamble_bottom = []
@@ -792,6 +792,11 @@ python write_specfile () {
         splitrconflicts  = strip_multilib_deps(localdata.getVar('RCONFLICTS', True), d)
         splitrobsoletes  = []
 
+        splitrpreinst  = localdata.getVar('pkg_preinst', True)
+        splitrpostinst = localdata.getVar('pkg_postinst', True)
+        splitrprerm    = localdata.getVar('pkg_prerm', True)
+        splitrpostrm   = localdata.getVar('pkg_postrm', True)
+
         # Gather special src/first package data
         if srcname == splitname:
             srcrdepends    = splitrdepends
@@ -801,10 +806,10 @@ python write_specfile () {
             srcrreplaces   = splitrreplaces
             srcrconflicts  = splitrconflicts
 
-            srcpreinst  = localdata.getVar('pkg_preinst', True)
-            srcpostinst = localdata.getVar('pkg_postinst', True)
-            srcprerm    = localdata.getVar('pkg_prerm', True)
-            srcpostrm   = localdata.getVar('pkg_postrm', True)
+            srcrpreinst    = splitrpreinst
+            srcrpostinst   = splitrpostinst
+            srcrprerm      = splitrprerm
+            srcrpostrm     = splitrpostrm
 
             file_list = []
             walk_files(root, file_list, conffiles)
@@ -850,6 +855,15 @@ python write_specfile () {
         splitrprovides = bb.utils.join_deps(rprovides, commasep=False)
 
         print_deps(splitrdepends, "Requires", spec_preamble_bottom, d)
+        if splitrpreinst:
+            print_deps(splitrdepends, "Requires(pre)", spec_preamble_bottom, d)
+        if splitrpostinst:
+            print_deps(splitrdepends, "Requires(post)", spec_preamble_bottom, d)
+        if splitrprerm:
+            print_deps(splitrdepends, "Requires(preun)", spec_preamble_bottom, d)
+        if splitrpostrm:
+            print_deps(splitrdepends, "Requires(postun)", spec_preamble_bottom, d)
+
         # Suggests in RPM are like recommends in OE-core!
         print_deps(splitrrecommends, "Suggests", spec_preamble_bottom, d)
         # While there is no analog for suggests... (So call them recommends for now)
@@ -880,21 +894,22 @@ python write_specfile () {
         spec_preamble_bottom.append('')
 
         # Now process scriptlets
-        for script in ["preinst", "postinst", "prerm", "postrm"]:
-            scriptvar = localdata.getVar('pkg_%s' % script, True)
-            if not scriptvar:
-                continue
-            if script == 'preinst':
-                spec_scriptlets_bottom.append('%%pre -n %s' % splitname)
-            elif script == 'postinst':
-                spec_scriptlets_bottom.append('%%post -n %s' % splitname)
-            elif script == 'prerm':
-                spec_scriptlets_bottom.append('%%preun -n %s' % splitname)
-                scriptvar = wrap_uninstall(scriptvar)
-            elif script == 'postrm':
-                spec_scriptlets_bottom.append('%%postun -n %s' % splitname)
-                scriptvar = wrap_uninstall(scriptvar)
-            spec_scriptlets_bottom.append('# %s - %s' % (splitname, script))
+        if splitrpreinst:
+            spec_scriptlets_bottom.append('%%pre -n %s' % splitname)
+            spec_scriptlets_bottom.append(splitrpreinst)
+            spec_scriptlets_bottom.append('')
+        if splitrpostinst:
+            spec_scriptlets_bottom.append('%%post -n %s' % splitname)
+            spec_scriptlets_bottom.append(splitrpostinst)
+            spec_scriptlets_bottom.append('')
+        if splitrprerm:
+            spec_scriptlets_bottom.append('%%preun -n %s' % splitname)
+            scriptvar = wrap_uninstall(splitrprerm)
+            spec_scriptlets_bottom.append(scriptvar)
+            spec_scriptlets_bottom.append('')
+        if splitrpostrm:
+            spec_scriptlets_bottom.append('%%postun -n %s' % splitname)
+            scriptvar = wrap_uninstall(splitrpostrm)
             spec_scriptlets_bottom.append(scriptvar)
             spec_scriptlets_bottom.append('')
 
@@ -943,6 +958,15 @@ python write_specfile () {
 
     print_deps(srcdepends, "BuildRequires", spec_preamble_top, d)
     print_deps(srcrdepends, "Requires", spec_preamble_top, d)
+    if srcrpreinst:
+        print_deps(srcrdepends, "Requires(pre)", spec_preamble_top, d)
+    if srcrpostinst:
+        print_deps(srcrdepends, "Requires(post)", spec_preamble_top, d)
+    if srcrprerm:
+        print_deps(srcrdepends, "Requires(preun)", spec_preamble_top, d)
+    if srcrpostrm:
+        print_deps(srcrdepends, "Requires(postun)", spec_preamble_top, d)
+
     # Suggests in RPM are like recommends in OE-core!
     print_deps(srcrrecommends, "Suggests", spec_preamble_top, d)
     # While there is no analog for suggests... (So call them recommends for now)
@@ -972,26 +996,26 @@ python write_specfile () {
 
     spec_preamble_top.append('')
 
-    if srcpreinst:
+    if srcrpreinst:
         spec_scriptlets_top.append('%pre')
         spec_scriptlets_top.append('# %s - preinst' % srcname)
-        spec_scriptlets_top.append(srcpreinst)
+        spec_scriptlets_top.append(srcrpreinst)
         spec_scriptlets_top.append('')
-    if srcpostinst:
+    if srcrpostinst:
         spec_scriptlets_top.append('%post')
         spec_scriptlets_top.append('# %s - postinst' % srcname)
-        spec_scriptlets_top.append(srcpostinst)
+        spec_scriptlets_top.append(srcrpostinst)
         spec_scriptlets_top.append('')
-    if srcprerm:
+    if srcrprerm:
         spec_scriptlets_top.append('%preun')
         spec_scriptlets_top.append('# %s - prerm' % srcname)
-        scriptvar = wrap_uninstall(srcprerm)
+        scriptvar = wrap_uninstall(srcrprerm)
         spec_scriptlets_top.append(scriptvar)
         spec_scriptlets_top.append('')
-    if srcpostrm:
+    if srcrpostrm:
         spec_scriptlets_top.append('%postun')
         spec_scriptlets_top.append('# %s - postrm' % srcname)
-        scriptvar = wrap_uninstall(srcpostrm)
+        scriptvar = wrap_uninstall(srcrpostrm)
         spec_scriptlets_top.append(scriptvar)
         spec_scriptlets_top.append('')
 
-- 
1.7.3.4




^ permalink raw reply related	[flat|nested] 37+ messages in thread

* [PATCH 05/22] rpm: enable _openall_before_chroot by default
  2012-12-04 17:14 [PATCH 00/22] Misc fixes Mark Hatle
                   ` (3 preceding siblings ...)
  2012-12-04 17:14 ` [PATCH 04/22] package_rpm.bbclass: Add the runtime dependencies to the pre/post scriptlets Mark Hatle
@ 2012-12-04 17:14 ` Mark Hatle
  2012-12-04 17:14 ` [PATCH 06/22] rpm: Move rpmdb_loadcvt from base to dev package Mark Hatle
                   ` (16 subsequent siblings)
  21 siblings, 0 replies; 37+ messages in thread
From: Mark Hatle @ 2012-12-04 17:14 UTC (permalink / raw)
  To: openembedded-core

From: Paul Eggleton <paul.eggleton@linux.intel.com>

We want this enabled especially for the native case.

Signed-off-by: Paul Eggleton <paul.eggleton@linux.intel.com>
---
 meta/recipes-devtools/rpm/rpm_5.4.9.bb |    3 ++-
 1 files changed, 2 insertions(+), 1 deletions(-)

diff --git a/meta/recipes-devtools/rpm/rpm_5.4.9.bb b/meta/recipes-devtools/rpm/rpm_5.4.9.bb
index a64ddd1..d435996 100644
--- a/meta/recipes-devtools/rpm/rpm_5.4.9.bb
+++ b/meta/recipes-devtools/rpm/rpm_5.4.9.bb
@@ -43,7 +43,7 @@ LICENSE = "LGPLv2.1"
 LIC_FILES_CHKSUM = "file://COPYING.LIB;md5=2d5025d4aa3495befef8f17206a5b0a1"
 
 DEPENDS = "libpcre attr acl popt ossp-uuid file bison-native"
-PR = "r54"
+PR = "r55"
 
 # rpm2cpio is a shell script, which is part of the rpm src.rpm.  It is needed
 # in order to extract the distribution SRPM into a format we can extract...
@@ -364,6 +364,7 @@ do_install_append() {
 	sed -i -e 's,%__perl_provides,#%%__perl_provides,' ${D}/${libdir}/rpm/macros
 	sed -i -e 's,%__perl_requires,#%%__perl_requires,' ${D}/${libdir}/rpm/macros
 	sed -i -e 's,%_repackage_all_erasures[^_].*,%_repackage_all_erasures 0,' ${D}/${libdir}/rpm/macros
+	sed -i -e 's,^#%_openall_before_chroot.*,%_openall_before_chroot\t1,' ${D}/${libdir}/rpm/macros
 
 	# Enable Debian style arbitrary tags...
 	sed -i -e 's,%_arbitrary_tags[^_].*,%_arbitrary_tags %{_arbitrary_tags_debian},' ${D}/${libdir}/rpm/macros
-- 
1.7.3.4




^ permalink raw reply related	[flat|nested] 37+ messages in thread

* [PATCH 06/22] rpm: Move rpmdb_loadcvt from base to dev package
  2012-12-04 17:14 [PATCH 00/22] Misc fixes Mark Hatle
                   ` (4 preceding siblings ...)
  2012-12-04 17:14 ` [PATCH 05/22] rpm: enable _openall_before_chroot by default Mark Hatle
@ 2012-12-04 17:14 ` Mark Hatle
  2012-12-04 17:14 ` [PATCH 07/22] rpm: Fix rpm relocation macro usage Mark Hatle
                   ` (15 subsequent siblings)
  21 siblings, 0 replies; 37+ messages in thread
From: Mark Hatle @ 2012-12-04 17:14 UTC (permalink / raw)
  To: openembedded-core

This item is only useful when the various development components are
installed.

Signed-off-by: Mark Hatle <mark.hatle@windriver.com>
---
 meta/recipes-devtools/rpm/rpm_5.4.9.bb |    8 ++++++--
 1 files changed, 6 insertions(+), 2 deletions(-)

diff --git a/meta/recipes-devtools/rpm/rpm_5.4.9.bb b/meta/recipes-devtools/rpm/rpm_5.4.9.bb
index d435996..ccf079a 100644
--- a/meta/recipes-devtools/rpm/rpm_5.4.9.bb
+++ b/meta/recipes-devtools/rpm/rpm_5.4.9.bb
@@ -43,7 +43,7 @@ LICENSE = "LGPLv2.1"
 LIC_FILES_CHKSUM = "file://COPYING.LIB;md5=2d5025d4aa3495befef8f17206a5b0a1"
 
 DEPENDS = "libpcre attr acl popt ossp-uuid file bison-native"
-PR = "r55"
+PR = "r56"
 
 # rpm2cpio is a shell script, which is part of the rpm src.rpm.  It is needed
 # in order to extract the distribution SRPM into a format we can extract...
@@ -203,7 +203,6 @@ FILES_${PN} =  "${bindir}/rpm \
 		${libdir}/rpm/tgpg \
 		${libdir}/rpm/macros \
 		${libdir}/rpm/rpmpopt \
-		${libdir}/rpm/rpmdb_loadcvt \
 		${libdir}/rpm/rpm2cpio \
 		${libdir}/rpm/vcheck \
 		${libdir}/rpm/helpers \
@@ -237,6 +236,8 @@ FILES_${PN}-libs = "${libdir}/librpm-*.so \
 		${libdir}/librpmbuild-*.so \
 		"
 
+RDEPENDS_${PN}-build += "bash"
+
 FILES_${PN}-build = "${prefix}/src/rpm \
 		${bindir}/rpmbuild \
 		${libdir}/rpm/brp-* \
@@ -317,6 +318,8 @@ FILES_perl-module-rpm = "${libdir}/perl/*/* \
 FILES_perl-module-rpm-dev = "${prefix}/share/man/man3/RPM* \
 		"
 
+RDEPENDS_${PN}-dev += "bash"
+
 FILES_${PN}-dev = "${includedir}/rpm \
 		${libdir}/librpm.la \
 		${libdir}/librpm.so \
@@ -332,6 +335,7 @@ FILES_${PN}-dev = "${includedir}/rpm \
 		${libdir}/librpmbuild.so \
 		${libdir}/rpm/lib/liblua.la \
 		${libdir}/pkgconfig/rpm.pc \
+		${libdir}/rpm/rpmdb_loadcvt \
 		"
 
 FILES_${PN}-staticdev = " \
-- 
1.7.3.4




^ permalink raw reply related	[flat|nested] 37+ messages in thread

* [PATCH 07/22] rpm: Fix rpm relocation macro usage
  2012-12-04 17:14 [PATCH 00/22] Misc fixes Mark Hatle
                   ` (5 preceding siblings ...)
  2012-12-04 17:14 ` [PATCH 06/22] rpm: Move rpmdb_loadcvt from base to dev package Mark Hatle
@ 2012-12-04 17:14 ` Mark Hatle
  2012-12-04 17:14 ` [PATCH 08/22] rpm: Fixup platform matching code Mark Hatle
                   ` (14 subsequent siblings)
  21 siblings, 0 replies; 37+ messages in thread
From: Mark Hatle @ 2012-12-04 17:14 UTC (permalink / raw)
  To: openembedded-core

When RPM is setup to dynamically reconfigure itself at runtime, we need
to avoid hard coded settings for _usrlibrpm and _etcrpm.

Signed-off-by: Mark Hatle <mark.hatle@windriver.com>
---
 .../rpm/rpm/rpm-reloc-macros.patch                 |   31 ++++++++++++++++++++
 meta/recipes-devtools/rpm/rpm_5.4.9.bb             |    3 +-
 2 files changed, 33 insertions(+), 1 deletions(-)
 create mode 100644 meta/recipes-devtools/rpm/rpm/rpm-reloc-macros.patch

diff --git a/meta/recipes-devtools/rpm/rpm/rpm-reloc-macros.patch b/meta/recipes-devtools/rpm/rpm/rpm-reloc-macros.patch
new file mode 100644
index 0000000..33ec8e2
--- /dev/null
+++ b/meta/recipes-devtools/rpm/rpm/rpm-reloc-macros.patch
@@ -0,0 +1,31 @@
+macros: Use dyanmic config vs hard coded settings
+
+When the dynamic, runtime relocation is enables we need to make sure that the 
+RPM macro file does not override the dynamic settings.  Fix this by forcing the
+dynamic version to be used in all cases.
+
+Upstream-Status: Inapproriate (OpenEmbedded specific)
+
+Signed-off-by: Mark Hatle <mark.hatle@windriver.com>
+
+Index: rpm-5.4.9/macros/macros.in
+===================================================================
+--- rpm-5.4.9.orig/macros/macros.in
++++ rpm-5.4.9/macros/macros.in
+@@ -27,11 +27,12 @@
+ #==============================================================================
+ # ---- filesystem macros.
+ #
+-%_usr			@usrprefix@
++%_usr			%{_usrlibrpm}/../..
+ %_usrsrc		%{_usr}/src
+-%_var			@varprefix@
+-%_usrlibrpm		@USRLIBRPM@
+-%_etcrpm		@SYSCONFIGDIR@
++%_var			%{_usr}/../var
++# The dynamic relocation code sets the following two items
++#%_usrlibrpm		@USRLIBRPM@
++#%_etcrpm		@SYSCONFIGDIR@
+ 
+ %__objext		@objext@
+ %__libext		@libext@
diff --git a/meta/recipes-devtools/rpm/rpm_5.4.9.bb b/meta/recipes-devtools/rpm/rpm_5.4.9.bb
index ccf079a..59f3eef 100644
--- a/meta/recipes-devtools/rpm/rpm_5.4.9.bb
+++ b/meta/recipes-devtools/rpm/rpm_5.4.9.bb
@@ -43,7 +43,7 @@ LICENSE = "LGPLv2.1"
 LIC_FILES_CHKSUM = "file://COPYING.LIB;md5=2d5025d4aa3495befef8f17206a5b0a1"
 
 DEPENDS = "libpcre attr acl popt ossp-uuid file bison-native"
-PR = "r56"
+PR = "r57"
 
 # rpm2cpio is a shell script, which is part of the rpm src.rpm.  It is needed
 # in order to extract the distribution SRPM into a format we can extract...
@@ -82,6 +82,7 @@ SRC_URI = "http://www.rpm5.org/files/rpm/rpm-5.4/rpm-5.4.9-0.20120508.src.rpm;ex
 	   file://rpm-db_buffer_small.patch \
 	   file://rpm-py-init.patch \
 	   file://python-rpm-rpmsense.patch \
+	   file://rpm-reloc-macros.patch \
 	  "
 
 SRC_URI[md5sum] = "60d56ace884340c1b3fcac6a1d58e768"
-- 
1.7.3.4




^ permalink raw reply related	[flat|nested] 37+ messages in thread

* [PATCH 08/22] rpm: Fixup platform matching code
  2012-12-04 17:14 [PATCH 00/22] Misc fixes Mark Hatle
                   ` (6 preceding siblings ...)
  2012-12-04 17:14 ` [PATCH 07/22] rpm: Fix rpm relocation macro usage Mark Hatle
@ 2012-12-04 17:14 ` Mark Hatle
  2012-12-04 17:14 ` [PATCH 09/22] rpm: Fix Upstream-Status fields Mark Hatle
                   ` (13 subsequent siblings)
  21 siblings, 0 replies; 37+ messages in thread
From: Mark Hatle @ 2012-12-04 17:14 UTC (permalink / raw)
  To: openembedded-core

On ARM systems the platform matching code could fail in some cases, as
the system macros file could override the 'platform' file settings.

Signed-off-by: Mark Hatle <mark.hatle@windriver.com>
---
 meta/recipes-devtools/rpm/rpm/rpm-platform2.patch |   56 +++++++++++++++++++++
 meta/recipes-devtools/rpm/rpm_5.4.9.bb            |    3 +-
 2 files changed, 58 insertions(+), 1 deletions(-)
 create mode 100644 meta/recipes-devtools/rpm/rpm/rpm-platform2.patch

diff --git a/meta/recipes-devtools/rpm/rpm/rpm-platform2.patch b/meta/recipes-devtools/rpm/rpm/rpm-platform2.patch
new file mode 100644
index 0000000..3d50e46
--- /dev/null
+++ b/meta/recipes-devtools/rpm/rpm/rpm-platform2.patch
@@ -0,0 +1,56 @@
+Fix up platform and related sysinfo file loading (part 2).
+
+Upstream-Status: Pending
+
+We need to ensure that we set the _gnu flag somehow.  We do this by reading
+from the platform file, and setting a new platform_gnu and related vars.
+
+We then check for the existance of these things and change the configure
+time defaults to the run-time values as necessary.
+
+Signed-off-by: Mark Hatle <mark.hatle@windriver.com>
+
+Index: rpm-5.4.9/lib/rpmrc.c
+===================================================================
+--- rpm-5.4.9.orig/lib/rpmrc.c
++++ rpm-5.4.9/lib/rpmrc.c
+@@ -487,9 +487,10 @@ static rpmRC rpmPlatform(const char * pl
+ 	}
+ 
+ 	if (!parseCVOG(p, &cvog) && cvog != NULL) {
+-	    addMacro(NULL, "_host_cpu", NULL, cvog->cpu, -1);
+-	    addMacro(NULL, "_host_vendor", NULL, cvog->vendor, -1);
+-	    addMacro(NULL, "_host_os", NULL, cvog->os, -1);
++	    addMacro(NULL, "_platform_cpu", NULL, cvog->cpu, -1);
++	    addMacro(NULL, "_platform_vendor", NULL, cvog->vendor, -1);
++	    addMacro(NULL, "_platform_os", NULL, cvog->os, -1);
++	    addMacro(NULL, "_platform_gnu", NULL, cvog->gnu, -1);
+ 	}
+ 
+ #if defined(RPM_VENDOR_OPENPKG) /* explicit-platform */
+Index: rpm-5.4.9/macros/macros.in
+===================================================================
+--- rpm-5.4.9.orig/macros/macros.in
++++ rpm-5.4.9/macros/macros.in
+@@ -873,7 +873,7 @@ $_arbitrary_tags_tests	Foo:Bar
+ %_build_arch		@RPMCANONARCH@
+ %_vendor		@RPMCANONVENDOR@
+ %_os			@RPMCANONOS@
+-%_gnu			@RPMCANONGNU@
++%_gnu			%{?_platform_gnu:-%{_platform_gnu}}%{!?_platform_gnu:@RPMCANONGNU@}
+ 
+ %_host_platform		%{_host_cpu}-%{_host_vendor}-%{_host_os}%{?_gnu}
+ %_build_platform	%{_build_cpu}-%{_build_vendor}-%{_build_os}%{?_gnu}
+@@ -920,9 +920,9 @@ $_arbitrary_tags_tests	Foo:Bar
+ %_build_os		%{_host_os}
+ %_host			@host@
+ %_host_alias		@host_alias@%{nil}
+-%_host_cpu		@host_cpu@
+-%_host_vendor		@host_vendor@
+-%_host_os		@host_os@
++%_host_cpu		%{?_platform_cpu}%{!?_platform_cpu:@host_cpu@}
++%_host_vendor		%{?_platform_vendor}%{!?_platform_vendor:@host_vendor@}
++%_host_os		%{?_platform_os}%{!?_platform_os:@host_os@}
+ %_target		%{_host}
+ %_target_alias		%{_host_alias}
+ %_target_cpu		%{_host_cpu}
diff --git a/meta/recipes-devtools/rpm/rpm_5.4.9.bb b/meta/recipes-devtools/rpm/rpm_5.4.9.bb
index 59f3eef..7311d0e 100644
--- a/meta/recipes-devtools/rpm/rpm_5.4.9.bb
+++ b/meta/recipes-devtools/rpm/rpm_5.4.9.bb
@@ -43,7 +43,7 @@ LICENSE = "LGPLv2.1"
 LIC_FILES_CHKSUM = "file://COPYING.LIB;md5=2d5025d4aa3495befef8f17206a5b0a1"
 
 DEPENDS = "libpcre attr acl popt ossp-uuid file bison-native"
-PR = "r57"
+PR = "r58"
 
 # rpm2cpio is a shell script, which is part of the rpm src.rpm.  It is needed
 # in order to extract the distribution SRPM into a format we can extract...
@@ -83,6 +83,7 @@ SRC_URI = "http://www.rpm5.org/files/rpm/rpm-5.4/rpm-5.4.9-0.20120508.src.rpm;ex
 	   file://rpm-py-init.patch \
 	   file://python-rpm-rpmsense.patch \
 	   file://rpm-reloc-macros.patch \
+	   file://rpm-platform2.patch \
 	  "
 
 SRC_URI[md5sum] = "60d56ace884340c1b3fcac6a1d58e768"
-- 
1.7.3.4




^ permalink raw reply related	[flat|nested] 37+ messages in thread

* [PATCH 09/22] rpm: Fix Upstream-Status fields
  2012-12-04 17:14 [PATCH 00/22] Misc fixes Mark Hatle
                   ` (7 preceding siblings ...)
  2012-12-04 17:14 ` [PATCH 08/22] rpm: Fixup platform matching code Mark Hatle
@ 2012-12-04 17:14 ` Mark Hatle
  2012-12-04 17:14 ` [PATCH 10/22] createrepo: implement support for recommends Mark Hatle
                   ` (12 subsequent siblings)
  21 siblings, 0 replies; 37+ messages in thread
From: Mark Hatle @ 2012-12-04 17:14 UTC (permalink / raw)
  To: openembedded-core

Signed-off-by: Mark Hatle <mark.hatle@windriver.com>
---
 .../rpm/rpm/python-rpm-rpmsense.patch              |    2 +-
 .../rpm/rpm/rpm-db_buffer_small.patch              |    2 +-
 .../rpm/rpm/rpm-stub-out-git_strerror.patch        |    2 +-
 .../rpm/rpm/rpm-uuid-include.patch                 |    2 ++
 4 files changed, 5 insertions(+), 3 deletions(-)

diff --git a/meta/recipes-devtools/rpm/rpm/python-rpm-rpmsense.patch b/meta/recipes-devtools/rpm/rpm/python-rpm-rpmsense.patch
index 61f1e0c..0fae571 100644
--- a/meta/recipes-devtools/rpm/rpm/python-rpm-rpmsense.patch
+++ b/meta/recipes-devtools/rpm/rpm/python-rpm-rpmsense.patch
@@ -4,7 +4,7 @@ We want to see the RPMSENSE_SCRIPT values for use with SMART.  We also
 want to see the MISSINGOK value so we can avoid recommended packages causing
 failures.
 
-Upstream-status: Pending
+Upstream-Status: Pending
 
 Signed-off-by: Mark Hatle <mark.hatle@windriver.com>
 
diff --git a/meta/recipes-devtools/rpm/rpm/rpm-db_buffer_small.patch b/meta/recipes-devtools/rpm/rpm/rpm-db_buffer_small.patch
index d2ed853..59022f4 100644
--- a/meta/recipes-devtools/rpm/rpm/rpm-db_buffer_small.patch
+++ b/meta/recipes-devtools/rpm/rpm/rpm-db_buffer_small.patch
@@ -14,7 +14,7 @@ If DBI debugging is enabled, additional diagnostics are printed, otherwise
 a basic retry and success message is added to show that the failure was
 resolved.
 
-Upstream-status: Inappropriate (workaround)
+Upstream-Status: Inappropriate (workaround)
 
 Signed-off-by: Mark Hatle <mark.hatle@windriver.com>
 
diff --git a/meta/recipes-devtools/rpm/rpm/rpm-stub-out-git_strerror.patch b/meta/recipes-devtools/rpm/rpm/rpm-stub-out-git_strerror.patch
index 2cfc163..cbeeb29 100644
--- a/meta/recipes-devtools/rpm/rpm/rpm-stub-out-git_strerror.patch
+++ b/meta/recipes-devtools/rpm/rpm/rpm-stub-out-git_strerror.patch
@@ -2,7 +2,7 @@ git: fix: stud-out git_strerror when --without-git
 
 Patch taken from the cvs repo,http://www.mail-archive.com/rpm-cvs@rpm5.org/msg08907.html. 
 
-Upstream-status: Backport
+Upstream-Status: Backport
 
 Signed-off-by: Morgan Little <morgan.little@windriver.com>
 
diff --git a/meta/recipes-devtools/rpm/rpm/rpm-uuid-include.patch b/meta/recipes-devtools/rpm/rpm/rpm-uuid-include.patch
index 0e45ed7..600e2c2 100644
--- a/meta/recipes-devtools/rpm/rpm/rpm-uuid-include.patch
+++ b/meta/recipes-devtools/rpm/rpm/rpm-uuid-include.patch
@@ -7,6 +7,8 @@ use the one in ossp which solves the issue.
 The recipe already depends on ossp so ossp/uuid.h will be there when rpm-native
 is built.
 
+Upstream-Status: Pending
+
 Signed-off-by: Morgan Little <morgan.little@windriver.com>
 
 
-- 
1.7.3.4




^ permalink raw reply related	[flat|nested] 37+ messages in thread

* [PATCH 10/22] createrepo: implement support for recommends
  2012-12-04 17:14 [PATCH 00/22] Misc fixes Mark Hatle
                   ` (8 preceding siblings ...)
  2012-12-04 17:14 ` [PATCH 09/22] rpm: Fix Upstream-Status fields Mark Hatle
@ 2012-12-04 17:14 ` Mark Hatle
  2012-12-04 17:14 ` [PATCH 11/22] python-smartpm: add " Mark Hatle
                   ` (11 subsequent siblings)
  21 siblings, 0 replies; 37+ messages in thread
From: Mark Hatle @ 2012-12-04 17:14 UTC (permalink / raw)
  To: openembedded-core

From: Paul Eggleton <paul.eggleton@linux.intel.com>

Adds a flag into the output metadata to note recommends relationships
in a way that should not break compatibility with clients that don't
understand this flag.

Signed-off-by: Paul Eggleton <paul.eggleton@linux.intel.com>
---
 .../createrepo/createrepo/recommends.patch         |   71 ++++++++++++++++++++
 .../createrepo/createrepo_0.4.11.bb                |    3 +-
 2 files changed, 73 insertions(+), 1 deletions(-)
 create mode 100644 meta/recipes-support/createrepo/createrepo/recommends.patch

diff --git a/meta/recipes-support/createrepo/createrepo/recommends.patch b/meta/recipes-support/createrepo/createrepo/recommends.patch
new file mode 100644
index 0000000..dc5de2b
--- /dev/null
+++ b/meta/recipes-support/createrepo/createrepo/recommends.patch
@@ -0,0 +1,71 @@
+createrepo: implement recommends support
+
+Record against the corresponding requires entry in the output metadata
+if a dependency relationship is marked with the RPMSENSE_MISSINGOK flag
+(indicating it is a recommendation, rather than a hard dependency).
+
+Upstream-Status: Pending
+
+Signed-off-by: Paul Eggleton <paul.eggleton@linux.intel.com>
+
+diff --git a/dumpMetadata.py b/dumpMetadata.py
+index 70bb2d8..e40e8ac 100644
+--- a/dumpMetadata.py
++++ b/dumpMetadata.py
+@@ -319,6 +319,23 @@ class RpmMetaData:
+                     reqs.append(0)
+         return reqs
+ 
++    def _checkMissingOk(self, flags):
++        reqs=[]
++        if flags is None:
++            return reqs
++
++        if type(flags) is not types.ListType:
++            flags = [flags]
++        for flag in flags:
++            newflag = flag
++            if flag is not None:
++                newflag = flag & rpm.RPMSENSE_MISSINGOK
++                if newflag:
++                    reqs.append(1)
++                else:
++                    reqs.append(0)
++        return reqs
++
+ 
+     def _correctVersion(self, vers):
+         returnvers = []
+@@ -537,9 +554,10 @@ class RpmMetaData:
+         tmpflags = self.hdr[rpm.RPMTAG_REQUIREFLAGS]
+         flags = self._correctFlags(tmpflags)
+         prereq = self._checkPreReq(tmpflags)
++        missingok = self._checkMissingOk(tmpflags)
+         ver = self._correctVersion(self.hdr[rpm.RPMTAG_REQUIREVERSION])
+         if names is not None:
+-            lst = zip(names, flags, ver, prereq)
++            lst = zip(names, flags, ver, prereq, missingok)
+         return self._uniq(lst)
+         
+     def obsoletesList(self):
+@@ -692,7 +710,7 @@ def generateXML(doc, node, formatns, rpmObj, sumtype):
+     depsList = rpmObj.depsList()
+     if len(depsList) > 0:
+         rpconode = format.newChild(formatns, 'requires', None)    
+-        for (name, flags, (e,v,r), prereq) in depsList:
++        for (name, flags, (e,v,r), prereq, missingok) in depsList:
+             entry = rpconode.newChild(formatns, 'entry', None)
+             entry.newProp('name', name)
+             if flags != 0:
+@@ -711,6 +729,8 @@ def generateXML(doc, node, formatns, rpmObj, sumtype):
+                     entry.newProp('rel', str(r))
+             if prereq == 1:
+                 entry.newProp('pre', str(prereq))
++            if missingok:
++                entry.newProp('missingok', '1')
+         
+     for file in rpmObj.usefulFiles():
+         files = format.newChild(None, 'file', None)
+-- 
+1.7.9.5
+
diff --git a/meta/recipes-support/createrepo/createrepo_0.4.11.bb b/meta/recipes-support/createrepo/createrepo_0.4.11.bb
index 8d2dcdf..227ebcb 100644
--- a/meta/recipes-support/createrepo/createrepo_0.4.11.bb
+++ b/meta/recipes-support/createrepo/createrepo_0.4.11.bb
@@ -6,12 +6,13 @@ LIC_FILES_CHKSUM = "file://COPYING;md5=18810669f13b87348459e611d31ab760"
 
 RDEPENDS_${PN}_class-native += "libxml2-native rpm-native"
 
-PR = "r7"
+PR = "r8"
 
 SRC_URI= "http://createrepo.baseurl.org/download/${BP}.tar.gz \
           file://fix-native-install.patch \
           file://python-scripts-should-use-interpreter-from-env.patch \
 	  file://createrepo-rpm549.patch \
+	  file://recommends.patch \
 	  file://rpm-createsolvedb.py \
          "
 
-- 
1.7.3.4




^ permalink raw reply related	[flat|nested] 37+ messages in thread

* [PATCH 11/22] python-smartpm: add support for recommends
  2012-12-04 17:14 [PATCH 00/22] Misc fixes Mark Hatle
                   ` (9 preceding siblings ...)
  2012-12-04 17:14 ` [PATCH 10/22] createrepo: implement support for recommends Mark Hatle
@ 2012-12-04 17:14 ` Mark Hatle
  2012-12-04 17:14 ` [PATCH 12/22] python-smartpm: style fixes Mark Hatle
                   ` (10 subsequent siblings)
  21 siblings, 0 replies; 37+ messages in thread
From: Mark Hatle @ 2012-12-04 17:14 UTC (permalink / raw)
  To: openembedded-core

From: Paul Eggleton <paul.eggleton@linux.intel.com>

Implement support within Smart for handling RRECOMMENDS relationships
between RPM packages as used by OE. This includes support within the
base system for caching and resolving these relationships as well as
specific support in the RPM backend for reading the information from
packages, and reading the "missingok" flag added to createrepo for
rpm-md feeds.

Signed-off-by: Paul Eggleton <paul.eggleton@linux.intel.com>
---
 .../python/python-smartpm/smart-missingok.patch    |   43 -
 .../python/python-smartpm/smart-recommends.patch   | 1362 ++++++++++++++++++++
 .../python/python-smartpm_1.4.1.bb                 |    2 +-
 3 files changed, 1363 insertions(+), 44 deletions(-)
 delete mode 100644 meta/recipes-devtools/python/python-smartpm/smart-missingok.patch
 create mode 100644 meta/recipes-devtools/python/python-smartpm/smart-recommends.patch

diff --git a/meta/recipes-devtools/python/python-smartpm/smart-missingok.patch b/meta/recipes-devtools/python/python-smartpm/smart-missingok.patch
deleted file mode 100644
index 7e13869..0000000
--- a/meta/recipes-devtools/python/python-smartpm/smart-missingok.patch
+++ /dev/null
@@ -1,43 +0,0 @@
-backends/rpm: Identify recommended packages
-
-We identify and store recommended packages (and later throw that data away.)
-
-This is indended to be the starting work to add support for recommended
-packages to smart.
-
-Upstream-status: Inappropriate [ Code isn't finished! ]
-
-Signed-off-by: Mark Hatle <mark.hatle@windriver.com>
-
-Index: smart-1.4.1/smart/backends/rpm/header.py
-===================================================================
---- smart-1.4.1.orig/smart/backends/rpm/header.py
-+++ smart-1.4.1/smart/backends/rpm/header.py
-@@ -292,6 +292,7 @@ class RPMHeaderLoader(Loader):
-                     f = [0]
-                 elif type(f) != list:
-                     f = [f]
-+                recdict = {}
-                 reqdict = {}
-                 for i in range(len(n)):
-                     ni = n[i]
-@@ -308,10 +309,17 @@ class RPMHeaderLoader(Loader):
-                             # RPMSENSE_SCRIPT_PREUN |
-                             # RPMSENSE_SCRIPT_POST |
-                             # RPMSENSE_SCRIPT_POSTUN == 7744
--                            reqdict[(f[i]&7744 and PreReq or Req,
--                                     intern(ni), r, vi)] = True
-+                            if (f[i]&rpm.RPMSENSE_MISSINGOK):
-+                                print "Ignoring Recommend Dependency: %s" % (ni)
-+                                recdict[(f[i]&7744 and PreReq or Req,
-+                                         intern(ni), r, vi)] = True
-+                            else:
-+                                reqdict[(f[i]&7744 and PreReq or Req,
-+                                         intern(ni), r, vi)] = True
-+                recargs = collapse_libc_requires(recdict.keys())
-                 reqargs = collapse_libc_requires(reqdict.keys())
-             else:
-+                recargs = None
-                 reqargs = None
- 
-             n = h[1054] # RPMTAG_CONFLICTNAME
diff --git a/meta/recipes-devtools/python/python-smartpm/smart-recommends.patch b/meta/recipes-devtools/python/python-smartpm/smart-recommends.patch
new file mode 100644
index 0000000..a41b1be
--- /dev/null
+++ b/meta/recipes-devtools/python/python-smartpm/smart-recommends.patch
@@ -0,0 +1,1362 @@
+Handle recommended packages in core and rpm backends
+
+Identify and store recommended packages in the cache, add a query option
+to read them and ignore them if they are not present when installing.
+
+Initial identification code from Mark Hatle <mark.hatle@windriver.com>.
+
+Upstream-Status: Pending
+
+Signed-off-by: Paul Eggleton <paul.eggleton@linux.intel.com>
+
+diff --git a/smart/backends/rpm/base.py b/smart/backends/rpm/base.py
+index 0489e11..b9e9cb2 100644
+--- a/smart/backends/rpm/base.py
++++ b/smart/backends/rpm/base.py
+@@ -198,6 +198,29 @@ class RPMPackage(Package):
+                         break
+                 else:
+                     return False
++        srecs = fk(self.recommends)
++        orecs = fk(other.recommends)
++        if srecs != orecs:
++            for srec in srecs:
++                if srec.name[0] == "/" or srec in orecs:
++                    continue
++                for orec in orecs:
++                    if (srec.name == orec.name and
++                        srec.relation == orec.relation and
++                        checkver(srec.version, orec.version)):
++                        break
++                else:
++                    return False
++            for orec in orecs:
++                if orec.name[0] == "/" or orec in srecs:
++                    continue
++                for srec in srecs:
++                    if (srec.name == orec.name and
++                        srec.relation == orec.relation and
++                        checkver(srec.version, orec.version)):
++                        break
++                else:
++                    return False
+         return True
+ 
+     def coexists(self, other):
+diff --git a/smart/backends/rpm/header.py b/smart/backends/rpm/header.py
+index 31786cc..4880f43 100644
+--- a/smart/backends/rpm/header.py
++++ b/smart/backends/rpm/header.py
+@@ -292,6 +292,7 @@ class RPMHeaderLoader(Loader):
+                     f = [0]
+                 elif type(f) != list:
+                     f = [f]
++                recdict = {}
+                 reqdict = {}
+                 for i in range(len(n)):
+                     ni = n[i]
+@@ -308,10 +309,16 @@ class RPMHeaderLoader(Loader):
+                             # RPMSENSE_SCRIPT_PREUN |
+                             # RPMSENSE_SCRIPT_POST |
+                             # RPMSENSE_SCRIPT_POSTUN == 7744
+-                            reqdict[(f[i]&7744 and PreReq or Req,
+-                                     intern(ni), r, vi)] = True
++                            if (f[i]&rpm.RPMSENSE_MISSINGOK):
++                                recdict[(f[i]&7744 and PreReq or Req,
++                                         intern(ni), r, vi)] = True
++                            else:
++                                reqdict[(f[i]&7744 and PreReq or Req,
++                                         intern(ni), r, vi)] = True
++                recargs = collapse_libc_requires(recdict.keys())
+                 reqargs = collapse_libc_requires(reqdict.keys())
+             else:
++                recargs = None
+                 reqargs = None
+ 
+             n = h[1054] # RPMTAG_CONFLICTNAME
+@@ -365,7 +372,7 @@ class RPMHeaderLoader(Loader):
+                 versionarch = "%s@%s" % (distversion, arch)
+ 
+             pkg = self.buildPackage((Pkg, name, versionarch),
+-                                    prvargs, reqargs, upgargs, cnfargs)
++                                    prvargs, reqargs, upgargs, cnfargs, recargs)
+             pkg.loaders[self] = offset
+             self._offsets[offset] = pkg
+             self._groups[pkg] = intern(h[rpm.RPMTAG_GROUP])
+@@ -583,8 +590,8 @@ class URPMILoader(RPMHeaderListLoader):
+     def setErrataFlags(self, flagdict):
+         self._flagdict = flagdict
+     
+-    def buildPackage(self, pkgargs, prvargs, reqargs, upgargs, cnfargs):
+-        pkg = Loader.buildPackage(self, pkgargs, prvargs, reqargs, upgargs, cnfargs)
++    def buildPackage(self, pkgargs, prvargs, reqargs, upgargs, cnfargs, recargs):
++        pkg = Loader.buildPackage(self, pkgargs, prvargs, reqargs, upgargs, cnfargs, recargs)
+         name = pkgargs[1]
+         if hasattr(self, '_flagdict') and self._flagdict and name in self._flagdict:
+             if sysconf.getReadOnly():
+diff --git a/smart/backends/rpm/metadata.py b/smart/backends/rpm/metadata.py
+index 2c54f39..568fe06 100644
+--- a/smart/backends/rpm/metadata.py
++++ b/smart/backends/rpm/metadata.py
+@@ -165,6 +165,7 @@ class RPMMetaDataLoader(Loader):
+         distepoch = None
+         info = {}
+         reqdict = {}
++        recdict = {}
+         prvdict = {}
+         upgdict = {}
+         cnfdict = {}
+@@ -287,12 +288,16 @@ class RPMMetaDataLoader(Loader):
+ 
+                     lasttag = queue[-1].tag
+                     if lasttag == REQUIRES:
+-                        if elem.get("pre") == "1":
+-                            reqdict[(RPMPreRequires,
+-                                     ename, erelation, eversion)] = True
++                        if elem.get("missingok") == "1":
++                            recdict[(RPMRequires,
++                                    ename, erelation, eversion)] = True
+                         else:
+-                            reqdict[(RPMRequires,
+-                                     ename, erelation, eversion)] = True
++                            if elem.get("pre") == "1":
++                                reqdict[(RPMPreRequires,
++                                        ename, erelation, eversion)] = True
++                            else:
++                                reqdict[(RPMRequires,
++                                        ename, erelation, eversion)] = True
+ 
+                     elif lasttag == PROVIDES:
+                         if ename[0] == "/":
+@@ -328,6 +333,12 @@ class RPMMetaDataLoader(Loader):
+                                        (RPMProvides, x[1], x[3]) in prvdict or
+                                        system_provides.match(*x[:3]))]
+                     reqargs = collapse_libc_requires(reqargs)
++
++                    recargs = [x for x in recdict
++                               if not ((x[2] is None or "=" in x[2]) and
++                                       (RPMProvides, x[1], x[3]) in prvdict or
++                                       system_provides.match(*x[:3]))]
++
+                     prvargs = prvdict.keys()
+                     cnfargs = cnfdict.keys()
+                     upgargs = upgdict.keys()
+@@ -339,7 +350,7 @@ class RPMMetaDataLoader(Loader):
+                         versionarch = "%s@%s" % (distversion, arch)
+ 
+                     pkg = self.buildPackage((RPMPackage, name, versionarch),
+-                                            prvargs, reqargs, upgargs, cnfargs)
++                                            prvargs, reqargs, upgargs, cnfargs, recargs)
+                     pkg.loaders[self] = info
+ 
+                     # Store the provided files for future usage.
+@@ -362,6 +373,7 @@ class RPMMetaDataLoader(Loader):
+                     distepoch = None
+                     pkgid = None
+                     reqdict.clear()
++                    recdict.clear()
+                     prvdict.clear()
+                     upgdict.clear()
+                     cnfdict.clear()
+diff --git a/smart/cache.py b/smart/cache.py
+index b829825..cec8bb3 100644
+--- a/smart/cache.py
++++ b/smart/cache.py
+@@ -32,7 +32,8 @@ class Package(object):
+         self.name = name
+         self.version = version
+         self.provides = ()
+-        self.requires = ()
++        self.requires = []
++        self.recommends = []
+         self.upgrades = ()
+         self.conflicts = ()
+         self.installed = False
+@@ -55,7 +56,9 @@ class Package(object):
+             fk([x for x in self.provides if x.name[0] != "/"]) !=
+             fk([x for x in other.provides if x.name[0] != "/"]) or
+             fk([x for x in self.requires if x.name[0] != "/"]) !=
+-            fk([x for x in other.requires if x.name[0] != "/"])):
++            fk([x for x in other.requires if x.name[0] != "/"]) or
++            fk([x for x in self.recommends if x.name[0] != "/"]) !=
++            fk([x for x in other.recommends if x.name[0] != "/"])):
+             return False
+         return True
+ 
+@@ -110,6 +113,7 @@ class Package(object):
+                 self.version,
+                 self.provides,
+                 self.requires,
++                self.recommends,
+                 self.upgrades,
+                 self.conflicts,
+                 self.installed,
+@@ -122,6 +126,7 @@ class Package(object):
+          self.version,
+          self.provides,
+          self.requires,
++         self.recommends,
+          self.upgrades,
+          self.conflicts,
+          self.installed,
+@@ -274,6 +279,7 @@ class Provides(object):
+         self.version = version
+         self.packages = []
+         self.requiredby = ()
++        self.recommendedby = ()
+         self.upgradedby = ()
+         self.conflictedby = ()
+ 
+@@ -401,7 +407,7 @@ class Loader(object):
+     def loadFileProvides(self, fndict):
+         pass
+ 
+-    def buildPackage(self, pkgargs, prvargs, reqargs, upgargs, cnfargs):
++    def buildPackage(self, pkgargs, prvargs, reqargs, upgargs, cnfargs, recargs = None):
+         cache = self._cache
+         pkg = pkgargs[0](*pkgargs[1:])
+         relpkgs = []
+@@ -427,6 +433,17 @@ class Loader(object):
+                 relpkgs.append(req.packages)
+                 pkg.requires.append(req)
+ 
++        if recargs:
++            pkg.recommends = []
++            for args in recargs:
++                rec = cache._objmap.get(args)
++                if not rec:
++                    rec = args[0](*args[1:])
++                    cache._objmap[args] = rec
++                    cache._recommends.append(rec)
++                relpkgs.append(rec.packages)
++                pkg.recommends.append(rec)
++
+         if upgargs:
+             pkg.upgrades = []
+             for args in upgargs:
+@@ -572,6 +589,7 @@ class Cache(object):
+         self._packages = []
+         self._provides = []
+         self._requires = []
++        self._recommends = []
+         self._upgrades = []
+         self._conflicts = []
+         self._objmap = {}
+@@ -581,6 +599,8 @@ class Cache(object):
+             del prv.packages[:]
+             if prv.requiredby:
+                 del prv.requiredby[:]
++            if prv.recommendedby:
++                del prv.recommendedby[:]
+             if prv.upgradedby:
+                 del prv.upgradedby[:]
+             if prv.conflictedby:
+@@ -589,6 +609,10 @@ class Cache(object):
+             del req.packages[:]
+             if req.providedby:
+                 del req.providedby[:]
++        for rec in self._recommends:
++            del rec.packages[:]
++            if rec.providedby:
++                del rec.providedby[:]
+         for upg in self._upgrades:
+             del upg.packages[:]
+             if upg.providedby:
+@@ -600,6 +624,7 @@ class Cache(object):
+         del self._packages[:]
+         del self._provides[:]
+         del self._requires[:]
++        del self._recommends[:]
+         del self._upgrades[:]
+         del self._conflicts[:]
+         self._objmap.clear()
+@@ -621,6 +646,7 @@ class Cache(object):
+         packages = {}
+         provides = {}
+         requires = {}
++        recommends = {}
+         upgrades = {}
+         conflicts = {}
+         objmap = self._objmap
+@@ -646,6 +672,11 @@ class Cache(object):
+                         if req not in requires:
+                             objmap[req.getInitArgs()] = req
+                             requires[req] = True
++                    for rec in pkg.recommends[:]:
++                        rec.packages.append(pkg)
++                        if rec not in recommends:
++                            objmap[rec.getInitArgs()] = rec
++                            recommends[rec] = True
+                     for upg in pkg.upgrades:
+                         upg.packages.append(pkg)
+                         if upg not in upgrades:
+@@ -659,6 +690,7 @@ class Cache(object):
+         self._packages[:] = packages.keys()
+         self._provides[:] = provides.keys()
+         self._requires[:] = requires.keys()
++        self._recommends[:] = recommends.keys()
+         self._upgrades[:] = upgrades.keys()
+         self._conflicts[:] = conflicts.keys()
+ 
+@@ -710,6 +742,14 @@ class Cache(object):
+                     lst.append(req)
+                 else:
+                     reqnames[name] = [req]
++        recnames = {}
++        for rec in self._recommends:
++            for name in rec.getMatchNames():
++                lst = recnames.get(name)
++                if lst:
++                    lst.append(rec)
++                else:
++                    recnames[name] = [rec]
+         upgnames = {}
+         for upg in self._upgrades:
+             for name in upg.getMatchNames():
+@@ -739,6 +779,18 @@ class Cache(object):
+                             prv.requiredby.append(req)
+                         else:
+                             prv.requiredby = [req]
++            lst = recnames.get(prv.name)
++            if lst:
++                for rec in lst:
++                    if rec.matches(prv):
++                        if rec.providedby:
++                            rec.providedby.append(prv)
++                        else:
++                            rec.providedby = [prv]
++                        if prv.recommendedby:
++                            prv.recommendedby.append(rec)
++                        else:
++                            prv.recommendedby = [rec]
+             lst = upgnames.get(prv.name)
+             if lst:
+                 for upg in lst:
+@@ -782,6 +834,12 @@ class Cache(object):
+         else:
+             return [x for x in self._requires if x.name == name]
+ 
++    def getRecommends(self, name=None):
++        if not name:
++            return self._recommends
++        else:
++            return [x for x in self._recommends if x.name == name]
++
+     def getUpgrades(self, name=None):
+         if not name:
+             return self._upgrades
+@@ -807,6 +865,12 @@ class Cache(object):
+                 for req in self._requires:
+                     if prvname in req.getMatchNames() and req.matches(prv):
+                         searcher.addResult(req)
++        if searcher.recommends:
++            for prv in searcher.recommends:
++                prvname = prv.name
++                for req in self._recommends:
++                    if prvname in req.getMatchNames() and req.matches(prv):
++                        searcher.addResult(req)
+         if searcher.upgrades:
+             for prv in searcher.upgrades:
+                 prvname = prv.name
+@@ -839,6 +903,7 @@ class Cache(object):
+         self._packages = state["_packages"]
+         provides = {}
+         requires = {}
++        recommends = {}
+         upgrades = {}
+         conflicts = {}
+         for pkg in self._packages:
+@@ -848,6 +913,9 @@ class Cache(object):
+             for req in pkg.requires:
+                 req.packages.append(pkg)
+                 requires[req] = True
++            for rec in pkg.recommends:
++                rec.packages.append(pkg)
++                recommends[rec] = True
+             for upg in pkg.upgrades:
+                 upg.packages.append(pkg)
+                 upgrades[upg] = True
+@@ -856,6 +924,7 @@ class Cache(object):
+                 conflicts[cnf] = True
+         self._provides = provides.keys()
+         self._requires = requires.keys()
++        self._recommends = recommends.keys()
+         self._upgrades = upgrades.keys()
+         self._conflicts = conflicts.keys()
+         self._objmap = {}
+diff --git a/smart/ccache.c b/smart/ccache.c
+index 7541e26..7193185 100644
+--- a/smart/ccache.c
++++ b/smart/ccache.c
+@@ -82,6 +82,7 @@ typedef struct {
+     PyObject *version;
+     PyObject *provides;
+     PyObject *requires;
++    PyObject *recommends;
+     PyObject *upgrades;
+     PyObject *conflicts;
+     PyObject *installed;
+@@ -96,6 +97,7 @@ typedef struct {
+     PyObject *version;
+     PyObject *packages;
+     PyObject *requiredby;
++    PyObject *recommendedby;
+     PyObject *upgradedby;
+     PyObject *conflictedby;
+ } ProvidesObject;
+@@ -123,6 +125,7 @@ typedef struct {
+     PyObject *_packages;
+     PyObject *_provides;
+     PyObject *_requires;
++    PyObject *_recommends;
+     PyObject *_upgrades;
+     PyObject *_conflicts;
+     PyObject *_objmap;
+@@ -211,7 +214,8 @@ Package_init(PackageObject *self, PyObject *args)
+     Py_INCREF(self->name);
+     Py_INCREF(self->version);
+     self->provides = PyTuple_New(0);
+-    self->requires = PyTuple_New(0);
++    self->requires = PyList_New(0);
++    self->recommends = PyList_New(0);
+     self->upgrades = PyTuple_New(0);
+     self->conflicts = PyTuple_New(0);
+     Py_INCREF(Py_False);
+@@ -228,6 +232,7 @@ Package_traverse(PackageObject *self, visitproc visit, void *arg)
+ {
+     Py_VISIT(self->provides);
+     Py_VISIT(self->requires);
++    Py_VISIT(self->recommends);
+     Py_VISIT(self->upgrades);
+     Py_VISIT(self->conflicts);
+     Py_VISIT(self->loaders);
+@@ -239,6 +244,7 @@ Package_clear(PackageObject *self)
+ {
+     Py_CLEAR(self->provides);
+     Py_CLEAR(self->requires);
++    Py_CLEAR(self->recommends);
+     Py_CLEAR(self->upgrades);
+     Py_CLEAR(self->conflicts);
+     Py_CLEAR(self->loaders);
+@@ -252,6 +258,7 @@ Package_dealloc(PackageObject *self)
+     Py_XDECREF(self->version);
+     Py_XDECREF(self->provides);
+     Py_XDECREF(self->requires);
++    Py_XDECREF(self->recommends);
+     Py_XDECREF(self->upgrades);
+     Py_XDECREF(self->conflicts);
+     Py_XDECREF(self->installed);
+@@ -453,6 +460,46 @@ Package_equals(PackageObject *self, PackageObject *other)
+         }
+     }
+ 
++    ilen = 0;
++    jlen = 0;
++    for (i = 0; i != PyList_GET_SIZE(self->recommends); i++) {
++        PyObject *item = PyList_GET_ITEM(self->recommends, i);
++        if (!PyObject_IsInstance(item, (PyObject *)&Depends_Type)) {
++            PyErr_SetString(PyExc_TypeError, "Depends instance expected");
++            return NULL;
++        }
++        if (STR(((DependsObject *)item)->name)[0] != '/')
++            ilen += 1;
++    }
++    for (j = 0; j != PyList_GET_SIZE(other->recommends); j++) {
++        PyObject *item = PyList_GET_ITEM(other->recommends, j);
++        if (!PyObject_IsInstance(item, (PyObject *)&Depends_Type)) {
++            PyErr_SetString(PyExc_TypeError, "Depends instance expected");
++            return NULL;
++        }
++        if (STR(((DependsObject *)item)->name)[0] != '/')
++            jlen += 1;
++    }
++    if (ilen != jlen) {
++        ret = Py_False;
++        goto exit;
++    }
++
++    ilen = PyList_GET_SIZE(self->recommends);
++    jlen = PyList_GET_SIZE(other->recommends);
++    for (i = 0; i != ilen; i++) {
++        PyObject *item = PyList_GET_ITEM(self->recommends, i);
++        if (STR(((DependsObject *)item)->name)[0] != '/') {
++            for (j = 0; j != jlen; j++)
++                if (item == PyList_GET_ITEM(other->recommends, j))
++                    break;
++            if (j == jlen) {
++                ret = Py_False;
++                goto exit;
++            }
++        }
++    }
++
+ exit:
+     Py_INCREF(ret);
+     return ret;
+@@ -606,13 +653,14 @@ Package_getPriority(PackageObject *self, PyObject *args)
+ static PyObject *
+ Package__getstate__(PackageObject *self, PyObject *args)
+ {
+-    PyObject *state = PyTuple_New(10);
++    PyObject *state = PyTuple_New(11);
+     if (!state) return NULL;
+ 
+     Py_INCREF(self->name);
+     Py_INCREF(self->version);
+     Py_INCREF(self->provides);
+     Py_INCREF(self->requires);
++    Py_INCREF(self->recommends);
+     Py_INCREF(self->upgrades);
+     Py_INCREF(self->conflicts);
+     Py_INCREF(self->installed);
+@@ -620,16 +668,17 @@ Package__getstate__(PackageObject *self, PyObject *args)
+     Py_INCREF(self->priority);
+     Py_INCREF(self->loaders);
+ 
+-    PyTuple_SET_ITEM(state, 0, self->name);
+-    PyTuple_SET_ITEM(state, 1, self->version);
+-    PyTuple_SET_ITEM(state, 2, self->provides);
+-    PyTuple_SET_ITEM(state, 3, self->requires);
+-    PyTuple_SET_ITEM(state, 4, self->upgrades);
+-    PyTuple_SET_ITEM(state, 5, self->conflicts);
+-    PyTuple_SET_ITEM(state, 6, self->installed);
+-    PyTuple_SET_ITEM(state, 7, self->essential);
+-    PyTuple_SET_ITEM(state, 8, self->priority);
+-    PyTuple_SET_ITEM(state, 9, self->loaders);
++    PyTuple_SET_ITEM(state,  0, self->name);
++    PyTuple_SET_ITEM(state,  1, self->version);
++    PyTuple_SET_ITEM(state,  2, self->provides);
++    PyTuple_SET_ITEM(state,  3, self->requires);
++    PyTuple_SET_ITEM(state,  4, self->recommends);
++    PyTuple_SET_ITEM(state,  5, self->upgrades);
++    PyTuple_SET_ITEM(state,  6, self->conflicts);
++    PyTuple_SET_ITEM(state,  7, self->installed);
++    PyTuple_SET_ITEM(state,  8, self->essential);
++    PyTuple_SET_ITEM(state,  9, self->priority);
++    PyTuple_SET_ITEM(state, 10, self->loaders);
+ 
+     return state;
+ }
+@@ -637,7 +686,7 @@ Package__getstate__(PackageObject *self, PyObject *args)
+ static PyObject *
+ Package__setstate__(PackageObject *self, PyObject *state)
+ {
+-    if (!PyTuple_Check(state) || PyTuple_GET_SIZE(state) != 10) {
++    if (!PyTuple_Check(state) || PyTuple_GET_SIZE(state) != 11) {
+         PyErr_SetString(StateVersionError, "");
+         return NULL;
+     }
+@@ -645,18 +694,20 @@ Package__setstate__(PackageObject *self, PyObject *state)
+     self->version = PyTuple_GET_ITEM(state, 1);
+     self->provides = PyTuple_GET_ITEM(state, 2);
+     self->requires = PyTuple_GET_ITEM(state, 3);
+-    self->upgrades = PyTuple_GET_ITEM(state, 4);
+-    self->conflicts = PyTuple_GET_ITEM(state, 5);
+-    self->installed = PyTuple_GET_ITEM(state, 6);
+-    self->essential = PyTuple_GET_ITEM(state, 7);
+-    self->priority = PyTuple_GET_ITEM(state, 8);
+-    self->loaders = PyTuple_GET_ITEM(state, 9);
++    self->recommends = PyTuple_GET_ITEM(state, 4);
++    self->upgrades = PyTuple_GET_ITEM(state, 5);
++    self->conflicts = PyTuple_GET_ITEM(state, 6);
++    self->installed = PyTuple_GET_ITEM(state, 7);
++    self->essential = PyTuple_GET_ITEM(state, 8);
++    self->priority = PyTuple_GET_ITEM(state, 9);
++    self->loaders = PyTuple_GET_ITEM(state, 10);
+ 
+ 
+     Py_INCREF(self->name);
+     Py_INCREF(self->version);
+     Py_INCREF(self->provides);
+     Py_INCREF(self->requires);
++    Py_INCREF(self->recommends);
+     Py_INCREF(self->upgrades);
+     Py_INCREF(self->conflicts);
+     Py_INCREF(self->installed);
+@@ -686,6 +737,7 @@ static PyMemberDef Package_members[] = {
+     {"version", T_OBJECT, OFF(version), 0, 0},
+     {"provides", T_OBJECT, OFF(provides), 0, 0},
+     {"requires", T_OBJECT, OFF(requires), 0, 0},
++    {"recommends", T_OBJECT, OFF(recommends), 0, 0},
+     {"upgrades", T_OBJECT, OFF(upgrades), 0, 0},
+     {"conflicts", T_OBJECT, OFF(conflicts), 0, 0},
+     {"installed", T_OBJECT, OFF(installed), 0, 0},
+@@ -750,6 +802,7 @@ Provides_init(ProvidesObject *self, PyObject *args)
+     Py_INCREF(self->version);
+     self->packages = PyList_New(0);
+     self->requiredby = PyTuple_New(0);
++    self->recommendedby = PyTuple_New(0);
+     self->upgradedby = PyTuple_New(0);
+     self->conflictedby = PyTuple_New(0);
+     return 0;
+@@ -760,6 +813,7 @@ Provides_traverse(ProvidesObject *self, visitproc visit, void *arg)
+ {
+     Py_VISIT(self->packages);
+     Py_VISIT(self->requiredby);
++    Py_VISIT(self->recommendedby);
+     Py_VISIT(self->upgradedby);
+     Py_VISIT(self->conflictedby);
+     return 0;
+@@ -770,6 +824,7 @@ Provides_clear(ProvidesObject *self)
+ {
+     Py_CLEAR(self->packages);
+     Py_CLEAR(self->requiredby);
++    Py_CLEAR(self->recommendedby);
+     Py_CLEAR(self->upgradedby);
+     Py_CLEAR(self->conflictedby);
+     return 0;
+@@ -782,6 +837,7 @@ Provides_dealloc(ProvidesObject *self)
+     Py_XDECREF(self->version);
+     Py_XDECREF(self->packages);
+     Py_XDECREF(self->requiredby);
++    Py_XDECREF(self->recommendedby);
+     Py_XDECREF(self->upgradedby);
+     Py_XDECREF(self->conflictedby);
+     self->ob_type->tp_free((PyObject *)self);
+@@ -960,6 +1016,7 @@ static PyMemberDef Provides_members[] = {
+     {"version", T_OBJECT, OFF(version), 0, 0},
+     {"packages", T_OBJECT, OFF(packages), 0, 0},
+     {"requiredby", T_OBJECT, OFF(requiredby), 0, 0},
++    {"recommendedby", T_OBJECT, OFF(recommendedby), 0, 0},
+     {"upgradedby", T_OBJECT, OFF(upgradedby), 0, 0},
+     {"conflictedby", T_OBJECT, OFF(conflictedby), 0, 0},
+     {NULL}
+@@ -1555,6 +1612,7 @@ Loader_buildPackage(LoaderObject *self, PyObject *args)
+     PyObject *reqargs;
+     PyObject *upgargs;
+     PyObject *cnfargs;
++    PyObject *recargs = NULL;
+     PyObject *callargs;
+     
+     PyObject *pkg;
+@@ -1574,9 +1632,10 @@ Loader_buildPackage(LoaderObject *self, PyObject *args)
+ 
+     cache = (CacheObject *)self->_cache;
+ 
+-    if (!PyArg_ParseTuple(args, "O!O&O&O&O&", &PyTuple_Type, &pkgargs,
++    if (!PyArg_ParseTuple(args, "O!O&O&O&O&|O&", &PyTuple_Type, &pkgargs,
+                           mylist, &prvargs, mylist, &reqargs,
+-                          mylist, &upgargs, mylist, &cnfargs))
++                          mylist, &upgargs, mylist, &cnfargs,
++                          mylist, &recargs))
+         return NULL;
+ 
+     if (PyTuple_GET_SIZE(pkgargs) < 2) {
+@@ -1701,6 +1760,59 @@ Loader_buildPackage(LoaderObject *self, PyObject *args)
+         }
+     }
+ 
++    /* if recargs: */
++    if (recargs) {
++        int i = 0;
++        int len = PyList_GET_SIZE(recargs);
++        /* pkg.recommends = [] */
++        Py_DECREF(pkgobj->recommends);
++        pkgobj->recommends = PyList_New(len);
++        /* for args in recargs: */
++        for (; i != len; i++) {
++            PyObject *args = PyList_GET_ITEM(recargs, i);
++            DependsObject *recobj;
++            PyObject *rec;
++            
++            if (!PyTuple_Check(args)) {
++                PyErr_SetString(PyExc_TypeError,
++                                "Item in recargs is not a tuple");
++                return NULL;
++            }
++
++            /* rec = cache._objmap.get(args) */
++            rec = PyDict_GetItem(cache->_objmap, args);
++            recobj = (DependsObject *)rec;
++
++            /* if not rec: */
++            if (!rec) {
++                if (!PyTuple_Check(args) || PyTuple_GET_SIZE(args) < 2) {
++                    PyErr_SetString(PyExc_ValueError, "Invalid recargs tuple");
++                    return NULL;
++                }
++                /* rec = args[0](*args[1:]) */
++                callargs = PyTuple_GetSlice(args, 1, PyTuple_GET_SIZE(args));
++                rec = PyObject_CallObject(PyTuple_GET_ITEM(args, 0), callargs);
++                Py_DECREF(callargs);
++                if (!rec) return NULL;
++                recobj = (DependsObject *)rec;
++
++                /* cache._objmap[args] = rec */
++                PyDict_SetItem(cache->_objmap, args, rec);
++                Py_DECREF(rec);
++
++                /* cache._recommends.append(rec) */
++                PyList_Append(cache->_recommends, rec);
++            }
++
++            /* relpkgs.append(rec.packages) */
++            PyList_Append(relpkgs, recobj->packages);
++
++            /* pkg.recommends.append(rec) */
++            Py_INCREF(rec);
++            PyList_SET_ITEM(pkgobj->recommends, i, rec);
++        }
++    }
++
+     /* if upgargs: */
+     if (upgargs) {
+         int i = 0;
+@@ -2391,6 +2503,7 @@ Cache_init(CacheObject *self, PyObject *args)
+     self->_packages = PyList_New(0);
+     self->_provides = PyList_New(0);
+     self->_requires = PyList_New(0);
++    self->_recommends = PyList_New(0);
+     self->_upgrades = PyList_New(0);
+     self->_conflicts = PyList_New(0);
+     self->_objmap = PyDict_New();
+@@ -2404,6 +2517,7 @@ Cache_traverse(CacheObject *self, visitproc visit, void *arg)
+     Py_VISIT(self->_packages);
+     Py_VISIT(self->_provides);
+     Py_VISIT(self->_requires);
++    Py_VISIT(self->_recommends);
+     Py_VISIT(self->_upgrades);
+     Py_VISIT(self->_conflicts);
+     Py_VISIT(self->_objmap);
+@@ -2417,6 +2531,7 @@ Cache_clear(CacheObject *self)
+     Py_CLEAR(self->_packages);
+     Py_CLEAR(self->_provides);
+     Py_CLEAR(self->_requires);
++    Py_CLEAR(self->_recommends);
+     Py_CLEAR(self->_upgrades);
+     Py_CLEAR(self->_conflicts);
+     Py_CLEAR(self->_objmap);
+@@ -2430,6 +2545,7 @@ Cache_dealloc(CacheObject *self)
+     Py_XDECREF(self->_packages);
+     Py_XDECREF(self->_provides);
+     Py_XDECREF(self->_requires);
++    Py_XDECREF(self->_recommends);
+     Py_XDECREF(self->_upgrades);
+     Py_XDECREF(self->_conflicts);
+     Py_XDECREF(self->_objmap);
+@@ -2449,6 +2565,8 @@ Cache_reset(CacheObject *self, PyObject *args)
+         LIST_CLEAR(prvobj->packages);
+         if (PyList_Check(prvobj->requiredby))
+             LIST_CLEAR(prvobj->requiredby);
++        if (PyList_Check(prvobj->recommendedby))
++            LIST_CLEAR(prvobj->recommendedby);
+         if (PyList_Check(prvobj->upgradedby))
+             LIST_CLEAR(prvobj->upgradedby);
+         if (PyList_Check(prvobj->conflictedby))
+@@ -2464,6 +2582,16 @@ Cache_reset(CacheObject *self, PyObject *args)
+         if (PyList_Check(reqobj->providedby))
+             LIST_CLEAR(reqobj->providedby);
+     }
++    len = PyList_GET_SIZE(self->_recommends);
++    for (i = 0; i != len; i++) {
++        DependsObject *reqobj;
++        PyObject *req;
++        req = PyList_GET_ITEM(self->_recommends, i);
++        reqobj = (DependsObject *)req;
++        LIST_CLEAR(reqobj->packages);
++        if (PyList_Check(reqobj->providedby))
++            LIST_CLEAR(reqobj->providedby);
++    }
+     len = PyList_GET_SIZE(self->_upgrades);
+     for (i = 0; i != len; i++) {
+         DependsObject *upgobj;
+@@ -2487,6 +2615,7 @@ Cache_reset(CacheObject *self, PyObject *args)
+     LIST_CLEAR(self->_packages);
+     LIST_CLEAR(self->_provides);
+     LIST_CLEAR(self->_requires);
++    LIST_CLEAR(self->_recommends);
+     LIST_CLEAR(self->_upgrades);
+     LIST_CLEAR(self->_conflicts);
+     PyDict_Clear(self->_objmap);
+@@ -2534,6 +2663,7 @@ Cache__reload(CacheObject *self, PyObject *args)
+       packages = {}
+       provides = {}
+       requires = {}
++      recommends = {}
+       upgrades = {}
+       conflicts = {}
+       objmap = self._objmap
+@@ -2541,11 +2671,12 @@ Cache__reload(CacheObject *self, PyObject *args)
+     PyObject *packages = PyDict_New();
+     PyObject *provides = PyDict_New();
+     PyObject *requires = PyDict_New();
++    PyObject *recommends = PyDict_New();
+     PyObject *upgrades = PyDict_New();
+     PyObject *conflicts = PyDict_New();
+     PyObject *objmap = self->_objmap;
+     int i, ilen;
+-    if (!packages || !provides || !requires || !conflicts)
++    if (!packages || !provides || !requires || !recommends || !conflicts )
+         return NULL;
+ 
+     /* for loader in loaders: */
+@@ -2679,6 +2810,30 @@ Cache__reload(CacheObject *self, PyObject *args)
+                 }
+ 
+                 /*
++                   for rec in pkg.recommends:
++                       rec.packages.append(pkg)
++                       if rec not in recommends:
++                           recommends[rec] = True
++                           objmap[rec.getInitArgs()] = rec
++                */
++                if (PyList_Check(pkg->recommends)) {
++                    klen = PyList_GET_SIZE(pkg->recommends);
++                    for (k = 0; k != klen; k++) {
++                        PyObject *rec = PyList_GET_ITEM(pkg->recommends, k);
++                        PyList_Append(((DependsObject *)rec)->packages,
++                                      (PyObject *)pkg);
++                        if (!PyDict_GetItem(recommends, rec)) {
++                            PyDict_SetItem(recommends, rec, Py_True);
++                            args = PyObject_CallMethod(rec, "getInitArgs",
++                                                       NULL);
++                            if (!args) return NULL;
++                            PyDict_SetItem(objmap, args, rec);
++                            Py_DECREF(args);
++                        }
++                    }
++                }
++
++                /*
+                    for upg in pkg.upgrades:
+                        upg.packages.append(pkg)
+                        if upg not in upgrades:
+@@ -2747,6 +2902,11 @@ Cache__reload(CacheObject *self, PyObject *args)
+     self->_requires = PyDict_Keys(requires);
+     Py_DECREF(requires);
+ 
++    /* self._recommends[:] = recommends.keys() */
++    Py_DECREF(self->_recommends);
++    self->_recommends = PyDict_Keys(recommends);
++    Py_DECREF(recommends);
++
+     /* self._upgrades[:] = upgrades.keys() */
+     Py_DECREF(self->_upgrades);
+     self->_upgrades = PyDict_Keys(upgrades);
+@@ -2852,7 +3012,7 @@ PyObject *
+ Cache_linkDeps(CacheObject *self, PyObject *args)
+ {
+     int i, j, len;
+-    PyObject *reqnames, *upgnames, *cnfnames;
++    PyObject *reqnames, *recnames, *upgnames, *cnfnames;
+     PyObject *lst;
+ 
+     /* reqnames = {} */
+@@ -2896,6 +3056,47 @@ Cache_linkDeps(CacheObject *self, PyObject *args)
+         Py_DECREF(seq);
+     }
+ 
++    /* recnames = {} */
++    recnames = PyDict_New();
++    /* for rec in self._recommends: */
++    len = PyList_GET_SIZE(self->_recommends);
++    for (i = 0; i != len; i++) {
++        PyObject *rec = PyList_GET_ITEM(self->_recommends, i);
++
++        /* for name in rec.getMatchNames(): */
++        PyObject *names = PyObject_CallMethod(rec, "getMatchNames", NULL);
++        PyObject *seq = PySequence_Fast(names, "getMatchNames() returned "
++                                               "non-sequence object");
++        int nameslen;
++        if (!seq) return NULL;
++        nameslen = PySequence_Fast_GET_SIZE(seq);
++        for (j = 0; j != nameslen; j++) {
++            PyObject *name = PySequence_Fast_GET_ITEM(seq, j);
++            
++            /* lst = recnames.get(name) */
++            lst = PyDict_GetItem(recnames, name);
++
++            /* 
++               if lst:
++                   lst.append(rec)
++               else:
++                   recnames[name] = [rec]
++            */
++            if (lst) {
++                PyList_Append(lst, rec);
++            } else {
++                lst = PyList_New(1);
++                Py_INCREF(rec);
++                PyList_SET_ITEM(lst, 0, rec);
++                PyDict_SetItem(recnames, name, lst);
++                Py_DECREF(lst);
++            }
++        }
++
++        Py_DECREF(names);
++        Py_DECREF(seq);
++    }
++
+     /* upgnames = {} */
+     upgnames = PyDict_New();
+     /* for upg in self._upgrades: */
+@@ -3035,6 +3236,56 @@ Cache_linkDeps(CacheObject *self, PyObject *args)
+             }
+         }
+ 
++        /* lst = recnames.get(prv.name) */
++        lst = PyDict_GetItem(recnames, prv->name);
++
++        /* if lst: */
++        if (lst) {
++            /* for rec in lst: */
++            int reclen = PyList_GET_SIZE(lst);
++            for (j = 0; j != reclen; j++) {
++                DependsObject *rec = (DependsObject *)PyList_GET_ITEM(lst, j);
++                /* if rec.matches(prv): */
++                PyObject *ret = PyObject_CallMethod((PyObject *)rec, "matches",
++                                                    "O", (PyObject *)prv);
++                if (!ret) return NULL;
++                if (PyObject_IsTrue(ret)) {
++                    /*
++                       if rec.providedby:
++                           rec.providedby.append(prv)
++                       else:
++                           rec.providedby = [prv]
++                    */
++                    if (PyList_Check(rec->providedby)) {
++                        PyList_Append(rec->providedby, (PyObject *)prv);
++                    } else {
++                        PyObject *_lst = PyList_New(1);
++                        Py_INCREF(prv);
++                        PyList_SET_ITEM(_lst, 0, (PyObject *)prv);
++                        Py_DECREF(rec->providedby);
++                        rec->providedby = _lst;
++                    }
++
++                    /*
++                       if prv.recommendedby:
++                           prv.recommendedby.append(prv)
++                       else:
++                           prv.recommendedby = [prv]
++                    */
++                    if (PyList_Check(prv->recommendedby)) {
++                        PyList_Append(prv->recommendedby, (PyObject *)rec);
++                    } else {
++                        PyObject *_lst = PyList_New(1);
++                        Py_INCREF(rec);
++                        PyList_SET_ITEM(_lst, 0, (PyObject *)rec);
++                        Py_DECREF(prv->recommendedby);
++                        prv->recommendedby = _lst;
++                    }
++                }
++                Py_DECREF(ret);
++            }
++        }
++
+         /* lst = upgnames.get(prv.name) */
+         lst = PyDict_GetItem(upgnames, prv->name);
+ 
+@@ -3139,6 +3390,7 @@ Cache_linkDeps(CacheObject *self, PyObject *args)
+     }
+ 
+     Py_DECREF(reqnames);
++    Py_DECREF(recnames);
+     Py_DECREF(upgnames);
+     Py_DECREF(cnfnames);
+ 
+@@ -3215,6 +3467,29 @@ Cache_getRequires(CacheObject *self, PyObject *args)
+ }
+ 
+ PyObject *
++Cache_getRecommends(CacheObject *self, PyObject *args)
++{
++    const char *name = NULL;
++    PyObject *lst;
++    int i, len;
++    if (!PyArg_ParseTuple(args, "|s", &name))
++        return NULL;
++    if (!name) {
++        Py_INCREF(self->_recommends);
++        return self->_recommends;
++    }
++    lst = PyList_New(0);
++    len = PyList_GET_SIZE(self->_recommends);
++    for (i = 0; i != len; i++) {
++        DependsObject *rec =
++            (DependsObject*)PyList_GET_ITEM(self->_recommends, i);
++        if (strcmp(STR(rec->name), name) == 0)
++            PyList_Append(lst, (PyObject *)rec);
++    }
++    return lst;
++}
++
++PyObject *
+ Cache_getUpgrades(CacheObject *self, PyObject *args)
+ {
+     const char *name = NULL;
+@@ -3324,6 +3599,38 @@ Cache_search(CacheObject *self, PyObject *searcher)
+     }
+     Py_DECREF(lst);
+ 
++    lst = PyObject_GetAttrString(searcher, "recommends");
++    if (lst == NULL || !PyList_Check(lst)) {
++        PyErr_SetString(PyExc_TypeError, "Invalid recommends attribute");
++        return NULL;
++    }
++    for (i = 0; i != PyList_GET_SIZE(lst); i++) {
++        ProvidesObject *prv = (ProvidesObject *)PyList_GET_ITEM(lst, i);
++        for (j = 0; j != PyList_GET_SIZE(self->_recommends); j++) {
++            PyObject *rec = PyList_GET_ITEM(self->_recommends, j);
++            PyObject *names = PyObject_CallMethod(rec, "getMatchNames", NULL);
++            PyObject *seq = PySequence_Fast(names, "getMatchNames() returned "
++                                                   "non-sequence object");
++            if (seq == NULL) return NULL;
++            for (k = 0; k != PySequence_Fast_GET_SIZE(seq); k++) {
++                if (strcmp(PyString_AS_STRING(PySequence_Fast_GET_ITEM(seq, k)),
++                           PyString_AS_STRING(prv->name)) == 0) {
++                    res = PyObject_CallMethod(rec, "matches", "O", prv);
++                    if (res == NULL)
++                        return NULL;
++                    if (PyObject_IsTrue(res))
++                        CALLMETHOD(searcher, "addResult", "O", rec);
++                    Py_DECREF(res);
++                    break;
++                }
++            }
++
++            Py_DECREF(names);
++            Py_DECREF(seq);
++        }
++    }
++    Py_DECREF(lst);
++
+     lst = PyObject_GetAttrString(searcher, "upgrades");
+     if (lst == NULL || !PyList_Check(lst)) {
+         PyErr_SetString(PyExc_TypeError, "Invalid upgrades attribute");
+@@ -3420,7 +3727,7 @@ Cache__getstate__(CacheObject *self, PyObject *args)
+ static PyObject *
+ Cache__setstate__(CacheObject *self, PyObject *state)
+ {
+-    PyObject *provides, *requires, *upgrades, *conflicts;
++    PyObject *provides, *requires, *recommends, *upgrades, *conflicts;
+     int i, ilen;
+     int j, jlen;
+     
+@@ -3452,11 +3759,13 @@ Cache__setstate__(CacheObject *self, PyObject *state)
+     /*
+        provides = {}
+        requires = {}
++       recommends = {}
+        upgrades = {}
+        conflicts = {}
+     */
+     provides = PyDict_New();
+     requires = PyDict_New();
++    recommends = PyDict_New();
+     upgrades = PyDict_New();
+     conflicts = PyDict_New();
+ 
+@@ -3497,6 +3806,21 @@ Cache__setstate__(CacheObject *self, PyObject *state)
+         }
+ 
+         /*
++           for rec in pkg.recommends:
++               rec.packages.append(pkg)
++               recommends[rec] = True
++        */
++        if (PyList_Check(pkgobj->recommends)) {
++            jlen = PyList_GET_SIZE(pkgobj->recommends);
++            for (j = 0; j != jlen; j++) {
++                PyObject *rec = PyList_GET_ITEM(pkgobj->recommends, j);
++                DependsObject *recobj = (DependsObject *)rec;
++                PyList_Append(recobj->packages, pkg);
++                PyDict_SetItem(recommends, rec, Py_True);
++            }
++        }
++
++        /*
+            for upg in pkg.upgrades:
+                upg.packages.append(pkg)
+                upgrades[upg] = True
+@@ -3525,6 +3849,7 @@ Cache__setstate__(CacheObject *self, PyObject *state)
+                 PyDict_SetItem(conflicts, cnf, Py_True);
+             }
+         }
++
+     }
+ 
+     /* self._provides = provides.keys() */
+@@ -3535,6 +3860,10 @@ Cache__setstate__(CacheObject *self, PyObject *state)
+     self->_requires = PyDict_Keys(requires);
+     Py_DECREF(requires);
+ 
++    /* self._recommends = recommends.keys() */
++    self->_recommends = PyDict_Keys(recommends);
++    Py_DECREF(recommends);
++
+     /* self._upgrades = upgrades.keys() */
+     self->_upgrades = PyDict_Keys(upgrades);
+     Py_DECREF(upgrades);
+@@ -3562,6 +3891,7 @@ static PyMethodDef Cache_methods[] = {
+     {"getPackages", (PyCFunction)Cache_getPackages, METH_VARARGS, NULL},
+     {"getProvides", (PyCFunction)Cache_getProvides, METH_VARARGS, NULL},
+     {"getRequires", (PyCFunction)Cache_getRequires, METH_VARARGS, NULL},
++    {"getRecommends", (PyCFunction)Cache_getRecommends, METH_VARARGS, NULL},
+     {"getUpgrades", (PyCFunction)Cache_getUpgrades, METH_VARARGS, NULL},
+     {"getConflicts", (PyCFunction)Cache_getConflicts, METH_VARARGS, NULL},
+     {"search", (PyCFunction)Cache_search, METH_O, NULL},
+@@ -3576,6 +3906,7 @@ static PyMemberDef Cache_members[] = {
+     {"_packages", T_OBJECT, OFF(_packages), RO, 0},
+     {"_provides", T_OBJECT, OFF(_provides), RO, 0},
+     {"_requires", T_OBJECT, OFF(_requires), RO, 0},
++    {"_recommends", T_OBJECT, OFF(_recommends), RO, 0},
+     {"_upgrades", T_OBJECT, OFF(_upgrades), RO, 0},
+     {"_conflicts", T_OBJECT, OFF(_conflicts), RO, 0},
+     {"_objmap", T_OBJECT, OFF(_objmap), RO, 0},
+diff --git a/smart/commands/query.py b/smart/commands/query.py
+index 808e53a..9265cd9 100644
+--- a/smart/commands/query.py
++++ b/smart/commands/query.py
+@@ -107,6 +107,8 @@ def option_parser(**kwargs):
+                       help=_("show requires for the given packages"))
+     parser.add_option("--show-prerequires", action="store_true",
+                       help=_("show requires selecting only pre-dependencies"))
++    parser.add_option("--show-recommends", action="store_true",
++                      help=_("show recommends for the given packages"))
+     parser.add_option("--show-upgrades", action="store_true",
+                       help=_("show upgrades for the given packages"))
+     parser.add_option("--show-conflicts", action="store_true",
+@@ -488,6 +490,19 @@ def main(ctrl, opts, reloadchannels=True):
+                                 continue
+                             output.showRequiresProvidedBy(pkg, req,
+                                                           prv, prvpkg)
++        if pkg.recommends and (opts.show_recommends):
++            pkg.recommends.sort()
++            first = True
++            for req in pkg.recommends:
++                output.showRecommends(pkg, req)
++                if opts.show_providedby and req.providedby:
++                    for prv in req.providedby:
++                        prv.packages.sort()
++                        for prvpkg in prv.packages:
++                            if opts.installed and not prvpkg.installed:
++                                continue
++                            output.showRecommendsProvidedBy(pkg, req,
++                                                          prv, prvpkg)
+         if pkg.upgrades and (opts.show_upgrades or whoupgrades):
+             pkg.upgrades.sort()
+             first = True
+@@ -594,6 +609,12 @@ class NullOutput(object):
+     def showRequiresProvidedBy(self, pkg, req, prv, prvpkg):
+         pass
+ 
++    def showRecommends(self, pkg, req):
++        pass
++
++    def showRecommendsProvidedBy(self, pkg, req, prv, prvpkg):
++        pass
++
+     def showUpgrades(self, pkg, upg):
+         pass
+ 
+@@ -619,6 +640,8 @@ class TextOutput(NullOutput):
+         self._firstconflictedby = True
+         self._firstrequires = True
+         self._firstrequiresprovidedby = True
++        self._firstrecommends = True
++        self._firstrecommendsprovidedby = True
+         self._firstupgrades = True
+         self._firstupgradesprovidedby = True
+         self._firstconflicts = True
+@@ -711,6 +734,22 @@ class TextOutput(NullOutput):
+             name = str(prvpkg)
+         print "       ", "%s (%s)" % (name, prv)
+ 
++    def showRecommends(self, pkg, rec):
++        if self._firstrecommends:
++            self._firstrecommends = False
++            print " ", _("Recommends:")
++        print "   ", rec
++
++    def showRecommendsProvidedBy(self, pkg, req, prv, prvpkg):
++        if self._firstrecommendsprovidedby:
++            self._firstrecommendsprovidedby = False
++            print "     ", _("Provided By:")
++        if self.opts.hide_version:
++            name = prvpkg.name
++        else:
++            name = str(prvpkg)
++        print "       ", "%s (%s)" % (name, prv)
++
+     def showUpgrades(self, pkg, upg):
+         if self._firstupgrades:
+             self._firstupgrades = False
+@@ -797,6 +836,18 @@ class GraphVizOutput(NullOutput):
+             self._shown[req, prv] = True
+             print '    "Requires: %s" -> "Provides: %s";' % (req, prv)
+ 
++    def showRecommends(self, pkg, req):
++        if (pkg, req) not in self._shown:
++            self._shown[pkg, req] = True
++            print '    "%s" -> "Recommends: %s";' % (pkg, req)
++
++    def showRecommendsProvidedBy(self, pkg, req, prv, prvpkg):
++        self.showPackage(prvpkg)
++        self.showProvides(prvpkg, prv)
++        if (req, prv) not in self._shown:
++            self._shown[req, prv] = True
++            print '    "Recommends: %s" -> "Provides: %s";' % (req, prv)
++
+     def showUpgrades(self, pkg, upg):
+         if (pkg, upg) not in self._shown:
+             self._shown[pkg, upg] = True
+diff --git a/smart/control.py b/smart/control.py
+index fd7083a..d44abe7 100644
+--- a/smart/control.py
++++ b/smart/control.py
+@@ -447,7 +447,7 @@ class Control(object):
+         queue = marked.keys()
+         while queue:
+             pkg = queue.pop(0)
+-            for req in pkg.requires:
++            for req in pkg.requires + pkg.recommends:
+                 for prv in req.providedby:
+                     for prvpkg in prv.packages:
+                         if (prvpkg.installed and
+@@ -794,7 +794,7 @@ class Control(object):
+         pkglst = []
+         for pkg in changeset:
+             n = 0
+-            for req in pkg.requires:
++            for req in pkg.requires + pkg.recommends:
+                 for prv in req.providedby:
+                     for prvpkg in prv.packages:
+                         if changeset.get(prvpkg) is INSTALL:
+diff --git a/smart/searcher.py b/smart/searcher.py
+index 216f4ce..32eb825 100644
+--- a/smart/searcher.py
++++ b/smart/searcher.py
+@@ -45,9 +45,9 @@ class Searcher(object):
+ 
+     - provides is matched in Provides.search(), for the same reason.
+ 
+-    - requires, upgrades, and conflicts don't have special searching
+-      methods. Instead, their usual match() method is given an instance
+-      of the Provides type.
++    - requires, recommends, upgrades, and conflicts don't have special
++      searching methods. Instead, their usual match() method is given
++      an instance of the Provides type.
+ 
+     - group, path, url, and other information which is found by
+       PackageInfo, is searched by the Loader.search() method and
+@@ -62,6 +62,7 @@ class Searcher(object):
+         self.nameversion = []
+         self.provides = []
+         self.requires = []
++        self.recommends = []
+         self.upgrades = []
+         self.conflicts = []
+         self.path = []
+@@ -76,6 +77,7 @@ class Searcher(object):
+         del self.nameversion[:]
+         del self.provides[:]
+         del self.requires[:]
++        del self.recommends[:]
+         del self.upgrades[:]
+         del self.conflicts[:]
+         del self.path[:]
+@@ -122,6 +124,8 @@ class Searcher(object):
+             self.addProvides(s[9:], cutoff)
+         elif s.startswith("requires:"):
+             self.addRequires(s[9:])
++        elif s.startswith("recommends:"):
++            self.addRecommends(s[11:])
+         elif s.startswith("upgrades:"):
+             self.addUpgrades(s[9:])
+         elif s.startswith("conflicts:"):
+@@ -151,6 +155,7 @@ class Searcher(object):
+         return s and (
+                 s.startswith("provides:") or
+                 s.startswith("requires:") or
++                s.startswith("recommends:") or
+                 s.startswith("upgrades:") or
+                 s.startswith("conflicts:") or
+                 s.startswith("url:") or
+@@ -182,6 +187,9 @@ class Searcher(object):
+     def addRequires(self, s):
+         self.requires.append(self._buildProvides(s))
+ 
++    def addRecommends(self, s):
++        self.recommends.append(self._buildProvides(s))
++
+     def addUpgrades(self, s):
+         self.upgrades.append(self._buildProvides(s))
+ 
+diff --git a/smart/transaction.py b/smart/transaction.py
+index eb320d2..300b9cc 100644
+--- a/smart/transaction.py
++++ b/smart/transaction.py
+@@ -573,7 +573,7 @@ class Transaction(object):
+                 self._remove(namepkg, changeset, locked, pending, depth)
+ 
+         # Install packages required by this one.
+-        for req in pkg.requires:
++        for req in pkg.requires + pkg.recommends:
+ 
+             # Check if someone is already providing it.
+             prvpkgs = {}
+@@ -596,8 +596,12 @@ class Transaction(object):
+ 
+             if not prvpkgs:
+                 # No packages provide it at all. Give up.
+-                raise Failed, _("Can't install %s: no package provides %s") % \
+-                              (pkg, req)
++                if req in pkg.requires:
++                    raise Failed, _("Can't install %s: no package provides %s") % \
++                                (pkg, req)
++                else:
++                    # It's only a recommend, skip
++                    continue
+ 
+             if len(prvpkgs) == 1:
+                 # Don't check locked here. prvpkgs was
+@@ -1359,7 +1363,7 @@ class ChangeSetSplitter(object):
+         set = self._changeset
+ 
+         # Check all dependencies needed by this package.
+-        for req in pkg.requires:
++        for req in pkg.requires + pkg.recommends:
+ 
+             # Check if any already installed or to be installed
+             # package will solve the problem.
+@@ -1424,8 +1428,9 @@ class ChangeSetSplitter(object):
+ 
+             # There are no solutions for the problem.
+             # Should we really care about it?
+-            if (self._forcerequires or
+-                isinstance(req, PreRequires)):
++            if ((self._forcerequires or
++                isinstance(req, PreRequires))
++                and req in pkg.requires):
+                 raise Error, _("No providers for '%s', "
+                                "required by '%s'") % (req, pkg)
+ 
+@@ -1625,7 +1630,7 @@ def recursiveInternalRequires(pkgmap, pkg, numrel, done=None):
+     return n
+ 
+ def forwardRequires(pkg, map):
+-    for req in pkg.requires:
++    for req in pkg.requires + pkg.recommends:
+         if req not in map:
+             map[req] = True
+             for prv in req.providedby:
+@@ -1794,6 +1799,15 @@ def checkPackages(cache, checkset, relateset, report=False):
+                 iface.info(_("Unsatisfied dependency: %s requires %s") %
+                            (pkg, req))
+ 
++        for req in pkg.recommends:
++            for prv in req.providedby:
++                for prvpkg in prv.packages:
++                    if prvpkg in relateset:
++                        break
++                else:
++                    continue
++                break
++
+         if not pkg.installed:
+             continue
+ 
+-- 
+1.7.9.5
+
diff --git a/meta/recipes-devtools/python/python-smartpm_1.4.1.bb b/meta/recipes-devtools/python/python-smartpm_1.4.1.bb
index 254318c..9048bc8 100644
--- a/meta/recipes-devtools/python/python-smartpm_1.4.1.bb
+++ b/meta/recipes-devtools/python/python-smartpm_1.4.1.bb
@@ -18,7 +18,7 @@ SRC_URI = "\
           http://launchpad.net/smart/trunk/${PV}/+download/${SRCNAME}-${PV}.tar.bz2 \
           file://smartpm-rpm5-nodig.patch \
           file://smart-rpm-root.patch \
-          file://smart-missingok.patch \
+          file://smart-recommends.patch \
           "
 
 SRC_URI[md5sum] = "573ef32ba177a6b3c4bf7ef04873fcb6"
-- 
1.7.3.4




^ permalink raw reply related	[flat|nested] 37+ messages in thread

* [PATCH 12/22] python-smartpm: style fixes
  2012-12-04 17:14 [PATCH 00/22] Misc fixes Mark Hatle
                   ` (10 preceding siblings ...)
  2012-12-04 17:14 ` [PATCH 11/22] python-smartpm: add " Mark Hatle
@ 2012-12-04 17:14 ` Mark Hatle
  2012-12-04 17:14 ` [PATCH 13/22] python-smartpm: fix package metadata not being read from rpm-md feeds Mark Hatle
                   ` (9 subsequent siblings)
  21 siblings, 0 replies; 37+ messages in thread
From: Mark Hatle @ 2012-12-04 17:14 UTC (permalink / raw)
  To: openembedded-core

From: Paul Eggleton <paul.eggleton@linux.intel.com>

* Use ${PN} instead of python-smartpm
* Use multi-line strings instead of multiple single line += (also
  avoiding the confusing "_append +=")
* Use class-native instead of virtclass-native - no difference in
  behaviour, but this keeps things consistent if we have to add
  any target overrides in future.

Signed-off-by: Paul Eggleton <paul.eggleton@linux.intel.com>
---
 .../python/python-smartpm_1.4.1.bb                 |   48 +++++++++----------
 1 files changed, 23 insertions(+), 25 deletions(-)

diff --git a/meta/recipes-devtools/python/python-smartpm_1.4.1.bb b/meta/recipes-devtools/python/python-smartpm_1.4.1.bb
index 9048bc8..ff153a7 100644
--- a/meta/recipes-devtools/python/python-smartpm_1.4.1.bb
+++ b/meta/recipes-devtools/python/python-smartpm_1.4.1.bb
@@ -28,13 +28,13 @@ S = "${WORKDIR}/${SRCNAME}-${PV}"
 # Options - rpm, qt4, gtk
 PACKAGECONFIG ??= "rpm"
 
-RPM_RDEP = "python-smartpm-backend-rpm"
-QT_RDEP = "python-smartpm-interface-qt4"
-GTK_RDEP = "python-smartpm-interface-gtk"
+RPM_RDEP = "${PN}-backend-rpm"
+QT_RDEP = "${PN}-interface-qt4"
+GTK_RDEP = "${PN}-interface-gtk"
 
-RPM_RDEP_virtclass-native = ""
-QT_RDEP_virtclass-native = ""
-GTK_RDEP_virtclass-native = ""
+RPM_RDEP_class-native = ""
+QT_RDEP_class-native = ""
+GTK_RDEP_class-native = ""
 
 PACKAGECONFIG[rpm] = ",,rpm,${RPM_RDEP}"
 PACKAGECONFIG[qt4] = ",,qt4-x11,${QT_RDEP}"
@@ -85,35 +85,33 @@ do_install_append() {
    fi
 }
 
-PACKAGES  = "python-smartpm-dev python-smartpm-dbg python-smartpm-doc smartpm"
-PACKAGES += "${@base_contains('PACKAGECONFIG', 'rpm', 'python-smartpm-backend-rpm', '', d)}"
-PACKAGES += "${@base_contains('PACKAGECONFIG', 'qt4', 'python-smartpm-interface-qt4', '', d)}"
-PACKAGES += "${@base_contains('PACKAGECONFIG', 'gtk', 'python-smartpm-interface-gtk', '', d)}"
-PACKAGES += "python-smartpm-interface-images"
-PACKAGES += "python-smartpm"
+PACKAGES = "${PN}-dev ${PN}-dbg ${PN}-doc smartpm \
+            ${@base_contains('PACKAGECONFIG', 'rpm', '${PN}-backend-rpm', '', d)} \
+            ${@base_contains('PACKAGECONFIG', 'qt4', '${PN}-interface-qt4', '', d)} \
+            ${@base_contains('PACKAGECONFIG', 'gtk', '${PN}-interface-gtk', '', d)} \
+            ${PN}-interface-images ${PN}"
 
-RDEPENDS_smartpm = 'python-smartpm'
+RDEPENDS_smartpm = "${PN}"
 
-RDEPENDS_python-smartpm_append = " python-smartpm-backend-rpm python-codecs python-textutils python-xml"
-RDEPENDS_python-smartpm_append += " python-fcntl python-pickle python-crypt python-compression python-shell"
-RDEPENDS_python-smartpm_append += " python-resource python-netclient python-threading python-unixadmin"
+RDEPENDS_${PN} += "${PN}-backend-rpm python-codecs python-textutils python-xml python-fcntl \
+                   python-pickle python-crypt python-compression python-shell \
+                   python-resource python-netclient python-threading python-unixadmin"
+RDEPENDS_${PN}_class-native = ""
 
-#RDEPENDS_python-smartpm_append += " python-modules"
+RDEPENDS_${PN}-backend-rpm = "python-rpm"
 
-RDEPENDS_python-smartpm-backend-rpm = 'python-rpm'
-
-RDEPENDS_python-smartpm-interface-qt4 = 'qt4-x11 python-smartpm-interface-images'
-RDEPENDS_python-smartpm-interface-gtk = 'gtk+ python-smartpm-interface-images'
+RDEPENDS_${PN}-interface-qt4 = "qt4-x11 ${PN}-interface-images"
+RDEPENDS_${PN}-interface-gtk = "gtk+ ${PN}-interface-images"
 
 FILES_smartpm = "${bindir}/smart"
 
 FILES_${PN}-dbg += "${libdir}/python*/site-packages/smart/backends/rpm/.debug"
 
-FILES_python-smartpm-backend-rpm = "${libdir}/python*/site-packages/smart/backends/rpm"
+FILES_${PN}-backend-rpm = "${libdir}/python*/site-packages/smart/backends/rpm"
 
-FILES_python-smartpm-interface-qt4 = "${libdir}/python*/site-packages/smart/interfaces/qt4"
-FILES_python-smartpm-interface-gtk = "${libdir}/python*/site-packages/smart/interfaces/gtk"
-FILES_python-smartpm-interface-images = "${datadir}/${baselib}/python*/site-packages/smart/interfaces/images"
+FILES_${PN}-interface-qt4 = "${libdir}/python*/site-packages/smart/interfaces/qt4"
+FILES_${PN}-interface-gtk = "${libdir}/python*/site-packages/smart/interfaces/gtk"
+FILES_${PN}-interface-images = "${datadir}/${baselib}/python*/site-packages/smart/interfaces/images"
 
 BBCLASSEXTEND = "native"
 
-- 
1.7.3.4




^ permalink raw reply related	[flat|nested] 37+ messages in thread

* [PATCH 13/22] python-smartpm: fix package metadata not being read from rpm-md feeds
  2012-12-04 17:14 [PATCH 00/22] Misc fixes Mark Hatle
                   ` (11 preceding siblings ...)
  2012-12-04 17:14 ` [PATCH 12/22] python-smartpm: style fixes Mark Hatle
@ 2012-12-04 17:14 ` Mark Hatle
  2012-12-04 17:14 ` [PATCH 14/22] python-smartpm: don't create /var/tmp on every rpm database open Mark Hatle
                   ` (8 subsequent siblings)
  21 siblings, 0 replies; 37+ messages in thread
From: Mark Hatle @ 2012-12-04 17:14 UTC (permalink / raw)
  To: openembedded-core

From: Paul Eggleton <paul.eggleton@linux.intel.com>

The XML indexes in rpm-md were being parsed incorrectly leading to the
package metadata (e.g. dependencies) not being read.

Signed-off-by: Paul Eggleton <paul.eggleton@linux.intel.com>
---
 .../python/python-smartpm/smart-rpm-md-parse.patch |   26 ++++++++++++++++++++
 .../python/python-smartpm_1.4.1.bb                 |    3 +-
 2 files changed, 28 insertions(+), 1 deletions(-)
 create mode 100644 meta/recipes-devtools/python/python-smartpm/smart-rpm-md-parse.patch

diff --git a/meta/recipes-devtools/python/python-smartpm/smart-rpm-md-parse.patch b/meta/recipes-devtools/python/python-smartpm/smart-rpm-md-parse.patch
new file mode 100644
index 0000000..97cecc1
--- /dev/null
+++ b/meta/recipes-devtools/python/python-smartpm/smart-rpm-md-parse.patch
@@ -0,0 +1,26 @@
+backends/rpm: fix parsing of rpm-md metadata
+
+If assertions are disabled then the queue.pop() wasn't being executed,
+leading to requires, recommends etc. not being read properly.
+
+Upstream-Status: Pending
+
+Signed-off-by: Paul Eggleton <paul.eggleton@linux.intel.com>
+
+diff --git a/smart/backends/rpm/metadata.py b/smart/backends/rpm/metadata.py
+index 2c54f39..dc9df22 100644
+--- a/smart/backends/rpm/metadata.py
++++ b/smart/backends/rpm/metadata.py
+@@ -188,7 +188,8 @@ class RPMMetaDataLoader(Loader):
+ 
+             elif event == "end":
+ 
+-                assert queue.pop() is elem
++                popped = queue.pop()
++                assert popped is elem
+ 
+                 if skip:
+                     if tag == skip:
+-- 
+1.7.9.5
+
diff --git a/meta/recipes-devtools/python/python-smartpm_1.4.1.bb b/meta/recipes-devtools/python/python-smartpm_1.4.1.bb
index ff153a7..2d0f7cd 100644
--- a/meta/recipes-devtools/python/python-smartpm_1.4.1.bb
+++ b/meta/recipes-devtools/python/python-smartpm_1.4.1.bb
@@ -11,7 +11,7 @@ LICENSE = "GPLv2"
 LIC_FILES_CHKSUM = "file://LICENSE;md5=393a5ca445f6965873eca0259a17f833"
 
 DEPENDS = "python rpm"
-PR = "r1"
+PR = "r2"
 SRCNAME = "smart"
 
 SRC_URI = "\
@@ -19,6 +19,7 @@ SRC_URI = "\
           file://smartpm-rpm5-nodig.patch \
           file://smart-rpm-root.patch \
           file://smart-recommends.patch \
+          file://smart-rpm-md-parse.patch \
           "
 
 SRC_URI[md5sum] = "573ef32ba177a6b3c4bf7ef04873fcb6"
-- 
1.7.3.4




^ permalink raw reply related	[flat|nested] 37+ messages in thread

* [PATCH 14/22] python-smartpm: don't create /var/tmp on every rpm database open
  2012-12-04 17:14 [PATCH 00/22] Misc fixes Mark Hatle
                   ` (12 preceding siblings ...)
  2012-12-04 17:14 ` [PATCH 13/22] python-smartpm: fix package metadata not being read from rpm-md feeds Mark Hatle
@ 2012-12-04 17:14 ` Mark Hatle
  2012-12-04 17:14 ` [PATCH 15/22] python-smartpm: support nolinktos and noparentdirs rpm options Mark Hatle
                   ` (7 subsequent siblings)
  21 siblings, 0 replies; 37+ messages in thread
From: Mark Hatle @ 2012-12-04 17:14 UTC (permalink / raw)
  To: openembedded-core

From: Paul Eggleton <paul.eggleton@linux.intel.com>

This directory if present in the rootfs interferes with proper
installation of base-files and doesn't seem to need to be there
for smart/rpm to work in any case.

Signed-off-by: Paul Eggleton <paul.eggleton@linux.intel.com>
---
 .../python/python-smartpm/smart-tmpdir.patch       |   30 ++++++++++++++++++++
 .../python/python-smartpm_1.4.1.bb                 |    1 +
 2 files changed, 31 insertions(+), 0 deletions(-)
 create mode 100644 meta/recipes-devtools/python/python-smartpm/smart-tmpdir.patch

diff --git a/meta/recipes-devtools/python/python-smartpm/smart-tmpdir.patch b/meta/recipes-devtools/python/python-smartpm/smart-tmpdir.patch
new file mode 100644
index 0000000..2f09ce9
--- /dev/null
+++ b/meta/recipes-devtools/python/python-smartpm/smart-tmpdir.patch
@@ -0,0 +1,30 @@
+backends/rpm: remove creation of /var/tmp
+
+This doesn't appear to be needed, and breaks installation of base-files
+in OpenEmbedded (since that is a symlink installed as part of the
+package).
+
+Upstream-Status: Pending
+
+Signed-off-by: Paul Eggleton <paul.eggleton@linux.intel.com>
+
+diff --git a/smart/backends/rpm/base.py b/smart/backends/rpm/base.py
+index 234c844..127354d 100644
+--- a/smart/backends/rpm/base.py
++++ b/smart/backends/rpm/base.py
+@@ -82,12 +82,6 @@ def getTS(new=False):
+             else:
+                 iface.warning(_("Initialized new rpm database at %s")
+                               % getTS.root)
+-        tmpdir = os.path.join(getTS.root, "var/tmp")
+-        if not os.path.isdir(tmpdir):
+-            try:
+-                os.makedirs(tmpdir)
+-            except OSError:
+-                pass
+     if new:
+         if sysconf.get("rpm-dbpath"):
+             rpm.addMacro('_dbpath', "/" + sysconf.get("rpm-dbpath"))
+-- 
+1.7.9.5
+
diff --git a/meta/recipes-devtools/python/python-smartpm_1.4.1.bb b/meta/recipes-devtools/python/python-smartpm_1.4.1.bb
index 2d0f7cd..9ec7c7a 100644
--- a/meta/recipes-devtools/python/python-smartpm_1.4.1.bb
+++ b/meta/recipes-devtools/python/python-smartpm_1.4.1.bb
@@ -20,6 +20,7 @@ SRC_URI = "\
           file://smart-rpm-root.patch \
           file://smart-recommends.patch \
           file://smart-rpm-md-parse.patch \
+          file://smart-tmpdir.patch \
           "
 
 SRC_URI[md5sum] = "573ef32ba177a6b3c4bf7ef04873fcb6"
-- 
1.7.3.4




^ permalink raw reply related	[flat|nested] 37+ messages in thread

* [PATCH 15/22] python-smartpm: support nolinktos and noparentdirs rpm options
  2012-12-04 17:14 [PATCH 00/22] Misc fixes Mark Hatle
                   ` (13 preceding siblings ...)
  2012-12-04 17:14 ` [PATCH 14/22] python-smartpm: don't create /var/tmp on every rpm database open Mark Hatle
@ 2012-12-04 17:14 ` Mark Hatle
  2012-12-04 17:14 ` [PATCH 16/22] python-smartpm: allow setting arbitrary macros in smart config Mark Hatle
                   ` (6 subsequent siblings)
  21 siblings, 0 replies; 37+ messages in thread
From: Mark Hatle @ 2012-12-04 17:14 UTC (permalink / raw)
  To: openembedded-core

From: Paul Eggleton <paul.eggleton@linux.intel.com>

Allowing us to turn on these options enables installation of base-files
which contains a symlink to /proc/mounts which is auto-detected as a
dependency and isn't provided by any other package.

Signed-off-by: Paul Eggleton <paul.eggleton@linux.intel.com>
---
 .../python/python-smartpm/smart-dflags.patch       |   40 ++++++++++++++++++++
 .../python/python-smartpm_1.4.1.bb                 |    1 +
 2 files changed, 41 insertions(+), 0 deletions(-)
 create mode 100644 meta/recipes-devtools/python/python-smartpm/smart-dflags.patch

diff --git a/meta/recipes-devtools/python/python-smartpm/smart-dflags.patch b/meta/recipes-devtools/python/python-smartpm/smart-dflags.patch
new file mode 100644
index 0000000..3f27262
--- /dev/null
+++ b/meta/recipes-devtools/python/python-smartpm/smart-dflags.patch
@@ -0,0 +1,40 @@
+backends/rpm: add support for setting dependency flags
+
+This is useful for OpenEmbedded so that we can do the equivalent of
+the --nolinktos and --noparentdirs rpm command line options.
+
+Upstream-Status: Pending
+
+Signed-off-by: Paul Eggleton <paul.eggleton@linux.intel.com>
+
+diff --git a/smart/backends/rpm/pm.py b/smart/backends/rpm/pm.py
+index 707a146..aec82e7 100644
+--- a/smart/backends/rpm/pm.py
++++ b/smart/backends/rpm/pm.py
+@@ -106,6 +106,23 @@ class RPMPackageManager(PackageManager):
+             flags |= rpm.RPMTRANS_FLAG_TEST
+         ts.setFlags(flags)
+ 
++        dflags = ts.setDFlags(0)
++        if sysconf.get("rpm-noupgrade", False):
++            dflags |= rpm.RPMDEPS_FLAG_NOUPGRADE
++        if sysconf.get("rpm-norequires", False):
++            dflags |= rpm.RPMDEPS_FLAG_NOREQUIRES
++        if sysconf.get("rpm-noconflicts", False):
++            dflags |= rpm.RPMDEPS_FLAG_NOCONFLICTS
++        if sysconf.get("rpm-noobsoletes", False):
++            dflags |= rpm.RPMDEPS_FLAG_NOOBSOLETES
++        if sysconf.get("rpm-noparentdirs", False):
++            dflags |= rpm.RPMDEPS_FLAG_NOPARENTDIRS
++        if sysconf.get("rpm-nolinktos", False):
++            dflags |= rpm.RPMDEPS_FLAG_NOLINKTOS
++        if sysconf.get("rpm-nosuggest", False):
++            dflags |= rpm.RPMDEPS_FLAG_NOSUGGEST
++        ts.setDFlags(dflags)
++
+         # Set rpm verbosity level.
+         levelname = sysconf.get('rpm-log-level')
+         level = {
+-- 
+1.7.9.5
+
diff --git a/meta/recipes-devtools/python/python-smartpm_1.4.1.bb b/meta/recipes-devtools/python/python-smartpm_1.4.1.bb
index 9ec7c7a..72a307d 100644
--- a/meta/recipes-devtools/python/python-smartpm_1.4.1.bb
+++ b/meta/recipes-devtools/python/python-smartpm_1.4.1.bb
@@ -19,6 +19,7 @@ SRC_URI = "\
           file://smartpm-rpm5-nodig.patch \
           file://smart-rpm-root.patch \
           file://smart-recommends.patch \
+          file://smart-dflags.patch \
           file://smart-rpm-md-parse.patch \
           file://smart-tmpdir.patch \
           "
-- 
1.7.3.4




^ permalink raw reply related	[flat|nested] 37+ messages in thread

* [PATCH 16/22] python-smartpm: allow setting arbitrary macros in smart config
  2012-12-04 17:14 [PATCH 00/22] Misc fixes Mark Hatle
                   ` (14 preceding siblings ...)
  2012-12-04 17:14 ` [PATCH 15/22] python-smartpm: support nolinktos and noparentdirs rpm options Mark Hatle
@ 2012-12-04 17:14 ` Mark Hatle
  2012-12-04 17:14 ` [PATCH 17/22] python-smartpm: Fix incorrect comparison arguments Mark Hatle
                   ` (5 subsequent siblings)
  21 siblings, 0 replies; 37+ messages in thread
From: Mark Hatle @ 2012-12-04 17:14 UTC (permalink / raw)
  To: openembedded-core

From: Paul Eggleton <paul.eggleton@linux.intel.com>

Add support for an rpm-extra-macros config option which can be
used to define some extra macros that need to be set for rootfs
construction to work on the host and that don't really warrant
their own specific named config options to be created.

Signed-off-by: Paul Eggleton <paul.eggleton@linux.intel.com>
---
 .../python-smartpm/smart-rpm-extra-macros.patch    |   27 ++++++++++++++++++++
 .../python/python-smartpm_1.4.1.bb                 |    1 +
 2 files changed, 28 insertions(+), 0 deletions(-)
 create mode 100644 meta/recipes-devtools/python/python-smartpm/smart-rpm-extra-macros.patch

diff --git a/meta/recipes-devtools/python/python-smartpm/smart-rpm-extra-macros.patch b/meta/recipes-devtools/python/python-smartpm/smart-rpm-extra-macros.patch
new file mode 100644
index 0000000..30cb176
--- /dev/null
+++ b/meta/recipes-devtools/python/python-smartpm/smart-rpm-extra-macros.patch
@@ -0,0 +1,27 @@
+backends/rpm: implement rpm-extra-macros option
+
+Allow defining extra macros in the smart configuration to be passed
+to rpm before opening the database.
+
+Upstream-Status: Pending
+
+Signed-off-by: Paul Eggleton <paul.eggleton@linux.intel.com>
+
+diff --git a/smart/backends/rpm/base.py b/smart/backends/rpm/base.py
+index b9e9cb2..234c844 100644
+--- a/smart/backends/rpm/base.py
++++ b/smart/backends/rpm/base.py
+@@ -53,6 +53,10 @@ def rpm_join_dbpath(root, dbpath):
+         return os.path.join(root, dbpath)
+ 
+ def getTS(new=False):
++    if sysconf.get("rpm-extra-macros"):
++        for key, value in sysconf.get("rpm-extra-macros").items():
++            rpm.addMacro(key, str(value))
++
+     rpm_root = os.path.abspath(sysconf.get("rpm-root", "/"))
+     if not hasattr(getTS, "ts") or getTS.root != rpm_root:
+         getTS.root = rpm_root
+-- 
+1.7.9.5
+
diff --git a/meta/recipes-devtools/python/python-smartpm_1.4.1.bb b/meta/recipes-devtools/python/python-smartpm_1.4.1.bb
index 72a307d..4694d51 100644
--- a/meta/recipes-devtools/python/python-smartpm_1.4.1.bb
+++ b/meta/recipes-devtools/python/python-smartpm_1.4.1.bb
@@ -19,6 +19,7 @@ SRC_URI = "\
           file://smartpm-rpm5-nodig.patch \
           file://smart-rpm-root.patch \
           file://smart-recommends.patch \
+          file://smart-rpm-extra-macros.patch \
           file://smart-dflags.patch \
           file://smart-rpm-md-parse.patch \
           file://smart-tmpdir.patch \
-- 
1.7.3.4




^ permalink raw reply related	[flat|nested] 37+ messages in thread

* [PATCH 17/22] python-smartpm: Fix incorrect comparison arguments
  2012-12-04 17:14 [PATCH 00/22] Misc fixes Mark Hatle
                   ` (15 preceding siblings ...)
  2012-12-04 17:14 ` [PATCH 16/22] python-smartpm: allow setting arbitrary macros in smart config Mark Hatle
@ 2012-12-04 17:14 ` Mark Hatle
  2012-12-04 17:14 ` [PATCH 18/22] shadow: add runtime dependency on base-passwd Mark Hatle
                   ` (4 subsequent siblings)
  21 siblings, 0 replies; 37+ messages in thread
From: Mark Hatle @ 2012-12-04 17:14 UTC (permalink / raw)
  To: openembedded-core

Built-in provides were not being compared properly within smart.
This was caused by an incorrect argument to the match function.

Signed-off-by: Mark Hatle <mark.hatle@windriver.com>
---
 .../python-smartpm/smart-metadata-match.patch      |   28 ++++++++++++++++++++
 .../python/python-smartpm_1.4.1.bb                 |    3 +-
 2 files changed, 30 insertions(+), 1 deletions(-)
 create mode 100644 meta/recipes-devtools/python/python-smartpm/smart-metadata-match.patch

diff --git a/meta/recipes-devtools/python/python-smartpm/smart-metadata-match.patch b/meta/recipes-devtools/python/python-smartpm/smart-metadata-match.patch
new file mode 100644
index 0000000..d06f416
--- /dev/null
+++ b/meta/recipes-devtools/python/python-smartpm/smart-metadata-match.patch
@@ -0,0 +1,28 @@
+smart - backends/rmp/metadata.py: Fix incorrect call to the match function
+
+The match function should take three parameters, name, comparison, version...
+The original code was passing it a reference to the object holding the data
+instead, which caused the comparison in match to always fail.
+
+Upstream-Status: Pending
+
+Signed-off-by: Mark Hatle <mark.hatle@windriver.com>
+
+--- a/smart/backends/rpm/metadata.py
++++ b/smart/backends/rpm/metadata.py
+@@ -332,13 +332,13 @@
+                     reqargs = [x for x in reqdict
+                                if not ((x[2] is None or "=" in x[2]) and
+                                        (RPMProvides, x[1], x[3]) in prvdict or
+-                                       system_provides.match(*x[:3]))]
++                                       system_provides.match(x[1], x[2], x[3]))]
+                     reqargs = collapse_libc_requires(reqargs)
+ 
+                     recargs = [x for x in recdict
+                                if not ((x[2] is None or "=" in x[2]) and
+                                        (RPMProvides, x[1], x[3]) in prvdict or
+-                                       system_provides.match(*x[:3]))]
++                                       system_provides.match(x[1], x[2], x[3]))]
+ 
+                     prvargs = prvdict.keys()
+                     cnfargs = cnfdict.keys()
diff --git a/meta/recipes-devtools/python/python-smartpm_1.4.1.bb b/meta/recipes-devtools/python/python-smartpm_1.4.1.bb
index 4694d51..bbaa530 100644
--- a/meta/recipes-devtools/python/python-smartpm_1.4.1.bb
+++ b/meta/recipes-devtools/python/python-smartpm_1.4.1.bb
@@ -11,7 +11,7 @@ LICENSE = "GPLv2"
 LIC_FILES_CHKSUM = "file://LICENSE;md5=393a5ca445f6965873eca0259a17f833"
 
 DEPENDS = "python rpm"
-PR = "r2"
+PR = "r3"
 SRCNAME = "smart"
 
 SRC_URI = "\
@@ -23,6 +23,7 @@ SRC_URI = "\
           file://smart-dflags.patch \
           file://smart-rpm-md-parse.patch \
           file://smart-tmpdir.patch \
+          file://smart-metadata-match.patch \
           "
 
 SRC_URI[md5sum] = "573ef32ba177a6b3c4bf7ef04873fcb6"
-- 
1.7.3.4




^ permalink raw reply related	[flat|nested] 37+ messages in thread

* [PATCH 18/22] shadow: add runtime dependency on base-passwd
  2012-12-04 17:14 [PATCH 00/22] Misc fixes Mark Hatle
                   ` (16 preceding siblings ...)
  2012-12-04 17:14 ` [PATCH 17/22] python-smartpm: Fix incorrect comparison arguments Mark Hatle
@ 2012-12-04 17:14 ` Mark Hatle
  2012-12-04 17:14 ` [PATCH 19/22] package_deb: Dependencies with a ( or ) in them are invalid in debs Mark Hatle
                   ` (3 subsequent siblings)
  21 siblings, 0 replies; 37+ messages in thread
From: Mark Hatle @ 2012-12-04 17:14 UTC (permalink / raw)
  To: openembedded-core

From: Paul Eggleton <paul.eggleton@linux.intel.com>

This fixes an issue where the shadow package was sometimes getting
installed before base-passwd during rootfs construction with Smart,
which meant the postinstall scripts could not find /etc/passwd and
/etc/group and failed as a result.

Signed-off-by: Paul Eggleton <paul.eggleton@linux.intel.com>
---
 meta/recipes-extended/shadow/shadow_4.1.4.3.bb |    5 +++--
 1 files changed, 3 insertions(+), 2 deletions(-)

diff --git a/meta/recipes-extended/shadow/shadow_4.1.4.3.bb b/meta/recipes-extended/shadow/shadow_4.1.4.3.bb
index eb00bf0..91410d8 100644
--- a/meta/recipes-extended/shadow/shadow_4.1.4.3.bb
+++ b/meta/recipes-extended/shadow/shadow_4.1.4.3.bb
@@ -8,8 +8,9 @@ LIC_FILES_CHKSUM = "file://COPYING;md5=08c553a87d4e51bbed50b20e0adcaede \
                     file://src/passwd.c;firstline=8;endline=30;md5=2899a045e90511d0e043b85a7db7e2fe"
 
 DEPENDS = "${@base_contains('DISTRO_FEATURES', 'pam', 'libpam', '', d)}"
-RDEPENDS_${PN} = "shadow-securetty ${@base_contains('DISTRO_FEATURES', 'pam', '${PAM_PLUGINS}', '', d)}"
-PR = "r12"
+RDEPENDS_${PN} = "shadow-securetty ${@base_contains('DISTRO_FEATURES', 'pam', '${PAM_PLUGINS}', '', d)} \
+                  base-passwd"
+PR = "r13"
 
 SRC_URI = "http://pkg-shadow.alioth.debian.org/releases/${BPN}-${PV}.tar.bz2 \
            file://login_defs_pam.sed \
-- 
1.7.3.4




^ permalink raw reply related	[flat|nested] 37+ messages in thread

* [PATCH 19/22] package_deb: Dependencies with a ( or ) in them are invalid in debs
  2012-12-04 17:14 [PATCH 00/22] Misc fixes Mark Hatle
                   ` (17 preceding siblings ...)
  2012-12-04 17:14 ` [PATCH 18/22] shadow: add runtime dependency on base-passwd Mark Hatle
@ 2012-12-04 17:14 ` Mark Hatle
  2012-12-04 17:14 ` [PATCH 20/22] pkgconfig: Add a manual dependency of pkgconfig(pkg-config) Mark Hatle
                   ` (2 subsequent siblings)
  21 siblings, 0 replies; 37+ messages in thread
From: Mark Hatle @ 2012-12-04 17:14 UTC (permalink / raw)
  To: openembedded-core

Replace ( or ) with __.  This allows RPM style dependencies to be satisfied
in deb style packages.

Signed-off-by: Mark Hatle <mark.hatle@windriver.com>
---
 meta/classes/package_deb.bbclass |   10 ++++++++++
 1 files changed, 10 insertions(+), 0 deletions(-)

diff --git a/meta/classes/package_deb.bbclass b/meta/classes/package_deb.bbclass
index d273cb0..eed9b8a 100644
--- a/meta/classes/package_deb.bbclass
+++ b/meta/classes/package_deb.bbclass
@@ -335,12 +335,22 @@ python do_package_deb () {
         mapping_rename_hook(localdata)
 
         def debian_cmp_remap(var):
+            # dpkg does not allow for '(' or ')' in a dependency name
+            # replace these instances with '__' and '__'
+            #
             # In debian '>' and '<' do not mean what it appears they mean
             #   '<' = less or equal
             #   '>' = greater or equal
             # adjust these to the '<<' and '>>' equivalents
             #
             for dep in var:
+                if '(' in dep:
+                    newdep = dep.replace('(', '__')
+                    newdep = newdep.replace(')', '__')
+                    if newdep != dep:
+                        var[newdep] = var[dep]
+                        del var[dep]
+            for dep in var:
                 for i, v in enumerate(var[dep]):
                     if (v or "").startswith("< "):
                         var[dep][i] = var[dep][i].replace("< ", "<< ")
-- 
1.7.3.4




^ permalink raw reply related	[flat|nested] 37+ messages in thread

* [PATCH 20/22] pkgconfig: Add a manual dependency of pkgconfig(pkg-config)
  2012-12-04 17:14 [PATCH 00/22] Misc fixes Mark Hatle
                   ` (18 preceding siblings ...)
  2012-12-04 17:14 ` [PATCH 19/22] package_deb: Dependencies with a ( or ) in them are invalid in debs Mark Hatle
@ 2012-12-04 17:14 ` Mark Hatle
  2012-12-06 13:16   ` Paul Eggleton
  2012-12-06 13:30   ` Otavio Salvador
  2012-12-04 17:14 ` [PATCH 21/22] pseudo: Rework target, native and nativesdk pseudo intergration Mark Hatle
  2012-12-04 17:14 ` [PATCH 22/22] license.bbclass: Avoid grep error message Mark Hatle
  21 siblings, 2 replies; 37+ messages in thread
From: Mark Hatle @ 2012-12-04 17:14 UTC (permalink / raw)
  To: openembedded-core

The libtelepathy-glib-dev package contains a .pc file that has a requires
of pkgconfig(pkg-config) > 0.21 in it.  In order to satisfy this requirement
we add a manual RPROVIDE to the pkgconfig package.

Signed-off-by: Mark Hatle <mark.hatle@windriver.com>
---
 meta/recipes-devtools/pkgconfig/pkgconfig.inc     |    5 +++++
 meta/recipes-devtools/pkgconfig/pkgconfig_0.25.bb |    2 +-
 meta/recipes-devtools/pkgconfig/pkgconfig_git.bb  |    1 +
 3 files changed, 7 insertions(+), 1 deletions(-)

diff --git a/meta/recipes-devtools/pkgconfig/pkgconfig.inc b/meta/recipes-devtools/pkgconfig/pkgconfig.inc
index 83a9cdf..27d4071 100644
--- a/meta/recipes-devtools/pkgconfig/pkgconfig.inc
+++ b/meta/recipes-devtools/pkgconfig/pkgconfig.inc
@@ -37,3 +37,8 @@ BBCLASSEXTEND = "native nativesdk"
 # files.
 FILES_${PN}-dev = ""
 FILES_${PN} += "${datadir}/aclocal/pkg.m4"
+
+# When using the RPM generated automatic package dependencies, some packages
+# will end up requiring 'pkgconfig(pkg-config)'.  Allow this behavior by
+# specifying an appropriate provide.
+RPROVIDES_${PN} += "pkgconfig(pkg-config) (= ${PV})"
diff --git a/meta/recipes-devtools/pkgconfig/pkgconfig_0.25.bb b/meta/recipes-devtools/pkgconfig/pkgconfig_0.25.bb
index 1e60c54..d0a2b1f 100644
--- a/meta/recipes-devtools/pkgconfig/pkgconfig_0.25.bb
+++ b/meta/recipes-devtools/pkgconfig/pkgconfig_0.25.bb
@@ -1,6 +1,6 @@
 require pkgconfig.inc
 
-PR = "r5"
+PR = "r6"
 
 SRC_URI[md5sum] = "a3270bab3f4b69b7dc6dbdacbcae9745"
 SRC_URI[sha256sum] = "3ba691ee2431f32ccb8efa131e59bf23e37f122dc66791309023ca6dcefcd10e"
diff --git a/meta/recipes-devtools/pkgconfig/pkgconfig_git.bb b/meta/recipes-devtools/pkgconfig/pkgconfig_git.bb
index 6271992..d5ec8fc 100644
--- a/meta/recipes-devtools/pkgconfig/pkgconfig_git.bb
+++ b/meta/recipes-devtools/pkgconfig/pkgconfig_git.bb
@@ -8,6 +8,7 @@ S = "${WORKDIR}/git/"
 
 SRCREV = "66d49f1375fec838bcd301bb4ca2ef76cee0e47c"
 PV = "0.23+git${SRCPV}"
+PR = "r1"
 
 DEFAULT_PREFERENCE = "-1"
 
-- 
1.7.3.4




^ permalink raw reply related	[flat|nested] 37+ messages in thread

* [PATCH 21/22] pseudo: Rework target, native and nativesdk pseudo intergration
  2012-12-04 17:14 [PATCH 00/22] Misc fixes Mark Hatle
                   ` (19 preceding siblings ...)
  2012-12-04 17:14 ` [PATCH 20/22] pkgconfig: Add a manual dependency of pkgconfig(pkg-config) Mark Hatle
@ 2012-12-04 17:14 ` Mark Hatle
  2012-12-06  5:06   ` Saul Wold
  2012-12-04 17:14 ` [PATCH 22/22] license.bbclass: Avoid grep error message Mark Hatle
  21 siblings, 1 reply; 37+ messages in thread
From: Mark Hatle @ 2012-12-04 17:14 UTC (permalink / raw)
  To: openembedded-core

Pseudo was not building and installing properly for systems where baselib
was not 'lib'.  This change reworks the three scenerios to work properly.

Signed-off-by: Mark Hatle <mark.hatle@windriver.com>
---
 meta/recipes-devtools/pseudo/pseudo.inc      |   58 ++++++++++++-------------
 meta/recipes-devtools/pseudo/pseudo_1.4.1.bb |    2 +-
 meta/recipes-devtools/pseudo/pseudo_git.bb   |    2 +-
 3 files changed, 30 insertions(+), 32 deletions(-)

diff --git a/meta/recipes-devtools/pseudo/pseudo.inc b/meta/recipes-devtools/pseudo/pseudo.inc
index 98f706c..8dc7d72 100644
--- a/meta/recipes-devtools/pseudo/pseudo.inc
+++ b/meta/recipes-devtools/pseudo/pseudo.inc
@@ -13,34 +13,28 @@ SRC_URI_append_class-nativesdk = " file://symver.patch"
 
 SRC_URI_append_class-native = " file://symver.patch"
 
-FILES_${PN} = "${libdir}/pseudo/lib*/libpseudo.so ${bindir}/* ${localstatedir}/pseudo ${prefix}/var/pseudo"
-FILES_${PN}-dbg += "${libdir}/pseudo/lib*/.debug"
+FILES_${PN} = "${prefix}/lib/pseudo/lib*/libpseudo.so ${bindir}/* ${localstatedir}/pseudo ${prefix}/var/pseudo"
+FILES_${PN}-dbg += "${prefix}/lib/pseudo/lib*/.debug"
 PROVIDES += "virtual/fakeroot"
 
 MAKEOPTS = ""
 
 inherit siteinfo
 
-do_configure () {
-	:
-}
-
-NO32LIBS ??= "1"
-
-# Compile for the local machine arch...
-do_compile () {
+do_configure_class-target () {
 	if [ "${SITEINFO_BITS}" = "64" ]; then
-	  ${S}/configure --prefix=${prefix} --libdir=${prefix}/lib/pseudo/lib${SITEINFO_BITS} --with-sqlite=${STAGING_DIR_TARGET}${exec_prefix} --cflags="${CFLAGS}" --bits=${SITEINFO_BITS} --enable-static-sqlite --without-rpath
+		mylibdir=${prefix}/lib/pseudo/lib${SITEINFO_BITS}
 	else
-	  ${S}/configure --prefix=${prefix} --libdir=${prefix}/lib/pseudo/lib --with-sqlite=${STAGING_DIR_TARGET}${exec_prefix} --cflags="${CFLAGS}" --bits=${SITEINFO_BITS} --enable-static-sqlite --without-rpath
+		mylibdir=${prefix}/lib/pseudo/lib
 	fi
-	oe_runmake ${MAKEOPTS}
+	${S}/configure --prefix=${prefix} --libdir=$mylibdir --cflags="${CFLAGS}" --bits=${SITEINFO_BITS} --without-rpath
 }
 
-# Two below are the same
+NO32LIBS ??= "1"
+
 # If necessary compile for the alternative machine arch.  This is only 
 # necessary in a native build.
-do_compile_prepend_class-native () {
+do_compile_native() {
 	if [ "${SITEINFO_BITS}" = "64" -a -e "/usr/include/gnu/stubs-32.h" -a "${PN}" = "pseudo-native" -a "${NO32LIBS}" != "1" ]; then
 		# We need the 32-bit libpseudo on a 64-bit machine...
                 # ... and we really, really, hope that the native host is
@@ -56,18 +50,20 @@ do_compile_prepend_class-native () {
 		# prevent it from removing the lib, but remove everything else
 		make 'LIB=foo' ${MAKEOPTS} distclean 
 	fi
+	if [ "${SITEINFO_BITS}" = "64" ]; then
+	  ${S}/configure --prefix=${prefix} --libdir=${prefix}/lib/pseudo/lib${SITEINFO_BITS} --with-sqlite=${STAGING_DIR_TARGET}${exec_prefix} --cflags="${CFLAGS}" --bits=${SITEINFO_BITS} --enable-static-sqlite --without-rpath
+	else
+	  ${S}/configure --prefix=${prefix} --libdir=${prefix}/lib/pseudo/lib --with-sqlite=${STAGING_DIR_TARGET}${exec_prefix} --cflags="${CFLAGS}" --bits=${SITEINFO_BITS} --enable-static-sqlite --without-rpath
+	fi
+	oe_runmake ${MAKEOPTS}
 }
 
-do_compile_prepend_class-nativesdk () {
-	if [ "${SITEINFO_BITS}" = "64" -a -e "/usr/include/gnu/stubs-32.h" -a "${PN}" = "pseudo-native" -a "${NO32LIBS}" != "1" ]; then
-		# We need the 32-bit libpseudo on a 64-bit machine...
-                # ... and we really, really, hope that the native host is
-                # x86, or else --bits may not work.
-		./configure --prefix=${prefix} --libdir=${prefix}/lib/pseudo/lib --with-sqlite=${STAGING_DIR_TARGET}${exec_prefix} --bits=32 --without-rpath
-		oe_runmake ${MAKEOPTS} libpseudo
-		# prevent it from removing the lib, but remove everything else
-		make 'LIB=foo' ${MAKEOPTS} distclean 
-	fi
+do_compile_class-native () {
+	do_compile_native
+}
+
+do_compile_class-nativesdk () {
+	do_compile_native
 }
 
 do_install () {
@@ -77,18 +73,20 @@ do_install () {
 # Two below are the same
 # If necessary install for the alternative machine arch.  This is only 
 # necessary in a native build.
-do_install_append_class-native () {
+do_install_native () {
 	if [ "${SITEINFO_BITS}" = "64" -a -e "/usr/include/gnu/stubs-32.h" -a "${PN}" = "pseudo-native" -a "${NO32LIBS}" != "1" ]; then
 		mkdir -p ${D}${prefix}/lib/pseudo/lib
 		cp lib/pseudo/lib/libpseudo.so ${D}${prefix}/lib/pseudo/lib/.
 	fi
+	oe_runmake 'DESTDIR=${D}' ${MAKEOPTS} 'LIB=lib/pseudo/lib$(MARK64)' install
+}
+
+do_install_class-native () {
+	do_install_native
 }
 
 do_install_append_class-nativesdk () {
-	if [ "${SITEINFO_BITS}" = "64" -a -e "/usr/include/gnu/stubs-32.h" -a "${PN}" = "pseudo-native" -a "${NO32LIBS}" != "1" ]; then
-		mkdir -p ${D}${prefix}/lib/pseudo/lib
-		cp lib/pseudo/lib/libpseudo.so ${D}${prefix}/lib/pseudo/lib/.
-	fi
+	do_install_native
 }
 
 BBCLASSEXTEND = "native nativesdk"
diff --git a/meta/recipes-devtools/pseudo/pseudo_1.4.1.bb b/meta/recipes-devtools/pseudo/pseudo_1.4.1.bb
index 70fe9c0..8367a34 100644
--- a/meta/recipes-devtools/pseudo/pseudo_1.4.1.bb
+++ b/meta/recipes-devtools/pseudo/pseudo_1.4.1.bb
@@ -1,6 +1,6 @@
 require pseudo.inc
 
-PR = "r13"
+PR = "r14"
 
 SRC_URI = "http://www.yoctoproject.org/downloads/${BPN}/${BPN}-${PV}.tar.bz2"
 
diff --git a/meta/recipes-devtools/pseudo/pseudo_git.bb b/meta/recipes-devtools/pseudo/pseudo_git.bb
index e394ffb..c8ec5ad 100644
--- a/meta/recipes-devtools/pseudo/pseudo_git.bb
+++ b/meta/recipes-devtools/pseudo/pseudo_git.bb
@@ -2,7 +2,7 @@ require pseudo.inc
 
 SRCREV = "398a264490713c912b4ce465251a8a82a7905f45"
 PV = "1.4.1+git${SRCPV}"
-PR = "r28"
+PR = "r29"
 
 DEFAULT_PREFERENCE = "-1"
 
-- 
1.7.3.4




^ permalink raw reply related	[flat|nested] 37+ messages in thread

* [PATCH 22/22] license.bbclass: Avoid grep error message
  2012-12-04 17:14 [PATCH 00/22] Misc fixes Mark Hatle
                   ` (20 preceding siblings ...)
  2012-12-04 17:14 ` [PATCH 21/22] pseudo: Rework target, native and nativesdk pseudo intergration Mark Hatle
@ 2012-12-04 17:14 ` Mark Hatle
  21 siblings, 0 replies; 37+ messages in thread
From: Mark Hatle @ 2012-12-04 17:14 UTC (permalink / raw)
  To: openembedded-core

Touch a file that is later greped to make sure it exists.

Signed-off-by: Mark Hatle <mark.hatle@windriver.com>
---
 meta/classes/license.bbclass |    3 ++-
 1 files changed, 2 insertions(+), 1 deletions(-)

diff --git a/meta/classes/license.bbclass b/meta/classes/license.bbclass
index c7ca4a6..66cde1c 100644
--- a/meta/classes/license.bbclass
+++ b/meta/classes/license.bbclass
@@ -13,7 +13,7 @@ do_populate_lic[cleandirs] = "${LICSSTATEDIR}"
 license_create_manifest() {
 	mkdir -p ${LICENSE_DIRECTORY}/${IMAGE_NAME}
 	# Get list of installed packages
-	list_installed_packages | grep -v "locale" |sort > ${LICENSE_DIRECTORY}/${IMAGE_NAME}/package.manifest
+	list_installed_packages | grep -v "locale" | sort > ${LICENSE_DIRECTORY}/${IMAGE_NAME}/package.manifest
 	INSTALLED_PKGS=`cat ${LICENSE_DIRECTORY}/${IMAGE_NAME}/package.manifest`
 	LICENSE_MANIFEST="${LICENSE_DIRECTORY}/${IMAGE_NAME}/license.manifest"
 	# remove existing license.manifest file
@@ -21,6 +21,7 @@ license_create_manifest() {
 		rm ${LICENSE_MANIFEST}
 	fi
 	# list of installed packages is broken for deb
+	touch ${LICENSE_MANIFEST}
 	for pkg in ${INSTALLED_PKGS}; do
 		# not the best way to do this but licenses are not arch dependant iirc
 		filename=`ls ${TMPDIR}/pkgdata/*/runtime-reverse/${pkg}| head -1`
-- 
1.7.3.4




^ permalink raw reply related	[flat|nested] 37+ messages in thread

* Re: [PATCH 03/22] update-alternatives.bbclass: Add missing runtime dependency
  2012-12-04 17:04   ` Martin Jansa
@ 2012-12-04 17:34     ` Mark Hatle
  2012-12-04 20:46       ` Richard Purdie
  0 siblings, 1 reply; 37+ messages in thread
From: Mark Hatle @ 2012-12-04 17:34 UTC (permalink / raw)
  To: Martin Jansa; +Cc: openembedded-core

On 12/4/12 11:04 AM, Martin Jansa wrote:
> On Tue, Dec 04, 2012 at 11:14:35AM -0600, Mark Hatle wrote:
>> When using update-alternatives, there should be a runtime dependency on
>> update-alternatives.  Without this, it's possible to get into a situation
>> where the package is not installable.
>>
>> Signed-off-by: Mark Hatle <mark.hatle@windriver.com>
>> ---
>>   meta/classes/update-alternatives.bbclass |    6 ++++++
>>   1 files changed, 6 insertions(+), 0 deletions(-)
>>
>> diff --git a/meta/classes/update-alternatives.bbclass b/meta/classes/update-alternatives.bbclass
>> index 4e1ff27..e432506 100644
>> --- a/meta/classes/update-alternatives.bbclass
>> +++ b/meta/classes/update-alternatives.bbclass
>> @@ -304,6 +304,12 @@ python populate_packages_prepend () {
>>               alt_remove_links += '\tupdate-alternatives --remove  %s %s\n' % (alt_name, alt_target)
>>
>>           if alt_setup_links:
>> +            # RDEPENDS setup
>> +            bb.note('adding runtime requirement for update-alternatives for %s' % pkg)
>> +            rdepends = d.getVar('RDEPENDS_%s' % pkg, True) or ""
>> +            rdepends += ' ' + d.getVar('MLPREFIX') + 'update-alternatives'
>> +            d.setVar("RDEPENDS_%s" % pkg, rdepends)
>> +
>
> I guess you should use VIRTUAL-RUNTIME_update-alternatives here

I believe what I have here is correct.  We don't care which update-alternatives 
we use, just that one is used.

recipes-devtools/dpkg/dpkg.inc:RPROVIDES_update-alternatives-dpkg += 
"update-alternatives"
recipes-devtools/opkg/opkg.inc:RPROVIDES_update-alternatives-cworth += 
"update-alternatives"

If I use the ${VIRTUAL-RUNTIME_update-alternatives} that has the effect or hard 
coding which specific version of update-alternatives we're going to use.. (-dpg 
vs -cworth)  I'm not sure this is really the desired behavior in this case -- if 
it is, it's easy enough to change of course.

--Mark

> Cheers,
>
>>               bb.note('adding update-alternatives calls to postinst/postrm for %s' % pkg)
>>               bb.note('%s' % alt_setup_links)
>>               postinst = (d.getVar('pkg_postinst_%s' % pkg, True) or d.getVar('pkg_postinst', True)) or '#!/bin/sh\n'
>> --
>> 1.7.3.4
>>
>>
>> _______________________________________________
>> Openembedded-core mailing list
>> Openembedded-core@lists.openembedded.org
>> http://lists.linuxtogo.org/cgi-bin/mailman/listinfo/openembedded-core
>




^ permalink raw reply	[flat|nested] 37+ messages in thread

* Re: [PATCH 03/22] update-alternatives.bbclass: Add missing runtime dependency
  2012-12-04 17:34     ` Mark Hatle
@ 2012-12-04 20:46       ` Richard Purdie
  2012-12-05  1:47         ` Mark Hatle
  0 siblings, 1 reply; 37+ messages in thread
From: Richard Purdie @ 2012-12-04 20:46 UTC (permalink / raw)
  To: Mark Hatle; +Cc: Martin Jansa, openembedded-core

On Tue, 2012-12-04 at 11:34 -0600, Mark Hatle wrote:
> On 12/4/12 11:04 AM, Martin Jansa wrote:
> > On Tue, Dec 04, 2012 at 11:14:35AM -0600, Mark Hatle wrote:
> >> When using update-alternatives, there should be a runtime dependency on
> >> update-alternatives.  Without this, it's possible to get into a situation
> >> where the package is not installable.
> >>
> >> Signed-off-by: Mark Hatle <mark.hatle@windriver.com>
> >> ---
> >>   meta/classes/update-alternatives.bbclass |    6 ++++++
> >>   1 files changed, 6 insertions(+), 0 deletions(-)
> >>
> >> diff --git a/meta/classes/update-alternatives.bbclass b/meta/classes/update-alternatives.bbclass
> >> index 4e1ff27..e432506 100644
> >> --- a/meta/classes/update-alternatives.bbclass
> >> +++ b/meta/classes/update-alternatives.bbclass
> >> @@ -304,6 +304,12 @@ python populate_packages_prepend () {
> >>               alt_remove_links += '\tupdate-alternatives --remove  %s %s\n' % (alt_name, alt_target)
> >>
> >>           if alt_setup_links:
> >> +            # RDEPENDS setup
> >> +            bb.note('adding runtime requirement for update-alternatives for %s' % pkg)
> >> +            rdepends = d.getVar('RDEPENDS_%s' % pkg, True) or ""
> >> +            rdepends += ' ' + d.getVar('MLPREFIX') + 'update-alternatives'
> >> +            d.setVar("RDEPENDS_%s" % pkg, rdepends)
> >> +
> >
> > I guess you should use VIRTUAL-RUNTIME_update-alternatives here
> 
> I believe what I have here is correct.

No, Martin is right.

>   We don't care which update-alternatives 
> we use, just that one is used.
> 
> recipes-devtools/dpkg/dpkg.inc:RPROVIDES_update-alternatives-dpkg += 
> "update-alternatives"
> recipes-devtools/opkg/opkg.inc:RPROVIDES_update-alternatives-cworth += 
> "update-alternatives"
> 
> If I use the ${VIRTUAL-RUNTIME_update-alternatives} that has the effect or hard 
> coding which specific version of update-alternatives we're going to use.. (-dpg 
> vs -cworth)  I'm not sure this is really the desired behavior in this case -- if 
> it is, it's easy enough to change of course.

I keep telling people this and people keep ignoring me.

We DO NOT SUPPORT switching providers at runtime since its a package
manager specific problem for which we currently have no general
abstraction.

This leads to patches like:

http://git.yoctoproject.org/cgit.cgi/poky/commit/?id=fe21ace36e19e06cbfdb83f73e60623bd4e382af

since the virtual/ space does not somehow magically work at runtime,
worse it breaks the deb package backend.

PREFERRED_PROVIDER is a build time thing. virtual/ is a build time
thing. How do I explain this any clearer?

The only mechanism for distro selection of runtime is VIRTUAL-RUNTIME_
which is pretty horrible and likely would be better done with something
debian package renaming like since we already have that mangling code.

Cheers,

Richard





^ permalink raw reply	[flat|nested] 37+ messages in thread

* Re: [PATCH 03/22] update-alternatives.bbclass: Add missing runtime dependency
  2012-12-04 20:46       ` Richard Purdie
@ 2012-12-05  1:47         ` Mark Hatle
  2012-12-05  9:17           ` Richard Purdie
  0 siblings, 1 reply; 37+ messages in thread
From: Mark Hatle @ 2012-12-05  1:47 UTC (permalink / raw)
  To: Richard Purdie; +Cc: Martin Jansa, openembedded-core

On 12/4/12 2:46 PM, Richard Purdie wrote:
> On Tue, 2012-12-04 at 11:34 -0600, Mark Hatle wrote:
>> On 12/4/12 11:04 AM, Martin Jansa wrote:
>>> On Tue, Dec 04, 2012 at 11:14:35AM -0600, Mark Hatle wrote:
>>>> When using update-alternatives, there should be a runtime dependency on
>>>> update-alternatives.  Without this, it's possible to get into a situation
>>>> where the package is not installable.
>>>>
>>>> Signed-off-by: Mark Hatle <mark.hatle@windriver.com>
>>>> ---
>>>>    meta/classes/update-alternatives.bbclass |    6 ++++++
>>>>    1 files changed, 6 insertions(+), 0 deletions(-)
>>>>
>>>> diff --git a/meta/classes/update-alternatives.bbclass b/meta/classes/update-alternatives.bbclass
>>>> index 4e1ff27..e432506 100644
>>>> --- a/meta/classes/update-alternatives.bbclass
>>>> +++ b/meta/classes/update-alternatives.bbclass
>>>> @@ -304,6 +304,12 @@ python populate_packages_prepend () {
>>>>                alt_remove_links += '\tupdate-alternatives --remove  %s %s\n' % (alt_name, alt_target)
>>>>
>>>>            if alt_setup_links:
>>>> +            # RDEPENDS setup
>>>> +            bb.note('adding runtime requirement for update-alternatives for %s' % pkg)
>>>> +            rdepends = d.getVar('RDEPENDS_%s' % pkg, True) or ""
>>>> +            rdepends += ' ' + d.getVar('MLPREFIX') + 'update-alternatives'
>>>> +            d.setVar("RDEPENDS_%s" % pkg, rdepends)
>>>> +
>>>
>>> I guess you should use VIRTUAL-RUNTIME_update-alternatives here
>>
>> I believe what I have here is correct.
>
> No, Martin is right.
>
>>    We don't care which update-alternatives
>> we use, just that one is used.
>>
>> recipes-devtools/dpkg/dpkg.inc:RPROVIDES_update-alternatives-dpkg +=
>> "update-alternatives"
>> recipes-devtools/opkg/opkg.inc:RPROVIDES_update-alternatives-cworth +=
>> "update-alternatives"
>>
>> If I use the ${VIRTUAL-RUNTIME_update-alternatives} that has the effect or hard
>> coding which specific version of update-alternatives we're going to use.. (-dpg
>> vs -cworth)  I'm not sure this is really the desired behavior in this case -- if
>> it is, it's easy enough to change of course.
>
> I keep telling people this and people keep ignoring me.
>
> We DO NOT SUPPORT switching providers at runtime since its a package
> manager specific problem for which we currently have no general
> abstraction.

We do support switching providers already, that's the whole alternatives system 
itself.  What is different is in this case we can't use the update-alternatives.

But with the RPROVIDE of update-alternatives within the dpkg and opkg code..  We 
can certainly require 'update-alterantives' and the packaging systems will do 
the right thing (they have so far...)

> This leads to patches like:
>
> http://git.yoctoproject.org/cgit.cgi/poky/commit/?id=fe21ace36e19e06cbfdb83f73e60623bd4e382af
>
> since the virtual/ space does not somehow magically work at runtime,
> worse it breaks the deb package backend.

It works in RPM... but if it doesn't in deb (and ipk) I understand the 
limitations we are bound to.  Limiting the character space (i.e. no '/') is 
different then saying we don't support RPROVIDES...

> PREFERRED_PROVIDER is a build time thing. virtual/ is a build time
> thing. How do I explain this any clearer?

I'm still confused on the PREFERRED_PROVIDER honestly.

conf/distro/include/default-providers.inc:PREFERRED_PROVIDER_virtual/update-alternatives 
?= "update-alternatives-cworth"
conf/distro/include/default-providers.inc:PREFERRED_PROVIDER_virtual/update-alternatives-native 
?= "opkg-native"

There is no 'update-alternatives-cworth' recipe.. but there is an opkg recipe 
that happens to provide an update-alternatives-cworth -package-.  So does 
PREFERRED_PROVIDER select packages or recipes?

> The only mechanism for distro selection of runtime is VIRTUAL-RUNTIME_
> which is pretty horrible and likely would be better done with something
> debian package renaming like since we already have that mangling code.

And the VIRTUAL-RUNTIME isn't a runtime selection, it's a build-time selection. 
  If we need to select this at build-time, we can.  I'm happy with changing the 
patch, but as a distribution person I really don't care who provides this as 
long as something does.

--Mark

> Cheers,
>
> Richard
>
>




^ permalink raw reply	[flat|nested] 37+ messages in thread

* Re: [PATCH 03/22] update-alternatives.bbclass: Add missing runtime dependency
  2012-12-05  1:47         ` Mark Hatle
@ 2012-12-05  9:17           ` Richard Purdie
  0 siblings, 0 replies; 37+ messages in thread
From: Richard Purdie @ 2012-12-05  9:17 UTC (permalink / raw)
  To: Mark Hatle; +Cc: Martin Jansa, openembedded-core

On Tue, 2012-12-04 at 19:47 -0600, Mark Hatle wrote:
> On 12/4/12 2:46 PM, Richard Purdie wrote:
> > On Tue, 2012-12-04 at 11:34 -0600, Mark Hatle wrote:
> > I keep telling people this and people keep ignoring me.
> >
> > We DO NOT SUPPORT switching providers at runtime since its a package
> > manager specific problem for which we currently have no general
> > abstraction.
> 
> We do support switching providers already, that's the whole alternatives system 
> itself.  What is different is in this case we can't use the update-alternatives.

We do support update alternatives, yes. We're talking about something
else here though.

> But with the RPROVIDE of update-alternatives within the dpkg and opkg code..  We 
> can certainly require 'update-alterantives' and the packaging systems will do 
> the right thing (they have so far...)

Ok, let me put this a different way. What exactly tells tells the
package manager what it should be installing as "update-alternatives"?
Where is the variable that controls this?

I think you will find there isn't any mechanism for it. The only reason
it does the right thing is a combination of:

a) We've configured things to only build one provider in most cases
b) We use the VIRTUAL-RUNTIME_update-alternatives substitution that 
   Martin mentions.

> > This leads to patches like:
> >
> > http://git.yoctoproject.org/cgit.cgi/poky/commit/?id=fe21ace36e19e06cbfdb83f73e60623bd4e382af
> >
> > since the virtual/ space does not somehow magically work at runtime,
> > worse it breaks the deb package backend.
> 
> It works in RPM... but if it doesn't in deb (and ipk) I understand the 
> limitations we are bound to.  Limiting the character space (i.e. no '/') is 
> different then saying we don't support RPROVIDES...

We support RPROVIDES, no argument. What we don't have is any mechanism
to indicate to *any* of the package managers that if there are two
providers, which one should be preferred.

The character was just a detail, the whole approach was also flawed, at
least as the system stands today :(.

> > PREFERRED_PROVIDER is a build time thing. virtual/ is a build time
> > thing. How do I explain this any clearer?
> 
> I'm still confused on the PREFERRED_PROVIDER honestly.

That much is clear from the email :/. It only works for build time
resolution, not package management.

> conf/distro/include/default-providers.inc:PREFERRED_PROVIDER_virtual/update-alternatives 
> ?= "update-alternatives-cworth"
> conf/distro/include/default-providers.inc:PREFERRED_PROVIDER_virtual/update-alternatives-native 
> ?= "opkg-native"
> 
> There is no 'update-alternatives-cworth' recipe.. but there is an opkg recipe 
> that happens to provide an update-alternatives-cworth -package-.  So does 
> PREFERRED_PROVIDER select packages or recipes?

It works in "build" namespace, namely DEPENDS and PROVIDES, so recipes.

Recipes can have additional PROVIDES other than their name, not to be
confused with RPROVIDES which is package namespace and separate.

We have no support for PREFERRED_RPROVIDER for example since that would
have to get communicated to the package manager. It would be interesting
to see that work...

> > The only mechanism for distro selection of runtime is VIRTUAL-RUNTIME_
> > which is pretty horrible and likely would be better done with something
> > debian package renaming like since we already have that mangling code.
> 
> And the VIRTUAL-RUNTIME isn't a runtime selection, it's a build-time selection. 

I realise that. As I said earlier, we don't support runtime selection
and we allow distro selection of some things (at build time) using this
rather ugly mechanism. I'd love to have something neater but its hard to
interface that into all the packaging backends.

>   If we need to select this at build-time, we can.

Rightly or wrongly, we need to.

>   I'm happy with changing the 
> patch, but as a distribution person I really don't care who provides this as 
> long as something does.

We care about deterministic builds so we have to care about details like
this.

Cheers,

Richard




^ permalink raw reply	[flat|nested] 37+ messages in thread

* Re: [PATCH 21/22] pseudo: Rework target, native and nativesdk pseudo intergration
  2012-12-04 17:14 ` [PATCH 21/22] pseudo: Rework target, native and nativesdk pseudo intergration Mark Hatle
@ 2012-12-06  5:06   ` Saul Wold
  2012-12-06 17:03     ` Mark Hatle
  0 siblings, 1 reply; 37+ messages in thread
From: Saul Wold @ 2012-12-06  5:06 UTC (permalink / raw)
  To: Mark Hatle; +Cc: openembedded-core

On 12/04/2012 09:14 AM, Mark Hatle wrote:
> Pseudo was not building and installing properly for systems where baselib
> was not 'lib'.  This change reworks the three scenerios to work properly.
>
> Signed-off-by: Mark Hatle <mark.hatle@windriver.com>
> ---
>   meta/recipes-devtools/pseudo/pseudo.inc      |   58 ++++++++++++-------------
>   meta/recipes-devtools/pseudo/pseudo_1.4.1.bb |    2 +-
>   meta/recipes-devtools/pseudo/pseudo_git.bb   |    2 +-
>   3 files changed, 30 insertions(+), 32 deletions(-)
>
> diff --git a/meta/recipes-devtools/pseudo/pseudo.inc b/meta/recipes-devtools/pseudo/pseudo.inc
> index 98f706c..8dc7d72 100644
> --- a/meta/recipes-devtools/pseudo/pseudo.inc
> +++ b/meta/recipes-devtools/pseudo/pseudo.inc
> @@ -13,34 +13,28 @@ SRC_URI_append_class-nativesdk = " file://symver.patch"
>
>   SRC_URI_append_class-native = " file://symver.patch"
>
> -FILES_${PN} = "${libdir}/pseudo/lib*/libpseudo.so ${bindir}/* ${localstatedir}/pseudo ${prefix}/var/pseudo"
> -FILES_${PN}-dbg += "${libdir}/pseudo/lib*/.debug"
> +FILES_${PN} = "${prefix}/lib/pseudo/lib*/libpseudo.so ${bindir}/* ${localstatedir}/pseudo ${prefix}/var/pseudo"
> +FILES_${PN}-dbg += "${prefix}/lib/pseudo/lib*/.debug"
>   PROVIDES += "virtual/fakeroot"
>
>   MAKEOPTS = ""
>
>   inherit siteinfo
>
> -do_configure () {
> -	:
> -}
> -
> -NO32LIBS ??= "1"
> -
> -# Compile for the local machine arch...
> -do_compile () {
> +do_configure_class-target () {
>   	if [ "${SITEINFO_BITS}" = "64" ]; then
> -	  ${S}/configure --prefix=${prefix} --libdir=${prefix}/lib/pseudo/lib${SITEINFO_BITS} --with-sqlite=${STAGING_DIR_TARGET}${exec_prefix} --cflags="${CFLAGS}" --bits=${SITEINFO_BITS} --enable-static-sqlite --without-rpath
> +		mylibdir=${prefix}/lib/pseudo/lib${SITEINFO_BITS}
>   	else
> -	  ${S}/configure --prefix=${prefix} --libdir=${prefix}/lib/pseudo/lib --with-sqlite=${STAGING_DIR_TARGET}${exec_prefix} --cflags="${CFLAGS}" --bits=${SITEINFO_BITS} --enable-static-sqlite --without-rpath
> +		mylibdir=${prefix}/lib/pseudo/lib
>   	fi
> -	oe_runmake ${MAKEOPTS}
> +	${S}/configure --prefix=${prefix} --libdir=$mylibdir --cflags="${CFLAGS}" --bits=${SITEINFO_BITS} --without-rpath

You seem to have dropped the --with-sqlite and now it does not find 
sqlite3.h for the target build as can be seen in the build appliance 
failure.

http://autobuilder.yoctoproject.org:8010/builders/build-appliance/builds/154/steps/shell_46/logs/stdio

Sau!

>   }
>
> -# Two below are the same
> +NO32LIBS ??= "1"
> +
>   # If necessary compile for the alternative machine arch.  This is only
>   # necessary in a native build.
> -do_compile_prepend_class-native () {
> +do_compile_native() {
>   	if [ "${SITEINFO_BITS}" = "64" -a -e "/usr/include/gnu/stubs-32.h" -a "${PN}" = "pseudo-native" -a "${NO32LIBS}" != "1" ]; then
>   		# We need the 32-bit libpseudo on a 64-bit machine...
>                   # ... and we really, really, hope that the native host is
> @@ -56,18 +50,20 @@ do_compile_prepend_class-native () {
>   		# prevent it from removing the lib, but remove everything else
>   		make 'LIB=foo' ${MAKEOPTS} distclean
>   	fi
> +	if [ "${SITEINFO_BITS}" = "64" ]; then
> +	  ${S}/configure --prefix=${prefix} --libdir=${prefix}/lib/pseudo/lib${SITEINFO_BITS} --with-sqlite=${STAGING_DIR_TARGET}${exec_prefix} --cflags="${CFLAGS}" --bits=${SITEINFO_BITS} --enable-static-sqlite --without-rpath
> +	else
> +	  ${S}/configure --prefix=${prefix} --libdir=${prefix}/lib/pseudo/lib --with-sqlite=${STAGING_DIR_TARGET}${exec_prefix} --cflags="${CFLAGS}" --bits=${SITEINFO_BITS} --enable-static-sqlite --without-rpath
> +	fi
> +	oe_runmake ${MAKEOPTS}
>   }
>
> -do_compile_prepend_class-nativesdk () {
> -	if [ "${SITEINFO_BITS}" = "64" -a -e "/usr/include/gnu/stubs-32.h" -a "${PN}" = "pseudo-native" -a "${NO32LIBS}" != "1" ]; then
> -		# We need the 32-bit libpseudo on a 64-bit machine...
> -                # ... and we really, really, hope that the native host is
> -                # x86, or else --bits may not work.
> -		./configure --prefix=${prefix} --libdir=${prefix}/lib/pseudo/lib --with-sqlite=${STAGING_DIR_TARGET}${exec_prefix} --bits=32 --without-rpath
> -		oe_runmake ${MAKEOPTS} libpseudo
> -		# prevent it from removing the lib, but remove everything else
> -		make 'LIB=foo' ${MAKEOPTS} distclean
> -	fi
> +do_compile_class-native () {
> +	do_compile_native
> +}
> +
> +do_compile_class-nativesdk () {
> +	do_compile_native
>   }
>
>   do_install () {
> @@ -77,18 +73,20 @@ do_install () {
>   # Two below are the same
>   # If necessary install for the alternative machine arch.  This is only
>   # necessary in a native build.
> -do_install_append_class-native () {
> +do_install_native () {
>   	if [ "${SITEINFO_BITS}" = "64" -a -e "/usr/include/gnu/stubs-32.h" -a "${PN}" = "pseudo-native" -a "${NO32LIBS}" != "1" ]; then
>   		mkdir -p ${D}${prefix}/lib/pseudo/lib
>   		cp lib/pseudo/lib/libpseudo.so ${D}${prefix}/lib/pseudo/lib/.
>   	fi
> +	oe_runmake 'DESTDIR=${D}' ${MAKEOPTS} 'LIB=lib/pseudo/lib$(MARK64)' install
> +}
> +
> +do_install_class-native () {
> +	do_install_native
>   }
>
>   do_install_append_class-nativesdk () {
> -	if [ "${SITEINFO_BITS}" = "64" -a -e "/usr/include/gnu/stubs-32.h" -a "${PN}" = "pseudo-native" -a "${NO32LIBS}" != "1" ]; then
> -		mkdir -p ${D}${prefix}/lib/pseudo/lib
> -		cp lib/pseudo/lib/libpseudo.so ${D}${prefix}/lib/pseudo/lib/.
> -	fi
> +	do_install_native
>   }
>
>   BBCLASSEXTEND = "native nativesdk"
> diff --git a/meta/recipes-devtools/pseudo/pseudo_1.4.1.bb b/meta/recipes-devtools/pseudo/pseudo_1.4.1.bb
> index 70fe9c0..8367a34 100644
> --- a/meta/recipes-devtools/pseudo/pseudo_1.4.1.bb
> +++ b/meta/recipes-devtools/pseudo/pseudo_1.4.1.bb
> @@ -1,6 +1,6 @@
>   require pseudo.inc
>
> -PR = "r13"
> +PR = "r14"
>
>   SRC_URI = "http://www.yoctoproject.org/downloads/${BPN}/${BPN}-${PV}.tar.bz2"
>
> diff --git a/meta/recipes-devtools/pseudo/pseudo_git.bb b/meta/recipes-devtools/pseudo/pseudo_git.bb
> index e394ffb..c8ec5ad 100644
> --- a/meta/recipes-devtools/pseudo/pseudo_git.bb
> +++ b/meta/recipes-devtools/pseudo/pseudo_git.bb
> @@ -2,7 +2,7 @@ require pseudo.inc
>
>   SRCREV = "398a264490713c912b4ce465251a8a82a7905f45"
>   PV = "1.4.1+git${SRCPV}"
> -PR = "r28"
> +PR = "r29"
>
>   DEFAULT_PREFERENCE = "-1"
>
>



^ permalink raw reply	[flat|nested] 37+ messages in thread

* Re: [PATCH 20/22] pkgconfig: Add a manual dependency of pkgconfig(pkg-config)
  2012-12-04 17:14 ` [PATCH 20/22] pkgconfig: Add a manual dependency of pkgconfig(pkg-config) Mark Hatle
@ 2012-12-06 13:16   ` Paul Eggleton
  2012-12-06 17:13     ` Mark Hatle
  2012-12-06 13:30   ` Otavio Salvador
  1 sibling, 1 reply; 37+ messages in thread
From: Paul Eggleton @ 2012-12-06 13:16 UTC (permalink / raw)
  To: Mark Hatle, openembedded-core

On Tuesday 04 December 2012 11:14:52 Mark Hatle wrote:
> The libtelepathy-glib-dev package contains a .pc file that has a requires
> of pkgconfig(pkg-config) > 0.21 in it.  In order to satisfy this requirement
> we add a manual RPROVIDE to the pkgconfig package.
> 
> Signed-off-by: Mark Hatle <mark.hatle@windriver.com>
> ---
>  meta/recipes-devtools/pkgconfig/pkgconfig.inc     |    5 +++++
>  meta/recipes-devtools/pkgconfig/pkgconfig_0.25.bb |    2 +-
>  meta/recipes-devtools/pkgconfig/pkgconfig_git.bb  |    1 +
>  3 files changed, 7 insertions(+), 1 deletions(-)
> 
> diff --git a/meta/recipes-devtools/pkgconfig/pkgconfig.inc
> b/meta/recipes-devtools/pkgconfig/pkgconfig.inc index 83a9cdf..27d4071
> 100644
> --- a/meta/recipes-devtools/pkgconfig/pkgconfig.inc
> +++ b/meta/recipes-devtools/pkgconfig/pkgconfig.inc
> @@ -37,3 +37,8 @@ BBCLASSEXTEND = "native nativesdk"
>  # files.
>  FILES_${PN}-dev = ""
>  FILES_${PN} += "${datadir}/aclocal/pkg.m4"
> +
> +# When using the RPM generated automatic package dependencies, some
> packages +# will end up requiring 'pkgconfig(pkg-config)'.  Allow this
> behavior by +# specifying an appropriate provide.
> +RPROVIDES_${PN} += "pkgconfig(pkg-config) (= ${PV})"
> diff --git a/meta/recipes-devtools/pkgconfig/pkgconfig_0.25.bb
> b/meta/recipes-devtools/pkgconfig/pkgconfig_0.25.bb index 1e60c54..d0a2b1f
> 100644
> --- a/meta/recipes-devtools/pkgconfig/pkgconfig_0.25.bb
> +++ b/meta/recipes-devtools/pkgconfig/pkgconfig_0.25.bb
> @@ -1,6 +1,6 @@
>  require pkgconfig.inc
> 
> -PR = "r5"
> +PR = "r6"
> 
>  SRC_URI[md5sum] = "a3270bab3f4b69b7dc6dbdacbcae9745"
>  SRC_URI[sha256sum] =
> "3ba691ee2431f32ccb8efa131e59bf23e37f122dc66791309023ca6dcefcd10e" diff
> --git a/meta/recipes-devtools/pkgconfig/pkgconfig_git.bb
> b/meta/recipes-devtools/pkgconfig/pkgconfig_git.bb index 6271992..d5ec8fc
> 100644
> --- a/meta/recipes-devtools/pkgconfig/pkgconfig_git.bb
> +++ b/meta/recipes-devtools/pkgconfig/pkgconfig_git.bb
> @@ -8,6 +8,7 @@ S = "${WORKDIR}/git/"
> 
>  SRCREV = "66d49f1375fec838bcd301bb4ca2ef76cee0e47c"
>  PV = "0.23+git${SRCPV}"
> +PR = "r1"
> 
>  DEFAULT_PREFERENCE = "-1"

Because this tends to come in via file dependencies generated during
do_package, a package for pkgconfig won't be forced to be built; so if nothing
else depends upon pkgconfig then you can get a failure during do_rootfs (as I
have here building core-image-lsb with DISTRO = "poky-lsb" from scratch with
these changes on top of master):

| Note: to be installed:  psplash@i586 packagegroup-core-basic@all
| packagegroup-core-ssh-openssh@all packagegroup-core-lsb@all
| packagegroup-base-extended@qemux86 packagegroup-core-boot@qemux86
| locale-base-en-us@i586 locale-base-en-gb@i586
| Loading cache...
| Updating cache...               ######################################## 
[100%]
| 
| Computing transaction...error: Can't install libz-dev-1.2.7-r0@i586: 
| no package provides pkgconfig

I'm not quite sure what the best fix for that is though.

Cheers,
Paul

-- 

Paul Eggleton
Intel Open Source Technology Centre



^ permalink raw reply	[flat|nested] 37+ messages in thread

* Re: [PATCH 20/22] pkgconfig: Add a manual dependency of pkgconfig(pkg-config)
  2012-12-04 17:14 ` [PATCH 20/22] pkgconfig: Add a manual dependency of pkgconfig(pkg-config) Mark Hatle
  2012-12-06 13:16   ` Paul Eggleton
@ 2012-12-06 13:30   ` Otavio Salvador
  2012-12-06 17:12     ` Mark Hatle
  1 sibling, 1 reply; 37+ messages in thread
From: Otavio Salvador @ 2012-12-06 13:30 UTC (permalink / raw)
  To: Mark Hatle; +Cc: Patches and discussions about the oe-core layer

[-- Attachment #1: Type: text/plain, Size: 708 bytes --]

On Tue, Dec 4, 2012 at 3:14 PM, Mark Hatle <mark.hatle@windriver.com> wrote:

> The libtelepathy-glib-dev package contains a .pc file that has a requires
> of pkgconfig(pkg-config) > 0.21 in it.  In order to satisfy this
> requirement
> we add a manual RPROVIDE to the pkgconfig package.
>
> Signed-off-by: Mark Hatle <mark.hatle@windriver.com>
>

Have this been tested using ipk and deb packages?

I don't know if the format used, of rprovides, is supported by them (or
abstracted by bitbake).

-- 
Otavio Salvador                             O.S. Systems
E-mail: otavio@ossystems.com.br  http://www.ossystems.com.br
Mobile: +55 53 9981-7854              http://projetos.ossystems.com.br

[-- Attachment #2: Type: text/html, Size: 1307 bytes --]

^ permalink raw reply	[flat|nested] 37+ messages in thread

* Re: [PATCH 21/22] pseudo: Rework target, native and nativesdk pseudo intergration
  2012-12-06  5:06   ` Saul Wold
@ 2012-12-06 17:03     ` Mark Hatle
  2012-12-06 17:21       ` Saul Wold
  0 siblings, 1 reply; 37+ messages in thread
From: Mark Hatle @ 2012-12-06 17:03 UTC (permalink / raw)
  To: Saul Wold; +Cc: openembedded-core

On 12/5/12 11:06 PM, Saul Wold wrote:
> On 12/04/2012 09:14 AM, Mark Hatle wrote:
>> Pseudo was not building and installing properly for systems where baselib
>> was not 'lib'.  This change reworks the three scenerios to work properly.
>>
>> Signed-off-by: Mark Hatle <mark.hatle@windriver.com>
>> ---
>>    meta/recipes-devtools/pseudo/pseudo.inc      |   58 ++++++++++++-------------
>>    meta/recipes-devtools/pseudo/pseudo_1.4.1.bb |    2 +-
>>    meta/recipes-devtools/pseudo/pseudo_git.bb   |    2 +-
>>    3 files changed, 30 insertions(+), 32 deletions(-)
>>
>> diff --git a/meta/recipes-devtools/pseudo/pseudo.inc b/meta/recipes-devtools/pseudo/pseudo.inc
>> index 98f706c..8dc7d72 100644
>> --- a/meta/recipes-devtools/pseudo/pseudo.inc
>> +++ b/meta/recipes-devtools/pseudo/pseudo.inc
>> @@ -13,34 +13,28 @@ SRC_URI_append_class-nativesdk = " file://symver.patch"
>>
>>    SRC_URI_append_class-native = " file://symver.patch"
>>
>> -FILES_${PN} = "${libdir}/pseudo/lib*/libpseudo.so ${bindir}/* ${localstatedir}/pseudo ${prefix}/var/pseudo"
>> -FILES_${PN}-dbg += "${libdir}/pseudo/lib*/.debug"
>> +FILES_${PN} = "${prefix}/lib/pseudo/lib*/libpseudo.so ${bindir}/* ${localstatedir}/pseudo ${prefix}/var/pseudo"
>> +FILES_${PN}-dbg += "${prefix}/lib/pseudo/lib*/.debug"
>>    PROVIDES += "virtual/fakeroot"
>>
>>    MAKEOPTS = ""
>>
>>    inherit siteinfo
>>
>> -do_configure () {
>> -	:
>> -}
>> -
>> -NO32LIBS ??= "1"
>> -
>> -# Compile for the local machine arch...
>> -do_compile () {
>> +do_configure_class-target () {
>>    	if [ "${SITEINFO_BITS}" = "64" ]; then
>> -	  ${S}/configure --prefix=${prefix} --libdir=${prefix}/lib/pseudo/lib${SITEINFO_BITS} --with-sqlite=${STAGING_DIR_TARGET}${exec_prefix} --cflags="${CFLAGS}" --bits=${SITEINFO_BITS} --enable-static-sqlite --without-rpath
>> +		mylibdir=${prefix}/lib/pseudo/lib${SITEINFO_BITS}
>>    	else
>> -	  ${S}/configure --prefix=${prefix} --libdir=${prefix}/lib/pseudo/lib --with-sqlite=${STAGING_DIR_TARGET}${exec_prefix} --cflags="${CFLAGS}" --bits=${SITEINFO_BITS} --enable-static-sqlite --without-rpath
>> +		mylibdir=${prefix}/lib/pseudo/lib
>>    	fi
>> -	oe_runmake ${MAKEOPTS}
>> +	${S}/configure --prefix=${prefix} --libdir=$mylibdir --cflags="${CFLAGS}" --bits=${SITEINFO_BITS} --without-rpath
>
> You seem to have dropped the --with-sqlite and now it does not find
> sqlite3.h for the target build as can be seen in the build appliance
> failure.

It should be sourcing it from the compiler with a #include.  It was working on 
all of my test builds.

But either way, there are two bugs here.. the first is pseudo isn't building for 
the target -- it wasn't before either.

But the real issue is -why on earth- are we building pseudo at all for the 
target.  It serves no purpose that I am aware of.

I'd prefer if the fix was simply to disable pseudo for target-class builds, and 
only build it for -native and -nativesdk cases.

Just drop this patch for now -- we can focus on fixing it a different way if 
target builds of pseudo are needed for some reason.

--Mark

> http://autobuilder.yoctoproject.org:8010/builders/build-appliance/builds/154/steps/shell_46/logs/stdio
>
> Sau!
>
>>    }
>>
>> -# Two below are the same
>> +NO32LIBS ??= "1"
>> +
>>    # If necessary compile for the alternative machine arch.  This is only
>>    # necessary in a native build.
>> -do_compile_prepend_class-native () {
>> +do_compile_native() {
>>    	if [ "${SITEINFO_BITS}" = "64" -a -e "/usr/include/gnu/stubs-32.h" -a "${PN}" = "pseudo-native" -a "${NO32LIBS}" != "1" ]; then
>>    		# We need the 32-bit libpseudo on a 64-bit machine...
>>                    # ... and we really, really, hope that the native host is
>> @@ -56,18 +50,20 @@ do_compile_prepend_class-native () {
>>    		# prevent it from removing the lib, but remove everything else
>>    		make 'LIB=foo' ${MAKEOPTS} distclean
>>    	fi
>> +	if [ "${SITEINFO_BITS}" = "64" ]; then
>> +	  ${S}/configure --prefix=${prefix} --libdir=${prefix}/lib/pseudo/lib${SITEINFO_BITS} --with-sqlite=${STAGING_DIR_TARGET}${exec_prefix} --cflags="${CFLAGS}" --bits=${SITEINFO_BITS} --enable-static-sqlite --without-rpath
>> +	else
>> +	  ${S}/configure --prefix=${prefix} --libdir=${prefix}/lib/pseudo/lib --with-sqlite=${STAGING_DIR_TARGET}${exec_prefix} --cflags="${CFLAGS}" --bits=${SITEINFO_BITS} --enable-static-sqlite --without-rpath
>> +	fi
>> +	oe_runmake ${MAKEOPTS}
>>    }
>>
>> -do_compile_prepend_class-nativesdk () {
>> -	if [ "${SITEINFO_BITS}" = "64" -a -e "/usr/include/gnu/stubs-32.h" -a "${PN}" = "pseudo-native" -a "${NO32LIBS}" != "1" ]; then
>> -		# We need the 32-bit libpseudo on a 64-bit machine...
>> -                # ... and we really, really, hope that the native host is
>> -                # x86, or else --bits may not work.
>> -		./configure --prefix=${prefix} --libdir=${prefix}/lib/pseudo/lib --with-sqlite=${STAGING_DIR_TARGET}${exec_prefix} --bits=32 --without-rpath
>> -		oe_runmake ${MAKEOPTS} libpseudo
>> -		# prevent it from removing the lib, but remove everything else
>> -		make 'LIB=foo' ${MAKEOPTS} distclean
>> -	fi
>> +do_compile_class-native () {
>> +	do_compile_native
>> +}
>> +
>> +do_compile_class-nativesdk () {
>> +	do_compile_native
>>    }
>>
>>    do_install () {
>> @@ -77,18 +73,20 @@ do_install () {
>>    # Two below are the same
>>    # If necessary install for the alternative machine arch.  This is only
>>    # necessary in a native build.
>> -do_install_append_class-native () {
>> +do_install_native () {
>>    	if [ "${SITEINFO_BITS}" = "64" -a -e "/usr/include/gnu/stubs-32.h" -a "${PN}" = "pseudo-native" -a "${NO32LIBS}" != "1" ]; then
>>    		mkdir -p ${D}${prefix}/lib/pseudo/lib
>>    		cp lib/pseudo/lib/libpseudo.so ${D}${prefix}/lib/pseudo/lib/.
>>    	fi
>> +	oe_runmake 'DESTDIR=${D}' ${MAKEOPTS} 'LIB=lib/pseudo/lib$(MARK64)' install
>> +}
>> +
>> +do_install_class-native () {
>> +	do_install_native
>>    }
>>
>>    do_install_append_class-nativesdk () {
>> -	if [ "${SITEINFO_BITS}" = "64" -a -e "/usr/include/gnu/stubs-32.h" -a "${PN}" = "pseudo-native" -a "${NO32LIBS}" != "1" ]; then
>> -		mkdir -p ${D}${prefix}/lib/pseudo/lib
>> -		cp lib/pseudo/lib/libpseudo.so ${D}${prefix}/lib/pseudo/lib/.
>> -	fi
>> +	do_install_native
>>    }
>>
>>    BBCLASSEXTEND = "native nativesdk"
>> diff --git a/meta/recipes-devtools/pseudo/pseudo_1.4.1.bb b/meta/recipes-devtools/pseudo/pseudo_1.4.1.bb
>> index 70fe9c0..8367a34 100644
>> --- a/meta/recipes-devtools/pseudo/pseudo_1.4.1.bb
>> +++ b/meta/recipes-devtools/pseudo/pseudo_1.4.1.bb
>> @@ -1,6 +1,6 @@
>>    require pseudo.inc
>>
>> -PR = "r13"
>> +PR = "r14"
>>
>>    SRC_URI = "http://www.yoctoproject.org/downloads/${BPN}/${BPN}-${PV}.tar.bz2"
>>
>> diff --git a/meta/recipes-devtools/pseudo/pseudo_git.bb b/meta/recipes-devtools/pseudo/pseudo_git.bb
>> index e394ffb..c8ec5ad 100644
>> --- a/meta/recipes-devtools/pseudo/pseudo_git.bb
>> +++ b/meta/recipes-devtools/pseudo/pseudo_git.bb
>> @@ -2,7 +2,7 @@ require pseudo.inc
>>
>>    SRCREV = "398a264490713c912b4ce465251a8a82a7905f45"
>>    PV = "1.4.1+git${SRCPV}"
>> -PR = "r28"
>> +PR = "r29"
>>
>>    DEFAULT_PREFERENCE = "-1"
>>
>>




^ permalink raw reply	[flat|nested] 37+ messages in thread

* Re: [PATCH 20/22] pkgconfig: Add a manual dependency of pkgconfig(pkg-config)
  2012-12-06 13:30   ` Otavio Salvador
@ 2012-12-06 17:12     ` Mark Hatle
  0 siblings, 0 replies; 37+ messages in thread
From: Mark Hatle @ 2012-12-06 17:12 UTC (permalink / raw)
  To: Otavio Salvador; +Cc: Patches and discussions about the oe-core layer

On 12/6/12 7:30 AM, Otavio Salvador wrote:
>
>
>
> On Tue, Dec 4, 2012 at 3:14 PM, Mark Hatle <mark.hatle@windriver.com
> <mailto:mark.hatle@windriver.com>> wrote:
>
>     The libtelepathy-glib-dev package contains a .pc file that has a requires
>     of pkgconfig(pkg-config) > 0.21 in it.  In order to satisfy this requirement
>     we add a manual RPROVIDE to the pkgconfig package.
>
>     Signed-off-by: Mark Hatle <mark.hatle@windriver.com
>     <mailto:mark.hatle@windriver.com>>
>
>
> Have this been tested using ipk and deb packages?
>
> I don't know if the format used, of rprovides, is supported by them (or
> abstracted by bitbake).

Deb was the only one that complained.  And that was solved by a patch that 
changed '(' and ')' to '__'.  This also paves the way for us to use some of the 
per-file dependency information we have to improve the dependency resolution for 
both deb and ipk.

(If IPK fails with this, it wasn't reporting the problem during build or image 
install on my system.  I tests deb, ipk and rpm with this change.)

--Mark

> --
> Otavio Salvador                             O.S. Systems
> E-mail: otavio@ossystems.com.br <mailto:otavio@ossystems.com.br>
> http://www.ossystems.com.br
> Mobile: +55 53 9981-7854 http://projetos.ossystems.com.br
>




^ permalink raw reply	[flat|nested] 37+ messages in thread

* Re: [PATCH 20/22] pkgconfig: Add a manual dependency of pkgconfig(pkg-config)
  2012-12-06 13:16   ` Paul Eggleton
@ 2012-12-06 17:13     ` Mark Hatle
  0 siblings, 0 replies; 37+ messages in thread
From: Mark Hatle @ 2012-12-06 17:13 UTC (permalink / raw)
  To: Paul Eggleton; +Cc: openembedded-core

On 12/6/12 7:16 AM, Paul Eggleton wrote:
> On Tuesday 04 December 2012 11:14:52 Mark Hatle wrote:
>> The libtelepathy-glib-dev package contains a .pc file that has a requires
>> of pkgconfig(pkg-config) > 0.21 in it.  In order to satisfy this requirement
>> we add a manual RPROVIDE to the pkgconfig package.
>>
>> Signed-off-by: Mark Hatle <mark.hatle@windriver.com>
>> ---
>>   meta/recipes-devtools/pkgconfig/pkgconfig.inc     |    5 +++++
>>   meta/recipes-devtools/pkgconfig/pkgconfig_0.25.bb |    2 +-
>>   meta/recipes-devtools/pkgconfig/pkgconfig_git.bb  |    1 +
>>   3 files changed, 7 insertions(+), 1 deletions(-)
>>
>> diff --git a/meta/recipes-devtools/pkgconfig/pkgconfig.inc
>> b/meta/recipes-devtools/pkgconfig/pkgconfig.inc index 83a9cdf..27d4071
>> 100644
>> --- a/meta/recipes-devtools/pkgconfig/pkgconfig.inc
>> +++ b/meta/recipes-devtools/pkgconfig/pkgconfig.inc
>> @@ -37,3 +37,8 @@ BBCLASSEXTEND = "native nativesdk"
>>   # files.
>>   FILES_${PN}-dev = ""
>>   FILES_${PN} += "${datadir}/aclocal/pkg.m4"
>> +
>> +# When using the RPM generated automatic package dependencies, some
>> packages +# will end up requiring 'pkgconfig(pkg-config)'.  Allow this
>> behavior by +# specifying an appropriate provide.
>> +RPROVIDES_${PN} += "pkgconfig(pkg-config) (= ${PV})"
>> diff --git a/meta/recipes-devtools/pkgconfig/pkgconfig_0.25.bb
>> b/meta/recipes-devtools/pkgconfig/pkgconfig_0.25.bb index 1e60c54..d0a2b1f
>> 100644
>> --- a/meta/recipes-devtools/pkgconfig/pkgconfig_0.25.bb
>> +++ b/meta/recipes-devtools/pkgconfig/pkgconfig_0.25.bb
>> @@ -1,6 +1,6 @@
>>   require pkgconfig.inc
>>
>> -PR = "r5"
>> +PR = "r6"
>>
>>   SRC_URI[md5sum] = "a3270bab3f4b69b7dc6dbdacbcae9745"
>>   SRC_URI[sha256sum] =
>> "3ba691ee2431f32ccb8efa131e59bf23e37f122dc66791309023ca6dcefcd10e" diff
>> --git a/meta/recipes-devtools/pkgconfig/pkgconfig_git.bb
>> b/meta/recipes-devtools/pkgconfig/pkgconfig_git.bb index 6271992..d5ec8fc
>> 100644
>> --- a/meta/recipes-devtools/pkgconfig/pkgconfig_git.bb
>> +++ b/meta/recipes-devtools/pkgconfig/pkgconfig_git.bb
>> @@ -8,6 +8,7 @@ S = "${WORKDIR}/git/"
>>
>>   SRCREV = "66d49f1375fec838bcd301bb4ca2ef76cee0e47c"
>>   PV = "0.23+git${SRCPV}"
>> +PR = "r1"
>>
>>   DEFAULT_PREFERENCE = "-1"
>
> Because this tends to come in via file dependencies generated during
> do_package, a package for pkgconfig won't be forced to be built; so if nothing
> else depends upon pkgconfig then you can get a failure during do_rootfs (as I
> have here building core-image-lsb with DISTRO = "poky-lsb" from scratch with
> these changes on top of master):
>
> | Note: to be installed:  psplash@i586 packagegroup-core-basic@all
> | packagegroup-core-ssh-openssh@all packagegroup-core-lsb@all
> | packagegroup-base-extended@qemux86 packagegroup-core-boot@qemux86
> | locale-base-en-us@i586 locale-base-en-gb@i586
> | Loading cache...
> | Updating cache...               ########################################
> [100%]
> |
> | Computing transaction...error: Can't install libz-dev-1.2.7-r0@i586:
> | no package provides pkgconfig
>
> I'm not quite sure what the best fix for that is though.

It would be nice if something asks for the feature dev-pkgs that it would add 
things like libtool, pkgconfig, etc and make the packages available in the 
build.  I must have been lucky with the sato build where I found this to already 
have pkgconfig around already.

--Mark

> Cheers,
> Paul
>




^ permalink raw reply	[flat|nested] 37+ messages in thread

* Re: [PATCH 21/22] pseudo: Rework target, native and nativesdk pseudo intergration
  2012-12-06 17:03     ` Mark Hatle
@ 2012-12-06 17:21       ` Saul Wold
  2012-12-06 17:28         ` Mark Hatle
  0 siblings, 1 reply; 37+ messages in thread
From: Saul Wold @ 2012-12-06 17:21 UTC (permalink / raw)
  To: Mark Hatle; +Cc: openembedded-core

On 12/06/2012 09:03 AM, Mark Hatle wrote:
> On 12/5/12 11:06 PM, Saul Wold wrote:
>> On 12/04/2012 09:14 AM, Mark Hatle wrote:
>>> Pseudo was not building and installing properly for systems where
>>> baselib
>>> was not 'lib'.  This change reworks the three scenerios to work
>>> properly.
>>>
>>> Signed-off-by: Mark Hatle <mark.hatle@windriver.com>
>>> ---
>>>    meta/recipes-devtools/pseudo/pseudo.inc      |   58
>>> ++++++++++++-------------
>>>    meta/recipes-devtools/pseudo/pseudo_1.4.1.bb |    2 +-
>>>    meta/recipes-devtools/pseudo/pseudo_git.bb   |    2 +-
>>>    3 files changed, 30 insertions(+), 32 deletions(-)
>>>
>>> diff --git a/meta/recipes-devtools/pseudo/pseudo.inc
>>> b/meta/recipes-devtools/pseudo/pseudo.inc
>>> index 98f706c..8dc7d72 100644
>>> --- a/meta/recipes-devtools/pseudo/pseudo.inc
>>> +++ b/meta/recipes-devtools/pseudo/pseudo.inc
>>> @@ -13,34 +13,28 @@ SRC_URI_append_class-nativesdk = "
>>> file://symver.patch"
>>>
>>>    SRC_URI_append_class-native = " file://symver.patch"
>>>
>>> -FILES_${PN} = "${libdir}/pseudo/lib*/libpseudo.so ${bindir}/*
>>> ${localstatedir}/pseudo ${prefix}/var/pseudo"
>>> -FILES_${PN}-dbg += "${libdir}/pseudo/lib*/.debug"
>>> +FILES_${PN} = "${prefix}/lib/pseudo/lib*/libpseudo.so ${bindir}/*
>>> ${localstatedir}/pseudo ${prefix}/var/pseudo"
>>> +FILES_${PN}-dbg += "${prefix}/lib/pseudo/lib*/.debug"
>>>    PROVIDES += "virtual/fakeroot"
>>>
>>>    MAKEOPTS = ""
>>>
>>>    inherit siteinfo
>>>
>>> -do_configure () {
>>> -    :
>>> -}
>>> -
>>> -NO32LIBS ??= "1"
>>> -
>>> -# Compile for the local machine arch...
>>> -do_compile () {
>>> +do_configure_class-target () {
>>>        if [ "${SITEINFO_BITS}" = "64" ]; then
>>> -      ${S}/configure --prefix=${prefix}
>>> --libdir=${prefix}/lib/pseudo/lib${SITEINFO_BITS}
>>> --with-sqlite=${STAGING_DIR_TARGET}${exec_prefix}
>>> --cflags="${CFLAGS}" --bits=${SITEINFO_BITS} --enable-static-sqlite
>>> --without-rpath
>>> +        mylibdir=${prefix}/lib/pseudo/lib${SITEINFO_BITS}
>>>        else
>>> -      ${S}/configure --prefix=${prefix}
>>> --libdir=${prefix}/lib/pseudo/lib
>>> --with-sqlite=${STAGING_DIR_TARGET}${exec_prefix}
>>> --cflags="${CFLAGS}" --bits=${SITEINFO_BITS} --enable-static-sqlite
>>> --without-rpath
>>> +        mylibdir=${prefix}/lib/pseudo/lib
>>>        fi
>>> -    oe_runmake ${MAKEOPTS}
>>> +    ${S}/configure --prefix=${prefix} --libdir=$mylibdir
>>> --cflags="${CFLAGS}" --bits=${SITEINFO_BITS} --without-rpath
>>
>> You seem to have dropped the --with-sqlite and now it does not find
>> sqlite3.h for the target build as can be seen in the build appliance
>> failure.
>
> It should be sourcing it from the compiler with a #include.  It was
> working on all of my test builds.
>
Not that I am aware of, the configure script defaults to /usr, is it 
possible you have a host contamination issue with sqlite3 installed on 
your machine?

> But either way, there are two bugs here.. the first is pseudo isn't
> building for the target -- it wasn't before either.
>
It has been building on the target in the past since we need it for the 
Build Appliance and it builds in world.

> But the real issue is -why on earth- are we building pseudo at all for
> the target.  It serves no purpose that I am aware of.
>
Build Appliance needs it.

> I'd prefer if the fix was simply to disable pseudo for target-class
> builds, and only build it for -native and -nativesdk cases.
>
Not really an option

> Just drop this patch for now -- we can focus on fixing it a different
> way if target builds of pseudo are needed for some reason.
>
consider it dropped.

Sau!

> --Mark
>
>> http://autobuilder.yoctoproject.org:8010/builders/build-appliance/builds/154/steps/shell_46/logs/stdio
>>
>>
>> Sau!
>>
>>>    }
>>>
>>> -# Two below are the same
>>> +NO32LIBS ??= "1"
>>> +
>>>    # If necessary compile for the alternative machine arch.  This is
>>> only
>>>    # necessary in a native build.
>>> -do_compile_prepend_class-native () {
>>> +do_compile_native() {
>>>        if [ "${SITEINFO_BITS}" = "64" -a -e
>>> "/usr/include/gnu/stubs-32.h" -a "${PN}" = "pseudo-native" -a
>>> "${NO32LIBS}" != "1" ]; then
>>>            # We need the 32-bit libpseudo on a 64-bit machine...
>>>                    # ... and we really, really, hope that the native
>>> host is
>>> @@ -56,18 +50,20 @@ do_compile_prepend_class-native () {
>>>            # prevent it from removing the lib, but remove everything
>>> else
>>>            make 'LIB=foo' ${MAKEOPTS} distclean
>>>        fi
>>> +    if [ "${SITEINFO_BITS}" = "64" ]; then
>>> +      ${S}/configure --prefix=${prefix}
>>> --libdir=${prefix}/lib/pseudo/lib${SITEINFO_BITS}
>>> --with-sqlite=${STAGING_DIR_TARGET}${exec_prefix}
>>> --cflags="${CFLAGS}" --bits=${SITEINFO_BITS} --enable-static-sqlite
>>> --without-rpath
>>> +    else
>>> +      ${S}/configure --prefix=${prefix}
>>> --libdir=${prefix}/lib/pseudo/lib
>>> --with-sqlite=${STAGING_DIR_TARGET}${exec_prefix}
>>> --cflags="${CFLAGS}" --bits=${SITEINFO_BITS} --enable-static-sqlite
>>> --without-rpath
>>> +    fi
>>> +    oe_runmake ${MAKEOPTS}
>>>    }
>>>
>>> -do_compile_prepend_class-nativesdk () {
>>> -    if [ "${SITEINFO_BITS}" = "64" -a -e
>>> "/usr/include/gnu/stubs-32.h" -a "${PN}" = "pseudo-native" -a
>>> "${NO32LIBS}" != "1" ]; then
>>> -        # We need the 32-bit libpseudo on a 64-bit machine...
>>> -                # ... and we really, really, hope that the native
>>> host is
>>> -                # x86, or else --bits may not work.
>>> -        ./configure --prefix=${prefix}
>>> --libdir=${prefix}/lib/pseudo/lib
>>> --with-sqlite=${STAGING_DIR_TARGET}${exec_prefix} --bits=32
>>> --without-rpath
>>> -        oe_runmake ${MAKEOPTS} libpseudo
>>> -        # prevent it from removing the lib, but remove everything else
>>> -        make 'LIB=foo' ${MAKEOPTS} distclean
>>> -    fi
>>> +do_compile_class-native () {
>>> +    do_compile_native
>>> +}
>>> +
>>> +do_compile_class-nativesdk () {
>>> +    do_compile_native
>>>    }
>>>
>>>    do_install () {
>>> @@ -77,18 +73,20 @@ do_install () {
>>>    # Two below are the same
>>>    # If necessary install for the alternative machine arch.  This is
>>> only
>>>    # necessary in a native build.
>>> -do_install_append_class-native () {
>>> +do_install_native () {
>>>        if [ "${SITEINFO_BITS}" = "64" -a -e
>>> "/usr/include/gnu/stubs-32.h" -a "${PN}" = "pseudo-native" -a
>>> "${NO32LIBS}" != "1" ]; then
>>>            mkdir -p ${D}${prefix}/lib/pseudo/lib
>>>            cp lib/pseudo/lib/libpseudo.so ${D}${prefix}/lib/pseudo/lib/.
>>>        fi
>>> +    oe_runmake 'DESTDIR=${D}' ${MAKEOPTS}
>>> 'LIB=lib/pseudo/lib$(MARK64)' install
>>> +}
>>> +
>>> +do_install_class-native () {
>>> +    do_install_native
>>>    }
>>>
>>>    do_install_append_class-nativesdk () {
>>> -    if [ "${SITEINFO_BITS}" = "64" -a -e
>>> "/usr/include/gnu/stubs-32.h" -a "${PN}" = "pseudo-native" -a
>>> "${NO32LIBS}" != "1" ]; then
>>> -        mkdir -p ${D}${prefix}/lib/pseudo/lib
>>> -        cp lib/pseudo/lib/libpseudo.so ${D}${prefix}/lib/pseudo/lib/.
>>> -    fi
>>> +    do_install_native
>>>    }
>>>
>>>    BBCLASSEXTEND = "native nativesdk"
>>> diff --git a/meta/recipes-devtools/pseudo/pseudo_1.4.1.bb
>>> b/meta/recipes-devtools/pseudo/pseudo_1.4.1.bb
>>> index 70fe9c0..8367a34 100644
>>> --- a/meta/recipes-devtools/pseudo/pseudo_1.4.1.bb
>>> +++ b/meta/recipes-devtools/pseudo/pseudo_1.4.1.bb
>>> @@ -1,6 +1,6 @@
>>>    require pseudo.inc
>>>
>>> -PR = "r13"
>>> +PR = "r14"
>>>
>>>    SRC_URI =
>>> "http://www.yoctoproject.org/downloads/${BPN}/${BPN}-${PV}.tar.bz2"
>>>
>>> diff --git a/meta/recipes-devtools/pseudo/pseudo_git.bb
>>> b/meta/recipes-devtools/pseudo/pseudo_git.bb
>>> index e394ffb..c8ec5ad 100644
>>> --- a/meta/recipes-devtools/pseudo/pseudo_git.bb
>>> +++ b/meta/recipes-devtools/pseudo/pseudo_git.bb
>>> @@ -2,7 +2,7 @@ require pseudo.inc
>>>
>>>    SRCREV = "398a264490713c912b4ce465251a8a82a7905f45"
>>>    PV = "1.4.1+git${SRCPV}"
>>> -PR = "r28"
>>> +PR = "r29"
>>>
>>>    DEFAULT_PREFERENCE = "-1"
>>>
>>>
>
>
>



^ permalink raw reply	[flat|nested] 37+ messages in thread

* Re: [PATCH 21/22] pseudo: Rework target, native and nativesdk pseudo intergration
  2012-12-06 17:21       ` Saul Wold
@ 2012-12-06 17:28         ` Mark Hatle
  2012-12-06 17:39           ` Saul Wold
  0 siblings, 1 reply; 37+ messages in thread
From: Mark Hatle @ 2012-12-06 17:28 UTC (permalink / raw)
  To: Saul Wold; +Cc: openembedded-core

On 12/6/12 11:21 AM, Saul Wold wrote:
> On 12/06/2012 09:03 AM, Mark Hatle wrote:
>> On 12/5/12 11:06 PM, Saul Wold wrote:
>>> On 12/04/2012 09:14 AM, Mark Hatle wrote:
>>>> Pseudo was not building and installing properly for systems where
>>>> baselib
>>>> was not 'lib'.  This change reworks the three scenerios to work
>>>> properly.
>>>>
>>>> Signed-off-by: Mark Hatle <mark.hatle@windriver.com>
>>>> ---
>>>>     meta/recipes-devtools/pseudo/pseudo.inc      |   58
>>>> ++++++++++++-------------
>>>>     meta/recipes-devtools/pseudo/pseudo_1.4.1.bb |    2 +-
>>>>     meta/recipes-devtools/pseudo/pseudo_git.bb   |    2 +-
>>>>     3 files changed, 30 insertions(+), 32 deletions(-)
>>>>
>>>> diff --git a/meta/recipes-devtools/pseudo/pseudo.inc
>>>> b/meta/recipes-devtools/pseudo/pseudo.inc
>>>> index 98f706c..8dc7d72 100644
>>>> --- a/meta/recipes-devtools/pseudo/pseudo.inc
>>>> +++ b/meta/recipes-devtools/pseudo/pseudo.inc
>>>> @@ -13,34 +13,28 @@ SRC_URI_append_class-nativesdk = "
>>>> file://symver.patch"
>>>>
>>>>     SRC_URI_append_class-native = " file://symver.patch"
>>>>
>>>> -FILES_${PN} = "${libdir}/pseudo/lib*/libpseudo.so ${bindir}/*
>>>> ${localstatedir}/pseudo ${prefix}/var/pseudo"
>>>> -FILES_${PN}-dbg += "${libdir}/pseudo/lib*/.debug"
>>>> +FILES_${PN} = "${prefix}/lib/pseudo/lib*/libpseudo.so ${bindir}/*
>>>> ${localstatedir}/pseudo ${prefix}/var/pseudo"
>>>> +FILES_${PN}-dbg += "${prefix}/lib/pseudo/lib*/.debug"
>>>>     PROVIDES += "virtual/fakeroot"
>>>>
>>>>     MAKEOPTS = ""
>>>>
>>>>     inherit siteinfo
>>>>
>>>> -do_configure () {
>>>> -    :
>>>> -}
>>>> -
>>>> -NO32LIBS ??= "1"
>>>> -
>>>> -# Compile for the local machine arch...
>>>> -do_compile () {
>>>> +do_configure_class-target () {
>>>>         if [ "${SITEINFO_BITS}" = "64" ]; then
>>>> -      ${S}/configure --prefix=${prefix}
>>>> --libdir=${prefix}/lib/pseudo/lib${SITEINFO_BITS}
>>>> --with-sqlite=${STAGING_DIR_TARGET}${exec_prefix}
>>>> --cflags="${CFLAGS}" --bits=${SITEINFO_BITS} --enable-static-sqlite
>>>> --without-rpath
>>>> +        mylibdir=${prefix}/lib/pseudo/lib${SITEINFO_BITS}
>>>>         else
>>>> -      ${S}/configure --prefix=${prefix}
>>>> --libdir=${prefix}/lib/pseudo/lib
>>>> --with-sqlite=${STAGING_DIR_TARGET}${exec_prefix}
>>>> --cflags="${CFLAGS}" --bits=${SITEINFO_BITS} --enable-static-sqlite
>>>> --without-rpath
>>>> +        mylibdir=${prefix}/lib/pseudo/lib
>>>>         fi
>>>> -    oe_runmake ${MAKEOPTS}
>>>> +    ${S}/configure --prefix=${prefix} --libdir=$mylibdir
>>>> --cflags="${CFLAGS}" --bits=${SITEINFO_BITS} --without-rpath
>>>
>>> You seem to have dropped the --with-sqlite and now it does not find
>>> sqlite3.h for the target build as can be seen in the build appliance
>>> failure.
>>
>> It should be sourcing it from the compiler with a #include.  It was
>> working on all of my test builds.
>>
> Not that I am aware of, the configure script defaults to /usr, is it
> possible you have a host contamination issue with sqlite3 installed on
> your machine?
>
>> But either way, there are two bugs here.. the first is pseudo isn't
>> building for the target -- it wasn't before either.
>>
> It has been building on the target in the past since we need it for the
> Build Appliance and it builds in world.

Enable multilibs, pseudo (target) will no longer build.  The integration is hard 
coded currently to be looking for things in the 'lib' directory, which may not 
exist.  In otherwords, it is broken -- and the autobuilds are missing any 
build-time tests for multilibs at this point.

>> But the real issue is -why on earth- are we building pseudo at all for
>> the target.  It serves no purpose that I am aware of.
>>
> Build Appliance needs it.

People keep telling me this, but honestly I can't figure out why it's needed. 
What actually uses pseudo in the build appliance?

I can easily build a system today, boot it, download OE-Core/Bitbake (or Poky) 
and build it on that system.  It's that the purpose of the build appliance?  Why 
is it needed?

>> I'd prefer if the fix was simply to disable pseudo for target-class
>> builds, and only build it for -native and -nativesdk cases.
>>
> Not really an option
>
>> Just drop this patch for now -- we can focus on fixing it a different
>> way if target builds of pseudo are needed for some reason.
>>
> consider it dropped.
>
> Sau!
>
>> --Mark
>>
>>> http://autobuilder.yoctoproject.org:8010/builders/build-appliance/builds/154/steps/shell_46/logs/stdio
>>>
>>>
>>> Sau!
>>>
>>>>     }
>>>>
>>>> -# Two below are the same
>>>> +NO32LIBS ??= "1"
>>>> +
>>>>     # If necessary compile for the alternative machine arch.  This is
>>>> only
>>>>     # necessary in a native build.
>>>> -do_compile_prepend_class-native () {
>>>> +do_compile_native() {
>>>>         if [ "${SITEINFO_BITS}" = "64" -a -e
>>>> "/usr/include/gnu/stubs-32.h" -a "${PN}" = "pseudo-native" -a
>>>> "${NO32LIBS}" != "1" ]; then
>>>>             # We need the 32-bit libpseudo on a 64-bit machine...
>>>>                     # ... and we really, really, hope that the native
>>>> host is
>>>> @@ -56,18 +50,20 @@ do_compile_prepend_class-native () {
>>>>             # prevent it from removing the lib, but remove everything
>>>> else
>>>>             make 'LIB=foo' ${MAKEOPTS} distclean
>>>>         fi
>>>> +    if [ "${SITEINFO_BITS}" = "64" ]; then
>>>> +      ${S}/configure --prefix=${prefix}
>>>> --libdir=${prefix}/lib/pseudo/lib${SITEINFO_BITS}
>>>> --with-sqlite=${STAGING_DIR_TARGET}${exec_prefix}
>>>> --cflags="${CFLAGS}" --bits=${SITEINFO_BITS} --enable-static-sqlite
>>>> --without-rpath
>>>> +    else
>>>> +      ${S}/configure --prefix=${prefix}
>>>> --libdir=${prefix}/lib/pseudo/lib
>>>> --with-sqlite=${STAGING_DIR_TARGET}${exec_prefix}
>>>> --cflags="${CFLAGS}" --bits=${SITEINFO_BITS} --enable-static-sqlite
>>>> --without-rpath
>>>> +    fi
>>>> +    oe_runmake ${MAKEOPTS}
>>>>     }
>>>>
>>>> -do_compile_prepend_class-nativesdk () {
>>>> -    if [ "${SITEINFO_BITS}" = "64" -a -e
>>>> "/usr/include/gnu/stubs-32.h" -a "${PN}" = "pseudo-native" -a
>>>> "${NO32LIBS}" != "1" ]; then
>>>> -        # We need the 32-bit libpseudo on a 64-bit machine...
>>>> -                # ... and we really, really, hope that the native
>>>> host is
>>>> -                # x86, or else --bits may not work.
>>>> -        ./configure --prefix=${prefix}
>>>> --libdir=${prefix}/lib/pseudo/lib
>>>> --with-sqlite=${STAGING_DIR_TARGET}${exec_prefix} --bits=32
>>>> --without-rpath
>>>> -        oe_runmake ${MAKEOPTS} libpseudo
>>>> -        # prevent it from removing the lib, but remove everything else
>>>> -        make 'LIB=foo' ${MAKEOPTS} distclean
>>>> -    fi
>>>> +do_compile_class-native () {
>>>> +    do_compile_native
>>>> +}
>>>> +
>>>> +do_compile_class-nativesdk () {
>>>> +    do_compile_native
>>>>     }
>>>>
>>>>     do_install () {
>>>> @@ -77,18 +73,20 @@ do_install () {
>>>>     # Two below are the same
>>>>     # If necessary install for the alternative machine arch.  This is
>>>> only
>>>>     # necessary in a native build.
>>>> -do_install_append_class-native () {
>>>> +do_install_native () {
>>>>         if [ "${SITEINFO_BITS}" = "64" -a -e
>>>> "/usr/include/gnu/stubs-32.h" -a "${PN}" = "pseudo-native" -a
>>>> "${NO32LIBS}" != "1" ]; then
>>>>             mkdir -p ${D}${prefix}/lib/pseudo/lib
>>>>             cp lib/pseudo/lib/libpseudo.so ${D}${prefix}/lib/pseudo/lib/.
>>>>         fi
>>>> +    oe_runmake 'DESTDIR=${D}' ${MAKEOPTS}
>>>> 'LIB=lib/pseudo/lib$(MARK64)' install
>>>> +}
>>>> +
>>>> +do_install_class-native () {
>>>> +    do_install_native
>>>>     }
>>>>
>>>>     do_install_append_class-nativesdk () {
>>>> -    if [ "${SITEINFO_BITS}" = "64" -a -e
>>>> "/usr/include/gnu/stubs-32.h" -a "${PN}" = "pseudo-native" -a
>>>> "${NO32LIBS}" != "1" ]; then
>>>> -        mkdir -p ${D}${prefix}/lib/pseudo/lib
>>>> -        cp lib/pseudo/lib/libpseudo.so ${D}${prefix}/lib/pseudo/lib/.
>>>> -    fi
>>>> +    do_install_native
>>>>     }
>>>>
>>>>     BBCLASSEXTEND = "native nativesdk"
>>>> diff --git a/meta/recipes-devtools/pseudo/pseudo_1.4.1.bb
>>>> b/meta/recipes-devtools/pseudo/pseudo_1.4.1.bb
>>>> index 70fe9c0..8367a34 100644
>>>> --- a/meta/recipes-devtools/pseudo/pseudo_1.4.1.bb
>>>> +++ b/meta/recipes-devtools/pseudo/pseudo_1.4.1.bb
>>>> @@ -1,6 +1,6 @@
>>>>     require pseudo.inc
>>>>
>>>> -PR = "r13"
>>>> +PR = "r14"
>>>>
>>>>     SRC_URI =
>>>> "http://www.yoctoproject.org/downloads/${BPN}/${BPN}-${PV}.tar.bz2"
>>>>
>>>> diff --git a/meta/recipes-devtools/pseudo/pseudo_git.bb
>>>> b/meta/recipes-devtools/pseudo/pseudo_git.bb
>>>> index e394ffb..c8ec5ad 100644
>>>> --- a/meta/recipes-devtools/pseudo/pseudo_git.bb
>>>> +++ b/meta/recipes-devtools/pseudo/pseudo_git.bb
>>>> @@ -2,7 +2,7 @@ require pseudo.inc
>>>>
>>>>     SRCREV = "398a264490713c912b4ce465251a8a82a7905f45"
>>>>     PV = "1.4.1+git${SRCPV}"
>>>> -PR = "r28"
>>>> +PR = "r29"
>>>>
>>>>     DEFAULT_PREFERENCE = "-1"
>>>>
>>>>
>>
>>
>>




^ permalink raw reply	[flat|nested] 37+ messages in thread

* Re: [PATCH 21/22] pseudo: Rework target, native and nativesdk pseudo intergration
  2012-12-06 17:28         ` Mark Hatle
@ 2012-12-06 17:39           ` Saul Wold
  0 siblings, 0 replies; 37+ messages in thread
From: Saul Wold @ 2012-12-06 17:39 UTC (permalink / raw)
  To: Mark Hatle; +Cc: openembedded-core

On 12/06/2012 09:28 AM, Mark Hatle wrote:
> On 12/6/12 11:21 AM, Saul Wold wrote:
>> On 12/06/2012 09:03 AM, Mark Hatle wrote:
>>> On 12/5/12 11:06 PM, Saul Wold wrote:
>>>> On 12/04/2012 09:14 AM, Mark Hatle wrote:
>>>>> Pseudo was not building and installing properly for systems where
>>>>> baselib
>>>>> was not 'lib'.  This change reworks the three scenerios to work
>>>>> properly.
>>>>>
>>>>> Signed-off-by: Mark Hatle <mark.hatle@windriver.com>
>>>>> ---
>>>>>     meta/recipes-devtools/pseudo/pseudo.inc      |   58
>>>>> ++++++++++++-------------
>>>>>     meta/recipes-devtools/pseudo/pseudo_1.4.1.bb |    2 +-
>>>>>     meta/recipes-devtools/pseudo/pseudo_git.bb   |    2 +-
>>>>>     3 files changed, 30 insertions(+), 32 deletions(-)
>>>>>
>>>>> diff --git a/meta/recipes-devtools/pseudo/pseudo.inc
>>>>> b/meta/recipes-devtools/pseudo/pseudo.inc
>>>>> index 98f706c..8dc7d72 100644
>>>>> --- a/meta/recipes-devtools/pseudo/pseudo.inc
>>>>> +++ b/meta/recipes-devtools/pseudo/pseudo.inc
>>>>> @@ -13,34 +13,28 @@ SRC_URI_append_class-nativesdk = "
>>>>> file://symver.patch"
>>>>>
>>>>>     SRC_URI_append_class-native = " file://symver.patch"
>>>>>
>>>>> -FILES_${PN} = "${libdir}/pseudo/lib*/libpseudo.so ${bindir}/*
>>>>> ${localstatedir}/pseudo ${prefix}/var/pseudo"
>>>>> -FILES_${PN}-dbg += "${libdir}/pseudo/lib*/.debug"
>>>>> +FILES_${PN} = "${prefix}/lib/pseudo/lib*/libpseudo.so ${bindir}/*
>>>>> ${localstatedir}/pseudo ${prefix}/var/pseudo"
>>>>> +FILES_${PN}-dbg += "${prefix}/lib/pseudo/lib*/.debug"
>>>>>     PROVIDES += "virtual/fakeroot"
>>>>>
>>>>>     MAKEOPTS = ""
>>>>>
>>>>>     inherit siteinfo
>>>>>
>>>>> -do_configure () {
>>>>> -    :
>>>>> -}
>>>>> -
>>>>> -NO32LIBS ??= "1"
>>>>> -
>>>>> -# Compile for the local machine arch...
>>>>> -do_compile () {
>>>>> +do_configure_class-target () {
>>>>>         if [ "${SITEINFO_BITS}" = "64" ]; then
>>>>> -      ${S}/configure --prefix=${prefix}
>>>>> --libdir=${prefix}/lib/pseudo/lib${SITEINFO_BITS}
>>>>> --with-sqlite=${STAGING_DIR_TARGET}${exec_prefix}
>>>>> --cflags="${CFLAGS}" --bits=${SITEINFO_BITS} --enable-static-sqlite
>>>>> --without-rpath
>>>>> +        mylibdir=${prefix}/lib/pseudo/lib${SITEINFO_BITS}
>>>>>         else
>>>>> -      ${S}/configure --prefix=${prefix}
>>>>> --libdir=${prefix}/lib/pseudo/lib
>>>>> --with-sqlite=${STAGING_DIR_TARGET}${exec_prefix}
>>>>> --cflags="${CFLAGS}" --bits=${SITEINFO_BITS} --enable-static-sqlite
>>>>> --without-rpath
>>>>> +        mylibdir=${prefix}/lib/pseudo/lib
>>>>>         fi
>>>>> -    oe_runmake ${MAKEOPTS}
>>>>> +    ${S}/configure --prefix=${prefix} --libdir=$mylibdir
>>>>> --cflags="${CFLAGS}" --bits=${SITEINFO_BITS} --without-rpath
>>>>
>>>> You seem to have dropped the --with-sqlite and now it does not find
>>>> sqlite3.h for the target build as can be seen in the build appliance
>>>> failure.
>>>
>>> It should be sourcing it from the compiler with a #include.  It was
>>> working on all of my test builds.
>>>
>> Not that I am aware of, the configure script defaults to /usr, is it
>> possible you have a host contamination issue with sqlite3 installed on
>> your machine?
>>
>>> But either way, there are two bugs here.. the first is pseudo isn't
>>> building for the target -- it wasn't before either.
>>>
>> It has been building on the target in the past since we need it for the
>> Build Appliance and it builds in world.
>
> Enable multilibs, pseudo (target) will no longer build.  The integration
> is hard coded currently to be looking for things in the 'lib' directory,
> which may not exist.  In otherwords, it is broken -- and the autobuilds
> are missing any build-time tests for multilibs at this point.
>
>>> But the real issue is -why on earth- are we building pseudo at all for
>>> the target.  It serves no purpose that I am aware of.
>>>
>> Build Appliance needs it.
>
> People keep telling me this, but honestly I can't figure out why it's
> needed. What actually uses pseudo in the build appliance?
>
The build appliance uses it to save time at start of HOB, since pseudo 
is needed to run hob first.  If we needed to build it first that can 
cause issues.  We have the sources available in the appliance, but it 
still does some network start up.

We want the hob to come up quickly, not have to wait for pseudo to be 
build.

> I can easily build a system today, boot it, download OE-Core/Bitbake (or
> Poky) and build it on that system.  It's that the purpose of the build
> appliance?  Why is it needed?
>
Yes, it builds pseudo first as normal you have a network in place

>>> I'd prefer if the fix was simply to disable pseudo for target-class
>>> builds, and only build it for -native and -nativesdk cases.
>>>
>> Not really an option
>>
>>> Just drop this patch for now -- we can focus on fixing it a different
>>> way if target builds of pseudo are needed for some reason.
>>>
>> consider it dropped.
>>
>> Sau!
>>
>>> --Mark
>>>
>>>> http://autobuilder.yoctoproject.org:8010/builders/build-appliance/builds/154/steps/shell_46/logs/stdio
>>>>
>>>>
>>>>
>>>> Sau!
>>>>
>>>>>     }
>>>>>
>>>>> -# Two below are the same
>>>>> +NO32LIBS ??= "1"
>>>>> +
>>>>>     # If necessary compile for the alternative machine arch.  This is
>>>>> only
>>>>>     # necessary in a native build.
>>>>> -do_compile_prepend_class-native () {
>>>>> +do_compile_native() {
>>>>>         if [ "${SITEINFO_BITS}" = "64" -a -e
>>>>> "/usr/include/gnu/stubs-32.h" -a "${PN}" = "pseudo-native" -a
>>>>> "${NO32LIBS}" != "1" ]; then
>>>>>             # We need the 32-bit libpseudo on a 64-bit machine...
>>>>>                     # ... and we really, really, hope that the native
>>>>> host is
>>>>> @@ -56,18 +50,20 @@ do_compile_prepend_class-native () {
>>>>>             # prevent it from removing the lib, but remove everything
>>>>> else
>>>>>             make 'LIB=foo' ${MAKEOPTS} distclean
>>>>>         fi
>>>>> +    if [ "${SITEINFO_BITS}" = "64" ]; then
>>>>> +      ${S}/configure --prefix=${prefix}
>>>>> --libdir=${prefix}/lib/pseudo/lib${SITEINFO_BITS}
>>>>> --with-sqlite=${STAGING_DIR_TARGET}${exec_prefix}
>>>>> --cflags="${CFLAGS}" --bits=${SITEINFO_BITS} --enable-static-sqlite
>>>>> --without-rpath
>>>>> +    else
>>>>> +      ${S}/configure --prefix=${prefix}
>>>>> --libdir=${prefix}/lib/pseudo/lib
>>>>> --with-sqlite=${STAGING_DIR_TARGET}${exec_prefix}
>>>>> --cflags="${CFLAGS}" --bits=${SITEINFO_BITS} --enable-static-sqlite
>>>>> --without-rpath
>>>>> +    fi
>>>>> +    oe_runmake ${MAKEOPTS}
>>>>>     }
>>>>>
>>>>> -do_compile_prepend_class-nativesdk () {
>>>>> -    if [ "${SITEINFO_BITS}" = "64" -a -e
>>>>> "/usr/include/gnu/stubs-32.h" -a "${PN}" = "pseudo-native" -a
>>>>> "${NO32LIBS}" != "1" ]; then
>>>>> -        # We need the 32-bit libpseudo on a 64-bit machine...
>>>>> -                # ... and we really, really, hope that the native
>>>>> host is
>>>>> -                # x86, or else --bits may not work.
>>>>> -        ./configure --prefix=${prefix}
>>>>> --libdir=${prefix}/lib/pseudo/lib
>>>>> --with-sqlite=${STAGING_DIR_TARGET}${exec_prefix} --bits=32
>>>>> --without-rpath
>>>>> -        oe_runmake ${MAKEOPTS} libpseudo
>>>>> -        # prevent it from removing the lib, but remove everything
>>>>> else
>>>>> -        make 'LIB=foo' ${MAKEOPTS} distclean
>>>>> -    fi
>>>>> +do_compile_class-native () {
>>>>> +    do_compile_native
>>>>> +}
>>>>> +
>>>>> +do_compile_class-nativesdk () {
>>>>> +    do_compile_native
>>>>>     }
>>>>>
>>>>>     do_install () {
>>>>> @@ -77,18 +73,20 @@ do_install () {
>>>>>     # Two below are the same
>>>>>     # If necessary install for the alternative machine arch.  This is
>>>>> only
>>>>>     # necessary in a native build.
>>>>> -do_install_append_class-native () {
>>>>> +do_install_native () {
>>>>>         if [ "${SITEINFO_BITS}" = "64" -a -e
>>>>> "/usr/include/gnu/stubs-32.h" -a "${PN}" = "pseudo-native" -a
>>>>> "${NO32LIBS}" != "1" ]; then
>>>>>             mkdir -p ${D}${prefix}/lib/pseudo/lib
>>>>>             cp lib/pseudo/lib/libpseudo.so
>>>>> ${D}${prefix}/lib/pseudo/lib/.
>>>>>         fi
>>>>> +    oe_runmake 'DESTDIR=${D}' ${MAKEOPTS}
>>>>> 'LIB=lib/pseudo/lib$(MARK64)' install
>>>>> +}
>>>>> +
>>>>> +do_install_class-native () {
>>>>> +    do_install_native
>>>>>     }
>>>>>
>>>>>     do_install_append_class-nativesdk () {
>>>>> -    if [ "${SITEINFO_BITS}" = "64" -a -e
>>>>> "/usr/include/gnu/stubs-32.h" -a "${PN}" = "pseudo-native" -a
>>>>> "${NO32LIBS}" != "1" ]; then
>>>>> -        mkdir -p ${D}${prefix}/lib/pseudo/lib
>>>>> -        cp lib/pseudo/lib/libpseudo.so ${D}${prefix}/lib/pseudo/lib/.
>>>>> -    fi
>>>>> +    do_install_native
>>>>>     }
>>>>>
>>>>>     BBCLASSEXTEND = "native nativesdk"
>>>>> diff --git a/meta/recipes-devtools/pseudo/pseudo_1.4.1.bb
>>>>> b/meta/recipes-devtools/pseudo/pseudo_1.4.1.bb
>>>>> index 70fe9c0..8367a34 100644
>>>>> --- a/meta/recipes-devtools/pseudo/pseudo_1.4.1.bb
>>>>> +++ b/meta/recipes-devtools/pseudo/pseudo_1.4.1.bb
>>>>> @@ -1,6 +1,6 @@
>>>>>     require pseudo.inc
>>>>>
>>>>> -PR = "r13"
>>>>> +PR = "r14"
>>>>>
>>>>>     SRC_URI =
>>>>> "http://www.yoctoproject.org/downloads/${BPN}/${BPN}-${PV}.tar.bz2"
>>>>>
>>>>> diff --git a/meta/recipes-devtools/pseudo/pseudo_git.bb
>>>>> b/meta/recipes-devtools/pseudo/pseudo_git.bb
>>>>> index e394ffb..c8ec5ad 100644
>>>>> --- a/meta/recipes-devtools/pseudo/pseudo_git.bb
>>>>> +++ b/meta/recipes-devtools/pseudo/pseudo_git.bb
>>>>> @@ -2,7 +2,7 @@ require pseudo.inc
>>>>>
>>>>>     SRCREV = "398a264490713c912b4ce465251a8a82a7905f45"
>>>>>     PV = "1.4.1+git${SRCPV}"
>>>>> -PR = "r28"
>>>>> +PR = "r29"
>>>>>
>>>>>     DEFAULT_PREFERENCE = "-1"
>>>>>
>>>>>
>>>
>>>
>>>
>
>
>



^ permalink raw reply	[flat|nested] 37+ messages in thread

end of thread, other threads:[~2012-12-06 17:54 UTC | newest]

Thread overview: 37+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-12-04 17:14 [PATCH 00/22] Misc fixes Mark Hatle
2012-12-04 17:14 ` [PATCH 01/22] cpio: Split RMT from cpio Mark Hatle
2012-12-04 17:14 ` [PATCH 02/22] tar: Split RMT from tar Mark Hatle
2012-12-04 17:14 ` [PATCH 03/22] update-alternatives.bbclass: Add missing runtime dependency Mark Hatle
2012-12-04 17:04   ` Martin Jansa
2012-12-04 17:34     ` Mark Hatle
2012-12-04 20:46       ` Richard Purdie
2012-12-05  1:47         ` Mark Hatle
2012-12-05  9:17           ` Richard Purdie
2012-12-04 17:14 ` [PATCH 04/22] package_rpm.bbclass: Add the runtime dependencies to the pre/post scriptlets Mark Hatle
2012-12-04 17:14 ` [PATCH 05/22] rpm: enable _openall_before_chroot by default Mark Hatle
2012-12-04 17:14 ` [PATCH 06/22] rpm: Move rpmdb_loadcvt from base to dev package Mark Hatle
2012-12-04 17:14 ` [PATCH 07/22] rpm: Fix rpm relocation macro usage Mark Hatle
2012-12-04 17:14 ` [PATCH 08/22] rpm: Fixup platform matching code Mark Hatle
2012-12-04 17:14 ` [PATCH 09/22] rpm: Fix Upstream-Status fields Mark Hatle
2012-12-04 17:14 ` [PATCH 10/22] createrepo: implement support for recommends Mark Hatle
2012-12-04 17:14 ` [PATCH 11/22] python-smartpm: add " Mark Hatle
2012-12-04 17:14 ` [PATCH 12/22] python-smartpm: style fixes Mark Hatle
2012-12-04 17:14 ` [PATCH 13/22] python-smartpm: fix package metadata not being read from rpm-md feeds Mark Hatle
2012-12-04 17:14 ` [PATCH 14/22] python-smartpm: don't create /var/tmp on every rpm database open Mark Hatle
2012-12-04 17:14 ` [PATCH 15/22] python-smartpm: support nolinktos and noparentdirs rpm options Mark Hatle
2012-12-04 17:14 ` [PATCH 16/22] python-smartpm: allow setting arbitrary macros in smart config Mark Hatle
2012-12-04 17:14 ` [PATCH 17/22] python-smartpm: Fix incorrect comparison arguments Mark Hatle
2012-12-04 17:14 ` [PATCH 18/22] shadow: add runtime dependency on base-passwd Mark Hatle
2012-12-04 17:14 ` [PATCH 19/22] package_deb: Dependencies with a ( or ) in them are invalid in debs Mark Hatle
2012-12-04 17:14 ` [PATCH 20/22] pkgconfig: Add a manual dependency of pkgconfig(pkg-config) Mark Hatle
2012-12-06 13:16   ` Paul Eggleton
2012-12-06 17:13     ` Mark Hatle
2012-12-06 13:30   ` Otavio Salvador
2012-12-06 17:12     ` Mark Hatle
2012-12-04 17:14 ` [PATCH 21/22] pseudo: Rework target, native and nativesdk pseudo intergration Mark Hatle
2012-12-06  5:06   ` Saul Wold
2012-12-06 17:03     ` Mark Hatle
2012-12-06 17:21       ` Saul Wold
2012-12-06 17:28         ` Mark Hatle
2012-12-06 17:39           ` Saul Wold
2012-12-04 17:14 ` [PATCH 22/22] license.bbclass: Avoid grep error message Mark Hatle

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.