1cb93a386Sopenharmony_ci# Copyright 2016 Google Inc.
2cb93a386Sopenharmony_ci#
3cb93a386Sopenharmony_ci# Use of this source code is governed by a BSD-style license that can be
4cb93a386Sopenharmony_ci# found in the LICENSE file.
5cb93a386Sopenharmony_ci
6cb93a386Sopenharmony_cideclare_args() {
7cb93a386Sopenharmony_ci  skia_use_system_zlib = is_official_build
8cb93a386Sopenharmony_ci}
9cb93a386Sopenharmony_ci
10cb93a386Sopenharmony_ciimport("../third_party.gni")
11cb93a386Sopenharmony_ci
12cb93a386Sopenharmony_ciif (skia_use_system_zlib) {
13cb93a386Sopenharmony_ci  system("zlib") {
14cb93a386Sopenharmony_ci    libs = [ "z" ]
15cb93a386Sopenharmony_ci  }
16cb93a386Sopenharmony_ci} else {
17cb93a386Sopenharmony_ci  # ARM optimizations disabled for Windows on Arm MSVC builds, see http://crbug.com/v8/10012.
18cb93a386Sopenharmony_ci  use_arm_neon_optimizations = current_cpu == "arm64" && !(is_win && !is_clang)
19cb93a386Sopenharmony_ci  use_x86_x64_optimizations =
20cb93a386Sopenharmony_ci      (current_cpu == "x86" || current_cpu == "x64") && !is_ios
21cb93a386Sopenharmony_ci
22cb93a386Sopenharmony_ci  config("zlib_simd_config") {
23cb93a386Sopenharmony_ci    defines = []
24cb93a386Sopenharmony_ci    if (use_x86_x64_optimizations) {
25cb93a386Sopenharmony_ci      if (is_win) {
26cb93a386Sopenharmony_ci        defines += [ "X86_WINDOWS" ]
27cb93a386Sopenharmony_ci      } else {
28cb93a386Sopenharmony_ci        defines += [ "X86_NOT_WINDOWS" ]
29cb93a386Sopenharmony_ci      }
30cb93a386Sopenharmony_ci      defines += [ "ADLER32_SIMD_SSSE3" ]  # Strangely this is needed for
31cb93a386Sopenharmony_ci                                           # cpu_features.c
32cb93a386Sopenharmony_ci    }
33cb93a386Sopenharmony_ci    if (use_arm_neon_optimizations) {
34cb93a386Sopenharmony_ci      if (is_android) {
35cb93a386Sopenharmony_ci        defines += [ "ARMV8_OS_ANDROID" ]  # also compatible with v7
36cb93a386Sopenharmony_ci      } else if (is_linux || is_chromeos) {
37cb93a386Sopenharmony_ci        defines += [ "ARMV8_OS_LINUX" ]
38cb93a386Sopenharmony_ci      } else if (is_fuchsia) {
39cb93a386Sopenharmony_ci        defines += [ "ARMV8_OS_FUCHSIA" ]
40cb93a386Sopenharmony_ci      } else if (is_win) {
41cb93a386Sopenharmony_ci        defines += [ "ARMV8_OS_WINDOWS" ]
42cb93a386Sopenharmony_ci      } else if (is_ios || is_mac) {
43cb93a386Sopenharmony_ci        # iOS@ARM is a special case where we always have NEON but don't check
44cb93a386Sopenharmony_ci        # for crypto extensions.
45cb93a386Sopenharmony_ci        defines += [ "ARM_OS_IOS" ]
46cb93a386Sopenharmony_ci      }  # else {
47cb93a386Sopenharmony_ci         # assert(false, "Unsupported ARM OS")
48cb93a386Sopenharmony_ci      # }
49cb93a386Sopenharmony_ci    }
50cb93a386Sopenharmony_ci
51cb93a386Sopenharmony_ci    # Warnings are just noise if we're not maintaining the code.
52cb93a386Sopenharmony_ci    if (is_win) {
53cb93a386Sopenharmony_ci      cflags = [ "/w" ]
54cb93a386Sopenharmony_ci    } else {
55cb93a386Sopenharmony_ci      cflags = [ "-w" ]
56cb93a386Sopenharmony_ci    }
57cb93a386Sopenharmony_ci  }
58cb93a386Sopenharmony_ci
59cb93a386Sopenharmony_ci  source_set("zlib_adler32_simd") {
60cb93a386Sopenharmony_ci    visibility = [ ":*" ]
61cb93a386Sopenharmony_ci    configs += [ ":zlib_simd_config" ]
62cb93a386Sopenharmony_ci    if (use_x86_x64_optimizations) {
63cb93a386Sopenharmony_ci      defines = [ "ADLER32_SIMD_SSSE3" ]
64cb93a386Sopenharmony_ci      if (!is_win || is_clang) {
65cb93a386Sopenharmony_ci        cflags = [ "-mssse3" ]
66cb93a386Sopenharmony_ci      }
67cb93a386Sopenharmony_ci    }
68cb93a386Sopenharmony_ci    if (use_arm_neon_optimizations) {
69cb93a386Sopenharmony_ci      defines = [ "ADLER32_SIMD_NEON" ]
70cb93a386Sopenharmony_ci    }
71cb93a386Sopenharmony_ci    sources = [ "../externals/zlib/adler32_simd.c" ]
72cb93a386Sopenharmony_ci  }
73cb93a386Sopenharmony_ci
74cb93a386Sopenharmony_ci  source_set("zlib_crc32_simd") {
75cb93a386Sopenharmony_ci    visibility = [ ":*" ]
76cb93a386Sopenharmony_ci    configs += [ ":zlib_simd_config" ]
77cb93a386Sopenharmony_ci
78cb93a386Sopenharmony_ci    # Disabled for iPhone, as described in DDI0487C_a_armv8_arm:
79cb93a386Sopenharmony_ci    #  "All implementations of the ARMv8.1 architecture are required to
80cb93a386Sopenharmony_ci    #   implement the CRC32* instructions. These are optional in ARMv8.0."
81cb93a386Sopenharmony_ci    if (!is_ios && use_arm_neon_optimizations) {
82cb93a386Sopenharmony_ci      defines = [ "CRC32_ARMV8_CRC32" ]
83cb93a386Sopenharmony_ci
84cb93a386Sopenharmony_ci      # An ARMv7 GCC build will fail to compile without building this target
85cb93a386Sopenharmony_ci      # for ARMv8-a+crc and letting runtime cpu detection select the correct
86cb93a386Sopenharmony_ci      # function.
87cb93a386Sopenharmony_ci      if (!is_win && !is_clang) {
88cb93a386Sopenharmony_ci        cflags_c = [ "-march=armv8-a+crc" ]
89cb93a386Sopenharmony_ci      }
90cb93a386Sopenharmony_ci    }
91cb93a386Sopenharmony_ci
92cb93a386Sopenharmony_ci    if (use_x86_x64_optimizations) {
93cb93a386Sopenharmony_ci      defines = [ "CRC32_SIMD_SSE42_PCLMUL" ]
94cb93a386Sopenharmony_ci      if (!is_win || is_clang) {
95cb93a386Sopenharmony_ci        cflags = [
96cb93a386Sopenharmony_ci          "-msse4.2",
97cb93a386Sopenharmony_ci          "-mpclmul",
98cb93a386Sopenharmony_ci        ]
99cb93a386Sopenharmony_ci      }
100cb93a386Sopenharmony_ci    }
101cb93a386Sopenharmony_ci
102cb93a386Sopenharmony_ci    sources = [ "../externals/zlib/crc32_simd.c" ]
103cb93a386Sopenharmony_ci  }
104cb93a386Sopenharmony_ci
105cb93a386Sopenharmony_ci  source_set("zlib_inflate_chunk_simd") {
106cb93a386Sopenharmony_ci    visibility = [ ":*" ]
107cb93a386Sopenharmony_ci    configs += [ ":zlib_simd_config" ]
108cb93a386Sopenharmony_ci    if (use_x86_x64_optimizations) {
109cb93a386Sopenharmony_ci      defines = [ "INFLATE_CHUNK_SIMD_SSE2" ]
110cb93a386Sopenharmony_ci      if (current_cpu == "x64") {
111cb93a386Sopenharmony_ci        defines += [ "INFLATE_CHUNK_READ_64LE" ]
112cb93a386Sopenharmony_ci      }
113cb93a386Sopenharmony_ci    }
114cb93a386Sopenharmony_ci    if (use_arm_neon_optimizations) {
115cb93a386Sopenharmony_ci      defines = [ "INFLATE_CHUNK_SIMD_NEON" ]
116cb93a386Sopenharmony_ci      if (current_cpu == "arm64") {
117cb93a386Sopenharmony_ci        defines += [ "INFLATE_CHUNK_READ_64LE" ]
118cb93a386Sopenharmony_ci      }
119cb93a386Sopenharmony_ci    }
120cb93a386Sopenharmony_ci    if (use_x86_x64_optimizations || use_arm_neon_optimizations) {
121cb93a386Sopenharmony_ci      include_dirs = [
122cb93a386Sopenharmony_ci        "../externals/zlib/",
123cb93a386Sopenharmony_ci        "../externals/zlib/contrib/optimizations/",
124cb93a386Sopenharmony_ci      ]
125cb93a386Sopenharmony_ci      sources = [
126cb93a386Sopenharmony_ci        "../externals/zlib/contrib/optimizations/inffast_chunk.c",
127cb93a386Sopenharmony_ci        "../externals/zlib/contrib/optimizations/inflate.c",
128cb93a386Sopenharmony_ci      ]
129cb93a386Sopenharmony_ci    }
130cb93a386Sopenharmony_ci  }
131cb93a386Sopenharmony_ci
132cb93a386Sopenharmony_ci  source_set("zlib_x86_x64_simd") {
133cb93a386Sopenharmony_ci    visibility = [ ":*" ]
134cb93a386Sopenharmony_ci    configs += [ ":zlib_simd_config" ]
135cb93a386Sopenharmony_ci    if (use_x86_x64_optimizations) {
136cb93a386Sopenharmony_ci      defines = [
137cb93a386Sopenharmony_ci        "CRC32_SIMD_SSE42_PCLMUL",
138cb93a386Sopenharmony_ci        "DEFLATE_FILL_WINDOW_SSE2",
139cb93a386Sopenharmony_ci      ]
140cb93a386Sopenharmony_ci      if (!is_win || is_clang) {
141cb93a386Sopenharmony_ci        cflags = [
142cb93a386Sopenharmony_ci          "-msse4.2",
143cb93a386Sopenharmony_ci          "-mpclmul",
144cb93a386Sopenharmony_ci        ]
145cb93a386Sopenharmony_ci      }
146cb93a386Sopenharmony_ci      sources = [
147cb93a386Sopenharmony_ci        "../externals/zlib/crc_folding.c",
148cb93a386Sopenharmony_ci        "../externals/zlib/fill_window_sse.c",
149cb93a386Sopenharmony_ci      ]
150cb93a386Sopenharmony_ci    }
151cb93a386Sopenharmony_ci  }
152cb93a386Sopenharmony_ci
153cb93a386Sopenharmony_ci  third_party("zlib") {
154cb93a386Sopenharmony_ci    public_include_dirs = [ "../externals/zlib" ]
155cb93a386Sopenharmony_ci    defines = [ "ZLIB_IMPLEMENTATION" ]
156cb93a386Sopenharmony_ci    deps = []
157cb93a386Sopenharmony_ci    configs = []
158cb93a386Sopenharmony_ci
159cb93a386Sopenharmony_ci    sources = [
160cb93a386Sopenharmony_ci      "../externals/zlib/adler32.c",
161cb93a386Sopenharmony_ci      "../externals/zlib/compress.c",
162cb93a386Sopenharmony_ci      "../externals/zlib/cpu_features.c",
163cb93a386Sopenharmony_ci      "../externals/zlib/crc32.c",
164cb93a386Sopenharmony_ci      "../externals/zlib/deflate.c",
165cb93a386Sopenharmony_ci      "../externals/zlib/gzclose.c",
166cb93a386Sopenharmony_ci      "../externals/zlib/gzlib.c",
167cb93a386Sopenharmony_ci      "../externals/zlib/gzread.c",
168cb93a386Sopenharmony_ci      "../externals/zlib/gzwrite.c",
169cb93a386Sopenharmony_ci      "../externals/zlib/infback.c",
170cb93a386Sopenharmony_ci      "../externals/zlib/inffast.c",
171cb93a386Sopenharmony_ci      "../externals/zlib/inftrees.c",
172cb93a386Sopenharmony_ci      "../externals/zlib/trees.c",
173cb93a386Sopenharmony_ci      "../externals/zlib/uncompr.c",
174cb93a386Sopenharmony_ci      "../externals/zlib/zutil.c",
175cb93a386Sopenharmony_ci    ]
176cb93a386Sopenharmony_ci
177cb93a386Sopenharmony_ci    if (is_android) {
178cb93a386Sopenharmony_ci      deps += [ "${skia_third_party_dir}/cpu-features" ]
179cb93a386Sopenharmony_ci    }
180cb93a386Sopenharmony_ci
181cb93a386Sopenharmony_ci    if (!use_x86_x64_optimizations && !use_arm_neon_optimizations) {
182cb93a386Sopenharmony_ci      defines += [ "CPU_NO_SIMD" ]
183cb93a386Sopenharmony_ci      sources += [ "../externals/zlib/inflate.c" ]
184cb93a386Sopenharmony_ci    } else {
185cb93a386Sopenharmony_ci      defines += [ "ADLER32_SIMD_NEON" ]
186cb93a386Sopenharmony_ci      configs += [ ":zlib_simd_config" ]
187cb93a386Sopenharmony_ci      deps += [
188cb93a386Sopenharmony_ci        ":zlib_adler32_simd",
189cb93a386Sopenharmony_ci        ":zlib_crc32_simd",
190cb93a386Sopenharmony_ci        ":zlib_inflate_chunk_simd",
191cb93a386Sopenharmony_ci        ":zlib_x86_x64_simd",
192cb93a386Sopenharmony_ci      ]
193cb93a386Sopenharmony_ci    }
194cb93a386Sopenharmony_ci  }
195cb93a386Sopenharmony_ci}
196cb93a386Sopenharmony_ci
197cb93a386Sopenharmony_ciconfig("zlib_config") {
198cb93a386Sopenharmony_ci}
199cb93a386Sopenharmony_ci
200cb93a386Sopenharmony_cithird_party("compression_utils_portable") {
201cb93a386Sopenharmony_ci  visibility = [ "${skia_third_party_dir}/externals/angle2:*" ]
202cb93a386Sopenharmony_ci  public_include_dirs = [ "../externals/zlib/google" ]
203cb93a386Sopenharmony_ci  sources = [
204cb93a386Sopenharmony_ci    "../externals/zlib/google/compression_utils_portable.cc",
205cb93a386Sopenharmony_ci    "../externals/zlib/google/compression_utils_portable.h",
206cb93a386Sopenharmony_ci  ]
207cb93a386Sopenharmony_ci  public_deps = [ ":zlib" ]  # either system or from source
208cb93a386Sopenharmony_ci}
209