--- /dev/null
+--- rpm-4.0.2/lib/rpmlib.h~ Sun May 26 07:47:04 2002
++++ rpm-4.0.2/lib/rpmlib.h Sun May 26 07:55:51 2002
+@@ -320,6 +320,7 @@
+ RPMFILE_GHOST = (1 << 6), /*!< from %%ghost */
+ RPMFILE_LICENSE = (1 << 7), /*!< from %%license */
+- RPMFILE_README = (1 << 8) /*!< from %%readme */
++ RPMFILE_README = (1 << 8), /*!< from %%readme */
++ RPMFILE_EXCLUDE = (1 << 9) /*!< from %%exclude */
+ } rpmfileAttrs;
+ #define RPMFILE_MULTILIB_SHIFT 9
+ #define RPMFILE_MULTILIB(N) ((N) << RPMFILE_MULTILIB_SHIFT)
+--- rpm-4.0.2/build/files.c~ Sun May 26 07:47:04 2002
++++ rpm-4.0.2/build/files.c Sun May 26 08:19:18 2002
+@@ -685,6 +685,7 @@
+ { "%dir", 0 }, /* XXX why not RPMFILE_DIR? */
+ { "%doc", RPMFILE_DOC },
+ { "%ghost", RPMFILE_GHOST },
++ { "%exclude", RPMFILE_EXCLUDE },
+ { "%readme", RPMFILE_README },
+ { "%license", RPMFILE_LICENSE },
+ { "%multilib", 0 },
+@@ -986,12 +987,16 @@
+ clp = *cpioList = xmalloc(sizeof(**cpioList) * fl->fileListRecsUsed);
+
+ for (flp = fl->fileList, count = fl->fileListRecsUsed; count > 0; flp++, count--) {
+- if ((count > 1) && !strcmp(flp->fileURL, flp[1].fileURL)) {
+- rpmError(RPMERR_BADSPEC, _("File listed twice: %s\n"),
+- flp->fileURL);
+- fl->processingFailed = 1;
+- }
++ if ((count > 1) && !strcmp(flp->fileURL, flp[1].fileURL))
++ if (!(flp[1].flags & RPMFILE_EXCLUDE)) {
++ rpmError(RPMERR_BADSPEC, _("File listed twice: %s\n"),
++ flp->fileURL);
++ fl->processingFailed = 1;
++ }
+
++ /* Skip files that were marked with %exclude. */
++ if (flp->flags & RPMFILE_EXCLUDE) continue;
++
+ if (flp->flags & RPMFILE_MULTILIB_MASK)
+ multiLibMask |=
+ (1 << ((flp->flags & RPMFILE_MULTILIB_MASK))