rpm 5.4.0: Add rpmdeps-oecore to replace rpmdeps for package.bbclass
authorRichard Purdie <richard.purdie@linuxfoundation.org>
Fri, 9 Mar 2012 06:14:04 +0000 (14:14 +0800)
committerRichard Purdie <richard.purdie@linuxfoundation.org>
Fri, 9 Mar 2012 14:40:12 +0000 (06:40 -0800)
This is a performance enhancement by adding a binary allowing batch processing
of individual file dependencies. The second patch in this series uses the binary
this patch creates.

(From OE-Core rev: 50dc8bfbac42b9a9b52a2f7d0568740c41790c13)

Signed-off-by: Robert Yang <liezhi.yang@windriver.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
meta/recipes-devtools/rpm/rpm/rpmdeps-oecore.patch [new file with mode: 0644]
meta/recipes-devtools/rpm/rpm_5.4.0.bb

diff --git a/meta/recipes-devtools/rpm/rpm/rpmdeps-oecore.patch b/meta/recipes-devtools/rpm/rpm/rpmdeps-oecore.patch
new file mode 100644 (file)
index 0000000..1667901
--- /dev/null
@@ -0,0 +1,198 @@
+Add an "rpmdeps-oecore" binary which allows batch processing of individual file
+dependencies in a similar manner to rpmdeps --provides --requires -v, prefixing
+each line of output with the filename that has the dependency.
+
+This is much faster than individually calling rpmdeps on each file.
+
+This binary is used by package.bbclass.
+
+Upstream-Status: Inappropriate [OE Specific]
+
+RP 2012/2/7
+
+---
+ tools/Makefile.am      |    6 ++-
+ tools/rpmdeps-oecore.c |  147 ++++++++++++++++++++++++++++++++++++++++++++++++
+ 2 files changed, 152 insertions(+), 1 deletions(-)
+ create mode 100644 tools/rpmdeps-oecore.c
+
+diff --git a/tools/Makefile.am b/tools/Makefile.am
+index f520843..2eba9bf 100644
+--- a/tools/Makefile.am
++++ b/tools/Makefile.am
+@@ -58,7 +58,7 @@ pkgbin_PROGRAMS =    \
+       @WITH_AUGEAS_AUGTOOL@ chroot cp @WITH_CUDF_CUDFTOOL@ find mtree \
+       @WITH_SEMANAGE_SEMODULE@ wget \
+       rpmcache rpmdigest rpmrepo rpmspecdump \
+-      rpmcmp rpmdeps sqlite3 @WITH_KEYUTILS_RPMKEY@ @WITH_LIBELF_DEBUGEDIT@
++      rpmcmp rpmdeps rpmdeps-oecore sqlite3 @WITH_KEYUTILS_RPMKEY@ @WITH_LIBELF_DEBUGEDIT@
+ dist_man_MANS =               rpmgrep.1
+ augtool_SOURCES =     augtool.c
+@@ -155,6 +155,10 @@ rpmdeps_SOURCES = rpmdeps.c
+ rpmdeps_LDFLAGS =     @LDFLAGS_STATIC@ $(LDFLAGS)
+ rpmdeps_LDADD =               $(RPM_LDADD_COMMON)
++rpmdeps_oecore_SOURCES =  rpmdeps-oecore.c
++rpmdeps_oecore_LDFLAGS =  @LDFLAGS_STATIC@ $(LDFLAGS)
++rpmdeps_oecore_LDADD =    $(RPM_LDADD_COMMON)
++
+ rpmdigest_SOURCES =   rpmdigest.c
+ rpmdigest_LDFLAGS =   @LDFLAGS_STATIC@ $(LDFLAGS)
+ rpmdigest_LDADD =     $(RPMIO_LDADD_COMMON)
+diff --git a/tools/rpmdeps-oecore.c b/tools/rpmdeps-oecore.c
+new file mode 100644
+index 0000000..e646da9
+--- /dev/null
++++ b/tools/rpmdeps-oecore.c
+@@ -0,0 +1,147 @@
++#include "system.h"
++const char *__progname;
++
++#include <rpmio.h>
++#include <rpmiotypes.h>
++#include <rpmcb.h>
++#include <argv.h>
++#include <rpmtypes.h>
++#include <rpmtag.h>
++
++#include <rpmds.h>
++#define   _RPMFC_INTERNAL     /* XXX for debugging */
++#include <rpmfc.h>
++
++#include <rpmcli.h>
++
++#include "debug.h"
++
++/*@unchecked@*/
++char *progname;
++
++#define   RPMDEP_RPMFC        1
++
++static int rpmdepPrint(char *filename, rpmds ds, FILE * fp)
++{
++    if (fp == NULL) fp = stderr;
++
++    ds = rpmdsInit(ds);
++    while (rpmdsNext(ds) >= 0) {
++  fprintf(fp, "%s %s: %s\n", filename, rpmdsType(ds), rpmdsDNEVR(ds)+2);
++    }
++    return 0;
++}
++
++static struct poptOption optionsTable[] = {
++
++ { NULL, '\0', POPT_ARG_INCLUDE_TABLE, rpmcliAllPoptTable, 0,
++  N_("Common options:"),
++  NULL }, 
++
++   POPT_AUTOALIAS
++   POPT_AUTOHELP
++   POPT_TABLEEND
++};
++
++
++int
++main(int argc, char *argv[])
++{
++    poptContext optCon;
++    ARGV_t av = NULL;
++    rpmfc fc = NULL;
++    FILE * fp = NULL;
++    int flags = 0;
++    int ac = 0;
++    int ec = 1;
++    int xx;
++    int i;
++    char buf[BUFSIZ];
++    int nddict;
++    const char * s;
++    char * se;
++    const char * fn;
++    const char * N;
++    const char * EVR;
++    evrFlags Flags;
++    unsigned char deptype;
++    int ix;
++    rpmds ds;
++
++/*@-modobserver@*/
++    if ((progname = strrchr(argv[0], '/')) != NULL)
++  progname++;
++    else
++  progname = argv[0];
++/*@=modobserver@*/
++
++    optCon = rpmcliInit(argc, argv, optionsTable);
++    if (optCon == NULL)
++  goto exit;
++
++    av = poptGetArgs(optCon);
++    ac = argvCount(av);
++
++    if (ac == 0) {
++  av = NULL;
++  xx = argvFgets(&av, NULL);
++  ac = argvCount(av);
++    }
++
++    /* Make sure file names are sorted. */
++    xx = argvSort(av, NULL);
++
++    /* Build file class dictionary. */
++    fc = rpmfcNew();
++    xx = rpmfcClassify(fc, av, NULL);
++
++    /* Build file/package dependency dictionary. */
++    xx = rpmfcApply(fc);
++
++    /* Generate per-file indices into package dependencies. */
++    nddict = argvCount(fc->ddict);
++
++    for (i = 0; i < nddict; i++) {
++  s = fc->ddict[i];
++
++  /* Parse out (file#,deptype,N,EVR,Flags) */
++  ix = strtol(s, &se, 10);
++  assert(se != NULL);
++  deptype = *se++;
++  se++;
++  N = se;
++  while (*se && *se != ' ')
++      se++;
++  *se++ = '\0';
++  EVR = se;
++  while (*se && *se != ' ')
++      se++;
++  *se++ = '\0';
++  Flags = strtol(se, NULL, 16);
++
++  switch (deptype) {
++  default:
++      /*@switchbreak@*/ break;
++  case 'P':   
++      ds = rpmdsSingle(RPMTAG_PROVIDENAME, N, EVR, Flags);
++      rpmdepPrint((char *)fc->fn[ix], ds, stdout);
++      (void)rpmdsFree(ds);
++      ds = NULL;
++      /*@switchbreak@*/ break;
++  case 'R':
++      ds = rpmdsSingle(RPMTAG_REQUIRENAME, N, EVR, Flags);
++      rpmdepPrint((char *)fc->fn[ix], ds, stdout);
++      (void)rpmdsFree(ds);
++      ds = NULL;
++      /*@switchbreak@*/ break;
++  }
++    }
++
++    fc = rpmfcFree(fc);
++
++    ec = 0;
++
++exit:
++    optCon = rpmcliFini(optCon);
++    return ec;
++}
+-- 
+1.7.4.1
+
index 64ae537..eeca823 100644 (file)
@@ -45,7 +45,7 @@ LIC_FILES_CHKSUM = "file://COPYING.LIB;md5=2d5025d4aa3495befef8f17206a5b0a1"
 DEPENDS = "bzip2 zlib db openssl elfutils expat libpcre attr acl popt ${extrarpmdeps}"
 extrarpmdeps = "python perl"
 extrarpmdeps_virtclass-native = "file-native"
-PR = "r32"
+PR = "r33"
 
 # 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...
@@ -68,6 +68,7 @@ SRC_URI = "http://www.rpm5.org/files/rpm/rpm-5.4/rpm-5.4.0-0.20101229.src.rpm;ex
           file://rpm-scriptletexechelper.patch \
           file://fix_for_automake_1.11.2.patch \
           file://pythondeps.sh \
+          file://rpmdeps-oecore.patch \
          "
 
 #         file://rpm-autoconf.patch \