|
|
@@ -0,0 +1,354 @@
|
|
|
+##
|
|
|
+## rpm-4.0.2.patch.feature -- Annotated patch file
|
|
|
+## Copyright (c) 2000-2001 Cable & Wireless Deutschland GmbH
|
|
|
+## Copyright (c) 2000-2001 Ralf S. Engelschall <rse.com>
|
|
|
+##
|
|
|
+## This file assembles changes to existing RPM source files between
|
|
|
+## the original RedHat RPM and the OpenPKG RPM variant. It can be
|
|
|
+## automatically applied to a vanilla RedHat RPM source tree with the
|
|
|
+## 'patch' tool to upgrade those files. Each patch snippet is annotated
|
|
|
+## with a short description.
|
|
|
+##
|
|
|
+## Created on: 20-Sep-2001
|
|
|
+##
|
|
|
+
|
|
|
++---------------------------------------------------------------------------
|
|
|
+| In OpenPKG, the RPM package contains own local versions of the
|
|
|
+| "patch" and "tar" tools, so we cannot accept hard-coded names here.
|
|
|
+| Instead we expand a variable to allow us to direct RPM to our tools.
|
|
|
+| Also we allow %setup and %patch macros whitespace-indented in %prep,
|
|
|
+| because both in OpenPKG we both have all scripts indented and this
|
|
|
+| way it is more flexible and clean.
|
|
|
+| Additionally add support for splitted source directories, i.e.,
|
|
|
+| source files alternatively can be placed into the spec directory and
|
|
|
+| are picked up there, too.
|
|
|
++---------------------------------------------------------------------------
|
|
|
+Index: build/parsePrep.c
|
|
|
+--- build/parsePrep.c 2001/01/15 23:10:04 1.1.1.7
|
|
|
++++ build/parsePrep.c 2001/09/17 11:09:23 1.3
|
|
|
+@@ -65,6 +65,7 @@
|
|
|
+ struct Source *sp;
|
|
|
+ rpmCompressedMagic compressed = COMPRESSED_NOT;
|
|
|
+ int urltype;
|
|
|
++ const char *patcher;
|
|
|
+
|
|
|
+ for (sp = spec->sources; sp != NULL; sp = sp->next) {
|
|
|
+ if ((sp->flags & RPMBUILD_ISPATCH) && (sp->num == c)) {
|
|
|
+@@ -76,7 +77,15 @@
|
|
|
+ return NULL;
|
|
|
+ }
|
|
|
+
|
|
|
++#ifndef OPENPKG
|
|
|
+ fn = urlfn = rpmGetPath("%{_sourcedir}/", sp->source, NULL);
|
|
|
++#else
|
|
|
++ fn = urlfn = rpmGetPath("%{_specdir}/", sp->source, NULL);
|
|
|
++ if (access(fn, F_OK) == -1) {
|
|
|
++ free(fn);
|
|
|
++ fn = urlfn = rpmGetPath("%{_sourcedir}/", sp->source, NULL);
|
|
|
++ }
|
|
|
++#endif
|
|
|
+
|
|
|
+ args[0] = '\0';
|
|
|
+ if (db) {
|
|
|
+@@ -112,6 +121,9 @@
|
|
|
+ /*@notreached@*/ break;
|
|
|
+ }
|
|
|
+
|
|
|
++ patcher = rpmGetPath("%{_patchbin}", NULL);
|
|
|
++ if (strcmp(patcher, "%{_patchbin}") == 0)
|
|
|
++ patcher = "patch";
|
|
|
+ if (compressed) {
|
|
|
+ const char *zipper = rpmGetPath(
|
|
|
+ (compressed == COMPRESSED_BZIP2 ? "%{_bzip2bin}" : "%{_gzipbin}"),
|
|
|
+@@ -119,20 +131,20 @@
|
|
|
+
|
|
|
+ sprintf(buf,
|
|
|
+ "echo \"Patch #%d (%s):\"\n"
|
|
|
+- "%s -d < %s | patch -p%d %s -s\n"
|
|
|
++ "%s -d < %s | %s -p%d %s -s\n"
|
|
|
+ "STATUS=$?\n"
|
|
|
+ "if [ $STATUS -ne 0 ]; then\n"
|
|
|
+ " exit $STATUS\n"
|
|
|
+ "fi",
|
|
|
+ c, (const char *) basename(fn),
|
|
|
+ zipper,
|
|
|
+- fn, strip, args);
|
|
|
++ fn, patcher, strip, args);
|
|
|
+ free((void *)zipper);
|
|
|
+ } else {
|
|
|
+ sprintf(buf,
|
|
|
+ "echo \"Patch #%d (%s):\"\n"
|
|
|
+- "patch -p%d %s -s < %s", c, (const char *) basename(fn),
|
|
|
+- strip, args, fn);
|
|
|
++ "%s -p%d %s -s < %s", c, (const char *) basename(fn),
|
|
|
++ patcher, strip, args, fn);
|
|
|
+ }
|
|
|
+
|
|
|
+ free((void *)urlfn);
|
|
|
+@@ -155,6 +167,7 @@
|
|
|
+ struct Source *sp;
|
|
|
+ rpmCompressedMagic compressed = COMPRESSED_NOT;
|
|
|
+ int urltype;
|
|
|
++ const char *tar;
|
|
|
+
|
|
|
+ for (sp = spec->sources; sp != NULL; sp = sp->next) {
|
|
|
+ if ((sp->flags & RPMBUILD_ISSOURCE) && (sp->num == c)) {
|
|
|
+@@ -166,7 +179,19 @@
|
|
|
+ return NULL;
|
|
|
+ }
|
|
|
+
|
|
|
++#ifndef OPENPKG
|
|
|
+ fn = urlfn = rpmGetPath("%{_sourcedir}/", sp->source, NULL);
|
|
|
++#else
|
|
|
++ fn = urlfn = rpmGetPath("%{_specdir}/", sp->source, NULL);
|
|
|
++ if (access(fn, F_OK) == -1) {
|
|
|
++ free(fn);
|
|
|
++ fn = urlfn = rpmGetPath("%{_sourcedir}/", sp->source, NULL);
|
|
|
++ }
|
|
|
++#endif
|
|
|
++
|
|
|
++ tar = rpmGetPath("%{_tarbin}", NULL);
|
|
|
++ if (strcmp(tar, "%{_tarbin}") == 0)
|
|
|
++ tar = "tar";
|
|
|
+
|
|
|
+ taropts = ((rpmIsVerbose() && !quietly) ? "-xvvf" : "-xf");
|
|
|
+
|
|
|
+@@ -232,8 +257,13 @@
|
|
|
+ free((void *)zipper);
|
|
|
+ *t++ = ' ';
|
|
|
+ t = stpcpy(t, fn);
|
|
|
+- if (needtar)
|
|
|
+- t = stpcpy( stpcpy( stpcpy(t, " | tar "), taropts), " -");
|
|
|
++ if (needtar) {
|
|
|
++ t = stpcpy(t, " | ");
|
|
|
++ t = stpcpy(t, tar);
|
|
|
++ t = stpcpy(t, " ");
|
|
|
++ t = stpcpy(t, taropts);
|
|
|
++ t = stpcpy(t, " -");
|
|
|
++ }
|
|
|
+ t = stpcpy(t,
|
|
|
+ "\n"
|
|
|
+ "STATUS=$?\n"
|
|
|
+@@ -549,11 +579,14 @@
|
|
|
+
|
|
|
+ saveLines = splitString(getStringBuf(buf), strlen(getStringBuf(buf)), '\n');
|
|
|
+ for (lines = saveLines; *lines; lines++) {
|
|
|
++ char *cp;
|
|
|
++ for (cp = *lines; *cp == ' ' || *cp == '\t'; cp++)
|
|
|
++ ;
|
|
|
+ res = 0;
|
|
|
+- if (! strncmp(*lines, "%setup", sizeof("%setup")-1)) {
|
|
|
+- res = doSetupMacro(spec, *lines);
|
|
|
+- } else if (! strncmp(*lines, "%patch", sizeof("%patch")-1)) {
|
|
|
+- res = doPatchMacro(spec, *lines);
|
|
|
++ if (! strncmp(cp, "%setup", sizeof("%setup")-1)) {
|
|
|
++ res = doSetupMacro(spec, cp);
|
|
|
++ } else if (! strncmp(cp, "%patch", sizeof("%patch")-1)) {
|
|
|
++ res = doPatchMacro(spec, cp);
|
|
|
+ } else {
|
|
|
+ appendLineStringBuf(spec->prep, *lines);
|
|
|
+ }
|
|
|
+
|
|
|
++---------------------------------------------------------------------------
|
|
|
+| Not everything on a system is RPM based (for instance OpenPKG is
|
|
|
+| just an add-on to the system), so do not assume we can just require
|
|
|
+| a package to provide "/bin/sh".
|
|
|
++---------------------------------------------------------------------------
|
|
|
+Index: build/parseScript.c
|
|
|
+--- build/parseScript.c 2001/01/15 23:10:04 1.1.1.9
|
|
|
++++ build/parseScript.c 2001/06/25 19:31:13 1.2
|
|
|
+@@ -246,6 +246,7 @@
|
|
|
+ stripTrailingBlanksStringBuf(sb);
|
|
|
+ p = getStringBuf(sb);
|
|
|
+
|
|
|
++ if (progArgv[0] != NULL && strcmp(progArgv[0], "/bin/sh") != 0)
|
|
|
+ addReqProv(spec, pkg->header, (tagflags | RPMSENSE_INTERP), progArgv[0], NULL, 0);
|
|
|
+
|
|
|
+ /* Trigger script insertion is always delayed in order to */
|
|
|
+
|
|
|
++---------------------------------------------------------------------------
|
|
|
+| RPM has two platform id canonicalizations: hard-coded ones in the
|
|
|
+| "rpm" program and defined ones in the rpmrc files. The hard-coded
|
|
|
+| ones make the defined ones inconsistent. Additionally in OpenPKG we
|
|
|
+| know exactly what we do. So disable the hard-coded canonicalizations
|
|
|
+| and use only the defined ones. The only thing we do inside "rpm" is
|
|
|
+| to reduce the platform version to major and minor version numbers in
|
|
|
+| order to simplify the "rpmrc" files.
|
|
|
++---------------------------------------------------------------------------
|
|
|
+Index: lib/rpmrc.c
|
|
|
+--- lib/rpmrc.c 2001/03/13 12:55:25 1.1.1.20
|
|
|
++++ lib/rpmrc.c 2001/06/25 19:35:42 1.2
|
|
|
+@@ -931,6 +931,23 @@
|
|
|
+ if (!gotDefaults) {
|
|
|
+ uname(&un);
|
|
|
+
|
|
|
++#ifdef OPENPKG
|
|
|
++ {
|
|
|
++ char *cp;
|
|
|
++ int n;
|
|
|
++ if ((n = strspn(un.release, "0123456789.")) > 0) {
|
|
|
++ /* terminate after "N.N.N...." prefix */
|
|
|
++ un.release[n] = '\0';
|
|
|
++ /* shorten to "N.N" if longer */
|
|
|
++ if ((cp = strchr(un.release, '.')) != NULL) {
|
|
|
++ if ((cp = strchr(cp+1, '.')) != NULL) {
|
|
|
++ *cp = '\0';
|
|
|
++ }
|
|
|
++ }
|
|
|
++ strcat(un.sysname, un.release);
|
|
|
++ }
|
|
|
++ }
|
|
|
++#else /* OPENPKG */
|
|
|
+ #if !defined(__linux__)
|
|
|
+ #ifdef SNI
|
|
|
+ /* USUALLY un.sysname on sinix does start with the word "SINIX"
|
|
|
+@@ -1114,6 +1131,7 @@
|
|
|
+ un.machine[1] = class;
|
|
|
+ }
|
|
|
+ # endif
|
|
|
++#endif /* OPENPKG */
|
|
|
+
|
|
|
+ /* the uname() result goes through the arch_canon table */
|
|
|
+ canon = lookupInCanonTable(un.machine,
|
|
|
+
|
|
|
++---------------------------------------------------------------------------
|
|
|
+| Add support for splitted source directories, i.e., source files
|
|
|
+| alternatively can be placed into the spec directory and are picked
|
|
|
+| up there, too.
|
|
|
++---------------------------------------------------------------------------
|
|
|
+Index: build/build.c
|
|
|
+--- build/build.c 2001/01/15 23:10:04 1.1.1.16
|
|
|
++++ build/build.c 2001/09/17 11:09:23 1.2
|
|
|
+@@ -25,7 +25,15 @@
|
|
|
+
|
|
|
+ for (p = spec->sources; p != NULL; p = p->next) {
|
|
|
+ if (! (p->flags & RPMBUILD_ISNO)) {
|
|
|
++#ifndef OPENPKG
|
|
|
+ const char *fn = rpmGetPath("%{_sourcedir}/", p->source, NULL);
|
|
|
++#else
|
|
|
++ const char *fn = rpmGetPath("%{_specdir}/", p->source, NULL);
|
|
|
++ if (access(fn, F_OK) == -1) {
|
|
|
++ free(fn);
|
|
|
++ fn = rpmGetPath("%{_sourcedir}/", p->source, NULL);
|
|
|
++ }
|
|
|
++#endif
|
|
|
+ unlink(fn);
|
|
|
+ free((void *)fn);
|
|
|
+ }
|
|
|
+@@ -34,7 +42,15 @@
|
|
|
+ for (pkg = spec->packages; pkg != NULL; pkg = pkg->next) {
|
|
|
+ for (p = pkg->icon; p != NULL; p = p->next) {
|
|
|
+ if (! (p->flags & RPMBUILD_ISNO)) {
|
|
|
++#ifndef OPENPKG
|
|
|
+ const char *fn = rpmGetPath("%{_sourcedir}/", p->source, NULL);
|
|
|
++#else
|
|
|
++ const char *fn = rpmGetPath("%{_specdir}/", p->source, NULL);
|
|
|
++ if (access(fn, F_OK) == -1) {
|
|
|
++ free(fn);
|
|
|
++ fn = rpmGetPath("%{_sourcedir}/", p->source, NULL);
|
|
|
++ }
|
|
|
++#endif
|
|
|
+ unlink(fn);
|
|
|
+ free((void *)fn);
|
|
|
+ }
|
|
|
+
|
|
|
++---------------------------------------------------------------------------
|
|
|
+| Add support for splitted source directories, i.e., source files
|
|
|
+| alternatively can be placed into the spec directory and are picked
|
|
|
+| up there, too.
|
|
|
++---------------------------------------------------------------------------
|
|
|
+Index: build/files.c
|
|
|
+--- build/files.c 2001/01/19 01:47:25 1.1.1.15
|
|
|
++++ build/files.c 2001/09/17 11:09:23 1.2
|
|
|
+@@ -1655,8 +1655,20 @@
|
|
|
+ }
|
|
|
+
|
|
|
+ { const char *s;
|
|
|
++#ifndef OPENPKG
|
|
|
+ s = rpmGetPath( ((srcPtr->flags & RPMBUILD_ISNO) ? "!" : ""),
|
|
|
+ "%{_sourcedir}/", srcPtr->source, NULL);
|
|
|
++#else
|
|
|
++ const char *s2;
|
|
|
++ s2 = rpmGetPath("%{_specdir}/", srcPtr->source, NULL);
|
|
|
++ if (access(s2, F_OK) == 0)
|
|
|
++ s = rpmGetPath( ((srcPtr->flags & RPMBUILD_ISNO) ? "!" : ""),
|
|
|
++ "%{_specdir}/", srcPtr->source, NULL);
|
|
|
++ else
|
|
|
++ s = rpmGetPath( ((srcPtr->flags & RPMBUILD_ISNO) ? "!" : ""),
|
|
|
++ "%{_sourcedir}/", srcPtr->source, NULL);
|
|
|
++ free(s2);
|
|
|
++#endif
|
|
|
+ appendLineStringBuf(sourceFiles, s);
|
|
|
+ free((void *)s);
|
|
|
+ }
|
|
|
+@@ -1665,8 +1677,20 @@
|
|
|
+ for (pkg = spec->packages; pkg != NULL; pkg = pkg->next) {
|
|
|
+ for (srcPtr = pkg->icon; srcPtr != NULL; srcPtr = srcPtr->next) {
|
|
|
+ const char *s;
|
|
|
++#ifndef OPENPKG
|
|
|
+ s = rpmGetPath( ((srcPtr->flags & RPMBUILD_ISNO) ? "!" : ""),
|
|
|
+ "%{_sourcedir}/", srcPtr->source, NULL);
|
|
|
++#else
|
|
|
++ const char *s2;
|
|
|
++ s2 = rpmGetPath("%{_specdir}/", srcPtr->source, NULL);
|
|
|
++ if (access(s2, F_OK) == 0)
|
|
|
++ s = rpmGetPath( ((srcPtr->flags & RPMBUILD_ISNO) ? "!" : ""),
|
|
|
++ "%{_specdir}/", srcPtr->source, NULL);
|
|
|
++ else
|
|
|
++ s = rpmGetPath( ((srcPtr->flags & RPMBUILD_ISNO) ? "!" : ""),
|
|
|
++ "%{_sourcedir}/", srcPtr->source, NULL);
|
|
|
++ free(s2);
|
|
|
++#endif
|
|
|
+ appendLineStringBuf(sourceFiles, s);
|
|
|
+ free((void *)s);
|
|
|
+ }
|
|
|
+
|
|
|
++---------------------------------------------------------------------------
|
|
|
+| Add support for splitted source directories, i.e., source files
|
|
|
+| alternatively can be placed into the spec directory and are picked
|
|
|
+| up there, too.
|
|
|
++---------------------------------------------------------------------------
|
|
|
+Index: build/parsePreamble.c
|
|
|
+--- build/parsePreamble.c 2001/01/15 23:10:04 1.1.1.9
|
|
|
++++ build/parsePreamble.c 2001/09/17 11:09:23 1.2
|
|
|
+@@ -317,7 +317,15 @@
|
|
|
+ size_t nb, iconsize;
|
|
|
+
|
|
|
+ /* XXX use rpmGenPath(rootdir, "%{_sourcedir}/", file) for icon path. */
|
|
|
++#ifndef OPENPKG
|
|
|
+ fn = rpmGetPath("%{_sourcedir}/", file, NULL);
|
|
|
++#else
|
|
|
++ fn = rpmGetPath("%{_specdir}/", file, NULL);
|
|
|
++ if (access(fn, F_OK) == -1) {
|
|
|
++ free(fn);
|
|
|
++ fn = rpmGetPath("%{_sourcedir}/", file, NULL);
|
|
|
++ }
|
|
|
++#endif
|
|
|
+
|
|
|
+ fd = Fopen(fn, "r.ufdio");
|
|
|
+ if (fd == NULL || Ferror(fd)) {
|
|
|
+
|
|
|
++---------------------------------------------------------------------------
|
|
|
+| Add support for splitted source directories, i.e., source files
|
|
|
+| alternatively can be placed into the spec directory and are picked
|
|
|
+| up there, too.
|
|
|
++---------------------------------------------------------------------------
|
|
|
+Index: build/spec.c
|
|
|
+--- build/spec.c 2001/01/15 23:10:04 1.1.1.16
|
|
|
++++ build/spec.c 2001/09/17 11:09:23 1.2
|
|
|
+@@ -319,7 +319,15 @@
|
|
|
+ spec->numSources++;
|
|
|
+
|
|
|
+ if (tag != RPMTAG_ICON) {
|
|
|
++#ifndef OPENPKG
|
|
|
+ const char *body = rpmGetPath("%{_sourcedir}/", p->source, NULL);
|
|
|
++#else
|
|
|
++ const char *body = rpmGetPath("%{_specdir}/", p->source, NULL);
|
|
|
++ if (access(body, F_OK) == -1) {
|
|
|
++ free(body);
|
|
|
++ body = rpmGetPath("%{_sourcedir}/", p->source, NULL);
|
|
|
++ }
|
|
|
++#endif
|
|
|
+
|
|
|
+ sprintf(buf, "%s%d",
|
|
|
+ (flag & RPMBUILD_ISPATCH) ? "PATCH" : "SOURCE", num);
|