blob: 1af743760006fc0a00543ef82c84be03a4bc8bf3 [file] [log] [blame]
# Copyright 2017 The Fuchsia 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("ffmpeg_generated.gni")
import("ffmpeg_options.gni")
# Path to configuration files.
#
# Placing this file in //build/secondary/third_party/ffmpeg causes it to be mirrored in
# //third_party/ffmpeg, where the build system expects it to be. The mirroring that achieves
# that doesn't work for config files, however. As a result, we have to be specific about where
# the config file can be found by the compiler.
#
# If at some point we are able to integrate this repo at //third_party/ffmpeg, this assignment
# must be restored to its previous value, namely:
#
# ffmpeg_config_root = "config/$ffmpeg_profile/$current_cpu"
#
ffmpeg_config_root =
"//build/secondary/third_party/ffmpeg/config/$ffmpeg_profile/$current_cpu"
has_yasm_deps = ffmpeg_yasm_sources != [] && current_cpu == "x64"
if (has_yasm_deps) {
import("//third_party/yasm/yasm_assemble.gni")
yasm_assemble("ffmpeg_yasm") {
sources = []
foreach(source, ffmpeg_yasm_sources) {
sources += [ "src/" + source ]
}
# Ensure the architecture defines go in the command line before the -P
# file below, so don't use defines.
yasm_flags = []
if (current_cpu == "x86") {
yasm_flags += [ "-DARCH_X86_32" ]
} else if (current_cpu == "x64") {
yasm_flags += [ "-DARCH_X86_64" ]
}
inputs = [
# Sets visibility hidden for cglobal functions. Explicitly included
# to avoid overlooking changes to this file in incremental builds.
"src/libavutil/x86/x86inc.asm",
]
defines = [ "PIC" ]
include_dirs = [
ffmpeg_config_root,
"src/libavcodec/x86",
"src/libavutil/x86",
"src",
]
# Disable warnings, prevents log spam for things we won't fix.
yasm_flags += [
"-w",
"-P",
rebase_path("$ffmpeg_config_root/config.asm", root_build_dir),
]
if (is_mac) {
# Necessary to ensure symbols end up with a _ prefix; added by
# yasm_assemble.gni for Windows, but not Mac.
defines += [ "PREFIX" ]
}
}
}
config("ffmpeg_dependent_config") {
include_dirs = [
ffmpeg_config_root,
"src",
]
}
# 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("ffmpegsumo_warnings") {
cflags = [
"-Wno-absolute-value",
# ffmpeg uses its own deprecated functions.
"-Wno-deprecated-declarations",
# ffmpeg doesn't care about pointer constness.
"-Wno-incompatible-pointer-types",
# ffmpeg doesn't follow usual parentheses conventions.
"-Wno-logical-op-parentheses",
# ffmpeg doesn't care about pointer signedness.
"-Wno-parentheses",
# ffmpeg doesn't care about pointer signedness.
"-Wno-pointer-sign",
# ffmpeg doesn't believe in exhaustive switch statements.
"-Wno-switch",
# matroskadec.c has a "failed:" label that's only used if some
# CONFIG_ flags we don't set are set.
"-Wno-unused-label",
# ffmpeg has a lot of unused variables.
"-Wno-unused-variable",
# This fires on `av_assert0(!"valid element size")` in utils.c
"-Wno-string-conversion",
# This fires on `pos_min` and `pos_max` in
# autorename_libavformat_utils.c
"-Wno-sometimes-uninitialized",
# ffmpeg contains static functions in header files, which lead
# to unused function warnings. There are a few legit unused
# functions too.
"-Wno-unused-function",
# vp3data.h's vp31_inter_dequant stores '128' in an int8_t array.
"-Wno-constant-conversion",
"-Wno-string-plus-int",
# ffmpeg compares ints and floats.
"-Wno-implicit-int-float-conversion",
"-Wno-implicit-int-conversion",
"-Wno-implicit-float-conversion",
"-Wno-float-conversion",
"-Wno-shorten-64-to-32",
"-Wno-unused-but-set-variable",
# fmmpeg may have questionable indentation. We should come back later
# to confirm if this indentation is expected.
"-Wno-misleading-indentation",
"-Wno-extra-semi",
]
}
config("ffmpeg_warnings") {
cflags = [
"-Wno-sign-compare",
"-Wno-missing-field-initializers",
"-Wno-pointer-bool-conversion",
"-Wno-implicit-fallthrough",
"-Wno-implicit-int-float-conversion",
"-Wno-implicit-int-conversion",
"-Wno-implicit-float-conversion",
"-Wno-float-conversion",
"-Wno-shorten-64-to-32",
"-Wno-string-plus-int",
"-Wno-unused-but-set-variable",
"-Wno-misleading-indentation",
]
}
shared_library("ffmpeg") {
sources = []
foreach(source, ffmpeg_c_sources + ffmpeg_gas_sources) {
sources += [ "src/" + source ]
}
sources += [
"$ffmpeg_config_root/config.h",
"$ffmpeg_config_root/libavutil/avconfig.h",
]
public_configs = [ ":ffmpeg_dependent_config" ]
defines = [
"HAVE_AV_CONFIG_H",
"_POSIX_C_SOURCE=200112",
"_XOPEN_SOURCE=600",
"PIC",
# Disable deprecated features that generate spammy warnings.
"FF_API_CONVERGENCE_DURATION=0",
# Upstream libavcodec/utils.c still uses the deprecated
# av_dup_packet(), avcodec_encode_{audio,video}2(), and
# libavformat/utils.c still accesses the deprecated AVStream.codec,
# causing deprecation warnings.
# The normal fix for such things is to disable the features like setting
# "FF_API_AVPACKET_OLD_API=0", but the upstream code does not yet compile
# with it disabled (in the case of av_dup_packet()), and has no FF_API*
# gate for avcodec_encode_{audio,video}2() or AVStream.codec. In the
# meantime, we directly disable those warnings locally in the C files.
]
# So we can append below and assume they're defined.
cflags = []
ldflags = []
libs = []
deps = [
# TODO(https://fxbug.dev/98632): workaround for toolchain issues.
"//build/config/fuchsia:uses-outline-atomics-fxbug98632",
"//third_party/opus",
]
configs += [
":ffmpeg_warnings",
":ffmpegsumo_warnings",
]
# Since we are not often debugging FFmpeg, and performance is unacceptable
# without optimization, we always optimize for speed.
#
# In addition to the above reasons, /Od optimization won't remove symbols
# that are under "if (0)" style sections. Which lead to link time errors
# when for example it tries to link an ARM symbol on X86.
configs -= [ "//build/config:default_optimize" ]
configs += [ "//build/config:optimize_speed" ]
# Make all symbols visible.
configs -= [ "//build/config:symbol_visibility_hidden" ]
cflags += [
# ffmpeg uses its own deprecated functions.
"-Wno-deprecated-declarations",
"-Wno-deprecated-non-prototype",
"-Wno-strict-prototypes",
]
defines += [
"_ISOC99_SOURCE",
"_LARGEFILE_SOURCE",
]
cflags += [
"-std=c99",
"-pthread",
"-fno-math-errno",
"-fno-signed-zeros",
"-fno-tree-vectorize",
"-fomit-frame-pointer",
]
ldflags = [
# Avoid PIC relocation errors from assembly code.
"-Wl,-Bsymbolic",
"-L",
rebase_path(target_gen_dir, root_build_dir),
]
if (has_yasm_deps) {
deps += [ ":ffmpeg_yasm" ]
}
}
group("ffmpeg_variants") {
deps = []
_variants = select_variant
if (select_variant != []) {
_variants += [ "novariant" ]
}
foreach(variant, _variants) {
deps += [ ":ffmpeg(${toolchain_variant.base}-${variant}-shared)" ]
}
}