blob: cef32d51cf30a5214a9b3b2b214f3a53635ca8c8 [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("ffmpeg_options.gni")
import("ffmpeg_generated.gni")
# Path to platform configuration files.
platform_config_root =
"chromium/config/$ffmpeg_branding/$os_config/$ffmpeg_arch"
# Stub generator script and signatures of all functions used by Chrome.
generate_stubs_script = "//tools/generate_stubs/generate_stubs.py"
# Used by ffmpeg_generate_stubs and ffmpeg_generate_def
sig_files = [ "chromium/ffmpegsumo.sigs" ]
# TODO(ajwong): Should be in ffmpeg_generate_stubs if we could grab the
# outputs of an action via a function.
stubs_filename_root = "ffmpeg_stubs"
if (cpu_arch != "arm" && os_config != "linux-noasm") {
import("//third_party/yasm/yasm_assemble.gni")
yasm_assemble("ffmpeg_yasm") {
sources = ffmpeg_yasm_sources
# Ensure the architecture defines go in the command line before the -P
# file below, so don't use defines.
yasm_flags = []
if (cpu_arch == "x86") {
yasm_flags += [ "-DARCH_X86_32" ]
} else if (cpu_arch == "x64") {
yasm_flags += [ "-DARCH_X86_64" ]
}
defines = [ "PIC" ]
include_dirs = [
platform_config_root,
"libavcodec/x86",
"libavutil/x86",
".",
]
# Disable warnings, prevents log spam for things we won't fix.
yasm_flags += [
"-w",
"-P", rebase_path("$platform_config_root/config.asm", root_build_dir),
]
if (is_mac) {
# Necessary to ensure symbols end up with a _ prefix; added by
# yasm_compile.gypi for Windows, but not Mac.
defines += [ "PREFIX" ]
}
}
}
# FFMpeg is dynamically loaded on all platforms but our code calls it
# as if it were directly linked. To make this work, the build system needs
# to generate stubs that indirect into the library calls.
#
# On Windows, this script calls the windows stub generator. Otherwise, assume
# this is a POSIX platform and generate our own wrapper stubs.
action("ffmpeg_generate_stubs") {
extra_header = "chromium/ffmpeg_stub_headers.fragment"
script = generate_stubs_script
sources = sig_files
inputs = [ extra_header ]
if (is_win) {
if (build_cpu_arch == "x64") {
outfile_type = "windows_lib_x64"
} else {
outfile_type = "windows_lib"
}
# TODO(ajwong): these need to be in the ffmpeg build.
outputs = [
"$target_gen_dir/$stubs_filename_root.lib",
]
args = [
# TODO(ajwong): In gyp, this uses different directories for the
# windows build. We should think this through.
"-i", rebase_path(target_gen_dir, root_build_dir),
"-o", rebase_path(target_gen_dir, root_build_dir),
"-t", outfile_type,
]
} else {
# If it's not windows, clearly it must be posix.
# TODO(ajwong): these need to be included in the ffmpeg build.
outputs = [
"$target_gen_dir/$stubs_filename_root.cc",
"$target_gen_dir/$stubs_filename_root.h",
]
args = [
# TODO(ajwong): IN gyp, this used to output the .h file into a shared
# directory that other targets could reference. The .cc ends up in a
# special generated directory that gyp would guaranteed that no one else
# could look at. Now we're dumping both into the generated directory.
# Verify what the best + simplest behavior is here and use that.
"-i", rebase_path(target_gen_dir, root_build_dir),
"-o", rebase_path(target_gen_dir, root_build_dir),
"-t", "posix_stubs",
"-e", rebase_path(extra_header, root_build_dir),
"-s", stubs_filename_root,
"-p", "third_party/ffmpeg",
]
}
args += rebase_path(sources, root_build_dir)
}
if (build_ffmpegsumo) {
shared_library("ffmpegsumo") {
sources = ffmpeg_c_sources + ffmpeg_gas_sources + [
"$platform_config_root/config.h",
"$platform_config_root/libavutil/avconfig.h",
]
include_dirs = [
platform_config_root,
".",
]
defines = [
"HAVE_AV_CONFIG_H",
"_POSIX_C_SOURCE=200112",
"_XOPEN_SOURCE=600",
"PIC",
# Disable deprecated features which generate spammy warnings.
"FF_API_PIX_FMT_DESC=0",
"FF_API_OLD_DECODE_AUDIO=0",
"FF_API_DESTRUCT_PACKET=0",
"FF_API_GET_BUFFER=0",
]
# So we can append below and assume they're defined.
cflags = []
ldflags = []
libs = []
deps = []
configs -= [ "//build/config/compiler:chromium_code" ]
configs += [ "//build/config/compiler:no_chromium_code" ]
# Since we are not often debugging FFmpeg, and performance is
# unacceptable without optimization, freeze the optimizations to -O2.
# If someone really wants -O1 , they can change these in their checkout.
# If you want -O0, see the Gotchas in README.Chromium for why that
# won't work.
#
# 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.
if (is_debug) {
configs -= [ "//build/config/compiler:no_optimize" ]
} else {
configs -= [ "//build/config/compiler:optimize" ]
}
if (is_win) {
# Setting the optimizations to 'speed' or to 'max' on Windows results in
# a lot of unresolved symbols. The only supported mode is 'size' (see
# crbug.com/264459).
configs += [ "//build/config/compiler:optimize" ]
} else {
configs += [ "//build/config/compiler:optimize_max" ]
}
if (is_posix) {
cflags += [
"-fPIC",
"-fomit-frame-pointer",
# ffmpeg uses its own deprecated functions.
"-Wno-deprecated-declarations",
]
if (is_clang) {
cflags += [
"-Wno-absolute-value",
"-Wno-incompatible-pointer-types",
"-Wno-logical-op-parentheses",
"-Wno-parentheses",
"-Wno-pointer-sign",
"-Wno-switch",
]
} else {
# gcc doesn't have flags for specific warnings, so disable them
# all.
cflags += [ "-w" ]
}
if (cpu_arch == "x86") {
# Turn off valgrind build option that breaks ffmpeg builds.
# TODO(ajwong): The gyp file had special removals for
# debug_extra_cflags and release_extra_cflags. Do we care?
#cflags -= [ "-fno-omit-frame-pointer" ]
} else if (cpu_arch == "arm") {
# TODO(ihf): See the long comment in build_ffmpeg.sh
# We want to be consistent with CrOS and have configured
# ffmpeg for thumb. Protect yourself from -marm.
if (is_chromeos) {
cflags += [ "-marm" ]
}
cflags += [
"-mthumb",
"-march=armv7-a",
"-mtune=cortex-a8",
"-mfpu=${arm_fpu}"
]
if (arm_float_abi == "hard") {
cflags += [ "-DHAVE_VFP_ARGS=1" ]
} else {
cflags += [ "-DHAVE_VFP_ARGS=0" ]
}
} else if (cpu_arch == "mipsel") {
cflags += [
"-mips32",
"-EL -Wl,-EL",
]
}
}
if (is_posix && !is_mac) {
defines += [
"_ISOC99_SOURCE",
"_LARGEFILE_SOURCE",
# BUG(ihf): ffmpeg compiles with this define. But according to
# ajwong: I wouldn't change _FILE_OFFSET_BITS. That's a scary change
# cause it affects the default length of off_t, and fpos_t,
# which can cause strange problems if the loading code doesn't
# have it set and you start passing FILE*s or file descriptors
# between symbol contexts.
# "_FILE_OFFSET_BITS=64",
]
cflags += [
"-std=c99",
"-pthread",
"-fno-math-errno",
"-fno-signed-zeros",
"-fno-tree-vectorize",
"-fomit-frame-pointer",
]
# Ensure the symbols are exported.
#
# TODO(ajwong): Manually tag the API that we use to be
# exported.
configs -= [ "//build/config/gcc:symbol_visibility_hidden" ]
ldflags = [
"-Wl,-Bsymbolic",
"-L", rebase_path(target_gen_dir, root_build_dir),
]
libs = [ "z" ]
# TODO(ajwong): How to handle openbsd? Especially w/o the is_posix?
# if (is_openbsd) {
# # OpenBSD's gcc (4.2.1) does not support this flag
# cflags -= [ "-fno-signed-zeros" ]
# }
}
if (is_mac) {
defines += [ "_DARWIN_C_SOURCE" ]
# TODO(ajwong): What does this do in mac? There isn't anything in ffmpeg.gyp that
# uses mac_real_dsym
# ['mac_breakpad == 1', {
# 'variables': {
# # A real .dSYM is needed for dump_syms to operate on.
# 'mac_real_dsym': 1,
# },
# }],
if (cpu_arch != "x64") {
# This is needed because even though FFmpeg now builds
# with -fPIC, it's not quite a complete PIC build, only
# partial :( Thus we need to instruct the linker to allow
# relocations for read-only segments for this target to be
# able to generated the shared library on Mac.
#
#TODO(ajwong): Check if this can be cpu_arch == "x86"
# Note -read_only_relocs cannot be used in x86_64
#
# This makes Mark sad, but he's okay with it since it is
# isolated to this module. When Mark finds this in the
# future, and has forgotten this conversation, this
# comment should remind him that the world is still nice
# and butterflies still exist...as do rainbows, sunshine,
# tulips, etc., etc...but not kittens. Those went away
# with this flag.
ldflags = [
"-Wl,-read_only_relocs,suppress",
]
}
# TODO(ajwong): How to handle SDKROOT?
# 'libraries': [
# '$(SDKROOT)/usr/lib/libz.dylib',
# ],
# Ensure the symbols are exported.
#
# TODO(ajwong): Manually tag the API that we use to be exported.
if (!is_win) {
configs -= [ "//build/config/gcc:symbol_visibility_hidden" ]
}
# TODO(ajwong): How to handle @loader_path?
# 'xcode_settings': {
# 'DYLIB_INSTALL_NAME_BASE': '@loader_path',
# }
lib_dirs = [ target_gen_dir ]
} else if (is_win) {
defines += [
"inline=__inline",
"strtoll=_strtoi64",
"_ISOC99_SOURCE",
"_LARGEFILE_SOURCE",
"HAVE_AV_CONFIG_H",
"strtod=avpriv_strtod",
"snprintf=avpriv_snprintf",
"_snprintf=avpriv_snprintf",
"vsnprintf=avpriv_vsnprintf",
]
include_dirs += [
"chromium/include/win"
]
# TODO(dalecurtis): We should fix these. http://crbug.com/154421
cflags += [
"/wd4996", # 'function': was declared deprecated
"/wd4018", # 'expression': signed/unsigned mismatch
"/wd4090", # 'operation' : different 'modifier' qualifiers
"/wd4305", # 'identifier': truncation from 'type1' to 'type2'
"/wd4133", # 'type' : incompatible types - from 'type1' to 'type2'
"/wd4146", # unary minus operator applied to unsigned type, result
# still unsigned
"/wd4554", # 'operator' : check operator precedence for possible
# error; use parentheses to clarify precedence
"/wd4028", # formal parameter 'number' different from declaration
"/wd4334", # 'operator' : result of 32-bit shift implicitly
# converted to 64 bits (was 64-bit shift intended?)
"/wd4101", # 'identifier' : unreferenced local variable
"/wd4102", # 'label' : unreferenced label
"/wd4116", # unnamed type definition in parentheses
"/wd4307", # 'operator' : integral constant overflow
"/wd4273", # 'function' : inconsistent DLL linkage
"/wd4005", # 'identifier' : macro redefinition
"/wd4056", # overflow in floating point constant arithmetic
"/wd4756", # overflow in constant arithmetic
]
# TODO(ajwong): Verify this is true.
# Ignore warnings about a local symbol being inefficiently imported,
# upstream is working on a fix.
ldflags += [
"/ignore:4049", # locally defined symbol 'symbol' imported
"/ignore:4217", # locally defined symbol 'symbol' imported in
# function 'function'
]
if (cpu_arch == "x64") {
# TODO(wolenetz): We should fix this. http://crbug.com/171009
cflags += [
"/wd4267" # Conversion from size_t to 'type'.
]
}
deps += [ ":ffmpeg_generate_def" ]
}
if (cpu_arch != "arm" && cpu_arch != "mipsel" && os_config != "linux-noasm") {
deps += [ ":ffmpeg_yasm" ]
}
}
}
if (is_win) {
config("ffmpeg_win_dependent_config") {
include_dirs = [
platform_config_root,
"chromium/include/win",
".",
]
libs = [ "$target_out_dir/ffmpegsumo.lib" ]
ldflags = [ "/DELAYLOAD:ffmpegsumo.dll" ]
}
action("ffmpeg_generate_def") {
script = generate_stubs_script
sources = sig_files
outputs = [ "$target_gen_dir/ffmpegsumo.def" ]
args = [
# TODO(ajwong): This was -i <(INTERMEDIATE_DIR). What next?
"-i", rebase_path(target_out_dir, root_build_dir),
"-o", rebase_path(target_gen_dir, root_build_dir),
"-t", "windows_def",
"-m", "ffmpegsumo.dll",
] + rebase_path(sources, root_build_dir)
}
group("ffmpeg") {
public_configs = [ ":ffmpeg_win_dependent_config" ]
public_deps = [
":ffmpeg_generate_stubs",
":ffmpegsumo",
]
}
} else {
config("ffmpeg_posix_dependent_config") {
include_dirs = [
platform_config_root,
".",
]
}
component("ffmpeg") {
sources = [
"$target_gen_dir/$stubs_filename_root.cc",
"$target_gen_dir/$stubs_filename_root.h",
]
configs -= [ "//build/config/gcc:symbol_visibility_hidden" ]
defines = [
"__STDC_CONSTANT_MACROS", # FFmpeg uses INT64_C.
]
include_dirs = [
platform_config_root,
".",
]
public_configs = [ ":ffmpeg_posix_dependent_config" ]
deps = [ ":ffmpeg_generate_stubs", ":ffmpegsumo" ]
}
}