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