#ifndef _H_RPMBUILD_ #define _H_RPMBUILD_ /** \ingroup rpmbuild * \file build/rpmbuild.h * This is the *only* module users of librpmbuild should need to include. */ #include /* and it shouldn't need these :-( */ #include "stringbuf.h" #include "misc.h" /* but this will be needed */ #include "rpmspec.h" /** \ingroup rpmbuild * Bit(s) to control buildSpec() operation. */ /*@-typeuse@*/ typedef enum rpmBuildFlags_e { /*@-enummemuse@*/ RPMBUILD_NONE = 0, /*@=enummemuse@*/ RPMBUILD_PREP = (1 << 0), /*!< Execute %%prep. */ RPMBUILD_BUILD = (1 << 1), /*!< Execute %%build. */ RPMBUILD_INSTALL = (1 << 2), /*!< Execute %%install. */ RPMBUILD_CLEAN = (1 << 3), /*!< Execute %%clean. */ RPMBUILD_FILECHECK = (1 << 4), /*!< Check %%files manifest. */ RPMBUILD_PACKAGESOURCE = (1 << 5), /*!< Create source package. */ RPMBUILD_PACKAGEBINARY = (1 << 6), /*!< Create binary package(s). */ RPMBUILD_RMSOURCE = (1 << 7), /*!< Remove source(s) and patch(s). */ RPMBUILD_RMBUILD = (1 << 8), /*!< Remove build sub-tree. */ RPMBUILD_STRINGBUF = (1 << 9), /*!< only for doScript() */ RPMBUILD_RMSPEC = (1 << 10) /*!< Remove spec file. */ } rpmBuildFlags; /*@=typeuse@*/ #include #define SKIPSPACE(s) { while (*(s) && xisspace(*(s))) (s)++; } #define SKIPNONSPACE(s) { while (*(s) && !xisspace(*(s))) (s)++; } #define PART_SUBNAME 0 #define PART_NAME 1 /** \ingroup rpmbuild * Spec file parser states. */ typedef enum rpmParseState_e { PART_NONE = 0, /*!< */ PART_PREAMBLE = 1, /*!< */ PART_PREP = 2, /*!< */ PART_BUILD = 3, /*!< */ PART_INSTALL = 4, /*!< */ PART_CLEAN = 5, /*!< */ PART_FILES = 6, /*!< */ PART_PRE = 7, /*!< */ PART_POST = 8, /*!< */ PART_PREUN = 9, /*!< */ PART_POSTUN = 10, /*!< */ PART_DESCRIPTION = 11, /*!< */ PART_CHANGELOG = 12, /*!< */ PART_TRIGGERIN = 13, /*!< */ PART_TRIGGERUN = 14, /*!< */ PART_VERIFYSCRIPT = 15, /*!< */ PART_BUILDARCHITECTURES= 16,/*!< */ PART_TRIGGERPOSTUN = 17, /*!< */ PART_LAST = 18 /*!< */ } rpmParseState; #define STRIP_NOTHING 0 #define STRIP_TRAILINGSPACE (1 << 0) #define STRIP_COMMENTS (1 << 1) #ifdef __cplusplus extern "C" { #endif /*@-redecl@*/ /** \ingroup rpmbuild * Destroy uid/gid caches. */ void freeNames(void) /*@globals internalState@*/ /*@modifies internalState */; /** \ingroup rpmbuild * Return cached user name from user id. * @todo Implement using hash. * @param user id * @return cached user name */ extern /*@observer@*/ const char * getUname(uid_t uid) /*@*/; /** \ingroup rpmbuild * Return cached user name. * @todo Implement using hash. * @param user name * @return cached user name */ extern /*@observer@*/ const char * getUnameS(const char * uname) /*@*/; /** \ingroup rpmbuild * Return cached user id. * @todo Implement using hash. * @param user name * @return cached uid */ uid_t getUidS(const char * uname) /*@*/; /** \ingroup rpmbuild * Return cached group name from group id. * @todo Implement using hash. * @param group id * @return cached group name */ extern /*@observer@*/ const char * getGname(gid_t gid) /*@*/; /** \ingroup rpmbuild * Return cached group name. * @todo Implement using hash. * @param group name * @return cached group name */ extern /*@observer@*/ const char * getGnameS(const char * gname) /*@*/; /** \ingroup rpmbuild * Return cached group id. * @todo Implement using hash. * @param group name * @return cached gid */ gid_t getGidS(const char * gname) /*@*/; /** \ingroup rpmbuild * Return build hostname. * @return build hostname */ extern /*@observer@*/ const char * const buildHost(void) /*@*/; /** \ingroup rpmbuild * Return build time stamp. * @return build time stamp */ extern /*@observer@*/ int_32 * const getBuildTime(void) /*@*/; /** \ingroup rpmbuild * Read next line from spec file. * @param spec spec file control structure * @param strip truncate comments? * @return 0 on success, 1 on EOF, <0 on error */ int readLine(Spec spec, int strip) /*@globals rpmGlobalMacroContext, fileSystem@*/ /*@modifies spec->fileStack, spec->readStack, spec->line, spec->lineNum, spec->nextline, spec->nextpeekc, spec->lbuf, spec->sl, rpmGlobalMacroContext, fileSystem @*/; /** \ingroup rpmbuild * Stop reading from spec file, freeing resources. * @param spec spec file control structure */ void closeSpec(/*@partial@*/ Spec spec) /*@globals fileSystem@*/ /*@modifies spec->fileStack, fileSystem @*/; /** \ingroup rpmbuild * Truncate comment lines. * @param s skip white space, truncate line at '#' */ void handleComments(char * s) /*@modifies s @*/; /** \ingroup rpmbuild * Check line for section separator, return next parser state. * @param line from spec file * @return next parser state */ rpmParseState isPart(const char * line) /*@*/; /** \ingroup rpmbuild * Parse a number. * @param line from spec file * @retval res pointer to int * @return 0 on success, 1 on failure */ int parseNum(/*@null@*/ const char * line, /*@null@*/ /*@out@*/int * res) /*@modifies *res @*/; /** \ingroup rpmbuild * Add changelog entry to header. * @param h header * @param time time of change * @param name person who made the change * @param text description of change */ void addChangelogEntry(Header h, time_t time, const char * name, const char * text) /*@modifies h @*/; /** \ingroup rpmbuild * Parse %%build/%%install/%%clean section(s) of a spec file. * @param spec spec file control structure * @param parsePart current rpmParseState * @return >= 0 next rpmParseState, < 0 on error */ int parseBuildInstallClean(Spec spec, rpmParseState parsePart) /*@globals rpmGlobalMacroContext, fileSystem @*/ /*@modifies spec->build, spec->install, spec->clean, spec->macros, spec->fileStack, spec->readStack, spec->line, spec->lineNum, spec->nextline, spec->nextpeekc, spec->lbuf, spec->sl, rpmGlobalMacroContext, fileSystem @*/; /** \ingroup rpmbuild * Parse %%changelog section of a spec file. * @param spec spec file control structure * @return >= 0 next rpmParseState, < 0 on error */ int parseChangelog(Spec spec) /*@globals rpmGlobalMacroContext, fileSystem@*/ /*@modifies spec->fileStack, spec->readStack, spec->line, spec->lineNum, spec->nextline, spec->nextpeekc, spec->lbuf, spec->sl, spec->packages->header, rpmGlobalMacroContext, fileSystem @*/; /** \ingroup rpmbuild * Parse %%description section of a spec file. * @param spec spec file control structure * @return >= 0 next rpmParseState, < 0 on error */ int parseDescription(Spec spec) /*@globals rpmGlobalMacroContext, fileSystem@*/ /*@modifies spec->packages, spec->fileStack, spec->readStack, spec->line, spec->lineNum, spec->nextline, spec->nextpeekc, spec->lbuf, spec->sl, spec->st, rpmGlobalMacroContext, fileSystem @*/; /** \ingroup rpmbuild * Parse %%files section of a spec file. * @param spec spec file control structure * @return >= 0 next rpmParseState, < 0 on error */ int parseFiles(Spec spec) /*@globals rpmGlobalMacroContext, fileSystem@*/ /*@modifies spec->packages, spec->fileStack, spec->readStack, spec->line, spec->lineNum, spec->nextline, spec->nextpeekc, spec->lbuf, spec->sl, rpmGlobalMacroContext, fileSystem @*/; /** \ingroup rpmbuild * Parse tags from preamble of a spec file. * @param spec spec file control structure * @param initialPackage * @return >= 0 next rpmParseState, < 0 on error */ int parsePreamble(Spec spec, int initialPackage) /*@globals rpmGlobalMacroContext, fileSystem, internalState @*/ /*@modifies spec->packages, spec->fileStack, spec->readStack, spec->line, spec->lineNum, spec->buildSubdir, spec->macros, spec->st, spec->buildRootURL, spec->sources, spec->numSources, spec->noSource, spec->buildRestrictions, spec->BANames, spec->BACount, spec->gotBuildRootURL, spec->nextline, spec->nextpeekc, spec->lbuf, spec->sl, rpmGlobalMacroContext, fileSystem, internalState @*/; /** \ingroup rpmbuild * Parse %%prep section of a spec file. * @param spec spec file control structure * @return >= 0 next rpmParseState, < 0 on error */ int parsePrep(Spec spec) /*@globals rpmGlobalMacroContext, fileSystem@*/ /*@modifies spec->prep, spec->buildSubdir, spec->macros, spec->fileStack, spec->readStack, spec->line, spec->lineNum, spec->nextline, spec->nextpeekc, spec->lbuf, spec->sl, rpmGlobalMacroContext, fileSystem @*/; /** \ingroup rpmbuild * Parse dependency relations from spec file and/or autogenerated output buffer. * @param spec spec file control structure * @param pkg package control structure * @param field text to parse (e.g. "foo < 0:1.2-3, bar = 5:6.7") * @param tag tag, identifies type of dependency * @param index (0 always) * @param tagflags dependency flags already known from context * @return 0 on success, RPMERR_BADSPEC on failure */ int parseRCPOT(Spec spec, Package pkg, const char * field, int tag, int index, rpmsenseFlags tagflags) /*@globals rpmGlobalMacroContext @*/ /*@modifies rpmGlobalMacroContext @*/; /** \ingroup rpmbuild * Parse %%pre et al scriptlets from a spec file. * @param spec spec file control structure * @param parsePart current rpmParseState * @return >= 0 next rpmParseState, < 0 on error */ int parseScript(Spec spec, int parsePart) /*@globals rpmGlobalMacroContext, fileSystem@*/ /*@modifies spec->packages, spec->fileStack, spec->readStack, spec->line, spec->lineNum, spec->nextline, spec->nextpeekc, spec->lbuf, spec->sl, rpmGlobalMacroContext, fileSystem @*/; /** \ingroup rpmbuild * Evaluate boolean expression. * @param spec spec file control structure * @param expr expression to parse * @return */ int parseExpressionBoolean(Spec spec, const char * expr) /*@globals rpmGlobalMacroContext @*/ /*@modifies rpmGlobalMacroContext @*/; /** \ingroup rpmbuild * Evaluate string expression. * @param spec spec file control structure * @param expr expression to parse * @return */ /*@unused@*/ char * parseExpressionString(Spec spec, const char * expr) /*@globals rpmGlobalMacroContext @*/ /*@modifies rpmGlobalMacroContext @*/; /** \ingroup rpmbuild * Run a build script, assembled from spec file scriptlet section. * * @param spec spec file control structure * @param what type of script * @param name name of scriptlet section * @param sb lines that compose script body * @param test don't execute scripts or package if testing * @return 0 on success, RPMERR_SCRIPT on failure */ int doScript(Spec spec, int what, const char * name, StringBuf sb, int test) /*@globals rpmGlobalMacroContext, fileSystem, internalState @*/ /*@modifies spec->macros, rpmGlobalMacroContext, fileSystem, internalState @*/; /** \ingroup rpmbuild * Find sub-package control structure by name. * @param spec spec file control structure * @param name (sub-)package name * @param flag if PART_SUBNAME, then 1st package name is prepended * @retval pkg package control structure * @return 0 on success, 1 on failure */ int lookupPackage(Spec spec, /*@null@*/ const char * name, int flag, /*@out@*/ Package * pkg) /*@modifies spec->packages, *pkg @*/; /** \ingroup rpmbuild * Create and initialize package control structure. * @param spec spec file control structure * @return package control structure */ /*@only@*/ Package newPackage(Spec spec) /*@modifies spec->packages, spec->packages->next @*/; /** \ingroup rpmbuild * Destroy all packages associated with spec file. * @param packages package control structure chain * @return NULL */ /*@null@*/ Package freePackages(/*@only@*/ /*@null@*/ Package packages) /*@modifies packages @*/; /** \ingroup rpmbuild * Destroy package control structure. * @param pkg package control structure * @return NULL */ /*@null@*/ Package freePackage(/*@only@*/ /*@null@*/ Package pkg) /*@modifies pkg @*/; /** \ingroup rpmbuild * Add dependency to header, filtering duplicates. * @param spec spec file control structure * @param h header * @param depFlags (e.g. Requires: foo < 0:1.2-3, both "Requires:" and "<") * @param depName (e.g. Requires: foo < 0:1.2-3, "foo") * @param depEVR (e.g. Requires: foo < 0:1.2-3, "0:1.2-3") * @param index (0 always) * @return 0 always */ int addReqProv(/*@unused@*/Spec spec, Header h, rpmsenseFlags depFlags, const char * depName, const char * depEVR, int index) /*@modifies h @*/; /** \ingroup rpmbuild * Add rpmlib feature dependency. * @param h header * @param feature rpm feature name (i.e. "rpmlib(Foo)" for feature Foo) * @param featureEVR rpm feature epoch/version/release * @return 0 always */ int rpmlibNeedsFeature(Header h, const char * feature, const char * featureEVR) /*@modifies h @*/; /** \ingroup rpmbuild * Post-build processing for binary package(s). * @param spec spec file control structure * @param installSpecialDoc * @param test don't execute scripts or package if testing * @return 0 on success */ int processBinaryFiles(Spec spec, int installSpecialDoc, int test) /*@globals rpmGlobalMacroContext, fileSystem, internalState @*/ /*@modifies spec->macros, spec->packages->cpioList, spec->packages->fileList, spec->packages->specialDoc, spec->packages->header, rpmGlobalMacroContext, fileSystem, internalState @*/; /** \ingroup rpmbuild * Create and initialize header for source package. * @param spec spec file control structure */ void initSourceHeader(Spec spec) /*@modifies spec->sourceHeader, spec->buildRestrictions, spec->BANames, spec->packages->header @*/; /** \ingroup rpmbuild * Post-build processing for source package. * @param spec spec file control structure * @return 0 on success */ int processSourceFiles(Spec spec) /*@globals rpmGlobalMacroContext, fileSystem @*/ /*@modifies spec->sourceHeader, spec->sourceCpioList, spec->buildRestrictions, spec->BANames, spec->packages->header, rpmGlobalMacroContext, fileSystem @*/; /** \ingroup rpmbuild * Parse spec file into spec control structure. * @retval specp spec file control structure * @param specFile * @param rootURL * @param buildRootURL * @param recursing parse is recursive? * @param passPhrase * @param cookie * @param anyarch * @param force * @return */ int parseSpec(/*@out@*/ Spec * specp, const char * specFile, /*@null@*/ const char * rootURL, /*@null@*/ const char * buildRootURL, int recursing, /*@null@*/ const char * passPhrase, /*@null@*/ char * cookie, int anyarch, int force) /*@globals rpmGlobalMacroContext, fileSystem, internalState @*/ /*@modifies *specp, rpmGlobalMacroContext, fileSystem, internalState @*/; /** \ingroup rpmbuild * @retval specp spec file control structure * @param specFile * @param rootdir * @param buildRoot * @param recursing parse is recursive? * @param passPhrase * @param cookie * @param anyarch * @param force * @return */ /*@-declundef@*/ extern int (*parseSpecVec) (Spec * specp, const char * specFile, const char * rootdir, /*@null@*/ const char * buildRoot, int recursing, /*@null@*/ const char * passPhrase, /*@null@*/ char * cookie, int anyarch, int force) /*@globals rpmGlobalMacroContext, fileSystem, internalState @*/ /*@modifies *specp, rpmGlobalMacroContext, fileSystem, internalState @*/; /*@=declundef@*/ /** \ingroup rpmbuild * Build stages state machine driver. * @param spec spec file control structure * @param what bit(s) to enable stages of build * @param test don't execute scripts or package if testing * @return 0 on success */ int buildSpec(Spec spec, int what, int test) /*@globals rpmGlobalMacroContext, fileSystem, internalState @*/ /*@modifies spec->sourceHeader, spec->sourceCpioList, spec->cookie, spec->sourceRpmName, spec->macros, spec->BASpecs, spec->buildRestrictions, spec->BANames, spec->packages->cpioList, spec->packages->fileList, spec->packages->specialDoc, spec->packages->header, rpmGlobalMacroContext, fileSystem, internalState @*/; /** \ingroup rpmbuild * Generate binary package(s). * @param spec spec file control structure * @return 0 on success */ int packageBinaries(Spec spec) /*@globals rpmGlobalMacroContext, fileSystem, internalState @*/ /*@modifies spec->packages->header, spec->sourceRpmName, rpmGlobalMacroContext, fileSystem, internalState @*/; /** \ingroup rpmbuild * Generate source package. * @param spec spec file control structure * @return 0 on success */ int packageSources(Spec spec) /*@globals rpmGlobalMacroContext, fileSystem, internalState @*/ /*@modifies spec->sourceHeader, spec->cookie, spec->sourceRpmName, rpmGlobalMacroContext, fileSystem, internalState @*/; /*@=redecl@*/ #ifdef __cplusplus } #endif #endif /* _H_RPMBUILD_ */