blob: 7309ad8b9c9330b451d9fa8aaafc03b6b17828ef [file] [log] [blame]
# Copyright 2018 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/sysroot.gni")
import("//build_overrides/build.gni")
declare_args() {
# Enable OSP_DCHECKs to be compiled in, even if it's not a debug build.
dcheck_always_on = false
# Enable address sanitizer.
is_asan = false
# Enable thread sanitizer.
is_tsan = false
# Enables clang's source-based coverage (requires is_clang=true).
# NOTE: This will slow down the build and increase binary size
# significantly. For more details, see:
# https://chromium.googlesource.com/chromium/src/+/refs/heads/master/docs/clang_code_coverage_wrapper.md
use_coverage = false
}
assert(!use_coverage || is_clang)
config("compiler_defaults") {
cflags = []
if (is_posix && !is_mac) {
cflags += [ "-fPIC" ]
}
ldflags = []
if (is_linux) {
ldflags += [ "-pthread" ]
}
if (is_posix && !is_mac) {
ldflags += [ "-Wl,--fatal-warnings" ]
if (is_clang) {
ldflags += [
"-stdlib=libstdc++",
"-latomic",
]
}
}
}
config("compiler_cpu_abi") {
cflags = []
ldflags = []
if (current_cpu == "x64") {
# These are explicitly specified in case of cross-compiling.
cflags += [ "-m64" ]
ldflags += [ "-m64" ]
} else if (current_cpu == "x86") {
cflags += [ "-m32" ]
ldflags += [ "-m32" ]
} else if (current_cpu == "arm") {
cflags += [
"--target=arm-linux-gnueabihf",
"-march=$arm_arch",
"-mfloat-abi=$arm_float_abi",
"-mtune=$arm_tune",
]
ldflags += [ "--target=arm-linux-gnueabihf" ]
} else if (current_cpu == "arm64") {
cflags += [ "--target=aarch64-linux-gnu" ]
ldflags += [ "--target=aarch64-linux-gnu" ]
}
}
config("no_exceptions") {
# -fno-exceptions causes the compiler to choose the implementation of the STL
# that uses abort() calls instead of throws, as well as issue compile errors
# for throw calls in user ccode. The no*unwind-tables flags disable generation
# of static unwind tables that are typically used for exceptions, resulting
# in typically smaller object sizes. For some information, see:
# https://gcc.gnu.org/onlinedocs/gcc/Code-Gen-Options.html#index-funwind-tables-1203
cflags_cc = [
"-fno-exceptions",
"-fno-unwind-tables",
"-fno-asynchronous-unwind-tables",
]
cflags_objcc = [
"-fno-exceptions",
"-fno-unwind-tables",
"-fno-asynchronous-unwind-tables",
]
}
config("no_rtti") {
cflags_cc = [ "-fno-rtti" ]
cflags_objcc = [ "-fno-rtti" ]
}
config("openscreen_code") {
cflags = [
"-Wall",
"-Werror",
"-fno-strict-aliasing", # See http://crbug.com/32204
]
cflags_cc = [ "-std=c++14" ]
cflags_objcc = [ "-std=c++14" ]
ldflags = [ "-Werror" ]
if (is_gcc) {
cflags += [ "-Wno-maybe-uninitialized" ]
cflags_cc += [
# GCC 7.2 reports noexcept errors that are not found in GCC 8.
# TODO(crbug.com/openscreen/40): Remove this when bots are upgraded to
# >= GCC 8.3.
"-Wno-noexcept-type",
]
}
if (is_clang) {
cflags += [
"-Wextra",
"-fcolor-diagnostics",
# Warn on missing break statements at the end of switch cases.
"-Wimplicit-fallthrough",
# Unused function parameters are okay (e.g., empty virtual method
# overrides).
"-Wno-unused-parameter",
# Permit code like "struct foo f = {0};".
"-Wno-missing-field-initializers",
# Warn on signed versus unsigned comparisons.
"-Wsign-compare",
# Warn on extra semi-colons.
"-Wextra-semi",
# Warn on unused results.
"-Wunused-result",
]
# Generate warning if code generates exit-time destructors, since such
# things are in violation of Chromium C++ Don'ts.
cflags_cc += [ "-Wexit-time-destructors" ]
cflags_objcc += [ "-Wexit-time-destructors" ]
ldflags += [ "-fcolor-diagnostics" ]
}
defines = []
if (dcheck_always_on) {
defines += [ "DCHECK_ALWAYS_ON" ]
} else if (!is_debug) {
# C-style assertions in the standard library should match the behavior of
# OSP_DCHECKs. Thus, turn them off whenever OSP_DCHECKs would be turned off.
defines += [ "NDEBUG" ]
}
}
config("default_optimization") {
cflags = []
defines = []
if (is_debug) {
cflags += [
"-O0",
"-g3", # Include extra debugging information.
"-fstack-protector-strong",
]
defines += [ "_DEBUG" ]
} else {
cflags += [
"-O2",
"-g1", # Minimal symbols (enough for stack traces).
"-fstack-protector",
]
}
}
config("symbol_visibility_hidden") {
cflags = [ "-fvisibility=hidden" ]
}
config("symbol_visibility_default") {
cflags = [ "-fvisibility=default" ]
}
config("default_sanitizers") {
# NOTE: This is not an artificial restriction; clang doesn't allow these to be
# used together.
assert(!is_asan || !is_tsan)
cflags = []
ldflags = []
if (is_asan) {
cflags += [ "-fsanitize=address" ]
ldflags += [ "-fsanitize=address" ]
} else if (is_tsan) {
cflags += [ "-fsanitize=thread" ]
ldflags += [ "-fsanitize=thread" ]
}
if (use_libfuzzer) {
cflags += [ "-fsanitize=fuzzer-no-link" ]
if (!is_asan) {
ldflags += [ "-fsanitize=address" ]
}
}
}
config("default_coverage") {
cflags = []
ldflags = []
# TODO(issuetracker.google.com/155348032): Limit the use of these flags
if (use_coverage) {
cflags += [
"-fprofile-instr-generate",
"-fcoverage-mapping",
]
ldflags += [ "-fprofile-instr-generate" ]
}
}
config("sysroot_runtime_libraries") {
if (sysroot != "") {
assert(is_clang)
sysroot_path = rebase_path(sysroot, root_build_dir)
flags = [ "--sysroot=" + sysroot_path ]
hash = exec_script("//build/scripts/install-sysroot.py",
[
"--print-hash",
"$current_cpu",
"$sysroot_platform",
],
"trim string",
[ "//build/scripts/sysroots.json" ])
# GN uses this to know that the sysroot is "dirty"
defines = [ "SYSROOT_HASH=$hash" ]
ldflags = flags
cflags = flags
ld_paths = exec_script("//build/scripts/sysroot_ld_path.py",
[ sysroot_path ],
"list lines")
foreach(ld_path, ld_paths) {
ld_path = rebase_path(ld_path, root_build_dir)
ldflags += [ "-L" + ld_path ]
}
}
}
config("operating_system_defines") {
defines = []
if (is_linux) {
defines += [ "OS_LINUX" ]
} else if (is_mac) {
defines += [ "MAC_OSX" ]
}
}