blob: 56d709edfe7d19581485033612f2f64414df0002 [file] [log] [blame]
# Copyright 2019 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("dav1d_generated.gni")
import("//build/config/compiler/compiler.gni")
import("//build/config/sanitizers/sanitizers.gni")
import("//third_party/nasm/nasm_assemble.gni")
# MemorySanitizer can't handle assembly, https://crbug.com/928357.
enable_nasm = (current_cpu == "x86" || current_cpu == "x64") && !is_msan
if (is_win) {
platform_config_root = "config/win/$current_cpu"
} else if (is_msan) {
assert(current_cpu == "x64" && is_linux, "Only Linux X64 MSAN is supported")
platform_config_root = "config/linux-noasm/$current_cpu"
} else {
# Linux configuration files seem to work on Mac, so just reuse them.
platform_config_root = "config/linux/$current_cpu"
}
# Clang LTO doesn't respect stack alignment and clang-cl doesn't support setting
# the stack alignment, so we must use the platform's default alignment in those
# cases; https://crbug.com/928743.
if (current_cpu == "x86" || current_cpu == "x64") {
if (use_thin_lto || is_win) {
needs_stack_alignment = false
# The defaults are stack_alignment=4 for x86 and stack_alignment=16 for x64.
} else {
# The compiler flags, as well as the stack alignment values, all mirror
# upstream's meson.build setup:
# https://chromium.googlesource.com/external/github.com/videolan/dav1d/+/master/meson.build
needs_stack_alignment = true
if (current_cpu == "x86") {
stack_alignment = 16
if (!is_clang) {
# Values used by GCC.
preferred_stack_boundary = 4
incoming_stack_boundary = 2
}
} else if (current_cpu == "x64") {
stack_alignment = 32
if (!is_clang) {
# Values used by GCC.
preferred_stack_boundary = 5
incoming_stack_boundary = 4
}
}
if (is_clang) {
stackalign_flag = "-mstack-alignment=$stack_alignment"
stackrealign_flag = "-mstackrealign"
} else {
# Assume GCC for now.
stackalign_flag = "-mpreferred-stack-boundary=$preferred_stack_boundary"
stackrealign_flag = "-mincoming-stack-boundary=$incoming_stack_boundary"
}
}
} else {
needs_stack_alignment = false
}
config("public_dav1d_config") {
include_dirs = [ "version" ]
# Disable internal dav1d logs in the official build to save storage.
if (is_official_build) {
defines = [ "CONFIG_LOG=0" ]
} else {
defines = [ "CONFIG_LOG=1" ]
}
if (needs_stack_alignment) {
defines += [ "STACK_ALIGNMENT=$stack_alignment" ]
}
# Don't let dav1d export any symbols. Otherwise the verify_order step on macOS
# can fail since these exports end up in the final Chromium binary.
defines += [ "DAV1D_API=" ]
}
config("dav1d_config") {
configs = [ ":public_dav1d_config" ]
include_dirs = [
"libdav1d",
"libdav1d/include",
"libdav1d/include/dav1d",
platform_config_root,
]
}
dav1d_copts = [
"-D_FILE_OFFSET_BITS=64",
"-D_POSIX_C_SOURCE=200112L",
]
if (!is_win) {
dav1d_copts += [ "-std=c99" ]
if (needs_stack_alignment) {
dav1d_copts += [ stackalign_flag ]
}
}
if (enable_nasm) {
nasm_assemble("dav1d_asm") {
sources = x86_asm_sources
inputs = [
"libdav1d/src/ext/x86/x86inc.asm",
"$platform_config_root/config.asm",
]
include_dirs = [
"libdav1d/src/",
platform_config_root,
]
nasm_flags = [
"-P",
rebase_path("$platform_config_root/config.asm", root_build_dir),
]
if (needs_stack_alignment) {
defines = [ "STACK_ALIGNMENT=$stack_alignment" ]
}
# Necessary to ensure macOS symbols end up with a _ prefix.
if (is_mac) {
defines += [ "PREFIX" ]
}
}
}
static_library("dav1d_entrypoints") {
configs -= [ "//build/config/compiler:chromium_code" ]
configs += [
"//build/config/compiler:no_chromium_code",
":dav1d_config",
]
sources = entry_point_sources
cflags = dav1d_copts
if (is_win) {
sources += [ "libdav1d/src/win32/thread.c" ]
}
if (needs_stack_alignment) {
cflags += [ stackrealign_flag ]
}
}
static_library("dav1d_8bit") {
configs -= [ "//build/config/compiler:chromium_code" ]
configs += [
"//build/config/compiler:no_chromium_code",
":dav1d_config",
]
sources = template_sources
if (current_cpu == "x86" || current_cpu == "x64") {
sources += x86_template_sources
} else if (current_cpu == "arm") {
sources += arm_template_sources
} else if (current_cpu == "arm64") {
sources += arm_template_sources
}
cflags = dav1d_copts
cflags += [ "-DBITDEPTH=8" ]
}
static_library("dav1d_10bit") {
configs -= [ "//build/config/compiler:chromium_code" ]
configs += [
"//build/config/compiler:no_chromium_code",
":dav1d_config",
]
sources = template_sources
if (current_cpu == "x86" || current_cpu == "x64") {
sources += x86_template_sources
} else if (current_cpu == "arm") {
sources += arm_template_sources
} else if (current_cpu == "arm64") {
sources += arm_template_sources
}
cflags = dav1d_copts
cflags += [ "-DBITDEPTH=16" ]
}
if (current_cpu == "x86" || current_cpu == "x64") {
static_library("dav1d_x86") {
sources = [
"libdav1d/src/x86/cpu.c",
"libdav1d/src/x86/cpu.h",
]
configs -= [ "//build/config/compiler:chromium_code" ]
configs += [
"//build/config/compiler:no_chromium_code",
":dav1d_config",
]
cflags = dav1d_copts
}
} else if (current_cpu == "arm" || current_cpu == "arm64") {
static_library("dav1d_arm") {
sources = [
"libdav1d/src/arm/cpu.c",
"libdav1d/src/arm/cpu.h",
]
# These are not template based so should only be built once.
if (current_cpu == "arm") {
sources += arm32_asm_sources
} else if (current_cpu == "arm64") {
sources += arm64_asm_sources
}
configs -= [ "//build/config/compiler:chromium_code" ]
configs += [
"//build/config/compiler:no_chromium_code",
":dav1d_config",
]
cflags = dav1d_copts
}
}
static_library("dav1d") {
sources = c_sources
configs -= [ "//build/config/compiler:chromium_code" ]
configs += [
"//build/config/compiler:no_chromium_code",
":dav1d_config",
]
cflags = dav1d_copts
deps = [
":dav1d_10bit",
":dav1d_8bit",
":dav1d_entrypoints",
]
public_configs = [ ":public_dav1d_config" ]
if (current_cpu == "x86" || current_cpu == "x64") {
deps += [ ":dav1d_x86" ]
if (enable_nasm) {
deps += [ ":dav1d_asm" ]
}
} else if (current_cpu == "arm" || current_cpu == "arm64") {
deps += [ ":dav1d_arm" ]
}
}