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