1 # Copyright (c) 2012 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 'variables': { 6 'libvpx_build_vp9%': 1, 7 'libvpx_source%': 'source/libvpx', 8 # Disable LTO for neon targets 9 # crbug.com/408997 10 'use_lto%': 0, 11 'conditions': [ 12 ['os_posix==1', { 13 'asm_obj_extension': 'o', 14 }], 15 ['OS=="win"', { 16 'asm_obj_extension': 'obj', 17 }], 18 19 ['msan==1', { 20 'target_arch_full': 'generic', 21 }, { 22 'conditions': [ 23 ['(target_arch=="arm" or target_arch=="armv7") and arm_neon==1', { 24 'target_arch_full': 'arm-neon', 25 }, { 26 'conditions': [ 27 ['OS=="android" and ((target_arch=="arm" or target_arch=="armv7") and arm_neon==0)', { 28 'target_arch_full': 'arm-neon-cpu-detect', 29 }, { 30 'target_arch_full': '<(target_arch)', 31 }], 32 ], 33 }], 34 ['target_arch=="arm64"', { 35 'target_arch_full': 'arm64', 36 }], 37 ], 38 }], 39 40 ['os_posix == 1 and OS != "mac"', { 41 'OS_CATEGORY%': 'linux', 42 }, { 43 'OS_CATEGORY%': '<(OS)', 44 }], 45 ], 46 47 # Location of the intermediate output. 48 'shared_generated_dir': '<(SHARED_INTERMEDIATE_DIR)/third_party/libvpx', 49 }, 50 'target_defaults': { 51 'target_conditions': [ 52 ['<(libvpx_build_vp9)==0', { 53 'sources/': [ ['exclude', '(^|/)vp9/'], ], 54 }], 55 ], 56 'variables': { 57 'conditions': [ 58 ['OS=="win" and buildtype=="Official"', { 59 # Do not set to 'size', as it results in an error on win64. 60 'optimize' :'speed', 61 }], 62 ], 63 }, 64 }, 65 'conditions': [ 66 ['target_arch=="ia32"', { 67 'includes': ['libvpx_srcs_x86_intrinsics.gypi', ], 68 }], 69 ['target_arch=="x64" and msan==0', { 70 'includes': ['libvpx_srcs_x86_64_intrinsics.gypi', ], 71 }], 72 [ '(target_arch=="arm" or target_arch=="armv7") and arm_neon==0 and OS=="android"', { 73 # When building for targets which may not have NEON (but may!), include 74 # support for neon and hide it behind Android cpu-features. 75 'includes': ['libvpx_srcs_arm_neon_cpu_detect_intrinsics.gypi', ], 76 }], 77 [ '(target_arch != "arm" and target_arch != "armv7") and \ 78 (target_arch != "mipsel" and target_arch != "mips64el")', { 79 'targets': [ 80 { 81 # This libvpx target contains both encoder and decoder. 82 # Encoder is configured to be realtime only. 83 'target_name': 'libvpx', 84 'type': 'static_library', 85 'variables': { 86 'yasm_output_path': '<(SHARED_INTERMEDIATE_DIR)/third_party/libvpx', 87 'OS_CATEGORY%': '<(OS_CATEGORY)', 88 'yasm_flags': [ 89 '-D', 'CHROMIUM', 90 '-I', 'source/config/<(OS_CATEGORY)/<(target_arch_full)', 91 '-I', 'source/config', 92 '-I', '<(libvpx_source)', 93 '-I', '<(shared_generated_dir)', # Generated assembly offsets 94 ], 95 # yasm only gets the flags we define. It doesn't inherit any of the 96 # really useful defines that come with a gcc invocation. In this 97 # case, we rely on __ANDROID__ to set 'rand' to 'lrand48'. 98 # Previously we used the builtin _rand but that's gone away. 99 'conditions': [ 100 ['OS=="android"', { 101 'yasm_flags': [ 102 '-D', '__ANDROID__', 103 ], 104 }], 105 ], 106 'clang_warning_flags': [ 107 # libvpx heavily relies on implicit enum casting. 108 '-Wno-conversion', 109 # libvpx does `if ((a == b))` in some places. 110 '-Wno-parentheses-equality', 111 ], 112 }, 113 'dependencies': [ 114 'gen_asm_offsets_vp8', 115 ], 116 'includes': [ 117 '../yasm/yasm_compile.gypi' 118 ], 119 'include_dirs': [ 120 'source/config/<(OS_CATEGORY)/<(target_arch_full)', 121 'source/config', 122 '<(libvpx_source)', 123 '<(libvpx_source)/vp8/common', 124 '<(libvpx_source)/vp8/decoder', 125 '<(libvpx_source)/vp8/encoder', 126 '<(shared_generated_dir)', # Provides vpx_rtcd.h. 127 ], 128 'direct_dependent_settings': { 129 'include_dirs': [ 130 '<(libvpx_source)', 131 ], 132 }, 133 # VS2010 does not correctly incrementally link obj files generated 134 # from asm files. This flag disables UseLibraryDependencyInputs to 135 # avoid this problem. 136 'msvs_2010_disable_uldi_when_referenced': 1, 137 'conditions': [ 138 ['target_arch=="ia32"', { 139 'includes': [ 140 'libvpx_srcs_x86.gypi', 141 ], 142 'dependencies': [ 143 'libvpx_intrinsics_mmx', 144 'libvpx_intrinsics_sse2', 145 # Currently no sse3 intrinsic functions 146 #'libvpx_intrinsics_sse3', 147 'libvpx_intrinsics_ssse3', 148 'libvpx_intrinsics_sse4_1', 149 # Currently no avx intrinsic functions 150 #'libvpx_intrinsics_avx', 151 #'libvpx_intrinsics_avx2', 152 ], 153 }], 154 ['target_arch=="arm64"', { 155 'includes': [ 'libvpx_srcs_arm64.gypi', ], 156 }], 157 ['target_arch=="x64"', { 158 'conditions': [ 159 ['msan==1', { 160 'includes': [ 'libvpx_srcs_generic.gypi', ], 161 }, { 162 'includes': [ 163 'libvpx_srcs_x86_64.gypi', 164 ], 165 'dependencies': [ 166 'libvpx_intrinsics_mmx', 167 'libvpx_intrinsics_sse2', 168 # Currently no sse3 intrinsic functions 169 #'libvpx_intrinsics_sse3', 170 'libvpx_intrinsics_ssse3', 171 'libvpx_intrinsics_sse4_1', 172 # Currently no avx intrinsic functions 173 #'libvpx_intrinsics_avx', 174 #'libvpx_intrinsics_avx2', 175 ], 176 }], 177 ], 178 }], 179 ], 180 }, 181 ], 182 }, 183 ], 184 # 'libvpx' target for mipsel and mips64el builds. 185 [ 'target_arch=="mipsel" or target_arch=="mips64el"', { 186 'targets': [ 187 { 188 # This libvpx target contains both encoder and decoder. 189 # Encoder is configured to be realtime only. 190 'target_name': 'libvpx', 191 'type': 'static_library', 192 'variables': { 193 'shared_generated_dir': 194 '<(SHARED_INTERMEDIATE_DIR)/third_party/libvpx', 195 }, 196 'includes': [ 197 'libvpx_srcs_mips.gypi', 198 ], 199 'include_dirs': [ 200 'source/config/<(OS_CATEGORY)/<(target_arch_full)', 201 'source/config', 202 '<(libvpx_source)', 203 '<(libvpx_source)/vp8/common', 204 '<(libvpx_source)/vp8/decoder', 205 '<(libvpx_source)/vp8/encoder', 206 ], 207 'direct_dependent_settings': { 208 'include_dirs': [ 209 '<(libvpx_source)', 210 ], 211 }, 212 'sources': [ 213 'source/config/<(OS_CATEGORY)/<(target_arch_full)/vpx_config.c', 214 ], 215 }, 216 ], 217 }, 218 ], 219 # 'libvpx' target for ARM builds. 220 [ '(target_arch=="arm" or target_arch=="armv7") ', { 221 'targets': [ 222 { 223 # This libvpx target contains both encoder and decoder. 224 # Encoder is configured to be realtime only. 225 'target_name': 'libvpx', 226 'type': 'static_library', 227 'dependencies': [ 228 'gen_asm_offsets_vp8', 229 'gen_asm_offsets_vpx_scale', 230 ], 231 232 # Copy the script to the output folder so that we can use it with 233 # absolute path. 234 'copies': [{ 235 'destination': '<(shared_generated_dir)', 236 'files': [ 237 '<(ads2gas_script_path)', 238 '<(ads2gas_script_include)', 239 ], 240 }], 241 242 # Rule to convert .asm files to .S files. 243 'rules': [ 244 { 245 'rule_name': 'convert_asm', 246 'extension': 'asm', 247 'inputs': [ 248 '<(shared_generated_dir)/<(ads2gas_script)', 249 '<(shared_generated_dir)/thumb.pm', 250 ], 251 'outputs': [ 252 '<(shared_generated_dir)/<(RULE_INPUT_ROOT).S', 253 ], 254 'action': [ 255 'bash', 256 '-c', 257 'cat <(RULE_INPUT_PATH) | perl <(shared_generated_dir)/<(ads2gas_script) -chromium > <(shared_generated_dir)/<(RULE_INPUT_ROOT).S', 258 ], 259 'process_outputs_as_sources': 1, 260 'message': 'Convert libvpx asm file for ARM <(RULE_INPUT_PATH)', 261 }, 262 ], 263 264 'variables': { 265 'variables': { 266 'conditions': [ 267 ['OS=="ios"', { 268 'ads2gas_script%': 'ads2gas_apple.pl', 269 }, { 270 'ads2gas_script%': 'ads2gas.pl', 271 }], 272 ], 273 }, 274 'ads2gas_script%': '<(ads2gas_script)', 275 # Location of the assembly conversion script. 276 'ads2gas_script_path': '<(libvpx_source)/build/make/<(ads2gas_script)', 277 'ads2gas_script_include': '<(libvpx_source)/build/make/thumb.pm', 278 }, 279 'xcode_settings': { 280 'OTHER_CFLAGS': [ 281 '-I<!(pwd)/source/config/<(OS_CATEGORY)/<(target_arch_full)', 282 '-I<!(pwd)/source/config', 283 '-I<(shared_generated_dir)', 284 ], 285 }, 286 'include_dirs': [ 287 'source/config/<(OS_CATEGORY)/<(target_arch_full)', 288 'source/config', 289 '<(libvpx_source)', 290 ], 291 'direct_dependent_settings': { 292 'include_dirs': [ 293 '<(libvpx_source)', 294 ], 295 }, 296 # We need to explicitly tell the assembler to look for 297 # .include directive files from the place where they're 298 # generated to. 299 'cflags': [ 300 '-Wa,-I,<(shared_generated_dir)', 301 ], 302 'conditions': [ 303 # For Android WebView, the following pathc are not required and not 304 # allowed, because they generate the absolute path. 305 ['android_webview_build!=1', { 306 'cflags': [ 307 '-Wa,-I,<!(pwd)/source/config/<(OS_CATEGORY)/<(target_arch_full)', 308 '-Wa,-I,<!(pwd)/source/config', 309 ], 310 }], 311 # Libvpx optimizations for ARMv6 or ARMv7 without NEON. 312 ['arm_neon==0', { 313 'conditions': [ 314 ['OS=="android"', { 315 'includes': [ 316 'libvpx_srcs_arm_neon_cpu_detect.gypi', 317 ], 318 'dependencies': [ 319 'libvpx_intrinsics_neon', 320 ], 321 'cflags': [ 322 '-Wa,-mfpu=neon', 323 ], 324 }, { 325 'includes': [ 326 'libvpx_srcs_arm.gypi', 327 ], 328 }], 329 ], 330 }], 331 # Libvpx optimizations for ARMv7 with NEON. 332 ['arm_neon==1', { 333 'includes': [ 334 'libvpx_srcs_arm_neon.gypi', 335 ], 336 }], 337 ['OS == "android"', { 338 'includes': [ 339 '../../build/android/cpufeatures.gypi', 340 ], 341 }], 342 ['OS == "ios"', { 343 'xcode_settings': { 344 'OTHER_CFLAGS!': [ 345 # Breaks at least boolhuff_armv5te:token_high_bit_not_set_ev. 346 '-fstack-protector-all', # Implies -fstack-protector 347 ], 348 }, 349 }], 350 ], 351 }, 352 ], 353 }], 354 ], 355 'targets': [ 356 { 357 # A tool that runs on host to extract integers from object file. 358 'target_name': 'libvpx_obj_int_extract', 359 'type': 'executable', 360 'toolsets': ['host'], 361 'include_dirs': [ 362 'source/config/<(OS_CATEGORY)/<(target_arch_full)', 363 'source/config', 364 '<(libvpx_source)', 365 ], 366 'sources': [ 367 '<(libvpx_source)/build/make/obj_int_extract.c', 368 ], 369 'conditions': [ 370 ['android_webview_build==1', { 371 'defines': [ 'FORCE_PARSE_ELF' ], 372 'include_dirs': [ 'include' ], 373 }], 374 ], 375 }, 376 { 377 # A library that contains assembly offsets needed. 378 'target_name': 'libvpx_asm_offsets_vp8', 379 'type': 'static_library', 380 'android_unmangled_name': 1, 381 'hard_dependency': 1, 382 'include_dirs': [ 383 'source/config/<(OS_CATEGORY)/<(target_arch_full)', 384 'source/config', 385 '<(libvpx_source)', 386 ], 387 'conditions': [ 388 ['asan==1', { 389 'cflags!': [ '-fsanitize=address' ], 390 'xcode_settings': { 'OTHER_CFLAGS!': [ '-fsanitize=address' ] }, 391 'ldflags!': [ '-fsanitize=address' ], 392 }], 393 ['OS=="win"', { 394 'msvs_settings': { 395 'VCCLCompilerTool': { 396 # Clang uses -fdata-sections when function level linking is 397 # enabled, but libvpx_obj_int_extract expects all data to 398 # reside in the same section on Windows. 399 'EnableFunctionLevelLinking': 'false', 400 }, 401 }, 402 }], 403 ], 404 'sources': [ 405 '<(libvpx_source)/vp8/encoder/vp8_asm_enc_offsets.c', 406 ], 407 }, 408 { 409 # A library that contains assembly offsets needed. 410 # TODO(fgalligan): Merge libvpx_asm_offsets_vpx_scale into 411 # libvpx_asm_offsets. 412 'target_name': 'libvpx_asm_offsets_vpx_scale', 413 'type': 'static_library', 414 'android_unmangled_name': 1, 415 'hard_dependency': 1, 416 'include_dirs': [ 417 'source/config/<(OS_CATEGORY)/<(target_arch_full)', 418 'source/config', 419 '<(libvpx_source)', 420 ], 421 'conditions': [ 422 ['asan==1', { 423 'cflags!': [ '-faddress-sanitizer', '-fsanitize=address', ], 424 'xcode_settings': { 425 'OTHER_CFLAGS!': [ '-faddress-sanitizer','-fsanitize=address' ], 426 }, 427 'ldflags!': [ '-faddress-sanitizer', '-fsanitize=address', ], 428 }], 429 ], 430 'sources': [ 431 '<(libvpx_source)/vpx_scale/vpx_scale_asm_offsets.c', 432 ], 433 }, 434 { 435 # A target that takes assembly offsets library and generate the 436 # corresponding assembly files. 437 # This target is a hard dependency because the generated .asm files 438 # are needed all assembly optimized files in libvpx. 439 'target_name': 'gen_asm_offsets_vp8', 440 'type': 'none', 441 'hard_dependency': 1, 442 'dependencies': [ 443 'libvpx_asm_offsets_vp8', 444 'libvpx_obj_int_extract#host', 445 ], 446 'variables' : { 447 'lib_intermediate_name' : '', 448 'output_format':'', 449 'output_dir': '<(shared_generated_dir)', 450 'conditions' : [ 451 ['android_webview_build==1', { 452 # pass the empty string for 3rd and 4th arguments of 453 # intermediates-dir-for macro. 454 'lib_intermediate_name' : '$(abspath $(call intermediates-dir-for,STATIC_LIBRARIES,libvpx_asm_offsets_vp8,,,$(gyp_var_prefix)))/libvpx_asm_offsets_vp8.a', 455 }], 456 ['(target_arch=="arm" or target_arch=="armv7")', { 457 'output_format': 'gas', 458 }, { 459 'output_format': 'rvds', 460 }], 461 ], 462 }, 463 'conditions': [ 464 ['OS=="win"', { 465 'variables': { 466 'ninja_obj_dir': '<(PRODUCT_DIR)/obj/third_party/libvpx/<(libvpx_source)/vp8', 467 }, 468 'actions': [ 469 { 470 'action_name': 'copy_enc_offsets_obj', 471 'inputs': [ 'copy_obj.py' ], 472 'outputs': [ '<(INTERMEDIATE_DIR)/vp8_asm_enc_offsets.obj' ], 473 'action': [ 474 'python', 475 '<(DEPTH)/third_party/libvpx/copy_obj.py', 476 '-d', '<@(_outputs)', 477 '-s', '<(PRODUCT_DIR)/obj/libvpx_asm_offsets_vp8/vp8_asm_enc_offsets.obj', 478 '-s', '<(ninja_obj_dir)/encoder/libvpx_asm_offsets_vp8.vp8_asm_enc_offsets.obj', 479 '-s', '<(PRODUCT_DIR)/obj/Source/WebKit/chromium/third_party/libvpx/<(libvpx_source)/vp8/encoder/libvpx_asm_offsets_vp8.vp8_asm_enc_offsets.obj', 480 ], 481 'process_outputs_as_sources': 1, 482 }, 483 ], 484 'sources': [ 485 '<(INTERMEDIATE_DIR)/vp8_asm_enc_offsets.obj', 486 ], 487 }, { 488 'variables': { 489 'unpack_lib_search_path_list': [ 490 '-a', '<(PRODUCT_DIR)/libvpx_asm_offsets_vp8.a', 491 '-a', '<(LIB_DIR)/third_party/libvpx/libvpx_asm_offsets_vp8.a', 492 '-a', '<(LIB_DIR)/chromium/src/third_party/libvpx/libvpx_asm_offsets_vp8.a', 493 '-a', '<(LIB_DIR)/Source/WebKit/chromium/third_party/libvpx/libvpx_asm_offsets_vp8.a', 494 '-a', '<(lib_intermediate_name)', 495 ], 496 'unpack_lib_output_dir':'<(INTERMEDIATE_DIR)', 497 'unpack_lib_name':'vp8_asm_enc_offsets.o' 498 }, 499 'includes': ['unpack_lib_posix.gypi'], 500 # Need this otherwise gyp won't run the rule on them. 501 'sources': [ 502 '<(INTERMEDIATE_DIR)/vp8_asm_enc_offsets.o', 503 ], 504 }], 505 ], 506 'includes': ['obj_int_extract.gypi'], 507 }, 508 { 509 # A target that takes assembly offsets library and generate the 510 # corresponding assembly files. 511 # This target is a hard dependency because the generated .asm files 512 # are needed all assembly optimized files in libvpx. 513 'target_name': 'gen_asm_offsets_vpx_scale', 514 'type': 'none', 515 'hard_dependency': 1, 516 'dependencies': [ 517 'libvpx_asm_offsets_vpx_scale', 518 'libvpx_obj_int_extract#host', 519 ], 520 'variables' : { 521 'lib_intermediate_name' : '', 522 'output_format':'', 523 'output_dir': '<(shared_generated_dir)', 524 'conditions' : [ 525 ['android_webview_build==1', { 526 # pass the empty string for 3rd and 4th arguments of 527 # intermediates-dir-for macro. 528 'lib_intermediate_name' : '$(abspath $(call intermediates-dir-for,STATIC_LIBRARIES,libvpx_asm_offsets_vpx_scale,,,$(gyp_var_prefix)))/libvpx_asm_offsets_vpx_scale.a', 529 }], 530 ['(target_arch=="arm" or target_arch=="armv7")', { 531 'output_format': 'gas', 532 }, { 533 'output_format': 'rvds', 534 }], 535 ], 536 }, 537 'conditions': [ 538 ['OS=="win"', { 539 'variables': { 540 'ninja_obj_dir': '<(PRODUCT_DIR)/obj/third_party/libvpx/<(libvpx_source)/vpx_scale', 541 }, 542 'actions': [ 543 { 544 'action_name': 'copy_enc_offsets_obj', 545 'inputs': [ 'copy_obj.py' ], 546 'outputs': [ '<(INTERMEDIATE_DIR)/vpx_scale_asm_offsets.obj' ], 547 'action': [ 548 'python', 549 '<(DEPTH)/third_party/libvpx/copy_obj.py', 550 '-d', '<@(_outputs)', 551 '-s', '<(PRODUCT_DIR)/obj/libvpx_asm_offsets_vpx_scale/vpx_scale_asm_offsets.obj', 552 '-s', '<(ninja_obj_dir)/encoder/libvpx_asm_offsets_vpx_scale.vpx_scale_asm_offsets.obj', 553 '-s', '<(PRODUCT_DIR)/obj/Source/WebKit/chromium/third_party/libvpx/<(libvpx_source)/vpx_scale/libvpx_asm_offsets_vpx_scale.vpx_scale_asm_offsets.obj', 554 ], 555 'process_outputs_as_sources': 1, 556 }, 557 ], 558 'sources': [ 559 '<(INTERMEDIATE_DIR)/vpx_scale_asm_offsets.obj', 560 ], 561 }, { 562 'variables': { 563 'unpack_lib_search_path_list': [ 564 '-a', '<(PRODUCT_DIR)/libvpx_asm_offsets_vpx_scale.a', 565 '-a', '<(LIB_DIR)/third_party/libvpx/libvpx_asm_offsets_vpx_scale.a', 566 '-a', '<(LIB_DIR)/chromium/src/third_party/libvpx/libvpx_asm_offsets_vpx_scale.a', 567 '-a', '<(LIB_DIR)/Source/WebKit/chromium/third_party/libvpx/libvpx_asm_offsets_vpx_scale.a', 568 '-a', '<(lib_intermediate_name)', 569 ], 570 'unpack_lib_output_dir':'<(INTERMEDIATE_DIR)', 571 'unpack_lib_name':'vpx_scale_asm_offsets.o' 572 }, 573 'includes': ['unpack_lib_posix.gypi'], 574 # Need this otherwise gyp won't run the rule on them. 575 'sources': [ 576 '<(INTERMEDIATE_DIR)/vpx_scale_asm_offsets.o', 577 ], 578 }], 579 ], 580 'includes': ['obj_int_extract.gypi'], 581 }, 582 ], 583 } 584