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 にコンテクストは付けられないと思う。