diff options
-rw-r--r-- | meta/classes/package_rpm.bbclass | 4 | ||||
-rw-r--r-- | meta/classes/rootfs_rpm.bbclass | 2 | ||||
-rw-r--r-- | meta/recipes-devtools/rpm/rpmresolve/rpmresolve.c | 69 |
3 files changed, 58 insertions, 17 deletions
diff --git a/meta/classes/package_rpm.bbclass b/meta/classes/package_rpm.bbclass index 50e9b31..b58ae85 100644 --- a/meta/classes/package_rpm.bbclass +++ b/meta/classes/package_rpm.bbclass @@ -235,9 +235,9 @@ process_pkg_list_rpm() { extraopt="-i" fi - rpmresolve $extraopt ${confbase}-base_archs.conf ${target_rootfs}/install/base_archs.pkglist >> ${target_rootfs}/install/${manifestpfx}.manifest + rpmresolve $extraopt ${confbase}-base_archs.conf ${target_rootfs}/install/base_archs.pkglist -o ${target_rootfs}/install/${manifestpfx}.manifest if [ -s ${target_rootfs}/install/ml_archs.pkglist ] ; then - rpmresolve $extraopt ${confbase}-ml_archs.conf ${target_rootfs}/install/ml_archs.pkglist >> ${target_rootfs}/install/${manifestpfx}_multilib.manifest + rpmresolve $extraopt ${confbase}-ml_archs.conf ${target_rootfs}/install/ml_archs.pkglist -o ${target_rootfs}/install/${manifestpfx}_multilib.manifest fi } diff --git a/meta/classes/rootfs_rpm.bbclass b/meta/classes/rootfs_rpm.bbclass index a03e9f3..c0207d8 100644 --- a/meta/classes/rootfs_rpm.bbclass +++ b/meta/classes/rootfs_rpm.bbclass @@ -151,7 +151,7 @@ list_installed_packages() { } rootfs_list_installed_depends() { - rpmresolve -d $INSTALL_ROOTFS_RPM/${rpmlibdir} + rpmresolve -t $INSTALL_ROOTFS_RPM/${rpmlibdir} } rootfs_install_packages() { diff --git a/meta/recipes-devtools/rpm/rpmresolve/rpmresolve.c b/meta/recipes-devtools/rpm/rpmresolve/rpmresolve.c index 568b689..3613ee5 100644 --- a/meta/recipes-devtools/rpm/rpmresolve/rpmresolve.c +++ b/meta/recipes-devtools/rpm/rpmresolve/rpmresolve.c @@ -36,6 +36,9 @@ #include <argv.h> #include <mire.h> +int debugmode; +FILE *outf; + int getPackageStr(rpmts ts, const char *NVRA, rpmTag tag, char **value) { int rc = -1; @@ -69,6 +72,8 @@ int loadTs(rpmts **ts, int *tsct, const char *dblistfn) listfile = 0; if(listfile) { + if(debugmode) + printf("DEBUG: reading database list file '%s'\n", dblistfn); *ts = malloc(sz * sizeof(rpmts)); FILE *f = fopen(dblistfn, "r" ); if(f) { @@ -87,6 +92,8 @@ int loadTs(rpmts **ts, int *tsct, const char *dblistfn) *ts = (rpmts *)realloc(*ts, sz); } + if(debugmode) + printf("DEBUG: opening database '%s'\n", line); char *dbpathm = malloc(strlen(line) + 10); sprintf(dbpathm, "_dbpath %s", line); rpmDefineMacro(NULL, dbpathm, RMIL_CMDLINE); @@ -113,6 +120,8 @@ int loadTs(rpmts **ts, int *tsct, const char *dblistfn) } } else { + if(debugmode) + printf("DEBUG: opening database '%s'\n", dblistfn); // Load from single database *ts = malloc(sizeof(rpmts)); char *dbpathm = malloc(strlen(dblistfn) + 10); @@ -164,13 +173,22 @@ int processPackages(rpmts *ts, int tscount, const char *packagelistfn, int ignor char *value = NULL; rc = getPackageStr(ts[i], keys[0], RPMTAG_PACKAGEORIGIN, &value); if(rc == 0) - printf("%s\n", value); + fprintf(outf, "%s\n", value); else fprintf(stderr, "Failed to get package origin for %s\n", line); found = 1; } else if( nkeys > 1 ) { - fprintf(stderr, "Multiple matches for %s!\n", line); + int keyindex = 0; + fprintf(stderr, "Multiple matches for %s:\n", line); + for( keyindex=0; keyindex<nkeys; keyindex++) { + char *value = NULL; + rc = getPackageStr(ts[i], keys[keyindex], RPMTAG_PACKAGEORIGIN, &value); + if(rc == 0) + fprintf(outf, " %s\n", value); + else + fprintf(stderr, " (%s)\n", keys[keyindex]); + } } } if(found) @@ -230,7 +248,7 @@ int printDepList(rpmts *ts, int tscount) int rc = 0; if( tscount > 1 ) - printf(">1 database specified with dependency list, using first only\n"); + fprintf(stderr, ">1 database specified with dependency list, using first only\n"); /* Get list of names */ rpmdb db = rpmtsGetRdb(ts[0]); @@ -274,17 +292,17 @@ int printDepList(rpmts *ts, int tscount) } if(prov) { if((int)reqflags[j] & 0x80000) - printf("%s|%s [REC]\n", name, prov); + fprintf(outf, "%s|%s [REC]\n", name, prov); else - printf("%s|%s\n", name, prov); + fprintf(outf, "%s|%s\n", name, prov); } else { rc = lookupProvider(ts[0], reqs[j], &prov); if(rc==0 && prov) { if((int)reqflags[j] & 0x80000) - printf("%s|%s [REC]\n", name, prov); + fprintf(outf, "%s|%s [REC]\n", name, prov); else - printf("%s|%s\n", name, prov); + fprintf(outf, "%s|%s\n", name, prov); free(prov); } } @@ -301,7 +319,7 @@ int printDepList(rpmts *ts, int tscount) void usage() { fprintf(stderr, "OpenEmbedded rpm resolver utility\n"); - fprintf(stderr, "syntax: rpmresolve [-i] [-d] <dblistfile> <packagelistfile>\n"); + fprintf(stderr, "syntax: rpmresolve [-i] [-d] [-t] <dblistfile> <packagelistfile>\n"); } int main(int argc, char **argv) @@ -313,16 +331,26 @@ int main(int argc, char **argv) int c; int ignoremissing = 0; int deplistmode = 0; + char *outfile = NULL; + + debugmode = 0; + outf = stdout; opterr = 0; - while ((c = getopt (argc, argv, "id")) != -1) { + while ((c = getopt (argc, argv, "itdo:")) != -1) { switch (c) { case 'i': ignoremissing = 1; break; - case 'd': + case 't': deplistmode = 1; break; + case 'd': + debugmode = 1; + break; + case 'o': + outfile = strdup(optarg); + break; case '?': if(isprint(optopt)) fprintf(stderr, "Unknown option `-%c'.\n", optopt); @@ -341,11 +369,18 @@ int main(int argc, char **argv) return 1; } + if( outfile ) { + if(debugmode) + printf("DEBUG: Using output file %s\n", outfile); + outf = fopen(outfile, "w"); + } + const char *dblistfn = argv[optind]; rpmcliInit(argc, argv, NULL); - //rpmSetVerbosity(RPMLOG_DEBUG); + if(debugmode) + rpmSetVerbosity(RPMLOG_DEBUG); rpmDefineMacro(NULL, "__dbi_txn create nofsync", RMIL_CMDLINE); @@ -363,15 +398,21 @@ int main(int argc, char **argv) else { if( argc - optind < 2 ) { fprintf(stderr, "Please specify package list file\n"); - return 1; } - const char *pkglistfn = argv[optind+1]; - rc = processPackages(ts, tscount, pkglistfn, ignoremissing); + else { + const char *pkglistfn = argv[optind+1]; + rc = processPackages(ts, tscount, pkglistfn, ignoremissing); + } } for(i=0; i<tscount; i++) (void) rpmtsCloseDB(ts[i]); free(ts); + if( outfile ) { + fclose(outf); + free(outfile); + } + return rc; } |