diff -pur rpm-4.2.1.000/build/rpmbuild.h rpm-4.2.1/build/rpmbuild.h --- rpm-4.2.1.000/build/rpmbuild.h 2002-12-24 07:02:26.000000000 +0100 +++ rpm-4.2.1/build/rpmbuild.h 2004-06-24 15:40:38.000000000 +0200 @@ -69,7 +69,8 @@ typedef enum rpmParseState_e { PART_VERIFYSCRIPT = 16, /*!< */ PART_BUILDARCHITECTURES= 17,/*!< */ PART_TRIGGERPOSTUN = 18, /*!< */ - PART_LAST = 19 /*!< */ + PART_PACKAGE = 19, /*!< */ + PART_LAST = 20 /*!< */ } rpmParseState; #define STRIP_NOTHING 0 diff -pur rpm-4.2.1.000/build/parseSpec.c rpm-4.2.1/build/parseSpec.c --- rpm-4.2.1.000/build/parseSpec.c 2003-05-15 15:38:57.000000000 +0200 +++ rpm-4.2.1/build/parseSpec.c 2004-06-24 15:40:38.000000000 +0200 @@ -25,7 +25,9 @@ static struct PartRec { /*@observer@*/ /*@null@*/ const char * token; } partList[] = { - { PART_PREAMBLE, 0, "%package"}, +/* PART_PREAMBLE is not associated with a tag + initialPackage now gets unset when first PART_PACKAGE is reached */ + { PART_PACKAGE, 0, "%package"}, { PART_PREP, 0, "%prep"}, { PART_BUILD, 0, "%build"}, { PART_INSTALL, 0, "%install"}, @@ -456,7 +458,10 @@ int parseSpec(rpmts ts, const char *spec switch (parsePart) { case PART_PREAMBLE: parsePart = parsePreamble(spec, initialPackage); + /*@switchbreak@*/ break; + case PART_PACKAGE: initialPackage = 0; + parsePart = parsePreamble(spec, initialPackage); /*@switchbreak@*/ break; case PART_PREP: parsePart = parsePrep(spec); diff -pur rpm-4.2.1.000/build/parsePreamble.c rpm-4.2.1/build/parsePreamble.c --- rpm-4.2.1.000/build/parsePreamble.c 2002-12-21 18:26:43.000000000 +0100 +++ rpm-4.2.1/build/parsePreamble.c 2004-06-24 15:42:17.000000000 +0200 @@ -459,7 +459,7 @@ extern int noLang; */ /*@-boundswrite@*/ static int handlePreambleTag(Spec spec, Package pkg, int tag, const char *macro, - const char *lang) + const char *lang, const int initialPackage) /*@globals rpmGlobalMacroContext, fileSystem, internalState @*/ /*@modifies spec->macros, spec->st, spec->buildRootURL, spec->sources, spec->numSources, spec->noSource, @@ -521,14 +521,16 @@ static int handlePreambleTag(Spec spec, spec->lineNum, "version", spec->line); return RPMERR_BADSPEC; } - addMacro(spec->macros, "PACKAGE_VERSION", NULL, field, RMIL_OLDSPEC); + if (initialPackage) + addMacro(spec->macros, "PACKAGE_VERSION", NULL, field, RMIL_OLDSPEC); } else if (tag == RPMTAG_RELEASE) { if (strchr(field, '-') != NULL) { rpmError(RPMERR_BADSPEC, _("line %d: Illegal char '-' in %s: %s\n"), spec->lineNum, "release", spec->line); return RPMERR_BADSPEC; } - addMacro(spec->macros, "PACKAGE_RELEASE", NULL, field, RMIL_OLDSPEC-1); + if (initialPackage) + addMacro(spec->macros, "PACKAGE_RELEASE", NULL, field, RMIL_OLDSPEC-1); } (void) headerAddEntry(pkg->header, tag, RPM_STRING_TYPE, field, 1); break; @@ -712,9 +714,9 @@ static int handlePreambleTag(Spec spec, return RPMERR_INTERNAL; } - if (macro) + if (macro && initialPackage) { addMacro(spec->macros, macro, NULL, field, RMIL_SPEC); - + } return 0; } /*@=boundswrite@*/ @@ -906,7 +908,7 @@ int parsePreamble(Spec spec, int initial spec->lineNum, spec->line); return RPMERR_BADSPEC; } - if (handlePreambleTag(spec, pkg, tag, macro, lang)) + if (handlePreambleTag(spec, pkg, tag, macro, lang, initialPackage)) return RPMERR_BADSPEC; if (spec->BANames && !spec->recursing) return PART_BUILDARCHITECTURES;