diff options
Diffstat (limited to 'build')
-rw-r--r-- | build/rpmfc.c | 41 | ||||
-rw-r--r-- | build/rpmfc.h | 7 |
2 files changed, 48 insertions, 0 deletions
diff --git a/build/rpmfc.c b/build/rpmfc.c index 261a09ee3..f8e340288 100644 --- a/build/rpmfc.c +++ b/build/rpmfc.c @@ -58,6 +58,7 @@ struct rpmfc_s { rpmds provides; /*!< (no. provides) package provides */ rpmds requires; /*!< (no. requires) package requires */ + rpmds supplements; /*!< (no. supplements) package supplements */ }; struct rpmfcTokens_s { @@ -546,6 +547,22 @@ static int rpmfcHelperRequires(rpmfc fc, const char * nsdep) return 0; } +/** + * Run per-interpreter Supplements: dependency helper. + * @param fc file classifier + * @param nsdep class name for interpreter (e.g. "perl") + * @return 0 + */ +static int rpmfcHelperSupplements(rpmfc fc, const char * nsdep) +{ + if (fc->skipReq) + return 0; + + rpmfcHelper(fc, nsdep, "supplements", &fc->supplements, RPMSENSE_FIND_REQUIRES|RPMSENSE_STRONG|RPMSENSE_MISSINGOK, RPMTAG_ENHANCESNAME); + + return 0; +} + /* Only used for elf coloring and controlling RPMTAG_FILECLASS inclusion now */ static const struct rpmfcTokens_s rpmfcTokens[] = { { "directory", RPMFC_INCLUDE }, @@ -763,6 +780,7 @@ rpmfc rpmfcFree(rpmfc fc) rpmdsFree(fc->provides); rpmdsFree(fc->requires); + rpmdsFree(fc->supplements); memset(fc, 0, sizeof(*fc)); /* trash and burn */ free(fc); } @@ -794,6 +812,11 @@ rpmds rpmfcRequires(rpmfc fc) return (fc != NULL ? fc->requires : NULL); } +rpmds rpmfcSupplements(rpmfc fc) +{ + return (fc != NULL ? fc->supplements : NULL); +} + rpmRC rpmfcApply(rpmfc fc) { const char * s; @@ -814,6 +837,7 @@ rpmRC rpmfcApply(rpmfc fc) for (ARGV_t fattr = fc->fattrs[fc->ix]; fattr && *fattr; fattr++) { rpmfcHelperProvides(fc, *fattr); rpmfcHelperRequires(fc, *fattr); + rpmfcHelperSupplements(fc, *fattr); } } /* No more additions after this, freeze pool to minimize memory use */ @@ -858,6 +882,11 @@ rpmRC rpmfcApply(rpmfc fc) dix = rpmdsFind(fc->requires, ds); rpmdsFree(ds); break; + case 'S': + ds = rpmdsSingle(RPMTAG_ENHANCESNAME, N, EVR, Flags); + dix = rpmdsFind(fc->supplements, ds); + ds = rpmdsFree(ds); + break; } if (dix < 0) @@ -1338,6 +1367,18 @@ rpmRC rpmfcGenerateDepends(const rpmSpec spec, Package pkg) } } + /* Add Supplements: */ + if (!fc->skipReq) { + rpmds pi = rpmdsInit(fc->supplements); + while (rpmdsNext(pi) >= 0) { + rpmsenseFlags flags = rpmdsFlags(pi); + + headerPutString(pkg->header, RPMTAG_ENHANCESNAME, rpmdsN(pi)); + headerPutString(pkg->header, RPMTAG_ENHANCESVERSION, rpmdsEVR(pi)); + headerPutUint32(pkg->header, RPMTAG_ENHANCESFLAGS, &flags, 1); + } + } + /* Add dependency dictionary(#dependencies) */ if (rpmtdFromArgi(&td, RPMTAG_DEPENDSDICT, fc->ddictx)) { headerPut(pkg->header, &td, HEADERPUT_DEFAULT); diff --git a/build/rpmfc.h b/build/rpmfc.h index f3d3e6645..a05fd0e78 100644 --- a/build/rpmfc.h +++ b/build/rpmfc.h @@ -106,6 +106,13 @@ rpmds rpmfcProvides(rpmfc fc); */ rpmds rpmfcRequires(rpmfc fc); +/** \ingroup rpmfc + * Retrieve file classification supplements + * @param fc file classifier + * @return rpmds dependency set of fc requires + */ +rpmds rpmfcSupplements(rpmfc fc); + #ifdef __cplusplus } #endif |