Skip to content

Commit fa01786

Browse files
authored
Merge pull request libgit2#5748 from lhchavez/chromium-zlib
zlib: Add support for building with Chromium's zlib implementation
2 parents fe41e58 + 754fa52 commit fa01786

File tree

3 files changed

+115
-3
lines changed

3 files changed

+115
-3
lines changed

CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ OPTION(USE_STANDALONE_FUZZERS "Enable standalone fuzzers (compatible with gcc)"
5050
OPTION(USE_LEAK_CHECKER "Run tests with leak checker" OFF)
5151
OPTION(DEBUG_POOL "Enable debug pool allocator" OFF)
5252
OPTION(ENABLE_WERROR "Enable compilation with -Werror" OFF)
53-
OPTION(USE_BUNDLED_ZLIB "Use the bundled version of zlib" OFF)
53+
OPTION(USE_BUNDLED_ZLIB "Use the bundled version of zlib. Can be set to one of Bundled(ON)/Chromium. The Chromium option requires a x86_64 processor with SSE4.2 and CLMUL" OFF)
5454
SET(USE_HTTP_PARSER "" CACHE STRING "Specifies the HTTP Parser implementation; either system or builtin.")
5555
OPTION(DEPRECATE_HARD "Do not include deprecated functions in the library" OFF)
5656
SET(REGEX_BACKEND "" CACHE STRING "Regular expression implementation. One of regcomp_l, pcre2, pcre, regcomp, or builtin.")

deps/chromium-zlib/CMakeLists.txt

Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
# CMake build script for the bundled Chromium zlib implementation. So far, it
2+
# is only supported for x86_64 processors with CLMUL, SSE3, SSE4.2.
3+
#
4+
# TODO: The Chromium build file (in deps/chromium-zlib/zlib/BUILD.gn) supports
5+
# more platforms (like ARM with NEON), more can be enabled as needed.
6+
7+
CMAKE_MINIMUM_REQUIRED(VERSION 3.11)
8+
9+
include(FetchContent)
10+
include(FindGit)
11+
12+
# Ensure that the git binary is present to download the sources.
13+
find_package(Git)
14+
IF(NOT Git_FOUND)
15+
message(FATAL_ERROR "git is required to download the Chromium zlib sources")
16+
ENDIF()
17+
18+
FetchContent_Populate(chromium_zlib_src
19+
GIT_REPOSITORY https://chromium.googlesource.com/chromium/src/third_party/zlib.git
20+
GIT_TAG 2c183c9f93a328bfb3121284da13cf89a0f7e64a
21+
QUIET
22+
)
23+
24+
# The Chromium build globally disables some warnings.
25+
disable_warnings(implicit-fallthrough)
26+
disable_warnings(unused-function)
27+
disable_warnings(unused-parameter)
28+
disable_warnings(sign-compare)
29+
disable_warnings(declaration-after-statement)
30+
disable_warnings(missing-declarations)
31+
32+
# -O3 is also set by the Chromium configuration and has been deemed safe enough
33+
# for them.
34+
SET(CMAKE_C_FLAGS_RELWITHDEBINFO "-O3 -g -DNDEBUG")
35+
SET(CMAKE_C_FLAGS_RELEASE "-O3 -DNDEBUG")
36+
37+
# Common definitions.
38+
add_definitions(
39+
-DSTDC
40+
-DNO_GZIP
41+
-DZLIB_IMPLEMENTATION
42+
)
43+
list(APPEND SRC_ZLIB
44+
"${chromium_zlib_src_SOURCE_DIR}/adler32.c"
45+
"${chromium_zlib_src_SOURCE_DIR}/chromeconf.h"
46+
"${chromium_zlib_src_SOURCE_DIR}/compress.c"
47+
"${chromium_zlib_src_SOURCE_DIR}/contrib/optimizations/insert_string.h"
48+
"${chromium_zlib_src_SOURCE_DIR}/cpu_features.c"
49+
"${chromium_zlib_src_SOURCE_DIR}/cpu_features.h"
50+
"${chromium_zlib_src_SOURCE_DIR}/crc32.c"
51+
"${chromium_zlib_src_SOURCE_DIR}/crc32.h"
52+
"${chromium_zlib_src_SOURCE_DIR}/deflate.c"
53+
"${chromium_zlib_src_SOURCE_DIR}/deflate.h"
54+
"${chromium_zlib_src_SOURCE_DIR}/gzclose.c"
55+
"${chromium_zlib_src_SOURCE_DIR}/gzguts.h"
56+
"${chromium_zlib_src_SOURCE_DIR}/gzlib.c"
57+
"${chromium_zlib_src_SOURCE_DIR}/gzread.c"
58+
"${chromium_zlib_src_SOURCE_DIR}/gzwrite.c"
59+
"${chromium_zlib_src_SOURCE_DIR}/infback.c"
60+
"${chromium_zlib_src_SOURCE_DIR}/inffast.c"
61+
"${chromium_zlib_src_SOURCE_DIR}/inffast.h"
62+
"${chromium_zlib_src_SOURCE_DIR}/inffixed.h"
63+
"${chromium_zlib_src_SOURCE_DIR}/inflate.h"
64+
"${chromium_zlib_src_SOURCE_DIR}/inftrees.c"
65+
"${chromium_zlib_src_SOURCE_DIR}/inftrees.h"
66+
"${chromium_zlib_src_SOURCE_DIR}/trees.c"
67+
"${chromium_zlib_src_SOURCE_DIR}/trees.h"
68+
"${chromium_zlib_src_SOURCE_DIR}/uncompr.c"
69+
"${chromium_zlib_src_SOURCE_DIR}/zconf.h"
70+
"${chromium_zlib_src_SOURCE_DIR}/zlib.h"
71+
"${chromium_zlib_src_SOURCE_DIR}/zutil.c"
72+
"${chromium_zlib_src_SOURCE_DIR}/zutil.h"
73+
)
74+
75+
# x86_64-specific optimizations
76+
string(APPEND CMAKE_C_FLAGS " -mssse3 -msse4.2 -mpclmul")
77+
add_definitions(
78+
-DCHROMIUM_ZLIB_NO_CHROMECONF
79+
-DX86_NOT_WINDOWS
80+
-DADLER32_SIMD_SSSE3
81+
-DCRC32_SIMD_SSE42_PCLMUL
82+
-DDEFLATE_FILL_WINDOW_SSE2
83+
-DINFLATE_CHUNK_READ_64LE
84+
-DINFLATE_CHUNK_SIMD_SSE2
85+
)
86+
list(APPEND SRC_ZLIB
87+
"${chromium_zlib_src_SOURCE_DIR}/adler32_simd.c"
88+
"${chromium_zlib_src_SOURCE_DIR}/adler32_simd.h"
89+
"${chromium_zlib_src_SOURCE_DIR}/contrib/optimizations/chunkcopy.h"
90+
"${chromium_zlib_src_SOURCE_DIR}/contrib/optimizations/inffast_chunk.c"
91+
"${chromium_zlib_src_SOURCE_DIR}/contrib/optimizations/inffast_chunk.h"
92+
"${chromium_zlib_src_SOURCE_DIR}/contrib/optimizations/inflate.c"
93+
"${chromium_zlib_src_SOURCE_DIR}/crc32_simd.c"
94+
"${chromium_zlib_src_SOURCE_DIR}/crc32_simd.h"
95+
"${chromium_zlib_src_SOURCE_DIR}/crc_folding.c"
96+
"${chromium_zlib_src_SOURCE_DIR}/fill_window_sse.c"
97+
)
98+
99+
list(SORT SRC_ZLIB)
100+
include_directories("${chromium_zlib_src_SOURCE_DIR}")
101+
add_library(chromium_zlib OBJECT ${SRC_ZLIB})

src/CMakeLists.txt

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ ENDIF()
77
ADD_FEATURE_INFO(debugpool GIT_DEBUG_POOL "debug pool allocator")
88

99
INCLUDE(PkgBuildConfig)
10+
INCLUDE(SanitizeBool)
1011

1112
# This variable will contain the libraries we need to put into
1213
# libgit2.pc's Requires.private. That is, what we're linking to or
@@ -186,7 +187,12 @@ ELSE()
186187
ENDIF()
187188

188189
# Optional external dependency: zlib
189-
IF(NOT USE_BUNDLED_ZLIB)
190+
SanitizeBool(USE_BUNDLED_ZLIB)
191+
IF(USE_BUNDLED_ZLIB STREQUAL ON)
192+
SET(USE_BUNDLED_ZLIB "Bundled")
193+
ENDIF()
194+
195+
IF(USE_BUNDLED_ZLIB STREQUAL "OFF")
190196
FIND_PACKAGE(ZLIB)
191197
IF(ZLIB_FOUND)
192198
LIST(APPEND LIBGIT2_SYSTEM_INCLUDES ${ZLIB_INCLUDE_DIRS})
@@ -201,7 +207,12 @@ IF(NOT USE_BUNDLED_ZLIB)
201207
MESSAGE(STATUS "zlib was not found; using bundled 3rd-party sources." )
202208
ENDIF()
203209
ENDIF()
204-
IF(USE_BUNDLED_ZLIB OR NOT ZLIB_FOUND)
210+
IF(USE_BUNDLED_ZLIB STREQUAL "Chromium")
211+
ADD_SUBDIRECTORY("${libgit2_SOURCE_DIR}/deps/chromium-zlib" "${libgit2_BINARY_DIR}/deps/chromium-zlib")
212+
LIST(APPEND LIBGIT2_INCLUDES "${libgit2_SOURCE_DIR}/deps/chromium-zlib")
213+
LIST(APPEND LIBGIT2_OBJECTS $<TARGET_OBJECTS:chromium_zlib>)
214+
ADD_FEATURE_INFO(zlib ON "using (Chromium) bundled zlib")
215+
ELSEIF(USE_BUNDLED_ZLIB OR NOT ZLIB_FOUND)
205216
ADD_SUBDIRECTORY("${libgit2_SOURCE_DIR}/deps/zlib" "${libgit2_BINARY_DIR}/deps/zlib")
206217
LIST(APPEND LIBGIT2_INCLUDES "${libgit2_SOURCE_DIR}/deps/zlib")
207218
LIST(APPEND LIBGIT2_OBJECTS $<TARGET_OBJECTS:zlib>)

0 commit comments

Comments
 (0)