• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# Copyright 2014 The Chromium Authors. All rights reserved.
2# Use of this source code is governed by a BSD-style license that can be
3# found in the LICENSE file.
4
5# Do not use the targets in this file unless you need a certain libjpeg
6# implementation. Use the meta target //third_party:jpeg instead.
7
8import("//build/config/features.gni")
9import("//build/config/sanitizers/sanitizers.gni")
10if (current_cpu == "arm" || current_cpu == "arm64") {
11  import("//build/config/arm.gni")
12}
13
14assert(
15    use_blink,
16    "This is not used if blink is not enabled, don't drag it in unintentionally")
17
18source_set("libjpeg_headers") {
19  sources = [
20    "jconfig.h",
21    "jdct.h",
22    "jinclude.h",
23    "jmorecfg.h",
24    "jpeglib.h",
25    "jpeglibmangler.h",
26  ]
27}
28
29if (current_cpu == "x86" || current_cpu == "x64") {
30  import("//third_party/nasm/nasm_assemble.gni")
31
32  nasm_assemble("simd_asm") {
33    defines = []
34    include_dirs = [ "simd/nasm/" ]
35
36    inputs = [
37      "simd/nasm/jdct.inc",
38      "simd/nasm/jsimdext.inc",
39    ]
40
41    if (current_cpu == "x86") {
42      include_dirs += [ "simd/i386/" ]
43      sources = [
44        "simd/i386/jccolor-avx2.asm",
45        "simd/i386/jccolor-mmx.asm",
46        "simd/i386/jccolor-sse2.asm",
47        "simd/i386/jcgray-avx2.asm",
48        "simd/i386/jcgray-mmx.asm",
49        "simd/i386/jcgray-sse2.asm",
50        "simd/i386/jchuff-sse2.asm",
51        "simd/i386/jcphuff-sse2.asm",
52        "simd/i386/jcsample-avx2.asm",
53        "simd/i386/jcsample-mmx.asm",
54        "simd/i386/jcsample-sse2.asm",
55        "simd/i386/jdcolor-avx2.asm",
56        "simd/i386/jdcolor-mmx.asm",
57        "simd/i386/jdcolor-sse2.asm",
58        "simd/i386/jdmerge-avx2.asm",
59        "simd/i386/jdmerge-mmx.asm",
60        "simd/i386/jdmerge-sse2.asm",
61        "simd/i386/jdsample-avx2.asm",
62        "simd/i386/jdsample-mmx.asm",
63        "simd/i386/jdsample-sse2.asm",
64        "simd/i386/jfdctflt-3dn.asm",
65        "simd/i386/jfdctflt-sse.asm",
66        "simd/i386/jfdctfst-mmx.asm",
67        "simd/i386/jfdctfst-sse2.asm",
68        "simd/i386/jfdctint-avx2.asm",
69        "simd/i386/jfdctint-mmx.asm",
70        "simd/i386/jfdctint-sse2.asm",
71        "simd/i386/jidctflt-3dn.asm",
72        "simd/i386/jidctflt-sse.asm",
73        "simd/i386/jidctflt-sse2.asm",
74        "simd/i386/jidctfst-mmx.asm",
75        "simd/i386/jidctfst-sse2.asm",
76        "simd/i386/jidctint-avx2.asm",
77        "simd/i386/jidctint-mmx.asm",
78        "simd/i386/jidctint-sse2.asm",
79        "simd/i386/jidctred-mmx.asm",
80        "simd/i386/jidctred-sse2.asm",
81        "simd/i386/jquant-3dn.asm",
82        "simd/i386/jquant-mmx.asm",
83        "simd/i386/jquant-sse.asm",
84        "simd/i386/jquantf-sse2.asm",
85        "simd/i386/jquanti-avx2.asm",
86        "simd/i386/jquanti-sse2.asm",
87        "simd/i386/jsimdcpu.asm",
88      ]
89      defines += [
90        "__x86__",
91        "PIC",
92      ]
93    } else if (current_cpu == "x64") {
94      include_dirs += [ "simd/x86_64/" ]
95      sources = [
96        "simd/x86_64/jccolor-avx2.asm",
97        "simd/x86_64/jccolor-sse2.asm",
98        "simd/x86_64/jcgray-avx2.asm",
99        "simd/x86_64/jcgray-sse2.asm",
100        "simd/x86_64/jchuff-sse2.asm",
101        "simd/x86_64/jcphuff-sse2.asm",
102        "simd/x86_64/jcsample-avx2.asm",
103        "simd/x86_64/jcsample-sse2.asm",
104        "simd/x86_64/jdcolor-avx2.asm",
105        "simd/x86_64/jdcolor-sse2.asm",
106        "simd/x86_64/jdmerge-avx2.asm",
107        "simd/x86_64/jdmerge-sse2.asm",
108        "simd/x86_64/jdsample-avx2.asm",
109        "simd/x86_64/jdsample-sse2.asm",
110        "simd/x86_64/jfdctflt-sse.asm",
111        "simd/x86_64/jfdctfst-sse2.asm",
112        "simd/x86_64/jfdctint-avx2.asm",
113        "simd/x86_64/jfdctint-sse2.asm",
114        "simd/x86_64/jidctflt-sse2.asm",
115        "simd/x86_64/jidctfst-sse2.asm",
116        "simd/x86_64/jidctint-avx2.asm",
117        "simd/x86_64/jidctint-sse2.asm",
118        "simd/x86_64/jidctred-sse2.asm",
119        "simd/x86_64/jquantf-sse2.asm",
120        "simd/x86_64/jquanti-avx2.asm",
121        "simd/x86_64/jquanti-sse2.asm",
122        "simd/x86_64/jsimdcpu.asm",
123      ]
124      defines += [
125        "__x86_64__",
126        "PIC",
127      ]
128    }
129
130    if (is_win) {
131      defines += [ "MSVC" ]
132      if (current_cpu == "x86") {
133        defines += [ "WIN32" ]
134      } else {
135        defines += [ "WIN64" ]
136      }
137    } else if (is_mac || is_ios) {
138      defines += [ "MACHO" ]
139    } else if (is_linux || is_android || is_fuchsia || is_chromeos) {
140      defines += [ "ELF" ]
141    }
142  }
143}
144
145static_library("simd") {
146  include_dirs = [ "." ]
147  deps = [ ":libjpeg_headers" ]
148  defines = [ "MANGLE_JPEG_NAMES" ]
149
150  if (current_cpu == "x86") {
151    deps += [ ":simd_asm" ]
152    sources = [ "simd/i386/jsimd.c" ]
153  } else if (current_cpu == "x64") {
154    deps += [ ":simd_asm" ]
155    sources = [ "simd/x86_64/jsimd.c" ]
156  } else if ((current_cpu == "arm" || current_cpu == "arm64") && arm_use_neon) {
157    include_dirs += [ "simd/arm/" ]
158
159    sources = [
160      "simd/arm/jccolor-neon.c",
161      "simd/arm/jcgray-neon.c",
162      "simd/arm/jcphuff-neon.c",
163      "simd/arm/jcsample-neon.c",
164      "simd/arm/jdcolor-neon.c",
165      "simd/arm/jdmerge-neon.c",
166      "simd/arm/jdsample-neon.c",
167      "simd/arm/jfdctfst-neon.c",
168      "simd/arm/jfdctint-neon.c",
169      "simd/arm/jidctfst-neon.c",
170      "simd/arm/jidctint-neon.c",
171      "simd/arm/jidctred-neon.c",
172      "simd/arm/jquanti-neon.c",
173    ]
174    if (current_cpu == "arm") {
175      sources += [
176        "simd/arm/aarch32/jchuff-neon.c",
177        "simd/arm/aarch32/jsimd.c",
178      ]
179    } else if (current_cpu == "arm64") {
180      sources += [
181        "simd/arm/aarch64/jchuff-neon.c",
182        "simd/arm/aarch64/jsimd.c",
183      ]
184    }
185
186    defines += [ "NEON_INTRINSICS" ]
187
188    configs -= [ "//build/config/compiler:default_optimization" ]
189    configs += [ "//build/config/compiler:optimize_speed" ]
190  } else {
191    sources = [ "jsimd_none.c" ]
192  }
193
194  if (is_win) {
195    cflags = [ "/wd4245" ]
196  }
197}
198
199config("libjpeg_config") {
200  include_dirs = [ "." ]
201  defines = [ "MANGLE_JPEG_NAMES" ]
202}
203
204static_library("libjpeg") {
205  sources = [
206    "jcapimin.c",
207    "jcapistd.c",
208    "jccoefct.c",
209    "jccolor.c",
210    "jcdctmgr.c",
211    "jchuff.c",
212    "jcicc.c",
213    "jcinit.c",
214    "jcmainct.c",
215    "jcmarker.c",
216    "jcmaster.c",
217    "jcomapi.c",
218    "jcparam.c",
219    "jcphuff.c",
220    "jcprepct.c",
221    "jcsample.c",
222    "jctrans.c",
223    "jdapimin.c",
224    "jdapistd.c",
225    "jdatadst.c",
226    "jdatasrc.c",
227    "jdcoefct.c",
228    "jdcolor.c",
229    "jddctmgr.c",
230    "jdhuff.c",
231    "jdicc.c",
232    "jdinput.c",
233    "jdmainct.c",
234    "jdmarker.c",
235    "jdmaster.c",
236    "jdmerge.c",
237    "jdphuff.c",
238    "jdpostct.c",
239    "jdsample.c",
240    "jdtrans.c",
241    "jerror.c",
242    "jfdctflt.c",
243    "jfdctfst.c",
244    "jfdctint.c",
245    "jidctflt.c",
246    "jidctfst.c",
247    "jidctint.c",
248    "jidctred.c",
249    "jmemmgr.c",
250    "jmemnobs.c",
251    "jpeg_nbits_table.c",
252    "jquant1.c",
253    "jquant2.c",
254    "jutils.c",
255  ]
256
257  defines = [
258    "WITH_SIMD",
259    "NO_GETENV",
260    "NO_PUTENV",
261  ]
262
263  configs += [ ":libjpeg_config" ]
264
265  public_configs = [ ":libjpeg_config" ]
266  public_deps = [ ":libjpeg_headers" ]
267
268  # MemorySanitizer doesn't support assembly code, so keep it disabled in x86
269  # and x64 MSan builds for now.
270  if (is_msan && (current_cpu == "x86" || current_cpu == "x64")) {
271    sources += [ "jsimd_none.c" ]
272  } else {
273    public_deps += [ ":simd" ]
274
275    if ((current_cpu == "arm" || current_cpu == "arm64") && arm_use_neon) {
276      defines += [ "NEON_INTRINSICS" ]
277    }
278  }
279}
280
281static_library("turbojpeg") {
282  sources = [
283    "jdatadst-tj.c",
284    "jdatasrc-tj.c",
285    "rdbmp.c",
286    "rdppm.c",
287    "transupp.c",
288    "turbojpeg.c",
289    "wrbmp.c",
290    "wrppm.c",
291  ]
292
293  defines = [
294    "WITH_SIMD",
295    "BMP_SUPPORTED",
296    "PPM_SUPPORTED",
297  ]
298
299  configs += [ ":libjpeg_config" ]
300
301  public_configs = [ ":libjpeg_config" ]
302  public_deps = [ ":libjpeg" ]
303}
304
305if (build_with_chromium) {
306  import("//testing/test.gni")
307
308  test("libjpeg_turbo_unittests") {
309    testonly = true
310
311    sources = [
312      "cdjpeg.c",
313      "cjpeg.c",
314      "djpeg.c",
315      "gtest/cjpeg-gtest-wrapper.cpp",
316      "gtest/djpeg-gtest-wrapper.cpp",
317      "gtest/gtest-utils.cpp",
318      "gtest/jpegtran-gtest-wrapper.cpp",
319      "gtest/tjbench-gtest-wrapper.cpp",
320      "gtest/tjunittest-gtest-wrapper.cpp",
321      "jpegtran.c",
322      "md5/md5.c",
323      "md5/md5hl.c",
324      "rdcolmap.c",
325      "rdgif.c",
326      "rdswitch.c",
327      "tjbench.c",
328      "tjunittest.c",
329      "tjutil.c",
330    ]
331
332    deps = [
333      ":turbojpeg",
334      "//base",
335      "//testing/gtest",
336      "//testing/gtest:gtest_main",
337    ]
338
339    data = [ "testimages/" ]
340
341    defines = [
342      "GTEST",
343      "WITH_SIMD",
344      "BMP_SUPPORTED",
345      "PPM_SUPPORTED",
346    ]
347
348    include_dirs = [
349      "//third_party/googletest/src/googletest/include/gtest",
350      ".",
351    ]
352
353    configs -= [ "//build/config/compiler:chromium_code" ]
354    configs += [ "//build/config/compiler:no_chromium_code" ]
355
356    if (is_win) {
357      cflags = [ "-U_CRT_SECURE_NO_DEPRECATE" ]
358    }
359  }
360}
361