From 96f80b8f5b8f41ff1387219d941bf19b365d1bf6 Mon Sep 17 00:00:00 2001 From: ryoon Date: Fri, 18 Jul 2014 11:12:41 +0000 Subject: Fix SCO OpenServer 5.0.7/3.2 build. SCO OpenServer 5.0.7/3.2 has strtoimax() declaration in inttypes.h, but libc.so has no implementation. And gnulib in GNU tar 1.27 has broken strtoimax() support. We have to use BSDL implementation instead. --- archivers/gtar-base/Makefile | 19 ++- archivers/gtar-base/distinfo | 7 +- archivers/gtar-base/patches/patch-src_Makefile.in | 20 +++ archivers/gtar-base/patches/patch-strtoimax.c | 160 ++++++++++++++++++++++ 4 files changed, 200 insertions(+), 6 deletions(-) create mode 100644 archivers/gtar-base/patches/patch-src_Makefile.in create mode 100644 archivers/gtar-base/patches/patch-strtoimax.c (limited to 'archivers') diff --git a/archivers/gtar-base/Makefile b/archivers/gtar-base/Makefile index fbc3b741874..beafb96e0a7 100644 --- a/archivers/gtar-base/Makefile +++ b/archivers/gtar-base/Makefile @@ -1,4 +1,4 @@ -# $NetBSD: Makefile,v 1.82 2014/03/18 18:11:26 bsiegert Exp $ +# $NetBSD: Makefile,v 1.83 2014/07/18 11:12:41 ryoon Exp $ # # Please run 'make files/gtar.1' when updating version of this package # to regenerate the man page. converters/help2man is needed. @@ -38,12 +38,19 @@ CONFIGURE_ENV+= gt_cv_func_gnugettext2_libintl=yes # allow configure to run as root CONFIGURE_ENV+= FORCE_UNSAFE_CONFIGURE=1 +.if ${OS_VARIANT} == "SCOOSR5" +# SCO OpenServer 5.0.7/3.2 has strtoimax in inttypes.h, but not in library. +CONFIGURE_ENV+= gl_cv_have_raw_decl_strtoimax=no +CONFIGURE_ENV+= ac_cv_have_decl_strtoimax=no +LDFLAGS.SCO_SV+= -lsocket +.endif + PLIST_VARS+= gtar rmt TEST_TARGET= check # don't include rmt if gtar won't build it -.if ${OPSYS} != "Interix" && ${OPSYS} != "Darwin" +.if ${OPSYS} != "Interix" && ${OPSYS} != "Darwin" && ${OS_VARIANT} != "SCOOSR5" PLIST.rmt= yes .endif @@ -63,6 +70,14 @@ SYMLINKS= bin/gtar ${PKGGNUDIR}bin/tar \ SYMLINKS+= libexec/grmt ${PKGGNUDIR}libexec/rmt .endif +.if ${OS_VARIANT} == "SCOOSR5" +# SCO OpenServer 5.0.7/3.2 has strtoimax() declaration in inttypes.h, +# but libc.so has no implementation. And gnulib in GNU tar 1.27 has broken +# strtoimax() support. We have to use BSDL implementation instead. +pre-configure: + cd ${WRKSRC} && ${CC} -c -o strtoimax.o strtoimax.c +.endif + files/gtar.1: build ${ECHO} .\\\" > ${FILESDIR}/gtar.1 ${ECHO} .\\\" \$$NetBSD\$$ >> ${FILESDIR}/gtar.1 diff --git a/archivers/gtar-base/distinfo b/archivers/gtar-base/distinfo index c5c7f582a97..4a10187e3f8 100644 --- a/archivers/gtar-base/distinfo +++ b/archivers/gtar-base/distinfo @@ -1,7 +1,6 @@ -$NetBSD: distinfo,v 1.32 2014/03/18 09:03:26 obache Exp $ +$NetBSD: distinfo,v 1.33 2014/07/18 11:12:41 ryoon Exp $ -SHA1 (tar-1.27.1.tar.bz2) = 67aa31d0d497849c05ba5ea6eb41cff130407751 -RMD160 (tar-1.27.1.tar.bz2) = a99ccfd874ac72c1e0feec2d86423c3e5bcd19fb -Size (tar-1.27.1.tar.bz2) = 2573070 bytes SHA1 (patch-ad) = f3a988a6b675a389d8d307fe1a90dde81ba98df5 SHA1 (patch-gnu_readlinkat.c) = b1ddbf5159db92df9186354f27db5c9cb93b9afa +SHA1 (patch-src_Makefile.in) = 9c6b469c8f43c043f44aed74e06df8d9a06b27b2 +SHA1 (patch-strtoimax.c) = a0385d8db47e95066c28c53aab4d74f9ab836b12 diff --git a/archivers/gtar-base/patches/patch-src_Makefile.in b/archivers/gtar-base/patches/patch-src_Makefile.in new file mode 100644 index 00000000000..408451e4d93 --- /dev/null +++ b/archivers/gtar-base/patches/patch-src_Makefile.in @@ -0,0 +1,20 @@ +$NetBSD: patch-src_Makefile.in,v 1.1 2014/07/18 11:12:41 ryoon Exp $ + +--- src/Makefile.in.orig 2013-11-17 16:18:38.000000000 +0000 ++++ src/Makefile.in +@@ -1300,6 +1300,15 @@ installcheck-binPROGRAMS: $(bin_PROGRAMS + done; \ + done; rm -f c$${pid}_.???; exit $$bad + ++# SCO OpenServer 5.0.7/3.2 requires strtoimax(). ++OS!= uname -s ++REL!= uname -r ++.if $(OS) == "SCO_SV" ++.if $(REL) == "3.2" ++tar_OBJECTS += ../strtoimax.o ++.endif ++.endif ++ + tar$(EXEEXT): $(tar_OBJECTS) $(tar_DEPENDENCIES) $(EXTRA_tar_DEPENDENCIES) + @rm -f tar$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(tar_OBJECTS) $(tar_LDADD) $(LIBS) diff --git a/archivers/gtar-base/patches/patch-strtoimax.c b/archivers/gtar-base/patches/patch-strtoimax.c new file mode 100644 index 00000000000..409fbcecd61 --- /dev/null +++ b/archivers/gtar-base/patches/patch-strtoimax.c @@ -0,0 +1,160 @@ +$NetBSD: patch-strtoimax.c,v 1.1 2014/07/18 11:12:41 ryoon Exp $ + +SCO OpenServer 5.0.7/3.2 has strtoimax() declaration in inttypes.h, +but libc.so has no implementation. And gnulib in GNU tar 1.27 has broken +strtoimax() support. We have to use BSDL implementation instead. + +--- strtoimax.c.orig 2014-02-28 16:27:33.000000000 +0000 ++++ strtoimax.c +@@ -0,0 +1,151 @@ ++/* NetBSD: strtoimax.c,v 1.3 2003/08/07 16:43:44 agc Exp */ ++ ++/*- ++ * Copyright (c) 1992, 1993 ++ * The Regents of the University of California. All rights reserved. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions ++ * are met: ++ * 1. Redistributions of source code must retain the above copyright ++ * notice, this list of conditions and the following disclaimer. ++ * 2. Redistributions in binary form must reproduce the above copyright ++ * notice, this list of conditions and the following disclaimer in the ++ * documentation and/or other materials provided with the distribution. ++ * 3. Neither the name of the University nor the names of its contributors ++ * may be used to endorse or promote products derived from this software ++ * without specific prior written permission. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ++ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ++ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ++ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE ++ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL ++ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS ++ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) ++ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT ++ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY ++ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF ++ * SUCH DAMAGE. ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++ ++/* ++ * Convert a string to an intmax_t. ++ * ++ * Ignores `locale' stuff. Assumes that the upper and lower case ++ * alphabets and digits are each contiguous. ++ */ ++intmax_t ++strtoimax(nptr, endptr, base) ++ const char *nptr; ++ char **endptr; ++ int base; ++{ ++ const char *s; ++ intmax_t acc, cutoff; ++ int c; ++ int neg, any, cutlim; ++ ++#ifdef __GNUC__ ++ /* This outrageous construct just to shut up a GCC warning. */ ++ (void) &acc; (void) &cutoff; ++#endif ++ ++ /* ++ * Skip white space and pick up leading +/- sign if any. ++ * If base is 0, allow 0x for hex and 0 for octal, else ++ * assume decimal; if base is already 16, allow 0x. ++ */ ++ s = nptr; ++ do { ++ c = (unsigned char) *s++; ++ } while (isspace(c)); ++ if (c == '-') { ++ neg = 1; ++ c = *s++; ++ } else { ++ neg = 0; ++ if (c == '+') ++ c = *s++; ++ } ++ if ((base == 0 || base == 16) && ++ c == '0' && (*s == 'x' || *s == 'X')) { ++ c = s[1]; ++ s += 2; ++ base = 16; ++ } ++ if (base == 0) ++ base = c == '0' ? 8 : 10; ++ ++ /* ++ * Compute the cutoff value between legal numbers and illegal ++ * numbers. That is the largest legal value, divided by the ++ * base. An input number that is greater than this value, if ++ * followed by a legal input character, is too big. One that ++ * is equal to this value may be valid or not; the limit ++ * between valid and invalid numbers is then based on the last ++ * digit. For instance, if the range for intmax_t is ++ * [-9223372036854775808..9223372036854775807] and the input base ++ * is 10, cutoff will be set to 922337203685477580 and cutlim to ++ * either 7 (neg==0) or 8 (neg==1), meaning that if we have ++ * accumulated a value > 922337203685477580, or equal but the ++ * next digit is > 7 (or 8), the number is too big, and we will ++ * return a range error. ++ * ++ * Set any if any `digits' consumed; make it negative to indicate ++ * overflow. ++ */ ++ cutoff = neg ? INTMAX_MIN : INTMAX_MAX; ++ cutlim = (int)(cutoff % base); ++ cutoff /= base; ++ if (neg) { ++ if (cutlim > 0) { ++ cutlim -= base; ++ cutoff += 1; ++ } ++ cutlim = -cutlim; ++ } ++ for (acc = 0, any = 0;; c = (unsigned char) *s++) { ++ if (isdigit(c)) ++ c -= '0'; ++ else if (isalpha(c)) ++ c -= isupper(c) ? 'A' - 10 : 'a' - 10; ++ else ++ break; ++ if (c >= base) ++ break; ++ if (any < 0) ++ continue; ++ if (neg) { ++ if (acc < cutoff || (acc == cutoff && c > cutlim)) { ++ any = -1; ++ acc = INTMAX_MIN; ++ errno = ERANGE; ++ } else { ++ any = 1; ++ acc *= base; ++ acc -= c; ++ } ++ } else { ++ if (acc > cutoff || (acc == cutoff && c > cutlim)) { ++ any = -1; ++ acc = INTMAX_MAX; ++ errno = ERANGE; ++ } else { ++ any = 1; ++ acc *= base; ++ acc += c; ++ } ++ } ++ } ++ if (endptr != 0) ++ /* LINTED interface specification */ ++ *endptr = (char *)(any ? s - 1 : nptr); ++ return (acc); ++} -- cgit v1.2.3