[PATCH] cache.h: auto-detect if zlib has uncompress2()

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Change the NO_UNCOMPRESS2=Y setting to auto-detect those older zlib
versions that don't have uncompress2().

This makes the compilation of git less annoying on older systems,
since the inclusion of a322920d0bb (Provide zlib's uncompress2 from
compat/zlib-compat.c, 2021-10-07) in v2.35.0-rc0 our default
dependency on a zlib 1.2.9 or newer unless NO_UNCOMPRESS2=Y is
specified has resulted in errors when git is compiled.

To get around those errors we've needed to bundle config.mak.uname
changes such as such as 68d1da41c4e (build: NonStop ships with an
older zlib, 2022-01-10) and the in-flight
https://lore.kernel.org/git/20220116020520.26895-1-davvid@xxxxxxxxx/.

Let's instead rely on ZLIB_VERNUM. Now only those systems where zlib
is so broken that it can't be rely on (such a system probably doesn't
exist) need to provide a NO_UNCOMPRESS2=Y.

See 9da3acfb194 ([PATCH] compat: support pre-1.2 zlib, 2005-04-30) and
609a2289d76 (Improve accuracy of check for presence of deflateBound.,
2007-11-07) for in-tree prior art using ZLIB_VERNUM.

Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@xxxxxxxxx>
---

I think this should be strongly considered for inclusion before the
final v2.35.0 release.

Aside from the ones already (and in-flight) in config.mak.uname, I've
run into numerous other cases where NO_UNCOMPRESS2=y is needed (so far
gcc{10,14,45,111,119,135,210} on the GCC farm). Adding
config.mak.uname detections to those would be tedious, we'd need to
start detecting various other OS versions.

Or, we can just ask zlib.h abuot its ZLIB_VERSION instead, and include
compat/zlib-uncompress2.c in our own zlib.c wrapper.

This has an interaction with da/rhel7-lacks-uncompress2-and-c99 (the
merge should preferably delete the NO_UNCOMPRESS2=Y it adds), it's in
"next", but I didn't base this on that topic as "nex" clearly won't be
merged down before v2.35.0.

 Makefile                  |  6 ++++--
 cache.h                   |  5 +++++
 compat/zlib-uncompress2.c |  5 +----
 config.mak.uname          |  6 ------
 reftable/block.c          |  2 +-
 reftable/system.h         | 12 +-----------
 zlib.c                    |  3 +++
 7 files changed, 15 insertions(+), 24 deletions(-)

diff --git a/Makefile b/Makefile
index 5580859afdb..3e90820bbfd 100644
--- a/Makefile
+++ b/Makefile
@@ -256,7 +256,10 @@ all::
 #
 # Define NO_DEFLATE_BOUND if your zlib does not have deflateBound.
 #
-# Define NO_UNCOMPRESS2 if your zlib does not have uncompress2.
+# Define NO_UNCOMPRESS2 if your zlib is older than v1.2.9 and does not
+# have uncompress2. You should not need to define this unless your
+# zlib's ZLIB_VERNUM is broken. We'll auto-detect this on the basis of
+# that macro.
 #
 # Define NO_NORETURN if using buggy versions of gcc 4.6+ and profile feedback,
 # as the compiler can crash (http://gcc.gnu.org/bugzilla/show_bug.cgi?id=49299)
@@ -1728,7 +1731,6 @@ endif
 
 ifdef NO_UNCOMPRESS2
 	BASIC_CFLAGS += -DNO_UNCOMPRESS2
-	REFTABLE_OBJS += compat/zlib-uncompress2.o
 endif
 
 ifdef NO_POSIX_GOODIES
diff --git a/cache.h b/cache.h
index 281f00ab1b1..02b355fcf08 100644
--- a/cache.h
+++ b/cache.h
@@ -29,6 +29,11 @@ typedef struct git_zstream {
 	unsigned char *next_out;
 } git_zstream;
 
+#if defined(NO_UNCOMPRESS2) || ZLIB_VERNUM < 0x1290
+#define GIT_NO_UNCOMPRESS2 1
+int uncompress2(Bytef *dest, uLongf *destLen, const Bytef *source,
+		uLong *sourceLen);
+#endif
 void git_inflate_init(git_zstream *);
 void git_inflate_init_gzip_only(git_zstream *);
 void git_inflate_end(git_zstream *);
diff --git a/compat/zlib-uncompress2.c b/compat/zlib-uncompress2.c
index 722610b9718..915796e85ac 100644
--- a/compat/zlib-uncompress2.c
+++ b/compat/zlib-uncompress2.c
@@ -8,15 +8,12 @@
 
 */
 
-#include "../reftable/system.h"
-#define z_const
-
 /*
  * Copyright (C) 1995-2003, 2010, 2014, 2016 Jean-loup Gailly, Mark Adler
  * For conditions of distribution and use, see copyright notice in zlib.h
  */
 
-#include <zlib.h>
+/* No "#include <zlib.h>", done in cache.h */
 
 /* clang-format off */
 
diff --git a/config.mak.uname b/config.mak.uname
index 9b3e9bff5f5..d0701f9beb0 100644
--- a/config.mak.uname
+++ b/config.mak.uname
@@ -261,10 +261,6 @@ ifeq ($(uname_S),FreeBSD)
 	FILENO_IS_A_MACRO = UnfortunatelyYes
 endif
 ifeq ($(uname_S),OpenBSD)
-	# Versions < 7.0 need compatibility layer
-	ifeq ($(shell expr "$(uname_R)" : "[1-6]\."),2)
-		NO_UNCOMPRESS2 = UnfortunatelyYes
-	endif
 	NO_STRCASESTR = YesPlease
 	NO_MEMMEM = YesPlease
 	USE_ST_TIMESPEC = YesPlease
@@ -520,7 +516,6 @@ ifeq ($(uname_S),Interix)
 	endif
 endif
 ifeq ($(uname_S),Minix)
-	NO_UNCOMPRESS2 = YesPlease
 	NO_IPV6 = YesPlease
 	NO_ST_BLOCKS_IN_STRUCT_STAT = YesPlease
 	NO_NSEC = YesPlease
@@ -576,7 +571,6 @@ ifeq ($(uname_S),NONSTOP_KERNEL)
 	NO_SETENV = YesPlease
 	NO_UNSETENV = YesPlease
 	NO_MKDTEMP = YesPlease
-	NO_UNCOMPRESS2 = YesPlease
 	# Currently libiconv-1.9.1.
 	OLD_ICONV = UnfortunatelyYes
 	NO_REGEX = NeedsStartEnd
diff --git a/reftable/block.c b/reftable/block.c
index 855e3f5c947..946edd0f34e 100644
--- a/reftable/block.c
+++ b/reftable/block.c
@@ -13,7 +13,7 @@ license that can be found in the LICENSE file or at
 #include "record.h"
 #include "reftable-error.h"
 #include "system.h"
-#include <zlib.h>
+#include "zlib.h"
 
 int header_size(int version)
 {
diff --git a/reftable/system.h b/reftable/system.h
index 4907306c0c5..2cebbc94d4d 100644
--- a/reftable/system.h
+++ b/reftable/system.h
@@ -15,17 +15,7 @@ license that can be found in the LICENSE file or at
 #include "strbuf.h"
 #include "hash.h" /* hash ID, sizes.*/
 #include "dir.h" /* remove_dir_recursively, for tests.*/
-
-#include <zlib.h>
-
-#ifdef NO_UNCOMPRESS2
-/*
- * This is uncompress2, which is only available in zlib >= 1.2.9
- * (released as of early 2017)
- */
-int uncompress2(Bytef *dest, uLongf *destLen, const Bytef *source,
-		uLong *sourceLen);
-#endif
+#include "zlib.h"
 
 int hash_size(uint32_t id);
 
diff --git a/zlib.c b/zlib.c
index d594cba3fc9..d9440dfb784 100644
--- a/zlib.c
+++ b/zlib.c
@@ -3,6 +3,9 @@
  * at init time.
  */
 #include "cache.h"
+#ifdef GIT_NO_UNCOMPRESS2
+#include "compat/zlib-uncompress2.c"
+#endif
 
 static const char *zerr_to_string(int status)
 {
-- 
2.35.0.rc1.855.gbd520c8f475




[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]

  Powered by Linux