mirror of
https://github.com/git/git
synced 2024-08-27 19:49:21 +00:00
![]() We have a copy of uncompress2() implementation in compat/ so that we can build with an older version of zlib that lack the function, and the build procedure selects if it is used via the NO_UNCOMPRESS2 $(MAKE) variable. This is yet another "annoying" knob the porters need to tweak on platforms that are not common enough to have the default set in the config.mak.uname file. Attempt to instead ask the system header <zlib.h> to decide if we need the compatibility implementation. This is a deviation from the way we have been handling the "compatiblity" features so far, and if it can be done cleanly enough, it could work as a model for features that need compatibility definition we discover in the future. With that goal in mind, avoid expedient but ugly hacks, like shoving the code that is conditionally compiled into an unrelated .c file, which may not work in future cases---instead, take an approach that uses a file that is independently compiled and stands on its own. Compile and link compat/zlib-uncompress2.c file unconditionally, but conditionally hide the implementation behind #if/#endif when zlib version is 1.2.9 or newer, and unconditionally archive the resulting object file in the libgit.a to be picked up by the linker. There are a few things to note in the shape of the code base after this change: - We no longer use NO_UNCOMPRESS2 knob; if the system header <zlib.h> claims a version that is more cent than the library actually is, this would break, but it is easy to add it back when we find such a system. - The object file compat/zlib-uncompress2.o is always compiled and archived in libgit.a, just like a few other compat/ object files already are. - The inclusion of <zlib.h> is done in <git-compat-util.h>; we used to do so from <cache.h> which includes <git-compat-util.h> as the first thing it does, so from the *.c codes, there is no practical change. - Until objects in libgit.a that is already used gains a reference to the function, the reftable code will be the only one that wants it, so libgit.a on the linker command line needs to appear once more at the end to satisify the mutual dependency. - Beat found a trick used by OpenSSL to avoid making the conditionally-compiled object truly empty (apparently because they had to deal with compilers that do not want to see an effectively empty input file). Our compat/zlib-uncompress2.c file borrows the same trick for portabilty. Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com> Helped-by: Beat Bolli <dev+git@drbeat.li> Signed-off-by: Junio C Hamano <gitster@pobox.com> |
||
---|---|---|
.. | ||
basics.c | ||
basics.h | ||
basics_test.c | ||
block.c | ||
block.h | ||
block_test.c | ||
blocksource.c | ||
blocksource.h | ||
constants.h | ||
dump.c | ||
error.c | ||
generic.c | ||
generic.h | ||
iter.c | ||
iter.h | ||
LICENSE | ||
merged.c | ||
merged.h | ||
merged_test.c | ||
pq.c | ||
pq.h | ||
pq_test.c | ||
publicbasics.c | ||
reader.c | ||
reader.h | ||
readwrite_test.c | ||
record.c | ||
record.h | ||
record_test.c | ||
refname.c | ||
refname.h | ||
refname_test.c | ||
reftable-blocksource.h | ||
reftable-error.h | ||
reftable-generic.h | ||
reftable-iterator.h | ||
reftable-malloc.h | ||
reftable-merged.h | ||
reftable-reader.h | ||
reftable-record.h | ||
reftable-stack.h | ||
reftable-tests.h | ||
reftable-writer.h | ||
reftable.c | ||
stack.c | ||
stack.h | ||
stack_test.c | ||
system.h | ||
test_framework.c | ||
test_framework.h | ||
tree.c | ||
tree.h | ||
tree_test.c | ||
writer.c | ||
writer.h |