X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=rpmbuild.c;h=4fb4289f834359b64d81a3340844c6e13f98be03;hb=edf906fa2e72b3f33e00a2262962be62e01df9db;hp=8503d768d20049588dcb15dc67d7254b2114a467;hpb=05547d1f30b529b82dba26655c68a451bafc3624;p=platform%2Fupstream%2Frpm.git diff --git a/rpmbuild.c b/rpmbuild.c index 8503d76..4fb4289 100644 --- a/rpmbuild.c +++ b/rpmbuild.c @@ -26,7 +26,6 @@ static struct rpmBuildArguments_s rpmBTArgs; #define POPT_BUILDROOT -1015 #define POPT_TARGETPLATFORM -1016 #define POPT_NOBUILD -1017 -#define POPT_SHORTCIRCUIT -1018 #define POPT_RMSPEC -1019 #define POPT_NODIRTOKENS -1020 @@ -49,6 +48,14 @@ static struct rpmBuildArguments_s rpmBTArgs; extern int _fsm_debug; +static rpmSpecFlags spec_flags = 0; /*!< Bit(s) to control spec parsing. */ +static int noDeps = 0; /*!< from --nodeps */ +static int shortCircuit = 0; /*!< from --short-circuit */ +static char buildMode = 0; /*!< Build mode (one of "btBC") */ +static char buildChar = 0; /*!< Build stage (one of "abcilps ") */ +static rpmBuildFlags nobuildAmount = 0; /*!< Build stage disablers */ +static ARGV_t build_targets = NULL; /*!< Target platform(s) */ + static void buildArgCallback( poptContext con, enum poptCallbackReason reason, const struct poptOption * opt, const char * arg, @@ -74,17 +81,16 @@ static void buildArgCallback( poptContext con, case POPT_TP: case POPT_TS: if (opt->val == POPT_BS || opt->val == POPT_TS) - rba->noDeps = 1; - if (rba->buildMode == '\0' && rba->buildChar == '\0') { - rba->buildMode = (((unsigned)opt->val) >> 8) & 0xff; - rba->buildChar = (opt->val ) & 0xff; + noDeps = 1; + if (buildMode == '\0' && buildChar == '\0') { + buildMode = (((unsigned)opt->val) >> 8) & 0xff; + buildChar = (opt->val ) & 0xff; } break; case POPT_NODIRTOKENS: rba->pkgFlags |= RPMBUILD_PKG_NODIRTOKENS; break; case POPT_NOBUILD: rba->buildAmount |= RPMBUILD_NOBUILD; break; - case POPT_NOLANG: rba->specFlags |= RPMSPEC_NOLANG; break; - case POPT_SHORTCIRCUIT: rba->shortCircuit = 1; break; + case POPT_NOLANG: spec_flags |= RPMSPEC_NOLANG; break; case POPT_RMSOURCE: rba->buildAmount |= RPMBUILD_RMSOURCE; break; case POPT_RMSPEC: rba->buildAmount |= RPMBUILD_RMSPEC; break; case POPT_RMBUILD: rba->buildAmount |= RPMBUILD_RMBUILD; break; @@ -96,27 +102,11 @@ static void buildArgCallback( poptContext con, rba->buildRootOverride = xstrdup(arg); break; case POPT_TARGETPLATFORM: - rstrscat(&rba->targets, rba->targets ? "," : "", arg, NULL); - break; - - case RPMCLI_POPT_NODIGEST: - rba->qva_flags |= VERIFY_DIGEST; - break; - - case RPMCLI_POPT_NOSIGNATURE: - rba->qva_flags |= VERIFY_SIGNATURE; - break; - - case RPMCLI_POPT_NOHDRCHK: - rba->qva_flags |= VERIFY_HDRCHK; - break; - - case RPMCLI_POPT_NODEPS: - rba->noDeps = 1; + argvSplit(&build_targets, arg, ","); break; case RPMCLI_POPT_FORCE: - rba->specFlags |= RPMSPEC_FORCE; + spec_flags |= RPMSPEC_FORCE; break; } @@ -187,18 +177,16 @@ static struct poptOption rpmBuildPoptTable[] = { N_("debug file state machine"), NULL}, { "nobuild", '\0', 0, 0, POPT_NOBUILD, N_("do not execute any stages of the build"), NULL }, - { "nodeps", '\0', 0, NULL, RPMCLI_POPT_NODEPS, + { "nodeps", '\0', POPT_ARG_VAL, &noDeps, 1, N_("do not verify build dependencies"), NULL }, { "nodirtokens", '\0', 0, 0, POPT_NODIRTOKENS, N_("generate package header(s) compatible with (legacy) rpm v3 packaging"), NULL}, - { "nodigest", '\0', POPT_ARGFLAG_DOC_HIDDEN, 0, RPMCLI_POPT_NODIGEST, - N_("don't verify package digest(s)"), NULL }, - { "nohdrchk", '\0', POPT_ARGFLAG_DOC_HIDDEN, 0, RPMCLI_POPT_NOHDRCHK, - N_("don't verify database header(s) when retrieved"), NULL }, - { "nosignature", '\0', POPT_ARGFLAG_DOC_HIDDEN, 0, RPMCLI_POPT_NOSIGNATURE, - N_("don't verify package signature(s)"), NULL }, + { "noclean", '\0', POPT_BIT_SET, &nobuildAmount, RPMBUILD_CLEAN, + N_("do not execute %clean stage of the build"), NULL }, + { "nocheck", '\0', POPT_BIT_SET, &nobuildAmount, RPMBUILD_CHECK, + N_("do not execute %check stage of the build"), NULL }, { "nolang", '\0', POPT_ARGFLAG_DOC_HIDDEN, 0, POPT_NOLANG, N_("do not accept i18N msgstr's from specfile"), NULL}, @@ -206,7 +194,7 @@ static struct poptOption rpmBuildPoptTable[] = { N_("remove sources when done"), NULL}, { "rmspec", '\0', 0, 0, POPT_RMSPEC, N_("remove specfile when done"), NULL}, - { "short-circuit", '\0', 0, 0, POPT_SHORTCIRCUIT, + { "short-circuit", '\0', POPT_ARG_VAL, &shortCircuit, 1, N_("skip straight to specified stage (only for c,i)"), NULL }, { "target", '\0', POPT_ARG_STRING, 0, POPT_TARGETPLATFORM, N_("override target platform"), "CPU-VENDOR-OS" }, @@ -240,30 +228,17 @@ static struct poptOption optionsTable[] = { POPT_TABLEEND }; -static int checkSpec(rpmts ts, Header h) +static int checkSpec(rpmts ts, rpmSpec spec) { - rpmps ps; int rc; + rpmps ps = rpmSpecCheckDeps(ts, spec); - if (!headerIsEntry(h, RPMTAG_REQUIRENAME) - && !headerIsEntry(h, RPMTAG_CONFLICTNAME)) - return 0; - - rc = rpmtsAddInstallElement(ts, h, NULL, 0, NULL); - - rc = rpmtsCheck(ts); - - ps = rpmtsProblems(ts); - if (rc == 0 && rpmpsNumProblems(ps) > 0) { + if (ps) { rpmlog(RPMLOG_ERR, _("Failed build dependencies:\n")); rpmpsPrint(NULL, ps); - rc = 1; } - ps = rpmpsFree(ps); - - /* XXX nuke the added package. */ - rpmtsClean(ts); - + rc = (ps != NULL); + rpmpsFree(ps); return rc; } @@ -276,7 +251,7 @@ static int isSpecFile(const char * specfile) int checking; f = fopen(specfile, "r"); - if (f == NULL || ferror(f)) { + if (f == NULL) { rpmlog(RPMLOG_ERR, _("Unable to open spec file %s: %s\n"), specfile, strerror(errno)); return 0; @@ -320,7 +295,7 @@ static char * getTarSpec(const char *arg) char *specDir; char *specBase; char *tmpSpecFile; - const char **try; + const char **spec; char tarbuf[BUFSIZ]; int gotspec = 0, res; static const char *tryspec[] = { "Specfile", "\\*.spec", NULL }; @@ -330,12 +305,12 @@ static char * getTarSpec(const char *arg) (void) close(mkstemp(tmpSpecFile)); - for (try = tryspec; *try != NULL; try++) { + for (spec = tryspec; *spec != NULL; spec++) { FILE *fp; char *cmd; cmd = rpmExpand("%{uncompress: ", arg, "} | ", - "%{__tar} xOvf - --wildcards ", *try, + "%{__tar} xOvf - --wildcards ", *spec, " 2>&1 > ", tmpSpecFile, NULL); if (!(fp = popen(cmd, "r"))) { @@ -396,11 +371,7 @@ static int buildForTarget(rpmts ts, const char * arg, BTA_t ba) rpmSpec spec = NULL; int rc = 1; /* assume failure */ int justRm = ((buildAmount & ~(RPMBUILD_RMSOURCE|RPMBUILD_RMSPEC)) == 0); - rpmSpecFlags specFlags = ba->specFlags; - -#ifndef DYING - rpmSetTables(RPM_MACHTABLE_BUILDARCH, RPM_MACHTABLE_BUILDOS); -#endif + rpmSpecFlags specFlags = spec_flags; if (ba->buildRootOverride) buildRootURL = rpmGenPath(NULL, ba->buildRootOverride, NULL); @@ -412,7 +383,7 @@ static int buildForTarget(rpmts ts, const char * arg, BTA_t ba) goto exit; } - if (ba->buildMode == 't') { + if (buildMode == 't') { char *srcdir = NULL, *dir; specFile = getTarSpec(arg); @@ -437,7 +408,7 @@ static int buildForTarget(rpmts ts, const char * arg, BTA_t ba) if (*specFile != '/') { char *cwd = rpmGetCwd(); char *s = NULL; - rasprintf(&s, "%s/%s", cwd, arg); + rasprintf(&s, "%s/%s", cwd, specFile); free(cwd); free(specFile); specFile = s; @@ -479,15 +450,15 @@ static int buildForTarget(rpmts ts, const char * arg, BTA_t ba) } /* Check build prerequisites if necessary, unless disabled */ - if (!justRm && !ba->noDeps && checkSpec(ts, spec->sourceHeader)) { + if (!justRm && !noDeps && checkSpec(ts, spec)) { goto exit; } - if (rpmSpecBuild(ba, spec)) { + if (rpmSpecBuild(spec, ba)) { goto exit; } - if (ba->buildMode == 't') + if (buildMode == 't') (void) unlink(specFile); rc = 0; @@ -500,23 +471,22 @@ exit: static int build(rpmts ts, const char * arg, BTA_t ba, const char * rcfile) { - char *t, *te; int rc = 0; - char * targets = ba->targets; + char * targets = argvJoin(build_targets, ","); #define buildCleanMask (RPMBUILD_RMSOURCE|RPMBUILD_RMSPEC) int cleanFlags = ba->buildAmount & buildCleanMask; rpmVSFlags vsflags, ovsflags; vsflags = rpmExpandNumeric("%{_vsflags_build}"); - if (ba->qva_flags & VERIFY_DIGEST) + if (rpmcliQueryFlags & VERIFY_DIGEST) vsflags |= _RPMVSF_NODIGESTS; - if (ba->qva_flags & VERIFY_SIGNATURE) + if (rpmcliQueryFlags & VERIFY_SIGNATURE) vsflags |= _RPMVSF_NOSIGNATURES; - if (ba->qva_flags & VERIFY_HDRCHK) + if (rpmcliQueryFlags & VERIFY_HDRCHK) vsflags |= RPMVSF_NOHDRCHK; ovsflags = rpmtsSetVSFlags(ts, vsflags); - if (targets == NULL) { + if (build_targets == NULL) { rc = buildForTarget(ts, arg, ba); goto exit; } @@ -526,36 +496,29 @@ static int build(rpmts ts, const char * arg, BTA_t ba, const char * rcfile) printf(_("Building target platforms: %s\n"), targets); ba->buildAmount &= ~buildCleanMask; - for (t = targets; *t != '\0'; t = te) { - char *target; - if ((te = strchr(t, ',')) == NULL) - te = t + strlen(t); - target = xmalloc(te-t+1); - strncpy(target, t, (te-t)); - target[te-t] = '\0'; - if (*te != '\0') - te++; - else /* XXX Perform clean-up after last target build. */ + for (ARGV_const_t target = build_targets; target && *target; target++) { + /* Perform clean-up after last target build. */ + if (*(target + 1) == NULL) ba->buildAmount |= cleanFlags; - printf(_("Building for target %s\n"), target); + printf(_("Building for target %s\n"), *target); /* Read in configuration for target. */ rpmFreeMacros(NULL); rpmFreeRpmrc(); - (void) rpmReadConfigFiles(rcfile, target); - free(target); + (void) rpmReadConfigFiles(rcfile, *target); rc = buildForTarget(ts, arg, ba); if (rc) break; } exit: - vsflags = rpmtsSetVSFlags(ts, ovsflags); + rpmtsSetVSFlags(ts, ovsflags); /* Restore original configuration. */ rpmFreeMacros(NULL); rpmFreeRpmrc(); (void) rpmReadConfigFiles(rcfile, NULL); + free(targets); return rc; } @@ -575,7 +538,7 @@ int main(int argc, char *argv[]) exit(EXIT_FAILURE); } - switch (ba->buildMode) { + switch (buildMode) { case 'b': bigMode = MODE_BUILD; break; case 't': bigMode = MODE_TARBUILD; break; case 'B': bigMode = MODE_REBUILD; break; @@ -606,6 +569,7 @@ int main(int argc, char *argv[]) ba->buildAmount |= RPMBUILD_CLEAN; ba->buildAmount |= RPMBUILD_RMBUILD; } + ba->buildAmount &= ~(nobuildAmount); while ((pkg = poptGetArg(optCon))) { char * specFile = NULL; @@ -625,22 +589,22 @@ int main(int argc, char *argv[]) break; case MODE_BUILD: case MODE_TARBUILD: - switch (ba->buildChar) { + switch (buildChar) { case 'a': ba->buildAmount |= RPMBUILD_PACKAGESOURCE; case 'b': ba->buildAmount |= RPMBUILD_PACKAGEBINARY; ba->buildAmount |= RPMBUILD_CLEAN; - if ((ba->buildChar == 'b') && ba->shortCircuit) + if ((buildChar == 'b') && shortCircuit) break; case 'i': ba->buildAmount |= RPMBUILD_INSTALL; ba->buildAmount |= RPMBUILD_CHECK; - if ((ba->buildChar == 'i') && ba->shortCircuit) + if ((buildChar == 'i') && shortCircuit) break; case 'c': ba->buildAmount |= RPMBUILD_BUILD; - if ((ba->buildChar == 'c') && ba->shortCircuit) + if ((buildChar == 'c') && shortCircuit) break; case 'p': ba->buildAmount |= RPMBUILD_PREP; @@ -653,6 +617,7 @@ int main(int argc, char *argv[]) ba->buildAmount |= RPMBUILD_PACKAGESOURCE; break; } + ba->buildAmount &= ~(nobuildAmount); while ((pkg = poptGetArg(optCon))) { ba->rootdir = rpmcliRootDir; @@ -666,10 +631,11 @@ int main(int argc, char *argv[]) break; } - ts = rpmtsFree(ts); - finishPipe(); - ba->buildRootOverride = _free(ba->buildRootOverride); - ba->targets = _free(ba->targets); + rpmtsFree(ts); + if (finishPipe()) + ec = EXIT_FAILURE; + free(ba->buildRootOverride); + argvFree(build_targets); rpmcliFini(optCon);