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