# 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" ]
}
