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