blob: e88053b5fa5b7ce251cca9e48adbc0876093f8af [file] [log] [blame]
# Copyright (C) 2017 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import("//gn/standalone/android.gni")
import("//gn/standalone/wasm.gni")
import("//gn/standalone/sanitizers/sanitizers.gni")
config("extra_warnings") {
cflags = [
"-Wall",
"-Wextra",
]
# Disable Weverything on fuzzers to avoid breakages when new versions of clang
# are rolled into OSS-fuzz.
if (is_clang && !is_fuzzer) {
cflags += [
"-Weverything",
"-Wno-c++98-compat-pedantic",
"-Wno-c++98-compat",
"-Wno-disabled-macro-expansion",
"-Wno-gnu-include-next",
"-Wno-gnu-statement-expression",
"-Wno-gnu-zero-variadic-macro-arguments",
"-Wno-padded",
"-Wno-reserved-id-macro",
"-Wno-unknown-sanitizers",
]
}
}
config("no_exceptions") {
cflags_cc = [ "-fno-exceptions" ]
}
config("no_rtti") {
cflags_cc = [ "-fno-rtti" ]
}
config("c++11") {
cflags_cc = [ "-std=c++11" ]
}
# This is needed to compile libunwindstack.
config("c++17") {
cflags_cc = [ "-std=c++17" ]
}
config("visibility_hidden") {
cflags = [ "-fvisibility=hidden" ]
}
config("default") {
asmflags = []
cflags = []
cflags_c = []
cflags_cc = []
defines = []
ldflags = []
libs = []
cflags += [
"-fstrict-aliasing",
"-fstack-protector",
"-fPIC",
"-g",
"-Wformat",
"-Werror",
]
if (!is_wasm && !is_lto) {
cflags += [ "-Wa,--noexecstack" ]
}
if (is_clang) {
cflags += [
# Color compiler output, see https://github.com/ninja-build/ninja/wiki/FAQ
"-fcolor-diagnostics",
"-fdiagnostics-show-template-tree",
]
}
if (is_lto) {
cflags += [ "-flto=full" ]
ldflags += [ "-flto=full" ]
}
if (current_cpu == "arm") {
cflags += [
"-march=armv7-a",
"-mfpu=neon",
"-mthumb",
]
} else if (current_cpu == "x86") {
asmflags += [ "-m32" ]
cflags += [
"-m32",
"-msse2",
"-mfpmath=sse",
]
ldflags += [ "-m32" ]
} else if (current_cpu == "arm64") {
cflags += [ "-fno-omit-frame-pointer" ]
}
if (is_linux) {
libs += [
"pthread",
"rt",
]
}
if (is_debug) {
libs += [ "dl" ]
}
if (is_android) {
asmflags += [ "--target=$android_abi_target" ]
cflags += [
"--sysroot=$android_compile_sysroot",
"-isystem$android_compile_sysroot/$android_compile_sysroot_subdir",
"-isystem$android_compile_sysroot",
"-DANDROID",
"-D__ANDROID_API__=${android_api_level}",
"--target=$android_abi_target",
]
cflags_cc += [
"-I$android_ndk_root/sources/cxx-stl/llvm-libc++/include",
"-I$android_ndk_root/sources/android/support/include",
"-I$android_ndk_root/sources/cxx-stl/llvm-libc++abi/include",
# This is needed for NDK libc++. Using -isystem instead of -I above
# results in build breakage related to cmath.h.
"-Wno-format-nonliteral",
]
ldflags += [
"-Wl,-z,nocopyreloc",
"-gcc-toolchain",
"$android_toolchain_root",
"--sysroot=$android_ndk_root/$android_link_sysroot_subdir",
"--target=$android_abi_target",
"-Wl,--exclude-libs,libunwind.a",
"-Wl,--exclude-libs,libgcc.a",
"-Wl,--exclude-libs,libc++_static.a",
"-Wl,--build-id",
"-Wl,--no-undefined",
"-Wl,-z,noexecstack",
"-Wl,-z,relro",
"-Wl,-z,now",
"-Wl,--warn-shared-textrel",
"-Wl,--fatal-warnings",
]
lib_dirs = [
"$android_ndk_root/sources/cxx-stl/llvm-libc++/libs/$android_app_abi",
]
libs += [
"gcc",
"c++_static",
"c++abi",
]
if (current_cpu == "arm") {
# New NDKs don't have libandroid_support for arm64.
libs += [ "android_support" ]
}
}
}
config("debug_symbols") {
cflags = [ "-O0" ]
if (is_android || is_linux) {
cflags += [ "-funwind-tables" ]
}
}
config("release") {
cflags = [
"-fdata-sections",
"-ffunction-sections",
]
if (is_android) {
cflags += [ "-Oz" ]
} else if (is_fuzzer) {
cflags += [ "-O1" ]
} else {
cflags += [ "-O3" ]
}
if (is_mac) {
ldflags = [ "-dead_strip" ]
} else {
ldflags = [
"-fuse-ld=gold",
"-Wl,--gc-sections",
"-Wl,--icf=all",
"-Wl,-O1",
]
}
defines = [ "NDEBUG" ]
}
config("shared_library") {
if (is_android || is_linux) {
ldflags = [ "-fPIC" ]
}
}
config("executable") {
ldflags = []
# Android will refuse to run executables if they aren't position independent.
# Instead on Linux there isn't any need and they break ASan (goo.gl/paFR6K).
if (is_android) {
asmflags = [ "-fPIE" ]
cflags = [ "-fPIE" ]
ldflags += [ "-pie" ]
}
# -rpath stores the path to the linked shared libraries into the binary, so
# that they can be launched without passing any LD_LIBRARY_PATH. It's
# supported only by Linux, not Android. But concretely we need this only when
# use_custom_libcxx=true && custom_libcxx_is_static=false, which happens only
# on Linux right now.
if (is_linux) {
ldflags += [
"-Wl,-rpath=\$ORIGIN/.",
"-Wl,-rpath-link=.",
]
}
}
# This config is only added to certain leaf target types (see BUILDCONFIG.gn).
# This allows us to remove the config (and thus the dependency) on a per-target
# basis. If the config was applied to source_sets, then they would unavoidably
# carry the dependency onto liblog to the final target.
config("android_liblog") {
if (is_android) {
libs = [ "log" ]
}
}
config("gen_include_path") {
include_dirs = [ root_gen_dir ]
}
# This action generates a perfetto_version.gen.h which contains the git SHA1
# of HEAD. The file can be included from C/C++ sources and exposes a
# PERFETTO_GET_GIT_REVISION() macro that contains the git revision.
action("gen_git_revision") {
script = "gen_git_revision.py"
generated_header = "${root_gen_dir}/perfetto_version.gen.h"
args = [ rebase_path(generated_header, root_build_dir) ]
inputs = []
outputs = [
generated_header,
]
public_configs = [ ":gen_include_path" ]
}