rpmRC buildSpec(rpmts ts, Spec spec, int what, int test) { rpmRC rc = RPMRC_OK; /* Generate a keypair lazily. */ if (spec->dig == NULL) spec->dig = pgpDigNew(RPMVSF_DEFAULT, PGPPUBKEYALGO_DSA); if (!spec->recursing && spec->BACount) { int x; /* When iterating over BANames, do the source */ /* packaging on the first run, and skip RMSOURCE altogether */ if (spec->BASpecs != NULL) for (x = 0; x < spec->BACount; x++) { if ((rc = buildSpec(ts, spec->BASpecs[x], (what & ~RPMBUILD_RMSOURCE) | (x ? 0 : (what & RPMBUILD_PACKAGESOURCE)), test))) { goto exit; } } } else { /* support "%track" script/section */ if ((what & RPMBUILD_TRACK) && (rc = doScript(spec, RPMBUILD_TRACK, NULL, NULL, test))) goto exit; if ((what & RPMBUILD_PREP) && (rc = doScript(spec, RPMBUILD_PREP, NULL, NULL, test))) goto exit; if ((what & RPMBUILD_BUILD) && (rc = doScript(spec, RPMBUILD_BUILD, NULL, NULL, test))) goto exit; if ((what & RPMBUILD_INSTALL) && (rc = doScript(spec, RPMBUILD_INSTALL, NULL, NULL, test))) goto exit; if ((what & RPMBUILD_CHECK) && (rc = doScript(spec, RPMBUILD_CHECK, NULL, NULL, test))) goto exit; if ((what & RPMBUILD_PACKAGESOURCE) && (rc = processSourceFiles(spec))) goto exit; if (((what & RPMBUILD_INSTALL) || (what & RPMBUILD_PACKAGEBINARY) || (what & RPMBUILD_FILECHECK)) && (rc = processBinaryFiles(spec, what & RPMBUILD_INSTALL, test))) goto exit; if (((what & RPMBUILD_PACKAGESOURCE) && !test) && (rc = packageSources(spec))) return rc; if (((what & RPMBUILD_PACKAGEBINARY) && !test) && (rc = packageBinaries(spec))) goto exit; if ((what & RPMBUILD_CLEAN) && (rc = doScript(spec, RPMBUILD_CLEAN, NULL, NULL, test))) goto exit; if ((what & RPMBUILD_RMBUILD) && (rc = doScript(spec, RPMBUILD_RMBUILD, NULL, NULL, test))) goto exit; } if (what & RPMBUILD_RMSOURCE) doRmSource(spec); if (what & RPMBUILD_RMSPEC) (void) Unlink(spec->specFile); #if defined(RPM_VENDOR_OPENPKG) /* auto-remove-source-directories */ /* In OpenPKG we use per-package %{_sourcedir} and %{_specdir} definitions (macros have trailing ".../%{name}"). On removal of source(s) and .spec file, this per-package directory would be kept (usually <prefix>/RPM/SRC/<name>/), because RPM does not know about this OpenPKG convention. So, let RPM try(!) to remove the two directories (if they are empty) and just ignore removal failures (if they are still not empty). */ if (what & RPMBUILD_RMSOURCE) { const char *pn; pn = rpmGetPath("%{_sourcedir}", NULL); Rmdir(pn); /* ignore error, it is ok if it fails (usually with ENOTEMPTY) */ pn = _free(pn); } if (what & RPMBUILD_RMSPEC) { const char *pn; pn = rpmGetPath("%{_specdir}", NULL); Rmdir(pn); /* ignore error, it is ok if it fails (usually with ENOTEMPTY) */ pn = _free(pn); } #endif exit: if (rc != RPMRC_OK && rpmlogGetNrecs() > 0) { rpmlog(RPMLOG_NOTICE, _("\n\nRPM build errors:\n")); rpmlogPrint(NULL); } return rc; }
static rpmRC buildSpec(BTA_t buildArgs, rpmSpec spec, int what) { rpmRC rc = RPMRC_OK; int test = (what & RPMBUILD_NOBUILD); char *cookie = buildArgs->cookie ? xstrdup(buildArgs->cookie) : NULL; /* XXX TODO: rootDir is only relevant during build, eliminate from spec */ spec->rootDir = buildArgs->rootdir; if (!spec->recursing && spec->BACount) { int x; /* When iterating over BANames, do the source */ /* packaging on the first run, and skip RMSOURCE altogether */ if (spec->BASpecs != NULL) for (x = 0; x < spec->BACount; x++) { if ((rc = buildSpec(buildArgs, spec->BASpecs[x], (what & ~RPMBUILD_RMSOURCE) | (x ? 0 : (what & RPMBUILD_PACKAGESOURCE))))) { goto exit; } } } else { int didBuild = (what & (RPMBUILD_PREP|RPMBUILD_BUILD|RPMBUILD_INSTALL)); if ((what & RPMBUILD_PREP) && (rc = doScript(spec, RPMBUILD_PREP, "%prep", getStringBuf(spec->prep), test))) goto exit; if ((what & RPMBUILD_BUILD) && (rc = doScript(spec, RPMBUILD_BUILD, "%build", getStringBuf(spec->build), test))) goto exit; if ((what & RPMBUILD_INSTALL) && (rc = doScript(spec, RPMBUILD_INSTALL, "%install", getStringBuf(spec->install), test))) goto exit; if ((what & RPMBUILD_CHECK) && (rc = doScript(spec, RPMBUILD_CHECK, "%check", getStringBuf(spec->check), test))) goto exit; if ((what & RPMBUILD_PACKAGESOURCE) && (rc = processSourceFiles(spec, buildArgs->pkgFlags))) goto exit; if (((what & RPMBUILD_INSTALL) || (what & RPMBUILD_PACKAGEBINARY) || (what & RPMBUILD_FILECHECK)) && (rc = processBinaryFiles(spec, buildArgs->pkgFlags, what & RPMBUILD_INSTALL, test))) goto exit; if (((what & RPMBUILD_INSTALL) || (what & RPMBUILD_PACKAGEBINARY)) && (rc = processBinaryPolicies(spec, test))) goto exit; if (((what & RPMBUILD_PACKAGESOURCE) && !test) && (rc = packageSources(spec, &cookie))) return rc; if (((what & RPMBUILD_PACKAGEBINARY) && !test) && (rc = packageBinaries(spec, cookie, (didBuild == 0)))) goto exit; if ((what & RPMBUILD_CLEAN) && (rc = doScript(spec, RPMBUILD_CLEAN, "%clean", getStringBuf(spec->clean), test))) goto exit; if ((what & RPMBUILD_RMBUILD) && (rc = doScript(spec, RPMBUILD_RMBUILD, "--clean", NULL, test))) goto exit; } if (what & RPMBUILD_RMSOURCE) doRmSource(spec); if (what & RPMBUILD_RMSPEC) (void) unlink(spec->specFile); exit: free(cookie); spec->rootDir = NULL; if (rc != RPMRC_OK && rpmlogGetNrecs() > 0) { rpmlog(RPMLOG_NOTICE, _("\n\nRPM build errors:\n")); rpmlogPrint(NULL); } rpmugFree(); return rc; }