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