RPM 4.9 だと Requires に付けるコンテクストが厳密になる

RPM 4.8.x までだと Requires(pre) であるとか Requires(post) だとか、Requires にコンテクストが付けられた。%pre や %post などの scriptlets で必要となるものを指定する際に使うものだ。

RPM 4.9.x からは以下のものに限定される。rpm-4.9.0-beta1/build/parsePreamble.c + upstream patch からの抜粋だ。

static struct tokenBits_s const installScriptBits[] = {
    { "interp",		RPMSENSE_INTERP },
    { "prereq",		RPMSENSE_PREREQ },
    { "preun",		RPMSENSE_SCRIPT_PREUN },
    { "pre",		RPMSENSE_SCRIPT_PRE },
    { "postun",		RPMSENSE_SCRIPT_POSTUN },
    { "post",		RPMSENSE_SCRIPT_POST },
    { "rpmlib",		RPMSENSE_RPMLIB },
    { "verify",		RPMSENSE_SCRIPT_VERIFY },
    { "pretrans",	RPMSENSE_PRETRANS },
    { "posttrans",	RPMSENSE_POSTTRANS },
    { NULL, 0 }
};

また、ここに載っていないコンテクストを書くと handlePreambleTag() でエラーを起こすようになった。今までは載っていないコンテクスト foo の場合 Requires(foo) は Requires とみなされていたようだ。

static int handlePreambleTag(rpmSpec spec, Package pkg, rpmTagVal tag,
		const char *macro, const char *lang)
{
    /* snip */
    case RPMTAG_ORDERFLAGS:
    case RPMTAG_REQUIREFLAGS:
    case RPMTAG_PREREQ:
	if ((rc = parseBits(lang, installScriptBits, &tagflags))) {
	    rpmlog(RPMLOG_ERR,
		     _("line %d: Bad %s: qualifiers: %s\n"),
		     spec->lineNum, rpmTagGetName(tag), spec->line);
	    return rc;
	}
	if ((rc = parseRCPOT(spec, pkg, field, tag, 0, tagflags)))
	    return rc;
	break;
    case RPMTAG_BUILDPREREQ:
    /* snip */
}

ついでに書いておくと、これまでは BuildRequires(check) のように BuildRequires にコンテクストが付いていてもエラーとならなかったが、これらもエラーになる。BuildRequires にコンテクストは付けられないと思う。