Merge "Add support for global LDFLAGS" into tizen
[platform/upstream/rpm.git] / rpmbuild.c
index 94021e8..4fb4289 100644 (file)
@@ -48,9 +48,13 @@ static struct rpmBuildArguments_s rpmBTArgs;
 
 extern int _fsm_debug;
 
-static rpmVerifyFlags qva_flags = 0;   /*!< Bit(s) to control verification */
+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,
@@ -78,15 +82,15 @@ static void buildArgCallback( poptContext con,
     case POPT_TS:
        if (opt->val == POPT_BS || opt->val == POPT_TS)
            noDeps = 1;
-       if (rba->buildMode == '\0' && rba->buildChar == '\0') {
-           rba->buildMode = (((unsigned)opt->val) >> 8) & 0xff;
-           rba->buildChar = (opt->val     ) & 0xff;
+       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_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;
@@ -98,23 +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:
-       qva_flags |= VERIFY_DIGEST;
-       break;
-
-    case RPMCLI_POPT_NOSIGNATURE:
-       qva_flags |= VERIFY_SIGNATURE;
-       break;
-
-    case RPMCLI_POPT_NOHDRCHK:
-       qva_flags |= VERIFY_HDRCHK;
+       argvSplit(&build_targets, arg, ",");
        break;
 
     case RPMCLI_POPT_FORCE:
-       rba->specFlags |= RPMSPEC_FORCE;
+       spec_flags |= RPMSPEC_FORCE;
        break;
 
     }
@@ -191,12 +183,10 @@ static struct poptOption rpmBuildPoptTable[] = {
        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},
@@ -238,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;
 }
 
@@ -274,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;
@@ -318,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 };
@@ -328,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"))) {
@@ -394,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);
@@ -410,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);
@@ -435,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;
@@ -477,15 +450,15 @@ static int buildForTarget(rpmts ts, const char * arg, BTA_t ba)
     }
 
     /* Check build prerequisites if necessary, unless disabled */
-    if (!justRm && !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;
 
@@ -498,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 (qva_flags & VERIFY_DIGEST)
+    if (rpmcliQueryFlags & VERIFY_DIGEST)
        vsflags |= _RPMVSF_NODIGESTS;
-    if (qva_flags & VERIFY_SIGNATURE)
+    if (rpmcliQueryFlags & VERIFY_SIGNATURE)
        vsflags |= _RPMVSF_NOSIGNATURES;
-    if (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;
     }
@@ -524,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;
 }
@@ -573,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;
@@ -604,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;
@@ -623,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') && shortCircuit)
+           if ((buildChar == 'b') && shortCircuit)
                break;
        case 'i':
            ba->buildAmount |= RPMBUILD_INSTALL;
            ba->buildAmount |= RPMBUILD_CHECK;
-           if ((ba->buildChar == 'i') && shortCircuit)
+           if ((buildChar == 'i') && shortCircuit)
                break;
        case 'c':
            ba->buildAmount |= RPMBUILD_BUILD;
-           if ((ba->buildChar == 'c') && shortCircuit)
+           if ((buildChar == 'c') && shortCircuit)
                break;
        case 'p':
            ba->buildAmount |= RPMBUILD_PREP;
@@ -651,6 +617,7 @@ int main(int argc, char *argv[])
            ba->buildAmount |= RPMBUILD_PACKAGESOURCE;
            break;
        }
+       ba->buildAmount &= ~(nobuildAmount);
 
        while ((pkg = poptGetArg(optCon))) {
            ba->rootdir = rpmcliRootDir;
@@ -664,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);