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" },
263 N_(
"Build options with [ <specfile> | <tarball> | <source package> ]:"),
266 {
"quiet",
'\0', POPT_ARGFLAG_DOC_HIDDEN, &
quiet, 0, NULL, NULL},
269 N_(
"Common options for all rpm modes and executables:"),
299 f = fopen(specfile,
"r");
302 specfile, strerror(errno));
305 count = fread(buf,
sizeof(buf[0]),
sizeof(buf), f);
312 for (s = buf; count--; s++) {
323 if (checking && !(isprint(*s) || isspace(*s)))
return 0;
326 if (checking && !(isprint(*s) || isspace(*s)) && *(
unsigned char *)s < 32)
return 0;
340 char *specFile = NULL;
346 int gotspec = 0, res;
347 static const char *tryspec[] = {
"Specfile",
"\\*.spec", NULL };
350 tmpSpecFile =
rpmGetPath(
"%{_specdir}/",
"rpm-spec.XXXXXX", NULL);
352 (void) close(mkstemp(tmpSpecFile));
354 for (spec = tryspec; *spec != NULL; spec++) {
359 cmd =
rpmExpand(
"%{uncompress: ", arg,
"} | ",
360 "%{__tar} xOvof - --wildcards ", *spec,
361 " 2>&1 > ", tmpSpecFile, NULL);
363 if (!(fp = popen(cmd,
"r"))) {
368 fok = fgets(tarbuf,
sizeof(tarbuf) - 1, fp);
371 if (strstr(fok,
"tar: ")) {
377 gotspec = (specfiles == 1) &&
isSpecFile(tmpSpecFile);
394 specBase = basename(tarbuf);
396 specBase[strlen(specBase)-1] =
'\0';
398 rasprintf(&specFile,
"%s/%s", specDir, specBase);
399 res = rename(tmpSpecFile, specFile);
403 tmpSpecFile, specFile);
409 umask(mask = umask(0));
410 (void) chmod(specFile, 0666 & ~mask);
414 (void) unlink(tmpSpecFile);
423 char * buildRootURL = NULL;
424 char * specFile = NULL;
433 addMacro(NULL,
"_builddir", NULL, cwd, 0);
441 const char * buildtree =
"%{_topdir}:%{_specdir}:%{_sourcedir}:%{_builddir}:%{_rpmdir}:%{_srcrpmdir}:%{_buildrootdir}";
448 char *srcdir = NULL, *dir;
462 srcdir = dirname(dir);
469 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 /"));
670 while ((pkg = poptGetArg(optCon))) {
671 char * specFile = NULL;
680 specFile =
_free(specFile);
689 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.
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
void argerror(const char *desc)
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.
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