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 "lib/signature.h" 23 #define POPT_NOLANG -1012 24 #define POPT_RMSOURCE -1013 25 #define POPT_RMBUILD -1014 26 #define POPT_BUILDROOT -1015 27 #define POPT_TARGETPLATFORM -1016 28 #define POPT_NOBUILD -1017 29 #define POPT_RMSPEC -1019 30 #define POPT_NODIRTOKENS -1020 31 #define POPT_BUILDINPLACE -1021 33 #define POPT_REBUILD 0x4262 34 #define POPT_RECOMPILE 0x4369 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_RA 0x4261 43 #define POPT_RB 0x4262 44 #define POPT_RC 0x4263 45 #define POPT_RI 0x4269 46 #define POPT_RL 0x426c 47 #define POPT_RP 0x4270 48 #define POPT_RS 0x4273 49 #define POPT_TA 0x7461 50 #define POPT_TB 0x7462 51 #define POPT_TC 0x7463 52 #define POPT_TI 0x7469 53 #define POPT_TL 0x746c 54 #define POPT_TP 0x7470 55 #define POPT_TS 0x7473 69 enum poptCallbackReason reason,
70 const struct poptOption * opt,
const char * arg,
102 buildMode = (((unsigned)opt->val) >> 8) & 0xff;
136 { NULL,
'\0', POPT_ARG_CALLBACK | POPT_CBFLAG_INC_DATA | POPT_CBFLAG_CONTINUE,
139 {
"bp", 0, POPT_ARGFLAG_ONEDASH, 0,
POPT_BP,
140 N_(
"build through %prep (unpack sources and apply patches) from <specfile>"),
142 {
"bc", 0, POPT_ARGFLAG_ONEDASH, 0,
POPT_BC,
143 N_(
"build through %build (%prep, then compile) from <specfile>"),
145 {
"bi", 0, POPT_ARGFLAG_ONEDASH, 0,
POPT_BI,
146 N_(
"build through %install (%prep, %build, then install) from <specfile>"),
148 {
"bl", 0, POPT_ARGFLAG_ONEDASH, 0,
POPT_BL,
149 N_(
"verify %files section from <specfile>"),
151 {
"ba", 0, POPT_ARGFLAG_ONEDASH, 0,
POPT_BA,
152 N_(
"build source and binary packages from <specfile>"),
154 {
"bb", 0, POPT_ARGFLAG_ONEDASH, 0,
POPT_BB,
155 N_(
"build binary package only from <specfile>"),
157 {
"bs", 0, POPT_ARGFLAG_ONEDASH, 0,
POPT_BS,
158 N_(
"build source package only from <specfile>"),
161 {
"rp", 0, POPT_ARGFLAG_ONEDASH, 0,
POPT_RP,
162 N_(
"build through %prep (unpack sources and apply patches) from <source package>"),
163 N_(
"<source package>") },
164 {
"rc", 0, POPT_ARGFLAG_ONEDASH, 0,
POPT_RC,
165 N_(
"build through %build (%prep, then compile) from <source package>"),
166 N_(
"<source package>") },
167 {
"ri", 0, POPT_ARGFLAG_ONEDASH, 0,
POPT_RI,
168 N_(
"build through %install (%prep, %build, then install) from <source package>"),
169 N_(
"<source package>") },
170 {
"rl", 0, POPT_ARGFLAG_ONEDASH, 0,
POPT_RL,
171 N_(
"verify %files section from <source package>"),
172 N_(
"<source package>") },
173 {
"ra", 0, POPT_ARGFLAG_ONEDASH, 0,
POPT_RA,
174 N_(
"build source and binary packages from <source package>"),
175 N_(
"<source package>") },
176 {
"rb", 0, POPT_ARGFLAG_ONEDASH, 0,
POPT_RB,
177 N_(
"build binary package only from <source package>"),
178 N_(
"<source package>") },
179 {
"rs", 0, POPT_ARGFLAG_ONEDASH, 0,
POPT_RS,
180 N_(
"build source package only from <source package>"),
181 N_(
"<source package>") },
183 {
"tp", 0, POPT_ARGFLAG_ONEDASH, 0,
POPT_TP,
184 N_(
"build through %prep (unpack sources and apply patches) from <tarball>"),
186 {
"tc", 0, POPT_ARGFLAG_ONEDASH, 0,
POPT_TC,
187 N_(
"build through %build (%prep, then compile) from <tarball>"),
189 {
"ti", 0, POPT_ARGFLAG_ONEDASH, 0,
POPT_TI,
190 N_(
"build through %install (%prep, %build, then install) from <tarball>"),
192 {
"tl", 0, POPT_ARGFLAG_ONEDASH|POPT_ARGFLAG_DOC_HIDDEN, 0,
POPT_TL,
193 N_(
"verify %files section from <tarball>"),
195 {
"ta", 0, POPT_ARGFLAG_ONEDASH, 0,
POPT_TA,
196 N_(
"build source and binary packages from <tarball>"),
198 {
"tb", 0, POPT_ARGFLAG_ONEDASH, 0,
POPT_TB,
199 N_(
"build binary package only from <tarball>"),
201 {
"ts", 0, POPT_ARGFLAG_ONEDASH, 0,
POPT_TS,
202 N_(
"build source package only from <tarball>"),
206 N_(
"build binary package from <source package>"),
207 N_(
"<source package>") },
209 N_(
"build through %install (%prep, %build, then install) from <source package>"),
210 N_(
"<source package>") },
213 N_(
"override build root"),
"DIRECTORY" },
215 N_(
"run build in current directory"), NULL },
217 N_(
"remove build tree when done"), NULL},
219 N_(
"ignore ExcludeArch: directives from spec file"), NULL},
220 {
"fsmdebug",
'\0', (POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN), &
_fsm_debug, -1,
221 N_(
"debug file state machine"), NULL},
223 N_(
"do not execute any stages of the build"), NULL },
224 {
"nodeps",
'\0', POPT_ARG_VAL, &
noDeps, 1,
225 N_(
"do not verify build dependencies"), NULL },
227 N_(
"generate package header(s) compatible with (legacy) rpm v3 packaging"),
231 N_(
"do not execute %clean stage of the build"), NULL },
233 N_(
"do not execute %prep stage of the build"), NULL },
235 N_(
"do not execute %check stage of the build"), NULL },
237 {
"nolang",
'\0', POPT_ARGFLAG_DOC_HIDDEN, 0,
POPT_NOLANG,
238 N_(
"do not accept i18N msgstr's from specfile"), NULL},
240 N_(
"remove sources when done"), NULL},
242 N_(
"remove specfile when done"), NULL},
243 {
"short-circuit",
'\0', POPT_ARG_VAL, &
shortCircuit, 1,
244 N_(
"skip straight to specified stage (only for c,i)"), NULL },
246 N_(
"override target platform"),
"CPU-VENDOR-OS" },
261 N_(
"Build options with [ <specfile> | <tarball> | <source package> ]:"),
265 N_(
"Common options for all rpm modes and executables:"),
295 f = fopen(specfile,
"r");
298 specfile, strerror(errno));
301 count = fread(buf,
sizeof(buf[0]),
sizeof(buf), f);
308 for (s = buf; count--; s++) {
319 if (checking && !(isprint(*s) || isspace(*s)))
return 0;
322 if (checking && !(isprint(*s) || isspace(*s)) && *(
unsigned char *)s < 32)
return 0;
336 char *specFile = NULL;
342 int gotspec = 0, res;
343 static const char *tryspec[] = {
"Specfile",
"\\*.spec", NULL };
346 tmpSpecFile =
rpmGetPath(
"%{_specdir}/",
"rpm-spec.XXXXXX", NULL);
348 (void) close(mkstemp(tmpSpecFile));
350 for (spec = tryspec; *spec != NULL; spec++) {
355 cmd =
rpmExpand(
"%{uncompress: ", arg,
"} | ",
356 "%{__tar} xOvof - --wildcards ", *spec,
357 " 2>&1 > ", tmpSpecFile, NULL);
359 if (!(fp = popen(cmd,
"r"))) {
364 fok = fgets(tarbuf,
sizeof(tarbuf) - 1, fp);
367 if (strstr(fok,
"tar: ")) {
373 gotspec = (specfiles == 1) &&
isSpecFile(tmpSpecFile);
390 specBase = basename(tarbuf);
392 specBase[strlen(specBase)-1] =
'\0';
394 rasprintf(&specFile,
"%s/%s", specDir, specBase);
395 res = rename(tmpSpecFile, specFile);
399 tmpSpecFile, specFile);
405 umask(mask = umask(0));
406 (void) chmod(specFile, 0666 & ~mask);
410 (void) unlink(tmpSpecFile);
419 char * buildRootURL = NULL;
420 char * specFile = NULL;
429 addMacro(NULL,
"_builddir", NULL, cwd, 0);
437 const char * buildtree =
"%{_topdir}:%{_specdir}:%{_sourcedir}:%{_builddir}:%{_rpmdir}:%{_srcrpmdir}:%{_buildrootdir}";
444 char *srcdir = NULL, *dir;
458 srcdir = dirname(dir);
466 if (*specFile !=
'/' && specFile[1] !=
':') {
468 if (*specFile !=
'/') {
479 if (stat(specFile, &st) < 0) {
483 if (! S_ISREG(st.st_mode)) {
491 _(
"File %s does not appear to be a specfile.\n"), specFile);
497 rc = unlink(specFile);
502 #define _anyarch(_f) \ 503 (((_f)&(RPMBUILD_PREP|RPMBUILD_BUILD|RPMBUILD_INSTALL|RPMBUILD_PACKAGEBINARY)) == 0) 523 (void) unlink(specFile);
537 #define buildCleanMask (RPMBUILD_RMSOURCE|RPMBUILD_RMSPEC) 557 printf(
_(
"Building target platforms: %s\n"), targets);
562 if (*(target + 1) == NULL)
565 printf(
_(
"Building for target %s\n"), *target);
591 int main(
int argc,
char *argv[])
597 const char *pkg = NULL;
599 poptContext optCon =
rpmcliInit(argc, argv, optionsTable);
602 if (ba->
buildAmount && poptPeekArg(optCon) == NULL) {
615 argerror(
_(
"arguments to --root (-r) must begin with a /"));
671 while ((pkg = poptGetArg(optCon))) {
672 char * specFile = NULL;
681 specFile =
_free(specFile);
690 while ((pkg = poptGetArg(optCon))) {
static struct poptOption rpmBuildPoptTable[]
static rpmBuildFlags nobuildAmount
const char * rpmcliRcfile
int rpmtsSetRootDir(rpmts ts, const char *rootDir)
Set transaction rootDir, i.e.
rpmQueryFlags rpmcliQueryFlags
Bit(s) from common command line options.
void printUsage(poptContext con, FILE *fp, int flags)
rpmps rpmSpecCheckDeps(rpmts ts, rpmSpec spec)
Verify build depencies of a spec against.
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
char * rstrscat(char **dest, const char *arg,...) RPM_GNUC_NULL_TERMINATED
Concatenate multiple strings with dynamically (re)allocated memory.
static int isSpecFile(const char *specfile)
#define POPT_BUILDINPLACE
poptContext rpmcliInit(int argc, char *const argv[], struct poptOption *optionsTable)
Initialize most everything needed by an rpm CLI executable context.
RPM_GNUC_NORETURN void argerror(const char *desc)
poptContext rpmcliFini(poptContext optCon)
Destroy most everything needed by an rpm CLI executable context.
rpmSpec rpmSpecFree(rpmSpec spec)
Destroy Spec structure.
static ARGV_t build_targets
rpmBuildPkgFlags pkgFlags
const char * rpmtsRootDir(rpmts ts)
Get transaction rootDir, i.e.
rpmRC rpmSpecBuild(rpmSpec spec, BTA_t buildArgs)
Spec build stages state machine driver.
int rpmReadConfigFiles(const char *file, const char *target)
Read macro configuration file(s) for a target.
static void buildArgCallback(poptContext con, enum poptCallbackReason reason, const struct poptOption *opt, const char *arg, const void *data)
#define POPT_TARGETPLATFORM
int argvSplit(ARGV_t *argvp, const char *str, const char *seps)
Split a string into an argv array.
const char * rpmcliPipeOutput
rpmBuildFlags buildAmount
static int rstreq(const char *s1, const char *s2)
Test for string equality.
static char * getTarSpec(const char *arg)
int rpmExpandNumeric(const char *arg)
Return macro expansion as a numeric value.
int rpmInstallSource(rpmts ts, const char *arg, char **specFilePtr, char **cookie)
Install source rpm package.
static struct poptOption optionsTable[]
int rpmMkdirs(const char *root, const char *pathstr)
Create several directories (including parents if needed) in one go.
const char * rpmcliRootDir
rpmps rpmpsFree(rpmps ps)
Destroy a problem set.
char * rpmGetPath(const char *path,...) RPM_GNUC_NULL_TERMINATED
Return (malloc'ed) expanded, canonicalized, file path.
#define RPMCLI_POPT_FORCE
void addMacro(rpmMacroContext mc, const char *n, const char *o, const char *b, int level)
Add macro to context.
ARGV_t argvFree(ARGV_t argv)
Destroy an argv array.
char *const * ARGV_const_t
#define _RPMVSF_NOSIGNATURES
rpmts rpmtsFree(rpmts ts)
Destroy transaction set, closing the database as well.
static int checkSpec(rpmts ts, rpmSpec spec)
void rpmFreeMacros(rpmMacroContext mc)
Destroy macro context.
rpmSpec rpmSpecParse(const char *specFile, rpmSpecFlags flags, const char *buildRoot)
Parse spec file into spec control structure.
rpmVSFlags rpmtsSetVSFlags(rpmts ts, rpmVSFlags vsflags)
Set verify signatures flag(s).
char * rpmExpand(const char *arg,...) RPM_GNUC_NULL_TERMINATED
Return (malloc'ed) concatenated macro expansion(s).
struct rpmts_s * rpmts
The main types involved in transaction manipulation.
int rpmDefineMacro(rpmMacroContext mc, const char *macro, int level)
Define macro in context.
int rasprintf(char **strp, const char *fmt,...) RPM_GNUC_PRINTF(2
asprintf() clone
void rpmFreeRpmrc(void)
Destroy rpmrc arch/os compatibility tables.
#define _RPMVSF_NODIGESTS
#define rpmSetVerbosity(_lvl)
void rpmpsPrint(FILE *fp, rpmps ps)
Print problems to file handle.
rpmts rpmtsCreate(void)
Create an empty transaction set.
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 rpmlogSetMask(int mask)
Set the log mask level.
char * rpmGetCwd(void)
Like getcwd() but the result is malloced.
struct poptOption rpmcliAllPoptTable[]
Popt option table for options shared by all modes and executables.
char * argvJoin(ARGV_const_t argv, const char *sep)
Join an argv array into a string.
int main(int argc, char *argv[])
void rpmlog(int code, const char *fmt,...) RPM_GNUC_PRINTF(2
Generate a log message using FMT string and option arguments.
struct rpmSpec_s * rpmSpec