# Copyright 2014 The Chromium Authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. import("//build/config/arm.gni") import("//build/config/android/config.gni") import("//build/config/sanitizers/sanitizers.gni") import("//third_party/libvpx_new/libvpx_srcs.gni") import("//third_party/yasm/yasm_assemble.gni") # Sets the architecture name for building libvpx. if (current_cpu == "x86") { cpu_arch_full = "ia32" } else if (current_cpu == "x64") { if (is_msan) { cpu_arch_full = "generic" } else { cpu_arch_full = "x64" } } else if (current_cpu == "arm") { if (arm_use_neon) { cpu_arch_full = "arm-neon" } else if (is_android) { cpu_arch_full = "arm-neon-cpu-detect" } else { cpu_arch_full = "arm" } } else { cpu_arch_full = current_cpu } if (is_nacl) { platform_include_dir = "//third_party/libvpx_new/source/config/nacl" } else { if (is_posix && !is_mac) { os_category = "linux" } else { os_category = current_os } platform_include_dir = "//third_party/libvpx_new/source/config/$os_category/$cpu_arch_full" } config("libvpx_config") { include_dirs = [ "//third_party/libvpx_new/source/config", platform_include_dir, "//third_party/libvpx_new/source/libvpx", "$root_gen_dir/third_party/libvpx_new", # Provides vpx_rtcd.h. ] } # gn orders flags on a target before flags from configs. The default config # adds -Wall, and these flags have to be after -Wall -- so they need to come # from a config and can't be on the target directly. config("libvpx_warnings") { if (is_clang) { cflags = [ # libvpx heavily relies on implicit enum casting. "-Wno-conversion", # libvpx does `if ((a == b))` in some places. "-Wno-parentheses-equality", # libvpx has many static functions in header, which trigger this warning. "-Wno-unused-function", ] } else if (!is_win) { cflags = [ "-Wno-unused-function", "-Wno-sign-compare", ] } } # This config is applied to targets that depend on libvpx. config("libvpx_external_config") { include_dirs = [ "//third_party/libvpx_new/source/libvpx" ] } if (current_cpu == "x86" || current_cpu == "x64") { yasm_assemble("libvpx_yasm") { if (current_cpu == "x86") { sources = libvpx_srcs_x86_assembly } else if (current_cpu == "x64") { sources = libvpx_srcs_x86_64_assembly } defines = [ "CHROMIUM" ] include_dirs = [ platform_include_dir, "//third_party/libvpx_new/source/config", "//third_party/libvpx_new/source/libvpx", target_gen_dir, ] } } static_library("libvpx_intrinsics_mmx") { configs += [ ":libvpx_config" ] configs -= [ "//build/config/compiler:chromium_code" ] configs += [ "//build/config/compiler:no_chromium_code" ] configs += [ ":libvpx_warnings" ] if (!is_win) { cflags = [ "-mmmx" ] } if (current_cpu == "x86") { sources = libvpx_srcs_x86_mmx } else if (current_cpu == "x64") { sources = libvpx_srcs_x86_64_mmx } } static_library("libvpx_intrinsics_sse2") { configs += [ ":libvpx_config" ] configs -= [ "//build/config/compiler:chromium_code" ] configs += [ "//build/config/compiler:no_chromium_code" ] configs += [ ":libvpx_warnings" ] if (!is_win || is_clang) { cflags = [ "-msse2" ] } if (current_cpu == "x86") { sources = libvpx_srcs_x86_sse2 } else if (current_cpu == "x64") { sources = libvpx_srcs_x86_64_sse2 } } static_library("libvpx_intrinsics_ssse3") { configs += [ ":libvpx_config" ] configs -= [ "//build/config/compiler:chromium_code" ] configs += [ "//build/config/compiler:no_chromium_code" ] configs += [ ":libvpx_warnings" ] if (!is_win || is_clang) { cflags = [ "-mssse3" ] } if (current_cpu == "x86") { sources = libvpx_srcs_x86_ssse3 } else if (current_cpu == "x64") { sources = libvpx_srcs_x86_64_ssse3 } } static_library("libvpx_intrinsics_sse4_1") { configs += [ ":libvpx_config" ] configs -= [ "//build/config/compiler:chromium_code" ] configs += [ "//build/config/compiler:no_chromium_code" ] configs += [ ":libvpx_warnings" ] if (!is_win || is_clang) { cflags = [ "-msse4.1" ] } if (current_cpu == "x86") { sources = libvpx_srcs_x86_sse4_1 } else if (current_cpu == "x64") { sources = libvpx_srcs_x86_64_sse4_1 } } static_library("libvpx_intrinsics_avx2") { configs += [ ":libvpx_config" ] configs -= [ "//build/config/compiler:chromium_code" ] configs += [ "//build/config/compiler:no_chromium_code" ] configs += [ ":libvpx_warnings" ] if (is_win) { cflags = [ "/arch:AVX2" ] } else { cflags = [ "-mavx2" ] } if (current_cpu == "x86") { sources = libvpx_srcs_x86_avx2 } else if (current_cpu == "x64") { sources = libvpx_srcs_x86_64_avx2 } } if (cpu_arch_full == "arm-neon-cpu-detect") { static_library("libvpx_intrinsics_neon") { configs -= [ "//build/config/compiler:compiler_arm_fpu" ] configs += [ ":libvpx_config" ] configs += [ ":libvpx_warnings" ] cflags = [ "-mfpu=neon" ] sources = libvpx_srcs_arm_neon_cpu_detect_neon } } # Converts ARM assembly files to GAS style. if (current_cpu == "arm") { action_foreach("convert_arm_assembly") { script = "//third_party/libvpx_new/run_perl.py" if (cpu_arch_full == "arm-neon") { sources = libvpx_srcs_arm_neon_assembly } else if (cpu_arch_full == "arm-neon-cpu-detect") { sources = libvpx_srcs_arm_neon_cpu_detect_assembly } else { sources = libvpx_srcs_arm_assembly } outputs = [ "$target_gen_dir/{{source_name_part}}.S", ] args = [ "-s", rebase_path( "//third_party/libvpx_new/source/libvpx/build/make/ads2gas.pl", root_build_dir), "-i", "{{source}}", "-o", rebase_path("$target_gen_dir/{{source_name_part}}.S"), ] } static_library("libvpx_assembly_arm") { sources = get_target_outputs(":convert_arm_assembly") configs -= [ "//build/config/compiler:compiler_arm_fpu" ] configs += [ ":libvpx_config" ] configs += [ ":libvpx_warnings" ] if (cpu_arch_full == "arm-neon" || cpu_arch_full == "arm-neon-cpu-detect") { asmflags = [ "-mfpu=neon" ] } deps = [ ":convert_arm_assembly", ] } } static_library("libvpx_new") { if (!is_debug && is_win) { configs -= [ "//build/config/compiler:default_optimization" ] configs += [ "//build/config/compiler:optimize_max" ] } if (is_nacl) { sources = libvpx_srcs_generic } else if (current_cpu == "x86") { sources = libvpx_srcs_x86 } else if (current_cpu == "x64") { if (is_msan) { sources = libvpx_srcs_generic } else { sources = libvpx_srcs_x86_64 } } else if (current_cpu == "mipsel") { sources = libvpx_srcs_mips } else if (current_cpu == "arm") { if (arm_use_neon) { sources = libvpx_srcs_arm_neon } else if (is_android) { sources = libvpx_srcs_arm_neon_cpu_detect } else { sources = libvpx_srcs_arm } } else if (current_cpu == "arm64") { sources = libvpx_srcs_arm64 } configs += [ ":libvpx_config" ] configs -= [ "//build/config/compiler:chromium_code" ] configs += [ "//build/config/compiler:no_chromium_code" ] configs += [ ":libvpx_warnings" ] deps = [] if (current_cpu == "x86" || (current_cpu == "x64" && !is_msan)) { deps += [ ":libvpx_yasm", ":libvpx_intrinsics_mmx", ":libvpx_intrinsics_sse2", ":libvpx_intrinsics_ssse3", ":libvpx_intrinsics_sse4_1", ":libvpx_intrinsics_avx2", ] } if (cpu_arch_full == "arm-neon-cpu-detect") { deps += [ ":libvpx_intrinsics_neon" ] } if (is_android) { deps += [ "//third_party/android_tools:cpu_features" ] } if (current_cpu == "arm") { deps += [ ":libvpx_assembly_arm" ] } public_configs = [ ":libvpx_external_config" ] }