/* * Parses RPM spec file into Makefile fragment. See * * http://fedora.redhat.com/docs/drafts/rpm-guide-en/ch-programming-c.html * * Mark Huang * Copyright (C) 2006 The Trustees of Princeton University * * $Id: rollout.py,v 1.3 2005/06/21 19:12:44 mlhuang Exp $ */ #include #include #include #include #include #include #include #include #include /* the structure describing the options we take and the defaults */ static struct poptOption optionsTable[] = { { NULL, '\0', POPT_ARG_INCLUDE_TABLE, rpmcliAllPoptTable, 0, "Common options for all rpm modes and executables:", NULL }, POPT_AUTOALIAS POPT_AUTOHELP POPT_TABLEEND }; /* Stolen from rpm/build/spec.c:rpmspecQuery() */ Spec rpmspecGet(rpmts ts, const char * arg) { char * buildRoot = NULL; int recursing = 0; char * passPhrase = ""; char *cookie = NULL; int anyarch = 1; int force = 1; if (parseSpec(ts, arg, "/", buildRoot, recursing, passPhrase, cookie, anyarch, force)) { fprintf(stderr, "query of specfile %s failed, can't parse\n", arg); return NULL; } return rpmtsSpec(ts); } int main(int argc, char *const argv[]) { poptContext context; rpmts ts = NULL; QVA_t qva = &rpmQVKArgs; int ec = 0; Spec spec; struct Source *source; /* Parse common options for all rpm modes and executables */ context = rpmcliInit(argc, argv, optionsTable); /* Create transaction state */ ts = rpmtsCreate(); /* Parse spec file. The rpmcli functions don't allow you to * access the Spec structure directly, so we call our own * version of parseSpec() directly. */ spec = rpmspecGet(ts, argv[1]); if (spec && spec->sources) { for (source = spec->sources; source; source = source->next) { char fullSource[PATH_MAX]; strncpy(fullSource, source->fullSource, sizeof(fullSource)); printf("SOURCES += SOURCES/%s\n", basename(fullSource)); } } /* This is what would popt would do if --specfile were * specified. */ qva->qva_source |= RPMQV_SPECFILE; qva->qva_sourceCount++; qva->qva_mode = 'q'; qva->qva_specQuery = rpmspecQuery; /* Get SRPM name from name of first package */ qva->qva_queryFormat = "SRPM := SRPMS/%{name}-%{version}-%{release}.src.rpm\n"; if (spec && spec->packages) showQueryPackage(qva, ts, spec->packages->header); /* Print all packages */ qva->qva_queryFormat = "RPMS += RPMS/%{ARCH}/%{name}-%{version}-%{release}.%{ARCH}.rpm\n"; ec = rpmcliQuery(ts, qva, (const char **) &argv[1]); ts = rpmtsFree(ts); context = rpmcliFini(context); return ec; }