blob: 797f473425454875ed895b231e91bba3a923bc66 [file] [log] [blame]
# 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.
]
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" ]
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" ]
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" ]
}
args += [
"-b",
rebase_path(get_label_info(":libvpx_asm_offsets", "target_out_dir")) +
"/" + invoker.src_dir + "/libvpx_asm_offsets." +
invoker.obj_file_root + ".o"
]
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" ]
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" ]
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" ]
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" ]
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" ]
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" ]
}