8 #include <rpm/rpmcli.h>
9 #include <rpm/rpmlib.h>
10 #include <rpm/rpmbuild.h>
11 #include <rpm/rpmlog.h>
12 #include <rpm/rpmfileutil.h>
13 #include <rpm/rpmdb.h>
14 #include <rpm/rpmps.h>
15 #include <rpm/rpmts.h>
16 #include "build/rpmbuild_internal.h"
17 #include "lib/signature.h"
24 #define POPT_NOLANG -1012
25 #define POPT_RMSOURCE -1013
26 #define POPT_RMBUILD -1014
27 #define POPT_BUILDROOT -1015
28 #define POPT_TARGETPLATFORM -1016
29 #define POPT_NOBUILD -1017
30 #define POPT_RMSPEC -1019
31 #define POPT_NODIRTOKENS -1020
33 #define POPT_REBUILD 0x4220
34 #define POPT_RECOMPILE 0x4320
35 #define POPT_BA 0x6261
36 #define POPT_BB 0x6262
37 #define POPT_BC 0x6263
38 #define POPT_BI 0x6269
39 #define POPT_BL 0x626c
40 #define POPT_BP 0x6270
41 #define POPT_BS 0x6273
42 #define POPT_TA 0x7461
43 #define POPT_TB 0x7462
44 #define POPT_TC 0x7463
45 #define POPT_TI 0x7469
46 #define POPT_TL 0x746c
47 #define POPT_TP 0x7470
48 #define POPT_TS 0x7473
61 enum poptCallbackReason reason,
62 const struct poptOption * opt,
const char * arg,
87 buildMode = (((unsigned)opt->val) >> 8) & 0xff;
117 { NULL,
'\0', POPT_ARG_CALLBACK | POPT_CBFLAG_INC_DATA | POPT_CBFLAG_CONTINUE,
120 {
"bp", 0, POPT_ARGFLAG_ONEDASH, 0,
POPT_BP,
121 N_(
"build through %prep (unpack sources and apply patches) from <specfile>"),
123 {
"bc", 0, POPT_ARGFLAG_ONEDASH, 0,
POPT_BC,
124 N_(
"build through %build (%prep, then compile) from <specfile>"),
126 {
"bi", 0, POPT_ARGFLAG_ONEDASH, 0,
POPT_BI,
127 N_(
"build through %install (%prep, %build, then install) from <specfile>"),
129 {
"bl", 0, POPT_ARGFLAG_ONEDASH, 0,
POPT_BL,
130 N_(
"verify %files section from <specfile>"),
132 {
"ba", 0, POPT_ARGFLAG_ONEDASH, 0,
POPT_BA,
133 N_(
"build source and binary packages from <specfile>"),
135 {
"bb", 0, POPT_ARGFLAG_ONEDASH, 0,
POPT_BB,
136 N_(
"build binary package only from <specfile>"),
138 {
"bs", 0, POPT_ARGFLAG_ONEDASH, 0,
POPT_BS,
139 N_(
"build source package only from <specfile>"),
142 {
"tp", 0, POPT_ARGFLAG_ONEDASH, 0,
POPT_TP,
143 N_(
"build through %prep (unpack sources and apply patches) from <tarball>"),
145 {
"tc", 0, POPT_ARGFLAG_ONEDASH, 0,
POPT_TC,
146 N_(
"build through %build (%prep, then compile) from <tarball>"),
148 {
"ti", 0, POPT_ARGFLAG_ONEDASH, 0,
POPT_TI,
149 N_(
"build through %install (%prep, %build, then install) from <tarball>"),
151 {
"tl", 0, POPT_ARGFLAG_ONEDASH|POPT_ARGFLAG_DOC_HIDDEN, 0,
POPT_TL,
152 N_(
"verify %files section from <tarball>"),
154 {
"ta", 0, POPT_ARGFLAG_ONEDASH, 0,
POPT_TA,
155 N_(
"build source and binary packages from <tarball>"),
157 {
"tb", 0, POPT_ARGFLAG_ONEDASH, 0,
POPT_TB,
158 N_(
"build binary package only from <tarball>"),
160 {
"ts", 0, POPT_ARGFLAG_ONEDASH, 0,
POPT_TS,
161 N_(
"build source package only from <tarball>"),
165 N_(
"build binary package from <source package>"),
166 N_(
"<source package>") },
168 N_(
"build through %install (%prep, %build, then install) from <source package>"),
169 N_(
"<source package>") },
172 N_(
"override build root"),
"DIRECTORY" },
174 N_(
"remove build tree when done"), NULL},
176 N_(
"ignore ExcludeArch: directives from spec file"), NULL},
177 {
"fsmdebug",
'\0', (POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN), &
_fsm_debug, -1,
178 N_(
"debug file state machine"), NULL},
180 N_(
"do not execute any stages of the build"), NULL },
181 {
"nodeps",
'\0', POPT_ARG_VAL, &
noDeps, 1,
182 N_(
"do not verify build dependencies"), NULL },
184 N_(
"generate package header(s) compatible with (legacy) rpm v3 packaging"),
188 N_(
"do not execute %clean stage of the build"), NULL },
190 N_(
"do not execute %check stage of the build"), NULL },
192 {
"nolang",
'\0', POPT_ARGFLAG_DOC_HIDDEN, 0,
POPT_NOLANG,
193 N_(
"do not accept i18N msgstr's from specfile"), NULL},
195 N_(
"remove sources when done"), NULL},
197 N_(
"remove specfile when done"), NULL},
198 {
"short-circuit",
'\0', POPT_ARG_VAL, &
shortCircuit, 1,
199 N_(
"skip straight to specified stage (only for c,i)"), NULL },
201 N_(
"override target platform"),
"CPU-VENDOR-OS" },
218 N_(
"Build options with [ <specfile> | <tarball> | <source package> ]:"),
221 {
"quiet",
'\0', POPT_ARGFLAG_DOC_HIDDEN, &
quiet, 0, NULL, NULL},
224 N_(
"Common options for all rpm modes and executables:"),
254 f = fopen(specfile,
"r");
257 specfile, strerror(errno));
260 count = fread(buf,
sizeof(buf[0]),
sizeof(buf), f);
267 for (s = buf; count--; s++) {
278 if (checking && !(isprint(*s) || isspace(*s)))
return 0;
281 if (checking && !(isprint(*s) || isspace(*s)) && *(
unsigned char *)s < 32)
return 0;
295 char *specFile = NULL;
301 int gotspec = 0, res;
302 static const char *tryspec[] = {
"Specfile",
"\\*.spec", NULL };
305 tmpSpecFile =
rpmGetPath(
"%{_specdir}/",
"rpm-spec.XXXXXX", NULL);
307 (void) close(mkstemp(tmpSpecFile));
309 for (spec = tryspec; *spec != NULL; spec++) {
313 cmd =
rpmExpand(
"%{uncompress: ", arg,
"} | ",
314 "%{__tar} xOvf - --wildcards ", *spec,
315 " 2>&1 > ", tmpSpecFile, NULL);
317 if (!(fp = popen(cmd,
"r"))) {
322 fok = fgets(tarbuf,
sizeof(tarbuf) - 1, fp);
324 if (!fok || strncmp(fok,
"tar: ", 5) != 0)
328 gotspec = (fok != NULL) &&
isSpecFile(tmpSpecFile);
341 specBase = basename(tarbuf);
343 specBase[strlen(specBase)-1] =
'\0';
345 rasprintf(&specFile,
"%s/%s", specDir, specBase);
346 res = rename(tmpSpecFile, specFile);
350 tmpSpecFile, specFile);
356 umask(mask = umask(0));
357 (void) chmod(specFile, 0666 & ~mask);
361 (void) unlink(tmpSpecFile);
370 char * buildRootURL = NULL;
371 char * specFile = NULL;
381 const char * buildtree =
"%{_topdir}:%{_specdir}:%{_sourcedir}:%{_builddir}:%{_rpmdir}:%{_srcrpmdir}:%{_buildrootdir}";
388 char *srcdir = NULL, *dir;
402 srcdir = dirname(dir);
409 if (*specFile !=
'/') {
419 if (stat(specFile, &st) < 0) {
423 if (! S_ISREG(st.st_mode)) {
431 _(
"File %s does not appear to be a specfile.\n"), specFile);
437 rc = unlink(specFile);
442 #define _anyarch(_f) \
443 (((_f)&(RPMBUILD_PREP|RPMBUILD_BUILD|RPMBUILD_INSTALL|RPMBUILD_PACKAGEBINARY)) == 0)
466 char *fn =
rpmGetPath(
"%{_srcrpmdir}/", spec->sourceRpmName,NULL);
475 char *binFormat =
rpmGetPath(
"%{_rpmfilename}", NULL);
477 const char *errorString;
493 (void) unlink(specFile);
507 #define buildCleanMask (RPMBUILD_RMSOURCE|RPMBUILD_RMSPEC)
527 printf(
_(
"Building target platforms: %s\n"), targets);
532 if (*(target + 1) == NULL)
535 printf(
_(
"Building for target %s\n"), *target);
557 int main(
int argc,
char *argv[])
563 const char *pkg = NULL;
565 poptContext optCon =
rpmcliInit(argc, argv, optionsTable);
568 if (ba->
buildAmount && poptPeekArg(optCon) == NULL) {
581 argerror(
_(
"arguments to --root (-r) must begin with a /"));
606 while ((pkg = poptGetArg(optCon))) {
607 char * specFile = NULL;
616 specFile =
_free(specFile);
654 while ((pkg = poptGetArg(optCon))) {
static struct poptOption rpmBuildPoptTable[]
static rpmBuildFlags nobuildAmount
const char * rpmcliRcfile
void printUsage(poptContext con, FILE *fp, int flags)
static int buildForTarget(rpmts ts, const char *arg, BTA_t ba)
static rpmSpecFlags spec_flags
static int build(rpmts ts, const char *arg, BTA_t ba, const char *rcfile)
static struct rpmBuildArguments_s rpmBTArgs
rpmSpec rpmSpecParse(const char *specFile, rpmSpecFlags flags, const char *buildRoot)
Parse spec file into spec control structure.
char * rpmGetCwd(void)
Like getcwd() but the result is malloced.
rpmts rpmtsFree(rpmts ts)
Destroy transaction set, closing the database as well.
rpmSpecPkg rpmSpecPkgIterNext(rpmSpecPkgIter iter)
static int isSpecFile(const char *specfile)
void addMacro(rpmMacroContext mc, const char *n, const char *o, const char *b, int level)
Add macro to context.
poptContext rpmcliInit(int argc, char *const argv[], struct poptOption *optionsTable)
Initialize most everything needed by an rpm CLI executable context.
Header rpmSpecPkgHeader(rpmSpecPkg pkg)
struct Package_s * rpmSpecPkg
static ARGV_t build_targets
rpmBuildPkgFlags pkgFlags
struct rpmts_s * rpmts
The main types involved in transaction manipulation.
static void buildArgCallback(poptContext con, enum poptCallbackReason reason, const struct poptOption *opt, const char *arg, const void *data)
rpmps rpmpsFree(rpmps ps)
Destroy a problem set.
#define POPT_TARGETPLATFORM
ARGV_t argvFree(ARGV_t argv)
Destroy an argv array.
rpmts rpmtsCreate(void)
Create an empty transaction set.
rpmQueryFlags rpmcliQueryFlags
Bit(s) from common command line options.
char * rpmExpand(const char *arg,...) RPM_GNUC_NULL_TERMINATED
Return (malloc'ed) concatenated macro expansion(s).
rpmSpec rpmSpecFree(rpmSpec spec)
Destroy Spec structure.
int rpmInstallSource(rpmts ts, const char *arg, char **specFilePtr, char **cookie)
Install source rpm package.
poptContext rpmcliFini(poptContext optCon)
Destroy most everything needed by an rpm CLI executable context.
const char * rpmcliPipeOutput
void argerror(const char *desc)
rpmBuildFlags buildAmount
rpmSpecPkgIter rpmSpecPkgIterInit(rpmSpec spec)
int main(int argc, char *argv[])
char * rpmGenPath(const char *urlroot, const char *urlmdir, const char *urlfile)
Merge 3 args into path, any or all of which may be a url.
int rpmReadConfigFiles(const char *file, const char *target)
Read macro configuration file(s) for a target.
static int rstreq(const char *s1, const char *s2)
Test for string equality.
static char * getTarSpec(const char *arg)
char * rpmGetPath(const char *path,...) RPM_GNUC_NULL_TERMINATED
Return (malloc'ed) expanded, canonicalized, file path.
char * rstrscat(char **dest, const char *arg,...) RPM_GNUC_NULL_TERMINATED
Concatenate multiple strings with dynamically (re)allocated memory.
int rasprintf(char **strp, const char *fmt,...) RPM_GNUC_PRINTF(2
asprintf() clone
struct headerToken_s * Header
RPM header and data retrieval types.
const char * rpmtsRootDir(rpmts ts)
Get transaction rootDir, i.e.
int rpmExpandNumeric(const char *arg)
Return macro expansion as a numeric value.
static struct poptOption optionsTable[]
const char * rpmcliRootDir
rpmVSFlags rpmtsSetVSFlags(rpmts ts, rpmVSFlags vsflags)
Set verify signatures flag(s).
void rpmlog(int code, const char *fmt,...) RPM_GNUC_PRINTF(2
Generate a log message using FMT string and option arguments.
rpmRC rpmSpecBuild(rpmSpec spec, BTA_t buildArgs)
Spec build stages state machine driver.
#define RPMCLI_POPT_FORCE
struct poptOption rpmcliAllPoptTable[]
Popt option table for options shared by all modes and executables.
char *const * ARGV_const_t
#define _RPMVSF_NOSIGNATURES
static int checkSpec(rpmts ts, rpmSpec spec)
struct rpmSpecIter_s * rpmSpecPkgIter
rpmps rpmSpecCheckDeps(rpmts ts, rpmSpec spec)
Verify build depencies of a spec against.
#define _RPMVSF_NODIGESTS
int argvSplit(ARGV_t *argvp, const char *str, const char *seps)
Split a string into an argv array.
#define rpmSetVerbosity(_lvl)
void rpmFreeMacros(rpmMacroContext mc)
Destroy macro context.
int rpmMkdirs(const char *root, const char *pathstr)
Create several directories (including parents if needed) in one go.
void rpmFreeRpmrc(void)
Destroy rpmrc arch/os compatibility tables.
int rpmtsSetRootDir(rpmts ts, const char *rootDir)
Set transaction rootDir, i.e.
void rpmpsPrint(FILE *fp, rpmps ps)
Print problems to file handle.
char * argvJoin(ARGV_const_t argv, const char *sep)
Join an argv array into a string.
struct rpmSpec_s * rpmSpec