summaryrefslogtreecommitdiff
path: root/build
diff options
context:
space:
mode:
Diffstat (limited to 'build')
-rw-r--r--build/files.c67
-rw-r--r--build/parseSpec.c1
2 files changed, 45 insertions, 23 deletions
diff --git a/build/files.c b/build/files.c
index f0721a14b..459a05e42 100644
--- a/build/files.c
+++ b/build/files.c
@@ -111,6 +111,7 @@ typedef struct specialDir_s {
ARGV_t files;
struct AttrRec_s ar;
struct AttrRec_s def_ar;
+ rpmFlags sdtype;
} * specialDir;
typedef struct FileEntry_s {
@@ -845,7 +846,7 @@ static rpmRC parseForSimple(char * buf, FileEntry cur, ARGV_t * fileNames)
{
char *s, *t;
rpmRC res = RPMRC_OK;
- int allow_relative = (RPMFILE_PUBKEY|RPMFILE_DOC);
+ int allow_relative = (RPMFILE_PUBKEY|RPMFILE_DOC|RPMFILE_LICENSE);
t = buf;
while ((s = strtokWithQuotes(t, " \t\n")) != NULL) {
@@ -862,8 +863,8 @@ static rpmRC parseForSimple(char * buf, FileEntry cur, ARGV_t * fileNames)
res = RPMRC_FAIL;
continue;
}
- /* non-absolute %doc paths are special */
- if (cur->attrFlags & RPMFILE_DOC)
+ /* non-absolute %doc and %license paths are special */
+ if (cur->attrFlags & (RPMFILE_DOC | RPMFILE_LICENSE))
cur->attrFlags |= RPMFILE_SPECIALDIR;
}
argvAdd(fileNames, s);
@@ -1708,9 +1709,10 @@ exit:
return rc;
}
-static char * getSpecialDocDir(Header h)
+static char * getSpecialDocDir(Header h, rpmFlags sdtype)
{
const char *errstr = NULL;
+ const char *dirtype = (sdtype == RPMFILE_DOC) ? "docdir" : "licensedir";
const char *fmt_default = "%{NAME}-%{VERSION}";
char *fmt_macro = rpmExpand("%{?_docdir_fmt}", NULL);
char *fmt = NULL;
@@ -1727,19 +1729,21 @@ static char * getSpecialDocDir(Header h)
if (fmt == NULL)
fmt = headerFormat(h, fmt_default, &errstr);
- res = rpmGetPath("%{_docdir}/", fmt, NULL);
+ res = rpmGetPath("%{_", dirtype, "}/", fmt, NULL);
free(fmt);
free(fmt_macro);
return res;
}
-static specialDir specialDirNew(Header h, AttrRec ar, AttrRec def_ar)
+static specialDir specialDirNew(Header h, rpmFlags sdtype,
+ AttrRec ar, AttrRec def_ar)
{
specialDir sd = xcalloc(1, sizeof(*sd));
dupAttrRec(ar, &(sd->ar));
dupAttrRec(def_ar, &(sd->def_ar));
- sd->dirname = getSpecialDocDir(h);
+ sd->dirname = getSpecialDocDir(h, sdtype);
+ sd->sdtype = sdtype;
return sd;
}
@@ -1755,25 +1759,30 @@ static specialDir specialDirFree(specialDir sd)
return NULL;
}
-static void processSpecialDocs(rpmSpec spec, Package pkg, FileList fl,
+static void processSpecialDir(rpmSpec spec, Package pkg, FileList fl,
specialDir sd, int install, int test)
{
- char *mkdocdir = rpmExpand("%{__mkdir_p} $DOCDIR", NULL);
+ const char *sdenv = (sd->sdtype == RPMFILE_DOC) ? "DOCDIR" : "LICENSEDIR";
+ const char *sdname = (sd->sdtype == RPMFILE_DOC) ? "%doc" : "%license";
+ char *mkdocdir = rpmExpand("%{__mkdir_p} $", sdenv, NULL);
StringBuf docScript = newStringBuf();
- appendStringBuf(docScript, "DOCDIR=$RPM_BUILD_ROOT");
+ appendStringBuf(docScript, sdenv);
+ appendStringBuf(docScript, "=$RPM_BUILD_ROOT");
appendLineStringBuf(docScript, sd->dirname);
- appendLineStringBuf(docScript, "export DOCDIR");
+ appendStringBuf(docScript, "export ");
+ appendLineStringBuf(docScript, sdenv);
appendLineStringBuf(docScript, mkdocdir);
for (ARGV_const_t fn = sd->files; fn && *fn; fn++) {
appendStringBuf(docScript, "cp -pr ");
appendStringBuf(docScript, *fn);
- appendLineStringBuf(docScript, " $DOCDIR");
+ appendStringBuf(docScript, " $");
+ appendLineStringBuf(docScript, sdenv);
}
if (install) {
- rpmRC rc = doScript(spec, RPMBUILD_STRINGBUF, "%doc",
+ rpmRC rc = doScript(spec, RPMBUILD_STRINGBUF, sdname,
getStringBuf(docScript), test);
if (rc && rpmExpandNumeric("%{?_missing_doc_files_terminate_build}"))
@@ -1800,6 +1809,7 @@ static rpmRC processPackageFiles(rpmSpec spec, rpmBuildPkgFlags pkgFlags,
struct FileList_s fl;
ARGV_t fileNames = NULL;
specialDir specialDoc = NULL;
+ specialDir specialLic = NULL;
pkg->cpioList = NULL;
@@ -1853,20 +1863,28 @@ static rpmRC processPackageFiles(rpmSpec spec, rpmBuildPkgFlags pkgFlags,
for (ARGV_const_t fn = fileNames; fn && *fn; fn++) {
if (fl.cur.attrFlags & RPMFILE_SPECIALDIR) {
- int oa = (fl.cur.attrFlags & ~(RPMFILE_DOC|RPMFILE_SPECIALDIR));
- if (oa || **fn == '/') {
+ rpmFlags oattrs = (fl.cur.attrFlags & ~RPMFILE_SPECIALDIR);
+ specialDir *sdp = NULL;
+ if (oattrs == RPMFILE_DOC) {
+ sdp = &specialDoc;
+ } else if (oattrs == RPMFILE_LICENSE) {
+ sdp = &specialLic;
+ }
+
+ if (sdp == NULL || **fn == '/') {
rpmlog(RPMLOG_ERR,
- _("Can't mix special %%doc with other forms: %s\n"),*fn);
+ _("Can't mix special %s with other forms: %s\n"),
+ (oattrs & RPMFILE_DOC) ? "%doc" : "%license", *fn);
fl.processingFailed = 1;
continue;
}
- /* save attributes on first special doc for later use */
- if (specialDoc == NULL) {
- specialDoc = specialDirNew(pkg->header,
- &fl.cur.ar, &fl.def.ar);
+ /* save attributes on first special doc/license for later use */
+ if (*sdp == NULL) {
+ *sdp = specialDirNew(pkg->header, oattrs,
+ &fl.cur.ar, &fl.def.ar);
}
- argvAdd(&specialDoc->files, *fn);
+ argvAdd(&(*sdp)->files, *fn);
continue;
}
@@ -1892,9 +1910,11 @@ static rpmRC processPackageFiles(rpmSpec spec, rpmBuildPkgFlags pkgFlags,
fl.haveCaps = 1;
}
- /* Now process special doc, if there is one */
+ /* Now process special docs and licenses if present */
if (specialDoc)
- processSpecialDocs(spec, pkg, &fl, specialDoc, installSpecialDoc, test);
+ processSpecialDir(spec, pkg, &fl, specialDoc, installSpecialDoc, test);
+ if (specialLic)
+ processSpecialDir(spec, pkg, &fl, specialLic, installSpecialDoc, test);
if (fl.processingFailed)
goto exit;
@@ -1909,6 +1929,7 @@ static rpmRC processPackageFiles(rpmSpec spec, rpmBuildPkgFlags pkgFlags,
exit:
FileListFree(&fl);
specialDirFree(specialDoc);
+ specialDirFree(specialLic);
return fl.processingFailed ? RPMRC_FAIL : RPMRC_OK;
}
diff --git a/build/parseSpec.c b/build/parseSpec.c
index d1a0788db..742059177 100644
--- a/build/parseSpec.c
+++ b/build/parseSpec.c
@@ -571,6 +571,7 @@ static rpmSpec parseSpec(const char *specFile, rpmSpecFlags flags,
spec->buildRoot = rpmGetPath("%{?buildroot:%{buildroot}}", NULL);
}
addMacro(NULL, "_docdir", NULL, "%{_defaultdocdir}", RMIL_SPEC);
+ addMacro(NULL, "_licensedir", NULL, "%{_defaultlicensedir}", RMIL_SPEC);
spec->recursing = recursing;
spec->flags = flags;