xref: /aosp_15_r20/external/zlib/CMakeLists.txt (revision 86ee64e75fa5f8bce2c8c356138035642429cd05)
1*86ee64e7SAndroid Build Coastguard Workercmake_minimum_required(VERSION 2.4.4...3.15.0)
2*86ee64e7SAndroid Build Coastguard Workerset(CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS ON)
3*86ee64e7SAndroid Build Coastguard Worker
4*86ee64e7SAndroid Build Coastguard Workerproject(zlib C)
5*86ee64e7SAndroid Build Coastguard Worker
6*86ee64e7SAndroid Build Coastguard Workerset(VERSION "1.3.0.1")
7*86ee64e7SAndroid Build Coastguard Worker
8*86ee64e7SAndroid Build Coastguard Workerset(INSTALL_BIN_DIR "${CMAKE_INSTALL_PREFIX}/bin" CACHE PATH "Installation directory for executables")
9*86ee64e7SAndroid Build Coastguard Workerset(INSTALL_LIB_DIR "${CMAKE_INSTALL_PREFIX}/lib" CACHE PATH "Installation directory for libraries")
10*86ee64e7SAndroid Build Coastguard Workerset(INSTALL_INC_DIR "${CMAKE_INSTALL_PREFIX}/include" CACHE PATH "Installation directory for headers")
11*86ee64e7SAndroid Build Coastguard Workerset(INSTALL_MAN_DIR "${CMAKE_INSTALL_PREFIX}/share/man" CACHE PATH "Installation directory for manual pages")
12*86ee64e7SAndroid Build Coastguard Workerset(INSTALL_PKGCONFIG_DIR "${CMAKE_INSTALL_PREFIX}/share/pkgconfig" CACHE PATH "Installation directory for pkgconfig (.pc) files")
13*86ee64e7SAndroid Build Coastguard Worker
14*86ee64e7SAndroid Build Coastguard Workerinclude(CheckTypeSize)
15*86ee64e7SAndroid Build Coastguard Workerinclude(CheckFunctionExists)
16*86ee64e7SAndroid Build Coastguard Workerinclude(CheckIncludeFile)
17*86ee64e7SAndroid Build Coastguard Workerinclude(CheckCSourceCompiles)
18*86ee64e7SAndroid Build Coastguard Workerenable_testing()
19*86ee64e7SAndroid Build Coastguard Worker
20*86ee64e7SAndroid Build Coastguard Workercheck_include_file(sys/types.h HAVE_SYS_TYPES_H)
21*86ee64e7SAndroid Build Coastguard Workercheck_include_file(stdint.h    HAVE_STDINT_H)
22*86ee64e7SAndroid Build Coastguard Workercheck_include_file(stddef.h    HAVE_STDDEF_H)
23*86ee64e7SAndroid Build Coastguard Worker
24*86ee64e7SAndroid Build Coastguard Workeroption(ENABLE_SIMD_OPTIMIZATIONS "Enable all SIMD optimizations" OFF)
25*86ee64e7SAndroid Build Coastguard Workeroption(ENABLE_SIMD_AVX512 "Enable SIMD AXV512 optimizations" OFF)
26*86ee64e7SAndroid Build Coastguard Workeroption(USE_ZLIB_RABIN_KARP_HASH "Enable bitstream compatibility with canonical zlib" OFF)
27*86ee64e7SAndroid Build Coastguard Workeroption(BUILD_UNITTESTS "Enable standalone unit tests build" OFF)
28*86ee64e7SAndroid Build Coastguard Workeroption(BUILD_MINIZIP_BIN "Enable building minzip_bin tool" OFF)
29*86ee64e7SAndroid Build Coastguard Workeroption(BUILD_ZPIPE "Enable building zpipe tool" OFF)
30*86ee64e7SAndroid Build Coastguard Workeroption(BUILD_MINIGZIP "Enable building minigzip tool" OFF)
31*86ee64e7SAndroid Build Coastguard Worker
32*86ee64e7SAndroid Build Coastguard Workerif (USE_ZLIB_RABIN_KARP_HASH)
33*86ee64e7SAndroid Build Coastguard Worker   add_definitions(-DUSE_ZLIB_RABIN_KARP_ROLLING_HASH)
34*86ee64e7SAndroid Build Coastguard Workerendif()
35*86ee64e7SAndroid Build Coastguard Worker
36*86ee64e7SAndroid Build Coastguard Worker# TODO(cavalcantii): add support for other OSes (e.g. Android, Fuchsia, etc)
37*86ee64e7SAndroid Build Coastguard Worker# and architectures (e.g. RISCV).
38*86ee64e7SAndroid Build Coastguard Workerif (ENABLE_SIMD_OPTIMIZATIONS)
39*86ee64e7SAndroid Build Coastguard Worker  # Apparently some environments (e.g. CentOS) require to explicitly link
40*86ee64e7SAndroid Build Coastguard Worker  # with pthread and that is required by the CPU features detection code.
41*86ee64e7SAndroid Build Coastguard Worker  find_package (Threads REQUIRED)
42*86ee64e7SAndroid Build Coastguard Worker  SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -pthread")
43*86ee64e7SAndroid Build Coastguard Worker  SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthread")
44*86ee64e7SAndroid Build Coastguard Worker
45*86ee64e7SAndroid Build Coastguard Worker  if (CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64")
46*86ee64e7SAndroid Build Coastguard Worker    add_definitions(-DINFLATE_CHUNK_SIMD_SSE2)
47*86ee64e7SAndroid Build Coastguard Worker    add_definitions(-DADLER32_SIMD_SSSE3)
48*86ee64e7SAndroid Build Coastguard Worker    add_definitions(-DINFLATE_CHUNK_READ_64LE)
49*86ee64e7SAndroid Build Coastguard Worker    add_definitions(-DCRC32_SIMD_SSE42_PCLMUL)
50*86ee64e7SAndroid Build Coastguard Worker    if (ENABLE_SIMD_AVX512)
51*86ee64e7SAndroid Build Coastguard Worker      add_definitions(-DCRC32_SIMD_AVX512_PCLMUL)
52*86ee64e7SAndroid Build Coastguard Worker      add_compile_options(-mvpclmulqdq -msse2 -mavx512f -mpclmul)
53*86ee64e7SAndroid Build Coastguard Worker    else()
54*86ee64e7SAndroid Build Coastguard Worker      add_compile_options(-msse4.2 -mpclmul)
55*86ee64e7SAndroid Build Coastguard Worker    endif()
56*86ee64e7SAndroid Build Coastguard Worker    add_definitions(-DDEFLATE_SLIDE_HASH_SSE2)
57*86ee64e7SAndroid Build Coastguard Worker    # Required by CPU features detection code.
58*86ee64e7SAndroid Build Coastguard Worker    add_definitions(-DX86_NOT_WINDOWS)
59*86ee64e7SAndroid Build Coastguard Worker  endif()
60*86ee64e7SAndroid Build Coastguard Worker
61*86ee64e7SAndroid Build Coastguard Worker  if ((CMAKE_SYSTEM_PROCESSOR STREQUAL "arm64") OR
62*86ee64e7SAndroid Build Coastguard Worker      (CMAKE_SYSTEM_PROCESSOR STREQUAL "aarch64"))
63*86ee64e7SAndroid Build Coastguard Worker    add_definitions(-DINFLATE_CHUNK_SIMD_NEON)
64*86ee64e7SAndroid Build Coastguard Worker    add_definitions(-DADLER32_SIMD_NEON)
65*86ee64e7SAndroid Build Coastguard Worker    add_definitions(-DINFLATE_CHUNK_READ_64LE)
66*86ee64e7SAndroid Build Coastguard Worker    add_definitions(-DCRC32_ARMV8_CRC32)
67*86ee64e7SAndroid Build Coastguard Worker    add_definitions(-DDEFLATE_SLIDE_HASH_NEON)
68*86ee64e7SAndroid Build Coastguard Worker    # Required by CPU features detection code.
69*86ee64e7SAndroid Build Coastguard Worker    if (APPLE)
70*86ee64e7SAndroid Build Coastguard Worker      add_definitions(-DARMV8_OS_MACOS)
71*86ee64e7SAndroid Build Coastguard Worker    endif()
72*86ee64e7SAndroid Build Coastguard Worker
73*86ee64e7SAndroid Build Coastguard Worker    if (UNIX AND NOT APPLE)
74*86ee64e7SAndroid Build Coastguard Worker      add_definitions(-DARMV8_OS_LINUX)
75*86ee64e7SAndroid Build Coastguard Worker    endif()
76*86ee64e7SAndroid Build Coastguard Worker
77*86ee64e7SAndroid Build Coastguard Worker    SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -march=armv8-a+crc+crypto")
78*86ee64e7SAndroid Build Coastguard Worker  endif()
79*86ee64e7SAndroid Build Coastguard Worker
80*86ee64e7SAndroid Build Coastguard Worker  if (CMAKE_SYSTEM_PROCESSOR STREQUAL "riscv64")
81*86ee64e7SAndroid Build Coastguard Worker    add_definitions(-DRISCV_RVV)
82*86ee64e7SAndroid Build Coastguard Worker    add_definitions(-DDEFLATE_SLIDE_HASH_RVV)
83*86ee64e7SAndroid Build Coastguard Worker    add_definitions(-DADLER32_SIMD_RVV)
84*86ee64e7SAndroid Build Coastguard Worker
85*86ee64e7SAndroid Build Coastguard Worker    # TODO(cavalcantii): add remaining flags as we port optimizations to RVV.
86*86ee64e7SAndroid Build Coastguard Worker    # chunk_copy is required for READ64 and unconditional decode of literals.
87*86ee64e7SAndroid Build Coastguard Worker    add_definitions(-DINFLATE_CHUNK_GENERIC)
88*86ee64e7SAndroid Build Coastguard Worker    add_definitions(-DINFLATE_CHUNK_READ_64LE)
89*86ee64e7SAndroid Build Coastguard Worker
90*86ee64e7SAndroid Build Coastguard Worker    # Tested with clang-17, unaligned loads are required by read64 & chunk_copy.
91*86ee64e7SAndroid Build Coastguard Worker    # TODO(cavalcantii): replace internal clang flags for -munaligned-access
92*86ee64e7SAndroid Build Coastguard Worker    # when we have a newer compiler available.
93*86ee64e7SAndroid Build Coastguard Worker    SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} --target=riscv64-unknown-linux-gnu -march=rv64gcv -Xclang -target-feature -Xclang +unaligned-scalar-mem")
94*86ee64e7SAndroid Build Coastguard Worker  endif()
95*86ee64e7SAndroid Build Coastguard Worker
96*86ee64e7SAndroid Build Coastguard Workerendif()
97*86ee64e7SAndroid Build Coastguard Worker
98*86ee64e7SAndroid Build Coastguard Worker#
99*86ee64e7SAndroid Build Coastguard Worker# Check to see if we have large file support
100*86ee64e7SAndroid Build Coastguard Worker#
101*86ee64e7SAndroid Build Coastguard Workerset(CMAKE_REQUIRED_DEFINITIONS -D_LARGEFILE64_SOURCE=1)
102*86ee64e7SAndroid Build Coastguard Worker# We add these other definitions here because CheckTypeSize.cmake
103*86ee64e7SAndroid Build Coastguard Worker# in CMake 2.4.x does not automatically do so and we want
104*86ee64e7SAndroid Build Coastguard Worker# compatibility with CMake 2.4.x.
105*86ee64e7SAndroid Build Coastguard Workerif(HAVE_SYS_TYPES_H)
106*86ee64e7SAndroid Build Coastguard Worker    list(APPEND CMAKE_REQUIRED_DEFINITIONS -DHAVE_SYS_TYPES_H)
107*86ee64e7SAndroid Build Coastguard Workerendif()
108*86ee64e7SAndroid Build Coastguard Workerif(HAVE_STDINT_H)
109*86ee64e7SAndroid Build Coastguard Worker    list(APPEND CMAKE_REQUIRED_DEFINITIONS -DHAVE_STDINT_H)
110*86ee64e7SAndroid Build Coastguard Workerendif()
111*86ee64e7SAndroid Build Coastguard Workerif(HAVE_STDDEF_H)
112*86ee64e7SAndroid Build Coastguard Worker    list(APPEND CMAKE_REQUIRED_DEFINITIONS -DHAVE_STDDEF_H)
113*86ee64e7SAndroid Build Coastguard Workerendif()
114*86ee64e7SAndroid Build Coastguard Workercheck_type_size(off64_t OFF64_T)
115*86ee64e7SAndroid Build Coastguard Workerif(HAVE_OFF64_T)
116*86ee64e7SAndroid Build Coastguard Worker   add_definitions(-D_LARGEFILE64_SOURCE=1)
117*86ee64e7SAndroid Build Coastguard Workerendif()
118*86ee64e7SAndroid Build Coastguard Workerset(CMAKE_REQUIRED_DEFINITIONS) # clear variable
119*86ee64e7SAndroid Build Coastguard Worker
120*86ee64e7SAndroid Build Coastguard Worker#
121*86ee64e7SAndroid Build Coastguard Worker# Check for fseeko
122*86ee64e7SAndroid Build Coastguard Worker#
123*86ee64e7SAndroid Build Coastguard Workercheck_function_exists(fseeko HAVE_FSEEKO)
124*86ee64e7SAndroid Build Coastguard Workerif(NOT HAVE_FSEEKO)
125*86ee64e7SAndroid Build Coastguard Worker    add_definitions(-DNO_FSEEKO)
126*86ee64e7SAndroid Build Coastguard Workerendif()
127*86ee64e7SAndroid Build Coastguard Worker
128*86ee64e7SAndroid Build Coastguard Worker#
129*86ee64e7SAndroid Build Coastguard Worker# Check for unistd.h
130*86ee64e7SAndroid Build Coastguard Worker#
131*86ee64e7SAndroid Build Coastguard Workercheck_include_file(unistd.h Z_HAVE_UNISTD_H)
132*86ee64e7SAndroid Build Coastguard Worker
133*86ee64e7SAndroid Build Coastguard Workerif(MSVC)
134*86ee64e7SAndroid Build Coastguard Worker    set(CMAKE_DEBUG_POSTFIX "d")
135*86ee64e7SAndroid Build Coastguard Worker    add_definitions(-D_CRT_SECURE_NO_DEPRECATE)
136*86ee64e7SAndroid Build Coastguard Worker    add_definitions(-D_CRT_NONSTDC_NO_DEPRECATE)
137*86ee64e7SAndroid Build Coastguard Worker    include_directories(${CMAKE_CURRENT_SOURCE_DIR})
138*86ee64e7SAndroid Build Coastguard Workerendif()
139*86ee64e7SAndroid Build Coastguard Worker
140*86ee64e7SAndroid Build Coastguard Workerif(NOT CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_CURRENT_BINARY_DIR)
141*86ee64e7SAndroid Build Coastguard Worker    # If we're doing an out of source build and the user has a zconf.h
142*86ee64e7SAndroid Build Coastguard Worker    # in their source tree...
143*86ee64e7SAndroid Build Coastguard Worker    if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/zconf.h)
144*86ee64e7SAndroid Build Coastguard Worker        message(STATUS "Renaming")
145*86ee64e7SAndroid Build Coastguard Worker        message(STATUS "    ${CMAKE_CURRENT_SOURCE_DIR}/zconf.h")
146*86ee64e7SAndroid Build Coastguard Worker        message(STATUS "to 'zconf.h.included' because this file is included with zlib")
147*86ee64e7SAndroid Build Coastguard Worker        message(STATUS "but CMake generates it automatically in the build directory.")
148*86ee64e7SAndroid Build Coastguard Worker        file(RENAME ${CMAKE_CURRENT_SOURCE_DIR}/zconf.h ${CMAKE_CURRENT_SOURCE_DIR}/zconf.h.included)
149*86ee64e7SAndroid Build Coastguard Worker  endif()
150*86ee64e7SAndroid Build Coastguard Workerendif()
151*86ee64e7SAndroid Build Coastguard Worker
152*86ee64e7SAndroid Build Coastguard Workerset(ZLIB_PC ${CMAKE_CURRENT_BINARY_DIR}/zlib.pc)
153*86ee64e7SAndroid Build Coastguard Workerconfigure_file( ${CMAKE_CURRENT_SOURCE_DIR}/zlib.pc.cmakein
154*86ee64e7SAndroid Build Coastguard Worker		${ZLIB_PC} @ONLY)
155*86ee64e7SAndroid Build Coastguard Workerconfigure_file(	${CMAKE_CURRENT_SOURCE_DIR}/zconf.h.cmakein
156*86ee64e7SAndroid Build Coastguard Worker		${CMAKE_CURRENT_BINARY_DIR}/zconf.h @ONLY)
157*86ee64e7SAndroid Build Coastguard Workerinclude_directories(${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_SOURCE_DIR})
158*86ee64e7SAndroid Build Coastguard Worker
159*86ee64e7SAndroid Build Coastguard Worker
160*86ee64e7SAndroid Build Coastguard Worker#============================================================================
161*86ee64e7SAndroid Build Coastguard Worker# zlib
162*86ee64e7SAndroid Build Coastguard Worker#============================================================================
163*86ee64e7SAndroid Build Coastguard Worker
164*86ee64e7SAndroid Build Coastguard Workerset(ZLIB_PUBLIC_HDRS
165*86ee64e7SAndroid Build Coastguard Worker    ${CMAKE_CURRENT_BINARY_DIR}/zconf.h
166*86ee64e7SAndroid Build Coastguard Worker    zlib.h
167*86ee64e7SAndroid Build Coastguard Worker)
168*86ee64e7SAndroid Build Coastguard Workerset(ZLIB_PRIVATE_HDRS
169*86ee64e7SAndroid Build Coastguard Worker    crc32.h
170*86ee64e7SAndroid Build Coastguard Worker    deflate.h
171*86ee64e7SAndroid Build Coastguard Worker    gzguts.h
172*86ee64e7SAndroid Build Coastguard Worker    inffast.h
173*86ee64e7SAndroid Build Coastguard Worker    inffixed.h
174*86ee64e7SAndroid Build Coastguard Worker    inflate.h
175*86ee64e7SAndroid Build Coastguard Worker    inftrees.h
176*86ee64e7SAndroid Build Coastguard Worker    trees.h
177*86ee64e7SAndroid Build Coastguard Worker    zutil.h
178*86ee64e7SAndroid Build Coastguard Worker)
179*86ee64e7SAndroid Build Coastguard Workerset(ZLIB_SRCS
180*86ee64e7SAndroid Build Coastguard Worker    adler32.c
181*86ee64e7SAndroid Build Coastguard Worker    compress.c
182*86ee64e7SAndroid Build Coastguard Worker    crc32.c
183*86ee64e7SAndroid Build Coastguard Worker    deflate.c
184*86ee64e7SAndroid Build Coastguard Worker    gzclose.c
185*86ee64e7SAndroid Build Coastguard Worker    gzlib.c
186*86ee64e7SAndroid Build Coastguard Worker    gzread.c
187*86ee64e7SAndroid Build Coastguard Worker    gzwrite.c
188*86ee64e7SAndroid Build Coastguard Worker    inflate.c
189*86ee64e7SAndroid Build Coastguard Worker    infback.c
190*86ee64e7SAndroid Build Coastguard Worker    inftrees.c
191*86ee64e7SAndroid Build Coastguard Worker    inffast.c
192*86ee64e7SAndroid Build Coastguard Worker    trees.c
193*86ee64e7SAndroid Build Coastguard Worker    uncompr.c
194*86ee64e7SAndroid Build Coastguard Worker    zutil.c
195*86ee64e7SAndroid Build Coastguard Worker)
196*86ee64e7SAndroid Build Coastguard Worker
197*86ee64e7SAndroid Build Coastguard Worker
198*86ee64e7SAndroid Build Coastguard Worker#============================================================================
199*86ee64e7SAndroid Build Coastguard Worker# Update list of source files if optimizations were enabled
200*86ee64e7SAndroid Build Coastguard Worker#============================================================================
201*86ee64e7SAndroid Build Coastguard Workerif (ENABLE_SIMD_OPTIMIZATIONS)
202*86ee64e7SAndroid Build Coastguard Worker  if (CMAKE_SYSTEM_PROCESSOR STREQUAL "riscv64")
203*86ee64e7SAndroid Build Coastguard Worker    message("RISCVV: Add optimizations.")
204*86ee64e7SAndroid Build Coastguard Worker    list(REMOVE_ITEM ZLIB_SRCS inflate.c)
205*86ee64e7SAndroid Build Coastguard Worker    list(APPEND ZLIB_PRIVATE_HDRS ${CMAKE_CURRENT_SOURCE_DIR}/adler32_simd.h)
206*86ee64e7SAndroid Build Coastguard Worker    list(APPEND ZLIB_PRIVATE_HDRS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/optimizations/chunkcopy.h)
207*86ee64e7SAndroid Build Coastguard Worker    list(APPEND ZLIB_PRIVATE_HDRS ${CMAKE_CURRENT_SOURCE_DIR}/cpu_features.h)
208*86ee64e7SAndroid Build Coastguard Worker
209*86ee64e7SAndroid Build Coastguard Worker    list(APPEND ZLIB_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/adler32_simd.c)
210*86ee64e7SAndroid Build Coastguard Worker    list(APPEND ZLIB_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/optimizations/inffast_chunk.c)
211*86ee64e7SAndroid Build Coastguard Worker    list(APPEND ZLIB_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/optimizations/inflate.c)
212*86ee64e7SAndroid Build Coastguard Worker    list(APPEND ZLIB_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/cpu_features.c)
213*86ee64e7SAndroid Build Coastguard Worker  else()
214*86ee64e7SAndroid Build Coastguard Worker    list(REMOVE_ITEM ZLIB_SRCS inflate.c)
215*86ee64e7SAndroid Build Coastguard Worker
216*86ee64e7SAndroid Build Coastguard Worker    list(APPEND ZLIB_PRIVATE_HDRS ${CMAKE_CURRENT_SOURCE_DIR}/adler32_simd.h)
217*86ee64e7SAndroid Build Coastguard Worker    list(APPEND ZLIB_PRIVATE_HDRS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/optimizations/chunkcopy.h)
218*86ee64e7SAndroid Build Coastguard Worker    list(APPEND ZLIB_PRIVATE_HDRS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/optimizations/inffast_chunk.h)
219*86ee64e7SAndroid Build Coastguard Worker    list(APPEND ZLIB_PRIVATE_HDRS ${CMAKE_CURRENT_SOURCE_DIR}/cpu_features.h)
220*86ee64e7SAndroid Build Coastguard Worker    list(APPEND ZLIB_PRIVATE_HDRS ${CMAKE_CURRENT_SOURCE_DIR}/crc32_simd.h)
221*86ee64e7SAndroid Build Coastguard Worker
222*86ee64e7SAndroid Build Coastguard Worker    list(APPEND ZLIB_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/adler32_simd.c)
223*86ee64e7SAndroid Build Coastguard Worker    list(APPEND ZLIB_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/optimizations/inffast_chunk.c)
224*86ee64e7SAndroid Build Coastguard Worker    list(APPEND ZLIB_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/contrib/optimizations/inflate.c)
225*86ee64e7SAndroid Build Coastguard Worker    list(APPEND ZLIB_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/cpu_features.c)
226*86ee64e7SAndroid Build Coastguard Worker    list(APPEND ZLIB_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/crc32_simd.c)
227*86ee64e7SAndroid Build Coastguard Worker    list(APPEND ZLIB_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/crc_folding.c)
228*86ee64e7SAndroid Build Coastguard Worker  endif()
229*86ee64e7SAndroid Build Coastguard Workerendif()
230*86ee64e7SAndroid Build Coastguard Worker
231*86ee64e7SAndroid Build Coastguard Worker# parse the full version number from zlib.h and include in ZLIB_FULL_VERSION
232*86ee64e7SAndroid Build Coastguard Workerfile(READ ${CMAKE_CURRENT_SOURCE_DIR}/zlib.h _zlib_h_contents)
233*86ee64e7SAndroid Build Coastguard Workerstring(REGEX REPLACE ".*#define[ \t]+ZLIB_VERSION[ \t]+\"([-0-9A-Za-z.]+)\".*"
234*86ee64e7SAndroid Build Coastguard Worker    "\\1" ZLIB_FULL_VERSION ${_zlib_h_contents})
235*86ee64e7SAndroid Build Coastguard Worker
236*86ee64e7SAndroid Build Coastguard Workerif(MINGW)
237*86ee64e7SAndroid Build Coastguard Worker    # This gets us DLL resource information when compiling on MinGW.
238*86ee64e7SAndroid Build Coastguard Worker    if(NOT CMAKE_RC_COMPILER)
239*86ee64e7SAndroid Build Coastguard Worker        set(CMAKE_RC_COMPILER windres.exe)
240*86ee64e7SAndroid Build Coastguard Worker    endif()
241*86ee64e7SAndroid Build Coastguard Worker
242*86ee64e7SAndroid Build Coastguard Worker    add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/zlib1rc.obj
243*86ee64e7SAndroid Build Coastguard Worker                       COMMAND ${CMAKE_RC_COMPILER}
244*86ee64e7SAndroid Build Coastguard Worker                            -D GCC_WINDRES
245*86ee64e7SAndroid Build Coastguard Worker                            -I ${CMAKE_CURRENT_SOURCE_DIR}
246*86ee64e7SAndroid Build Coastguard Worker                            -I ${CMAKE_CURRENT_BINARY_DIR}
247*86ee64e7SAndroid Build Coastguard Worker                            -o ${CMAKE_CURRENT_BINARY_DIR}/zlib1rc.obj
248*86ee64e7SAndroid Build Coastguard Worker                            -i ${CMAKE_CURRENT_SOURCE_DIR}/win32/zlib1.rc)
249*86ee64e7SAndroid Build Coastguard Worker    set(ZLIB_DLL_SRCS ${CMAKE_CURRENT_BINARY_DIR}/zlib1rc.obj)
250*86ee64e7SAndroid Build Coastguard Workerendif(MINGW)
251*86ee64e7SAndroid Build Coastguard Worker
252*86ee64e7SAndroid Build Coastguard Workeradd_library(zlib SHARED ${ZLIB_SRCS} ${ZLIB_DLL_SRCS} ${ZLIB_PUBLIC_HDRS} ${ZLIB_PRIVATE_HDRS})
253*86ee64e7SAndroid Build Coastguard Workeradd_library(zlibstatic STATIC ${ZLIB_SRCS} ${ZLIB_PUBLIC_HDRS} ${ZLIB_PRIVATE_HDRS})
254*86ee64e7SAndroid Build Coastguard Workerset_target_properties(zlib PROPERTIES DEFINE_SYMBOL ZLIB_DLL)
255*86ee64e7SAndroid Build Coastguard Workerset_target_properties(zlib PROPERTIES SOVERSION 1)
256*86ee64e7SAndroid Build Coastguard Worker
257*86ee64e7SAndroid Build Coastguard Workerif(NOT CYGWIN)
258*86ee64e7SAndroid Build Coastguard Worker    # This property causes shared libraries on Linux to have the full version
259*86ee64e7SAndroid Build Coastguard Worker    # encoded into their final filename.  We disable this on Cygwin because
260*86ee64e7SAndroid Build Coastguard Worker    # it causes cygz-${ZLIB_FULL_VERSION}.dll to be created when cygz.dll
261*86ee64e7SAndroid Build Coastguard Worker    # seems to be the default.
262*86ee64e7SAndroid Build Coastguard Worker    #
263*86ee64e7SAndroid Build Coastguard Worker    # This has no effect with MSVC, on that platform the version info for
264*86ee64e7SAndroid Build Coastguard Worker    # the DLL comes from the resource file win32/zlib1.rc
265*86ee64e7SAndroid Build Coastguard Worker    set_target_properties(zlib PROPERTIES VERSION ${ZLIB_FULL_VERSION})
266*86ee64e7SAndroid Build Coastguard Workerendif()
267*86ee64e7SAndroid Build Coastguard Worker
268*86ee64e7SAndroid Build Coastguard Workerif(UNIX)
269*86ee64e7SAndroid Build Coastguard Worker    # On unix-like platforms the library is almost always called libz
270*86ee64e7SAndroid Build Coastguard Worker   set_target_properties(zlib zlibstatic PROPERTIES OUTPUT_NAME z)
271*86ee64e7SAndroid Build Coastguard Worker   if(NOT APPLE)
272*86ee64e7SAndroid Build Coastguard Worker     set_target_properties(zlib PROPERTIES LINK_FLAGS "-Wl,--version-script,\"${CMAKE_CURRENT_SOURCE_DIR}/zlib.map\"")
273*86ee64e7SAndroid Build Coastguard Worker   endif()
274*86ee64e7SAndroid Build Coastguard Workerelseif(BUILD_SHARED_LIBS AND WIN32)
275*86ee64e7SAndroid Build Coastguard Worker    # Creates zlib1.dll when building shared library version
276*86ee64e7SAndroid Build Coastguard Worker    set_target_properties(zlib PROPERTIES SUFFIX "1.dll")
277*86ee64e7SAndroid Build Coastguard Workerendif()
278*86ee64e7SAndroid Build Coastguard Worker
279*86ee64e7SAndroid Build Coastguard Workerif(NOT SKIP_INSTALL_LIBRARIES AND NOT SKIP_INSTALL_ALL )
280*86ee64e7SAndroid Build Coastguard Worker    install(TARGETS zlib zlibstatic
281*86ee64e7SAndroid Build Coastguard Worker        RUNTIME DESTINATION "${INSTALL_BIN_DIR}"
282*86ee64e7SAndroid Build Coastguard Worker        ARCHIVE DESTINATION "${INSTALL_LIB_DIR}"
283*86ee64e7SAndroid Build Coastguard Worker        LIBRARY DESTINATION "${INSTALL_LIB_DIR}" )
284*86ee64e7SAndroid Build Coastguard Workerendif()
285*86ee64e7SAndroid Build Coastguard Workerif(NOT SKIP_INSTALL_HEADERS AND NOT SKIP_INSTALL_ALL )
286*86ee64e7SAndroid Build Coastguard Worker    install(FILES ${ZLIB_PUBLIC_HDRS} DESTINATION "${INSTALL_INC_DIR}")
287*86ee64e7SAndroid Build Coastguard Workerendif()
288*86ee64e7SAndroid Build Coastguard Workerif(NOT SKIP_INSTALL_FILES AND NOT SKIP_INSTALL_ALL )
289*86ee64e7SAndroid Build Coastguard Worker    install(FILES zlib.3 DESTINATION "${INSTALL_MAN_DIR}/man3")
290*86ee64e7SAndroid Build Coastguard Workerendif()
291*86ee64e7SAndroid Build Coastguard Workerif(NOT SKIP_INSTALL_FILES AND NOT SKIP_INSTALL_ALL )
292*86ee64e7SAndroid Build Coastguard Worker    install(FILES ${ZLIB_PC} DESTINATION "${INSTALL_PKGCONFIG_DIR}")
293*86ee64e7SAndroid Build Coastguard Workerendif()
294*86ee64e7SAndroid Build Coastguard Worker
295*86ee64e7SAndroid Build Coastguard Worker#============================================================================
296*86ee64e7SAndroid Build Coastguard Worker# Benchmarker
297*86ee64e7SAndroid Build Coastguard Worker#============================================================================
298*86ee64e7SAndroid Build Coastguard Workerenable_language(CXX)
299*86ee64e7SAndroid Build Coastguard Workerset(CMAKE_CXX_STANDARD 14) # workaround for older compilers (e.g. g++ 5.4).
300*86ee64e7SAndroid Build Coastguard Workeradd_executable(zlib_bench contrib/bench/zlib_bench.cc)
301*86ee64e7SAndroid Build Coastguard Workertarget_link_libraries(zlib_bench zlib)
302*86ee64e7SAndroid Build Coastguard Worker
303*86ee64e7SAndroid Build Coastguard Worker#============================================================================
304*86ee64e7SAndroid Build Coastguard Worker# Unit Tests
305*86ee64e7SAndroid Build Coastguard Worker#============================================================================
306*86ee64e7SAndroid Build Coastguard Workerif (BUILD_UNITTESTS)
307*86ee64e7SAndroid Build Coastguard Worker    include (ExternalProject)
308*86ee64e7SAndroid Build Coastguard Worker    set_directory_properties(PROPERTIES EP_PREFIX ${CMAKE_BINARY_DIR}/third_party)
309*86ee64e7SAndroid Build Coastguard Worker    ExternalProject_add(
310*86ee64e7SAndroid Build Coastguard Worker        googletest
311*86ee64e7SAndroid Build Coastguard Worker        GIT_REPOSITORY https://github.com/google/googletest.git
312*86ee64e7SAndroid Build Coastguard Worker        GIT_TAG d1467f5813f4d363cfd11aba99c4e9fe47a85e99
313*86ee64e7SAndroid Build Coastguard Worker        UPDATE_COMMAND ""
314*86ee64e7SAndroid Build Coastguard Worker        INSTALL_COMMAND ""
315*86ee64e7SAndroid Build Coastguard Worker        LOG_DOWNLOAD ON
316*86ee64e7SAndroid Build Coastguard Worker        LOG_CONFIGURE ON
317*86ee64e7SAndroid Build Coastguard Worker        LOG_BUILD ON
318*86ee64e7SAndroid Build Coastguard Worker    )
319*86ee64e7SAndroid Build Coastguard Worker
320*86ee64e7SAndroid Build Coastguard Worker    # gtest includedir
321*86ee64e7SAndroid Build Coastguard Worker    ExternalProject_Get_Property(googletest source_dir)
322*86ee64e7SAndroid Build Coastguard Worker    set(GTEST_INCLUDE_DIRS
323*86ee64e7SAndroid Build Coastguard Worker        ${source_dir}/googletest/include
324*86ee64e7SAndroid Build Coastguard Worker        ${source_dir}/googletest/include/gtest
325*86ee64e7SAndroid Build Coastguard Worker    )
326*86ee64e7SAndroid Build Coastguard Worker
327*86ee64e7SAndroid Build Coastguard Worker    # gtest library
328*86ee64e7SAndroid Build Coastguard Worker    ExternalProject_Get_Property(googletest binary_dir)
329*86ee64e7SAndroid Build Coastguard Worker    set(GTEST_LIBRARY_PATH ${binary_dir}/lib/${CMAKE_FIND_LIBRARY_PREFIXES}gtest.a)
330*86ee64e7SAndroid Build Coastguard Worker    set(GTEST_LIBRARY gtest)
331*86ee64e7SAndroid Build Coastguard Worker    add_library(${GTEST_LIBRARY} UNKNOWN IMPORTED)
332*86ee64e7SAndroid Build Coastguard Worker    set_property(TARGET ${GTEST_LIBRARY} PROPERTY IMPORTED_LOCATION ${GTEST_LIBRARY_PATH})
333*86ee64e7SAndroid Build Coastguard Worker    add_dependencies(${GTEST_LIBRARY} googletest)
334*86ee64e7SAndroid Build Coastguard Worker
335*86ee64e7SAndroid Build Coastguard Worker    set(UTEST_SRC
336*86ee64e7SAndroid Build Coastguard Worker        ${CMAKE_CURRENT_SOURCE_DIR}/contrib/tests/infcover.cc
337*86ee64e7SAndroid Build Coastguard Worker        ${CMAKE_CURRENT_SOURCE_DIR}/contrib/tests/infcover.h
338*86ee64e7SAndroid Build Coastguard Worker        ${CMAKE_CURRENT_SOURCE_DIR}/contrib/tests/utils_unittest.cc
339*86ee64e7SAndroid Build Coastguard Worker        ${CMAKE_CURRENT_SOURCE_DIR}/contrib/tests/standalone_test_runner.cc
340*86ee64e7SAndroid Build Coastguard Worker        ${CMAKE_CURRENT_SOURCE_DIR}/google/compression_utils_portable.cc
341*86ee64e7SAndroid Build Coastguard Worker    )
342*86ee64e7SAndroid Build Coastguard Worker
343*86ee64e7SAndroid Build Coastguard Worker    add_compile_definitions(CMAKE_STANDALONE_UNITTESTS)
344*86ee64e7SAndroid Build Coastguard Worker
345*86ee64e7SAndroid Build Coastguard Worker    add_executable(zlib_unittests ${UTEST_SRC})
346*86ee64e7SAndroid Build Coastguard Worker    target_include_directories(zlib_unittests PUBLIC ${GTEST_INCLUDE_DIRS})
347*86ee64e7SAndroid Build Coastguard Worker    target_include_directories(zlib_unittests PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/google)
348*86ee64e7SAndroid Build Coastguard Worker
349*86ee64e7SAndroid Build Coastguard Worker    target_link_libraries(zlib_unittests ${GTEST_LIBRARY})
350*86ee64e7SAndroid Build Coastguard Worker    target_link_libraries(zlib_unittests zlib)
351*86ee64e7SAndroid Build Coastguard Worker    # Needed by gtest
352*86ee64e7SAndroid Build Coastguard Worker    target_link_libraries(zlib_unittests pthread)
353*86ee64e7SAndroid Build Coastguard Workerendif()
354*86ee64e7SAndroid Build Coastguard Worker
355*86ee64e7SAndroid Build Coastguard Worker#============================================================================
356*86ee64e7SAndroid Build Coastguard Worker# Minizip tool
357*86ee64e7SAndroid Build Coastguard Worker#============================================================================
358*86ee64e7SAndroid Build Coastguard Worker# TODO(cavalcantii): get it working on Windows.
359*86ee64e7SAndroid Build Coastguard Workerif (BUILD_MINIZIP_BIN)
360*86ee64e7SAndroid Build Coastguard Worker  add_executable(minizip_bin contrib/minizip/minizip.c contrib/minizip/ioapi.c
361*86ee64e7SAndroid Build Coastguard Worker    contrib/minizip/ioapi.h contrib/minizip/unzip.c
362*86ee64e7SAndroid Build Coastguard Worker    contrib/minizip/unzip.h contrib/minizip/zip.c contrib/minizip/zip.h
363*86ee64e7SAndroid Build Coastguard Worker    )
364*86ee64e7SAndroid Build Coastguard Worker  target_link_libraries(minizip_bin zlib)
365*86ee64e7SAndroid Build Coastguard Workerendif()
366*86ee64e7SAndroid Build Coastguard Worker
367*86ee64e7SAndroid Build Coastguard Worker#============================================================================
368*86ee64e7SAndroid Build Coastguard Worker# zpipe tool
369*86ee64e7SAndroid Build Coastguard Worker#============================================================================
370*86ee64e7SAndroid Build Coastguard Workerif (BUILD_ZPIPE)
371*86ee64e7SAndroid Build Coastguard Worker  add_executable(zpipe examples/zpipe.c)
372*86ee64e7SAndroid Build Coastguard Worker  target_link_libraries(zpipe zlib)
373*86ee64e7SAndroid Build Coastguard Workerendif()
374*86ee64e7SAndroid Build Coastguard Worker#============================================================================
375*86ee64e7SAndroid Build Coastguard Worker# MiniGzip tool
376*86ee64e7SAndroid Build Coastguard Worker#============================================================================
377*86ee64e7SAndroid Build Coastguard Workerif (BUILD_MINIGZIP)
378*86ee64e7SAndroid Build Coastguard Worker  add_executable(minigzip_bin test/minigzip.c)
379*86ee64e7SAndroid Build Coastguard Worker  target_link_libraries(minigzip_bin zlib)
380*86ee64e7SAndroid Build Coastguard Workerendif()
381