| # 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("//third_party/libvpx/libvpx_srcs.gni") |
| import("//third_party/yasm/yasm_assemble.gni") |
| |
| if (is_posix && !is_mac) { |
| os_category = "linux" |
| } else { |
| os_category = os |
| } |
| |
| # Sets the architecture name for building libvpx. |
| if (cpu_arch == "x86") { |
| cpu_arch_full = "ia32" |
| } else if (cpu_arch == "x64") { |
| if (is_msan) { |
| cpu_arch_full = "generic" |
| } else { |
| cpu_arch_full = "x64" |
| } |
| } else if (cpu_arch == "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 = cpu_arch |
| } |
| |
| config("libvpx_config") { |
| include_dirs = [ |
| "//third_party/libvpx/source/config", |
| "//third_party/libvpx/source/config/$os_category/$cpu_arch_full", |
| "//third_party/libvpx/source/libvpx", |
| "$root_gen_dir/third_party/libvpx", # Provides vpx_rtcd.h. |
| ] |
| 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/source/libvpx", |
| ] |
| } |
| |
| executable("libvpx_obj_int_extract") { |
| sources = [ |
| "//third_party/libvpx/source/libvpx/build/make/obj_int_extract.c" |
| ] |
| configs += [ ":libvpx_config" ] |
| configs -= [ "//build/config/compiler:chromium_code" ] |
| configs += [ "//build/config/compiler:no_chromium_code" ] |
| if (is_android_webview_build) { |
| defines += [ "FORCE_PARSE_ELF" ] |
| include_dirs += [ "//third_party/libvpx/include" ] |
| } |
| } |
| |
| # A library whose object files contain integers to be extracted. |
| static_library("libvpx_asm_offsets") { |
| sources = [ |
| "//third_party/libvpx/source/libvpx/vp8/encoder/vp8_asm_enc_offsets.c", |
| "//third_party/libvpx/source/libvpx/vpx_scale/vpx_scale_asm_offsets.c" |
| ] |
| configs += [ ":libvpx_config" ] |
| configs -= [ "//build/config/compiler:chromium_code" ] |
| configs += [ "//build/config/compiler:no_chromium_code" ] |
| if (is_clang) { |
| cflags = [ "-Wno-unused-function" ] |
| } |
| } |
| |
| # This works only on POSIX to extract integer values from an object file. |
| template("obj_int_extract") { |
| action(target_name) { |
| script = "//third_party/libvpx/obj_int_extract.py" |
| bin_label = "//third_party/libvpx($host_toolchain)" |
| |
| args = [ |
| "-e", |
| "./" + rebase_path(get_label_info(bin_label, "root_out_dir") + |
| "/libvpx_obj_int_extract", |
| root_build_dir) |
| ] |
| |
| if (cpu_arch == "arm") { |
| args += [ "-f", "gas" ] |
| } else { |
| args += [ "-f", "rvds" ] |
| } |
| |
| if (is_win) { |
| obj_extension = "obj" |
| } else { |
| obj_extension = "o" |
| } |
| |
| args += [ |
| "-b", |
| rebase_path(get_label_info(":libvpx_asm_offsets", "target_out_dir")) + |
| "/" + invoker.src_dir + "/libvpx_asm_offsets." + |
| invoker.obj_file_root + ".${obj_extension}" |
| ] |
| out_file = "$target_gen_dir/" + invoker.obj_file_root + ".asm" |
| args += [ "-o", rebase_path(out_file) ] |
| outputs = [ out_file ] |
| deps = [ |
| ":libvpx_asm_offsets", |
| ":libvpx_obj_int_extract($host_toolchain)" |
| ] |
| } |
| } |
| |
| obj_int_extract("gen_asm_offsets_vp8") { |
| src_dir = "source/libvpx/vp8/encoder" |
| obj_file_root = "vp8_asm_enc_offsets" |
| } |
| |
| obj_int_extract("gen_asm_offsets_scale") { |
| src_dir = "source/libvpx/vpx_scale" |
| obj_file_root = "vpx_scale_asm_offsets" |
| } |
| |
| if (cpu_arch == "x86" || cpu_arch == "x64") { |
| yasm_assemble("libvpx_yasm") { |
| if (cpu_arch == "x86") { |
| sources = libvpx_srcs_x86_assembly |
| } else if (cpu_arch == "x64") { |
| sources = libvpx_srcs_x86_64_assembly |
| } |
| |
| defines = [ "CHROMIUM" ] |
| include_dirs = [ |
| "//third_party/libvpx/source/config/$os_category/$cpu_arch_full", |
| "//third_party/libvpx/source/config", |
| "//third_party/libvpx/source/libvpx", |
| target_gen_dir |
| ] |
| deps = [ |
| ":gen_asm_offsets_vp8", |
| ":gen_asm_offsets_scale", |
| ] |
| } |
| } |
| |
| static_library("libvpx_intrinsics_mmx") { |
| configs += [ ":libvpx_config" ] |
| configs -= [ "//build/config/compiler:chromium_code" ] |
| configs += [ "//build/config/compiler:no_chromium_code" ] |
| if (!is_win) { |
| cflags = [ "-mmmx" ] |
| } |
| if (cpu_arch == "x86") { |
| sources = libvpx_srcs_x86_mmx |
| } else if (cpu_arch == "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" ] |
| if (!is_win) { |
| cflags = [ "-msse2" ] |
| } |
| if (cpu_arch == "x86") { |
| sources = libvpx_srcs_x86_sse2 |
| } else if (cpu_arch == "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" ] |
| if (!is_win) { |
| cflags = [ "-mssse3" ] |
| } |
| if (cpu_arch == "x86") { |
| sources = libvpx_srcs_x86_ssse3 |
| } else if (cpu_arch == "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" ] |
| if (!is_win) { |
| cflags = [ "-msse4.1" ] |
| } |
| if (cpu_arch == "x86") { |
| sources = libvpx_srcs_x86_sse4_1 |
| } else if (cpu_arch == "x64") { |
| sources = libvpx_srcs_x86_64_sse4_1 |
| } |
| } |
| |
| if (cpu_arch_full == "arm-neon-cpu-detect") { |
| static_library("libvpx_intrinsics_neon") { |
| configs -= [ "//build/config/compiler:compiler_arm_fpu" ] |
| configs += [ ":libvpx_config" ] |
| cflags = [ "-mfpu=neon" ] |
| sources = libvpx_srcs_arm_neon_cpu_detect_neon |
| } |
| } |
| |
| # Converts ARM assembly files to GAS style. |
| if (cpu_arch == "arm") { |
| action_foreach("convert_arm_assembly") { |
| script = "//third_party/libvpx/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/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" ] |
| if (cpu_arch_full == "arm-neon" || |
| cpu_arch_full == "arm-neon-cpu-detect") { |
| cflags = [ "-mfpu=neon" ] |
| } |
| deps = [ |
| ":convert_arm_assembly", |
| ":gen_asm_offsets_vp8", |
| ":gen_asm_offsets_scale", |
| ] |
| } |
| } |
| |
| static_library("libvpx") { |
| if (!is_debug && is_win && is_official_build) { |
| configs -= [ "//build/config/compiler:optimize" ] |
| configs += [ "//build/config/compiler:optimize_max" ] |
| } |
| |
| if (cpu_arch == "x86") { |
| sources = libvpx_srcs_x86 |
| } else if (cpu_arch == "x64") { |
| if (is_msan) { |
| sources = libvpx_srcs_generic |
| } else { |
| sources = libvpx_srcs_x86_64 |
| } |
| } else if (cpu_arch == "mipsel") { |
| sources = libvpx_srcs_generic |
| } else if (cpu_arch == "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 (cpu_arch == "arm64") { |
| sources = libvpx_srcs_arm64 |
| } |
| configs += [ ":libvpx_config" ] |
| configs -= [ "//build/config/compiler:chromium_code" ] |
| configs += [ "//build/config/compiler:no_chromium_code" ] |
| deps = [] |
| if (cpu_arch == "x86" || (cpu_arch == "x64" && !is_msan)) { |
| deps += [ |
| ":libvpx_yasm", |
| ":libvpx_intrinsics_mmx", |
| ":libvpx_intrinsics_sse2", |
| ":libvpx_intrinsics_ssse3", |
| ":libvpx_intrinsics_sse4_1", |
| ] |
| } |
| if (cpu_arch_full == "arm-neon-cpu-detect") { |
| deps += [ ":libvpx_intrinsics_neon" ] |
| } |
| if (is_android) { |
| deps += [ "//third_party/android_tools:cpu_features" ] |
| } |
| if (cpu_arch == "arm") { |
| deps += [ ":libvpx_assembly_arm" ] |
| } |
| |
| public_configs = [ ":libvpx_external_config" ] |
| } |