1*6dbdd20aSAndroid Build Coastguard Worker# Copyright (C) 2017 The Android Open Source Project 2*6dbdd20aSAndroid Build Coastguard Worker# 3*6dbdd20aSAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License"); 4*6dbdd20aSAndroid Build Coastguard Worker# you may not use this file except in compliance with the License. 5*6dbdd20aSAndroid Build Coastguard Worker# You may obtain a copy of the License at 6*6dbdd20aSAndroid Build Coastguard Worker# 7*6dbdd20aSAndroid Build Coastguard Worker# http://www.apache.org/licenses/LICENSE-2.0 8*6dbdd20aSAndroid Build Coastguard Worker# 9*6dbdd20aSAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software 10*6dbdd20aSAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS, 11*6dbdd20aSAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12*6dbdd20aSAndroid Build Coastguard Worker# See the License for the specific language governing permissions and 13*6dbdd20aSAndroid Build Coastguard Worker# limitations under the License. 14*6dbdd20aSAndroid Build Coastguard Worker 15*6dbdd20aSAndroid Build Coastguard Workerimport("//gn/perfetto_check_build_deps.gni") 16*6dbdd20aSAndroid Build Coastguard Workerimport("//gn/standalone/android.gni") 17*6dbdd20aSAndroid Build Coastguard Workerimport("//gn/standalone/libc++/libc++.gni") 18*6dbdd20aSAndroid Build Coastguard Workerimport("//gn/standalone/sanitizers/sanitizers.gni") 19*6dbdd20aSAndroid Build Coastguard Workerimport("//gn/standalone/toolchain/msvc.gni") 20*6dbdd20aSAndroid Build Coastguard Workerimport("//gn/standalone/wasm.gni") 21*6dbdd20aSAndroid Build Coastguard Worker 22*6dbdd20aSAndroid Build Coastguard Worker# These warnings have been introduced with the newest version of clang (only in 23*6dbdd20aSAndroid Build Coastguard Worker# the hermetic build) and are enabled just with -Werror. 24*6dbdd20aSAndroid Build Coastguard Workerhermetic_clang_suppressions = [ "-Wno-c99-designator" ] 25*6dbdd20aSAndroid Build Coastguard Worker 26*6dbdd20aSAndroid Build Coastguard Worker# We deal with three toolchains here: 27*6dbdd20aSAndroid Build Coastguard Worker# 1. Clang, used in most cases. 28*6dbdd20aSAndroid Build Coastguard Worker# 2. GCC, used in some Linux cases. 29*6dbdd20aSAndroid Build Coastguard Worker# 3. MSVC, used in some Windows cases. 30*6dbdd20aSAndroid Build Coastguard Worker# Clang vs gcc is typically not a problem: both support roughly the same 31*6dbdd20aSAndroid Build Coastguard Worker# switches. -Wno-unknown-warning-option fixes the mismatching ones. 32*6dbdd20aSAndroid Build Coastguard Worker# The situation on Windows is a bit trickier: clang-cl.exe really pretends to be 33*6dbdd20aSAndroid Build Coastguard Worker# cl.exe (MSVC), so we should use MSVC-style switches (e.g. /W2). However, 34*6dbdd20aSAndroid Build Coastguard Worker# clang-cl.exe still supports some -Wclang-style-switches for flags that don't 35*6dbdd20aSAndroid Build Coastguard Worker# have a corresponding version in MSVC. 36*6dbdd20aSAndroid Build Coastguard Worker# 37*6dbdd20aSAndroid Build Coastguard Worker# In the rules below, the conditionals should be interpreted as follows: 38*6dbdd20aSAndroid Build Coastguard Worker# is_win -> can be either clang-cl.exe or cl.exe (MSVC). Only MSVC-style 39*6dbdd20aSAndroid Build Coastguard Worker# switches (the common denominator) should be used. 40*6dbdd20aSAndroid Build Coastguard Worker# is_clang -> could be clang-on-linux, clang-on-mac or clang-cl.exe. 41*6dbdd20aSAndroid Build Coastguard Worker 42*6dbdd20aSAndroid Build Coastguard Workerconfig("extra_warnings") { 43*6dbdd20aSAndroid Build Coastguard Worker if (is_win) { 44*6dbdd20aSAndroid Build Coastguard Worker cflags = [ 45*6dbdd20aSAndroid Build Coastguard Worker "/W2", 46*6dbdd20aSAndroid Build Coastguard Worker "/wd4244", # conversion from 'float' to 'int', possible loss of data 47*6dbdd20aSAndroid Build Coastguard Worker "/wd4267", # conversion from 'size_t' to 'int', possible loss of data 48*6dbdd20aSAndroid Build Coastguard Worker ] 49*6dbdd20aSAndroid Build Coastguard Worker if (is_clang) { 50*6dbdd20aSAndroid Build Coastguard Worker cflags += [ 51*6dbdd20aSAndroid Build Coastguard Worker "-Wno-float-equal", 52*6dbdd20aSAndroid Build Coastguard Worker "-Wno-unused-macros", 53*6dbdd20aSAndroid Build Coastguard Worker "-Wno-old-style-cast", 54*6dbdd20aSAndroid Build Coastguard Worker ] 55*6dbdd20aSAndroid Build Coastguard Worker } 56*6dbdd20aSAndroid Build Coastguard Worker } else { 57*6dbdd20aSAndroid Build Coastguard Worker # Clang or Gcc. On linux, Android and Mac. 58*6dbdd20aSAndroid Build Coastguard Worker cflags = [ 59*6dbdd20aSAndroid Build Coastguard Worker "-Wall", 60*6dbdd20aSAndroid Build Coastguard Worker "-Wextra", 61*6dbdd20aSAndroid Build Coastguard Worker "-Wpedantic", 62*6dbdd20aSAndroid Build Coastguard Worker ] 63*6dbdd20aSAndroid Build Coastguard Worker } 64*6dbdd20aSAndroid Build Coastguard Worker 65*6dbdd20aSAndroid Build Coastguard Worker # Disable variadic macro warning as we make extensive use of them in trace 66*6dbdd20aSAndroid Build Coastguard Worker # processor and client API. 67*6dbdd20aSAndroid Build Coastguard Worker if (is_clang) { 68*6dbdd20aSAndroid Build Coastguard Worker # Only enable -Weverything on hermetic clang as system clang might be quite 69*6dbdd20aSAndroid Build Coastguard Worker # out of date. 70*6dbdd20aSAndroid Build Coastguard Worker if (is_hermetic_clang && current_toolchain == host_toolchain && 71*6dbdd20aSAndroid Build Coastguard Worker !is_fuzzer) { 72*6dbdd20aSAndroid Build Coastguard Worker # Disable Weverything on fuzzers to avoid breakages when new versions of 73*6dbdd20aSAndroid Build Coastguard Worker # clang are rolled into OSS-fuzz. 74*6dbdd20aSAndroid Build Coastguard Worker cflags += [ "-Weverything" ] 75*6dbdd20aSAndroid Build Coastguard Worker } 76*6dbdd20aSAndroid Build Coastguard Worker cflags += [ 77*6dbdd20aSAndroid Build Coastguard Worker "-Wno-c++98-compat-pedantic", 78*6dbdd20aSAndroid Build Coastguard Worker "-Wno-c++98-compat", 79*6dbdd20aSAndroid Build Coastguard Worker "-Wno-disabled-macro-expansion", 80*6dbdd20aSAndroid Build Coastguard Worker "-Wno-documentation-unknown-command", 81*6dbdd20aSAndroid Build Coastguard Worker "-Wno-gnu-include-next", 82*6dbdd20aSAndroid Build Coastguard Worker "-Wno-gnu-statement-expression", 83*6dbdd20aSAndroid Build Coastguard Worker "-Wno-gnu-zero-variadic-macro-arguments", 84*6dbdd20aSAndroid Build Coastguard Worker "-Wno-padded", 85*6dbdd20aSAndroid Build Coastguard Worker "-Wno-poison-system-directories", 86*6dbdd20aSAndroid Build Coastguard Worker "-Wno-pre-c11-compat", 87*6dbdd20aSAndroid Build Coastguard Worker "-Wno-reserved-id-macro", 88*6dbdd20aSAndroid Build Coastguard Worker "-Wno-reserved-identifier", 89*6dbdd20aSAndroid Build Coastguard Worker "-Wno-shadow-uncaptured-local", 90*6dbdd20aSAndroid Build Coastguard Worker "-Wno-unknown-sanitizers", 91*6dbdd20aSAndroid Build Coastguard Worker "-Wno-unknown-warning-option", 92*6dbdd20aSAndroid Build Coastguard Worker "-Wno-unsafe-buffer-usage", 93*6dbdd20aSAndroid Build Coastguard Worker 94*6dbdd20aSAndroid Build Coastguard Worker # TODO(primiano): -Wswitch-default could be useful but will require a mass 95*6dbdd20aSAndroid Build Coastguard Worker # codebase cleanup. 96*6dbdd20aSAndroid Build Coastguard Worker "-Wno-switch-default", 97*6dbdd20aSAndroid Build Coastguard Worker ] 98*6dbdd20aSAndroid Build Coastguard Worker 99*6dbdd20aSAndroid Build Coastguard Worker if (perfetto_thread_safety_annotations) { 100*6dbdd20aSAndroid Build Coastguard Worker cflags += [ 101*6dbdd20aSAndroid Build Coastguard Worker "-Wthread-safety", 102*6dbdd20aSAndroid Build Coastguard Worker "-Wno-thread-safety-negative", 103*6dbdd20aSAndroid Build Coastguard Worker ] 104*6dbdd20aSAndroid Build Coastguard Worker } 105*6dbdd20aSAndroid Build Coastguard Worker } else if (is_gcc) { 106*6dbdd20aSAndroid Build Coastguard Worker # Use return std::move(...) for compatibility with old GCC compilers. 107*6dbdd20aSAndroid Build Coastguard Worker cflags_cc = [ "-Wno-redundant-move" ] 108*6dbdd20aSAndroid Build Coastguard Worker 109*6dbdd20aSAndroid Build Coastguard Worker # Use after free detection in GCC is still not good enough: it still fails 110*6dbdd20aSAndroid Build Coastguard Worker # on very obvious false-positives in trace processor. 111*6dbdd20aSAndroid Build Coastguard Worker cflags_cc += [ "-Wno-use-after-free" ] 112*6dbdd20aSAndroid Build Coastguard Worker 113*6dbdd20aSAndroid Build Coastguard Worker # GCC 7's handling of uninitialized std::optional is flaky at best and 114*6dbdd20aSAndroid Build Coastguard Worker # causes many false positives. 115*6dbdd20aSAndroid Build Coastguard Worker # TODO(lalitm): remove this when we upgrade to a GCC version which is good 116*6dbdd20aSAndroid Build Coastguard Worker # enough to handle this. 117*6dbdd20aSAndroid Build Coastguard Worker cflags_cc += [ "-Wno-maybe-uninitialized" ] 118*6dbdd20aSAndroid Build Coastguard Worker 119*6dbdd20aSAndroid Build Coastguard Worker # GCC's handling of detecting infinite recursion is flaky at best and 120*6dbdd20aSAndroid Build Coastguard Worker # causes some false positives. 121*6dbdd20aSAndroid Build Coastguard Worker # TODO(lalitm): remove this when we upgrade to a GCC version which is good 122*6dbdd20aSAndroid Build Coastguard Worker # enough to handle this. 123*6dbdd20aSAndroid Build Coastguard Worker cflags_cc += [ "-Wno-infinite-recursion" ] 124*6dbdd20aSAndroid Build Coastguard Worker 125*6dbdd20aSAndroid Build Coastguard Worker # GCC's handling of detecting non null arguments is flaky at best and 126*6dbdd20aSAndroid Build Coastguard Worker # causes some false positives. 127*6dbdd20aSAndroid Build Coastguard Worker # TODO(lalitm): remove this when we upgrade to a GCC version which is good 128*6dbdd20aSAndroid Build Coastguard Worker # enough to handle this. 129*6dbdd20aSAndroid Build Coastguard Worker cflags_cc += [ "-Wno-nonnull" ] 130*6dbdd20aSAndroid Build Coastguard Worker } 131*6dbdd20aSAndroid Build Coastguard Worker} 132*6dbdd20aSAndroid Build Coastguard Worker 133*6dbdd20aSAndroid Build Coastguard Workerconfig("no_exceptions") { 134*6dbdd20aSAndroid Build Coastguard Worker # Exceptions are disabled by default on Windows (Use /EHsc to enable them). 135*6dbdd20aSAndroid Build Coastguard Worker if (!is_win) { 136*6dbdd20aSAndroid Build Coastguard Worker cflags_cc = [ "-fno-exceptions" ] 137*6dbdd20aSAndroid Build Coastguard Worker } 138*6dbdd20aSAndroid Build Coastguard Worker} 139*6dbdd20aSAndroid Build Coastguard Worker 140*6dbdd20aSAndroid Build Coastguard Workerconfig("no_rtti") { 141*6dbdd20aSAndroid Build Coastguard Worker if (is_win) { 142*6dbdd20aSAndroid Build Coastguard Worker cflags_cc = [ "/GR-" ] 143*6dbdd20aSAndroid Build Coastguard Worker } else { 144*6dbdd20aSAndroid Build Coastguard Worker cflags_cc = [ "-fno-rtti" ] 145*6dbdd20aSAndroid Build Coastguard Worker } 146*6dbdd20aSAndroid Build Coastguard Worker} 147*6dbdd20aSAndroid Build Coastguard Worker 148*6dbdd20aSAndroid Build Coastguard Worker# Used in buildtools dependencies for standalone builds. 149*6dbdd20aSAndroid Build Coastguard Workerconfig("c++17") { 150*6dbdd20aSAndroid Build Coastguard Worker if (is_win) { 151*6dbdd20aSAndroid Build Coastguard Worker cflags_cc = [ "/std:c++17" ] 152*6dbdd20aSAndroid Build Coastguard Worker } else { 153*6dbdd20aSAndroid Build Coastguard Worker cflags_cc = [ "-std=c++17" ] 154*6dbdd20aSAndroid Build Coastguard Worker } 155*6dbdd20aSAndroid Build Coastguard Worker} 156*6dbdd20aSAndroid Build Coastguard Worker 157*6dbdd20aSAndroid Build Coastguard Worker# Used in buildtools dependencies for standalone builds. 158*6dbdd20aSAndroid Build Coastguard Workerconfig("c++20") { 159*6dbdd20aSAndroid Build Coastguard Worker visibility = [ "//buildtools:libc++config" ] 160*6dbdd20aSAndroid Build Coastguard Worker if (is_win) { 161*6dbdd20aSAndroid Build Coastguard Worker cflags_cc = [ "/std:c++20" ] 162*6dbdd20aSAndroid Build Coastguard Worker } else { 163*6dbdd20aSAndroid Build Coastguard Worker cflags_cc = [ "-std=c++20" ] 164*6dbdd20aSAndroid Build Coastguard Worker } 165*6dbdd20aSAndroid Build Coastguard Worker} 166*6dbdd20aSAndroid Build Coastguard Worker 167*6dbdd20aSAndroid Build Coastguard Workerconfig("visibility_hidden") { 168*6dbdd20aSAndroid Build Coastguard Worker if (!is_win) { 169*6dbdd20aSAndroid Build Coastguard Worker cflags = [ "-fvisibility=hidden" ] 170*6dbdd20aSAndroid Build Coastguard Worker } 171*6dbdd20aSAndroid Build Coastguard Worker} 172*6dbdd20aSAndroid Build Coastguard Worker 173*6dbdd20aSAndroid Build Coastguard Workerconfig("win32_lean_and_mean") { 174*6dbdd20aSAndroid Build Coastguard Worker if (is_win) { 175*6dbdd20aSAndroid Build Coastguard Worker defines = [ "WIN32_LEAN_AND_MEAN" ] 176*6dbdd20aSAndroid Build Coastguard Worker } 177*6dbdd20aSAndroid Build Coastguard Worker} 178*6dbdd20aSAndroid Build Coastguard Worker 179*6dbdd20aSAndroid Build Coastguard Workerconfig("default") { 180*6dbdd20aSAndroid Build Coastguard Worker asmflags = [] 181*6dbdd20aSAndroid Build Coastguard Worker cflags = [] 182*6dbdd20aSAndroid Build Coastguard Worker cflags_c = [] 183*6dbdd20aSAndroid Build Coastguard Worker cflags_cc = [] 184*6dbdd20aSAndroid Build Coastguard Worker defines = [] 185*6dbdd20aSAndroid Build Coastguard Worker include_dirs = [] 186*6dbdd20aSAndroid Build Coastguard Worker ldflags = [] 187*6dbdd20aSAndroid Build Coastguard Worker libs = [] 188*6dbdd20aSAndroid Build Coastguard Worker 189*6dbdd20aSAndroid Build Coastguard Worker if ((is_android || is_linux) && !is_wasm) { 190*6dbdd20aSAndroid Build Coastguard Worker ldflags += [ 191*6dbdd20aSAndroid Build Coastguard Worker "-Wl,--build-id", 192*6dbdd20aSAndroid Build Coastguard Worker "-Wl,-z,max-page-size=16384", 193*6dbdd20aSAndroid Build Coastguard Worker ] 194*6dbdd20aSAndroid Build Coastguard Worker } 195*6dbdd20aSAndroid Build Coastguard Worker 196*6dbdd20aSAndroid Build Coastguard Worker if (is_clang || !is_win) { # Clang or GCC, but not MSVC. 197*6dbdd20aSAndroid Build Coastguard Worker cflags += [ 198*6dbdd20aSAndroid Build Coastguard Worker "-fstrict-aliasing", 199*6dbdd20aSAndroid Build Coastguard Worker "-Wformat", 200*6dbdd20aSAndroid Build Coastguard Worker ] 201*6dbdd20aSAndroid Build Coastguard Worker } 202*6dbdd20aSAndroid Build Coastguard Worker 203*6dbdd20aSAndroid Build Coastguard Worker if (is_clang && is_win) { 204*6dbdd20aSAndroid Build Coastguard Worker # clang-cl from version 16 does not like out-of-line definition of static 205*6dbdd20aSAndroid Build Coastguard Worker # constexpr, even in C++14 mode. Disable the deprecated warnings to work 206*6dbdd20aSAndroid Build Coastguard Worker # around the problem. 207*6dbdd20aSAndroid Build Coastguard Worker cflags += [ "-Wno-deprecated" ] 208*6dbdd20aSAndroid Build Coastguard Worker } 209*6dbdd20aSAndroid Build Coastguard Worker 210*6dbdd20aSAndroid Build Coastguard Worker if (is_win) { 211*6dbdd20aSAndroid Build Coastguard Worker cflags += [ 212*6dbdd20aSAndroid Build Coastguard Worker "/bigobj", # Some of our files are bigger than the regular limits. 213*6dbdd20aSAndroid Build Coastguard Worker "/Gy", # Enable function-level linking. 214*6dbdd20aSAndroid Build Coastguard Worker "/FS", # Preserve previous PDB behavior. 215*6dbdd20aSAndroid Build Coastguard Worker "/utf-8", # Assume UTF-8 by default to avoid code page dependencies. 216*6dbdd20aSAndroid Build Coastguard Worker "/Zc:__cplusplus", # Allow use of __cplusplus macro. 217*6dbdd20aSAndroid Build Coastguard Worker ] 218*6dbdd20aSAndroid Build Coastguard Worker defines += [ 219*6dbdd20aSAndroid Build Coastguard Worker "_CRT_NONSTDC_NO_WARNINGS", 220*6dbdd20aSAndroid Build Coastguard Worker "_CRT_SECURE_NO_DEPRECATE", 221*6dbdd20aSAndroid Build Coastguard Worker "_CRT_SECURE_NO_WARNINGS", # Disables warnings on some POSIX-compat API. 222*6dbdd20aSAndroid Build Coastguard Worker "_SCL_SECURE_NO_DEPRECATE", 223*6dbdd20aSAndroid Build Coastguard Worker "NOMINMAX", 224*6dbdd20aSAndroid Build Coastguard Worker ] 225*6dbdd20aSAndroid Build Coastguard Worker if (!use_custom_libcxx) { 226*6dbdd20aSAndroid Build Coastguard Worker defines += [ "_HAS_EXCEPTIONS=0" ] # Disables exceptions in MSVC STL. 227*6dbdd20aSAndroid Build Coastguard Worker } 228*6dbdd20aSAndroid Build Coastguard Worker } else if (!is_wasm) { # !is_win 229*6dbdd20aSAndroid Build Coastguard Worker cflags += [ 230*6dbdd20aSAndroid Build Coastguard Worker "-g", 231*6dbdd20aSAndroid Build Coastguard Worker "-fPIC", 232*6dbdd20aSAndroid Build Coastguard Worker "-fstack-protector-strong", 233*6dbdd20aSAndroid Build Coastguard Worker ] 234*6dbdd20aSAndroid Build Coastguard Worker } 235*6dbdd20aSAndroid Build Coastguard Worker 236*6dbdd20aSAndroid Build Coastguard Worker # Treat warnings as errors, but give up on fuzzer builds. 237*6dbdd20aSAndroid Build Coastguard Worker if (!is_fuzzer) { 238*6dbdd20aSAndroid Build Coastguard Worker if (is_win) { 239*6dbdd20aSAndroid Build Coastguard Worker cflags += [ "/WX" ] 240*6dbdd20aSAndroid Build Coastguard Worker } else { 241*6dbdd20aSAndroid Build Coastguard Worker cflags += [ "-Werror" ] 242*6dbdd20aSAndroid Build Coastguard Worker } 243*6dbdd20aSAndroid Build Coastguard Worker } 244*6dbdd20aSAndroid Build Coastguard Worker 245*6dbdd20aSAndroid Build Coastguard Worker if (is_clang) { 246*6dbdd20aSAndroid Build Coastguard Worker cflags += [ "-fcolor-diagnostics" ] 247*6dbdd20aSAndroid Build Coastguard Worker if (!is_win) { 248*6dbdd20aSAndroid Build Coastguard Worker cflags += [ "-fdiagnostics-show-template-tree" ] 249*6dbdd20aSAndroid Build Coastguard Worker } 250*6dbdd20aSAndroid Build Coastguard Worker } 251*6dbdd20aSAndroid Build Coastguard Worker 252*6dbdd20aSAndroid Build Coastguard Worker if (is_hermetic_clang && is_linux && !is_wasm) { 253*6dbdd20aSAndroid Build Coastguard Worker cflags += hermetic_clang_suppressions 254*6dbdd20aSAndroid Build Coastguard Worker } else { 255*6dbdd20aSAndroid Build Coastguard Worker not_needed([ "hermetic_clang_suppressions" ]) 256*6dbdd20aSAndroid Build Coastguard Worker } 257*6dbdd20aSAndroid Build Coastguard Worker 258*6dbdd20aSAndroid Build Coastguard Worker if (non_hermetic_clang_stdlib != "") { 259*6dbdd20aSAndroid Build Coastguard Worker if (is_clang && !is_hermetic_clang && !is_wasm) { 260*6dbdd20aSAndroid Build Coastguard Worker cflags_cc += [ "-stdlib=" + non_hermetic_clang_stdlib ] 261*6dbdd20aSAndroid Build Coastguard Worker ldflags += [ "-stdlib=" + non_hermetic_clang_stdlib ] 262*6dbdd20aSAndroid Build Coastguard Worker } 263*6dbdd20aSAndroid Build Coastguard Worker } 264*6dbdd20aSAndroid Build Coastguard Worker 265*6dbdd20aSAndroid Build Coastguard Worker if (is_lto) { 266*6dbdd20aSAndroid Build Coastguard Worker cflags += [ "-flto=full" ] 267*6dbdd20aSAndroid Build Coastguard Worker ldflags += [ "-flto=full" ] 268*6dbdd20aSAndroid Build Coastguard Worker } 269*6dbdd20aSAndroid Build Coastguard Worker 270*6dbdd20aSAndroid Build Coastguard Worker if (is_win) { 271*6dbdd20aSAndroid Build Coastguard Worker # We support only x86/x64 builds on Windows. 272*6dbdd20aSAndroid Build Coastguard Worker assert(current_cpu == "x64" || current_cpu == "x86") 273*6dbdd20aSAndroid Build Coastguard Worker } else if (current_cpu == "arm") { 274*6dbdd20aSAndroid Build Coastguard Worker cflags += [ 275*6dbdd20aSAndroid Build Coastguard Worker "-march=armv7-a", 276*6dbdd20aSAndroid Build Coastguard Worker "-mfpu=neon", 277*6dbdd20aSAndroid Build Coastguard Worker "-mthumb", 278*6dbdd20aSAndroid Build Coastguard Worker ] 279*6dbdd20aSAndroid Build Coastguard Worker } else if (current_cpu == "riscv64") { 280*6dbdd20aSAndroid Build Coastguard Worker if (!is_clang) { 281*6dbdd20aSAndroid Build Coastguard Worker # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=104338 282*6dbdd20aSAndroid Build Coastguard Worker libs += [ "atomic" ] 283*6dbdd20aSAndroid Build Coastguard Worker } 284*6dbdd20aSAndroid Build Coastguard Worker } else if (current_cpu == "x86") { 285*6dbdd20aSAndroid Build Coastguard Worker asmflags += [ "-m32" ] 286*6dbdd20aSAndroid Build Coastguard Worker cflags += [ 287*6dbdd20aSAndroid Build Coastguard Worker "-m32", 288*6dbdd20aSAndroid Build Coastguard Worker "-msse2", 289*6dbdd20aSAndroid Build Coastguard Worker "-mfpmath=sse", 290*6dbdd20aSAndroid Build Coastguard Worker ] 291*6dbdd20aSAndroid Build Coastguard Worker ldflags += [ "-m32" ] 292*6dbdd20aSAndroid Build Coastguard Worker } else if (current_cpu == "arm64") { 293*6dbdd20aSAndroid Build Coastguard Worker cflags += [ "-fno-omit-frame-pointer" ] 294*6dbdd20aSAndroid Build Coastguard Worker } else if (current_cpu == "x64") { 295*6dbdd20aSAndroid Build Coastguard Worker cflags += [ "-fno-omit-frame-pointer" ] # For perf profiling. 296*6dbdd20aSAndroid Build Coastguard Worker if (enable_perfetto_x64_cpu_opt) { 297*6dbdd20aSAndroid Build Coastguard Worker # When updating these flags, the CheckCpuOptimizations() in utils.cc must 298*6dbdd20aSAndroid Build Coastguard Worker # be updated accordingly. 299*6dbdd20aSAndroid Build Coastguard Worker cflags += [ 300*6dbdd20aSAndroid Build Coastguard Worker "-mbmi", 301*6dbdd20aSAndroid Build Coastguard Worker "-mbmi2", 302*6dbdd20aSAndroid Build Coastguard Worker "-mavx2", 303*6dbdd20aSAndroid Build Coastguard Worker "-mpopcnt", 304*6dbdd20aSAndroid Build Coastguard Worker "-msse4.2", 305*6dbdd20aSAndroid Build Coastguard Worker ] 306*6dbdd20aSAndroid Build Coastguard Worker } 307*6dbdd20aSAndroid Build Coastguard Worker } 308*6dbdd20aSAndroid Build Coastguard Worker 309*6dbdd20aSAndroid Build Coastguard Worker if (is_wasm) { 310*6dbdd20aSAndroid Build Coastguard Worker # As of writing (2023-06-12) WASM 128bit SIMD is supported on 311*6dbdd20aSAndroid Build Coastguard Worker # stable Chrome, Safari, and Firefox. See: 312*6dbdd20aSAndroid Build Coastguard Worker # - https://webassembly.org/roadmap/ 313*6dbdd20aSAndroid Build Coastguard Worker # - https://emscripten.org/docs/porting/simd.html 314*6dbdd20aSAndroid Build Coastguard Worker cflags += [ "-msimd128" ] 315*6dbdd20aSAndroid Build Coastguard Worker } 316*6dbdd20aSAndroid Build Coastguard Worker 317*6dbdd20aSAndroid Build Coastguard Worker if (is_linux) { 318*6dbdd20aSAndroid Build Coastguard Worker # Enable LFS (large file support) for stat() and other syscalls. 319*6dbdd20aSAndroid Build Coastguard Worker cflags += [ 320*6dbdd20aSAndroid Build Coastguard Worker "-D_FILE_OFFSET_BITS=64", 321*6dbdd20aSAndroid Build Coastguard Worker "-D_LARGEFILE_SOURCE", 322*6dbdd20aSAndroid Build Coastguard Worker "-D_LARGEFILE64_SOURCE", 323*6dbdd20aSAndroid Build Coastguard Worker ] 324*6dbdd20aSAndroid Build Coastguard Worker libs += [ 325*6dbdd20aSAndroid Build Coastguard Worker "pthread", 326*6dbdd20aSAndroid Build Coastguard Worker "rt", 327*6dbdd20aSAndroid Build Coastguard Worker ] 328*6dbdd20aSAndroid Build Coastguard Worker } 329*6dbdd20aSAndroid Build Coastguard Worker 330*6dbdd20aSAndroid Build Coastguard Worker if (is_win && !is_clang) { 331*6dbdd20aSAndroid Build Coastguard Worker # When using MSVC we need to manually pass the include dirs. clang-cl.exe 332*6dbdd20aSAndroid Build Coastguard Worker # doesn't need them because it's smart enough to figure out the right path 333*6dbdd20aSAndroid Build Coastguard Worker # by querying the registry on its own. 334*6dbdd20aSAndroid Build Coastguard Worker include_dirs = win_msvc_inc_dirs # Defined in msvc.gni. 335*6dbdd20aSAndroid Build Coastguard Worker } 336*6dbdd20aSAndroid Build Coastguard Worker 337*6dbdd20aSAndroid Build Coastguard Worker if (is_win) { 338*6dbdd20aSAndroid Build Coastguard Worker cflags += [ "/Zi" ] 339*6dbdd20aSAndroid Build Coastguard Worker } 340*6dbdd20aSAndroid Build Coastguard Worker if (is_debug) { 341*6dbdd20aSAndroid Build Coastguard Worker if (is_win) { 342*6dbdd20aSAndroid Build Coastguard Worker if (is_clang) { 343*6dbdd20aSAndroid Build Coastguard Worker # Required to see symbols in windbg when building with clang-cl.exe. 344*6dbdd20aSAndroid Build Coastguard Worker cflags += [ "-gcodeview-ghash" ] 345*6dbdd20aSAndroid Build Coastguard Worker ldflags = [ "/DEBUG:GHASH" ] 346*6dbdd20aSAndroid Build Coastguard Worker } 347*6dbdd20aSAndroid Build Coastguard Worker } else { 348*6dbdd20aSAndroid Build Coastguard Worker libs += [ "dl" ] 349*6dbdd20aSAndroid Build Coastguard Worker } 350*6dbdd20aSAndroid Build Coastguard Worker } 351*6dbdd20aSAndroid Build Coastguard Worker 352*6dbdd20aSAndroid Build Coastguard Worker if (is_android) { 353*6dbdd20aSAndroid Build Coastguard Worker asmflags += [ "--target=$android_abi_target" ] 354*6dbdd20aSAndroid Build Coastguard Worker cflags += [ 355*6dbdd20aSAndroid Build Coastguard Worker "--sysroot=$android_compile_sysroot", 356*6dbdd20aSAndroid Build Coastguard Worker "-DANDROID", 357*6dbdd20aSAndroid Build Coastguard Worker "-D__ANDROID_API__=${android_api_level}", 358*6dbdd20aSAndroid Build Coastguard Worker "--target=$android_abi_target", 359*6dbdd20aSAndroid Build Coastguard Worker ] 360*6dbdd20aSAndroid Build Coastguard Worker cflags_cc += [ "-isystem$android_compile_sysroot/c++/v1" ] 361*6dbdd20aSAndroid Build Coastguard Worker 362*6dbdd20aSAndroid Build Coastguard Worker android_lib_dir = "$android_compile_sysroot/usr/lib/$android_abi_target/$android_api_level" 363*6dbdd20aSAndroid Build Coastguard Worker ldflags += [ 364*6dbdd20aSAndroid Build Coastguard Worker "-Wl,-z,nocopyreloc", 365*6dbdd20aSAndroid Build Coastguard Worker "--sysroot=$android_compile_sysroot", 366*6dbdd20aSAndroid Build Coastguard Worker "-B${android_lib_dir}", 367*6dbdd20aSAndroid Build Coastguard Worker "--target=$android_abi_target", 368*6dbdd20aSAndroid Build Coastguard Worker "-Wl,--no-undefined", 369*6dbdd20aSAndroid Build Coastguard Worker "-Wl,-z,noexecstack", 370*6dbdd20aSAndroid Build Coastguard Worker "-Wl,-z,relro", 371*6dbdd20aSAndroid Build Coastguard Worker "-Wl,-z,now", 372*6dbdd20aSAndroid Build Coastguard Worker "-Wl,--warn-shared-textrel", 373*6dbdd20aSAndroid Build Coastguard Worker "-Wl,--fatal-warnings", 374*6dbdd20aSAndroid Build Coastguard Worker 375*6dbdd20aSAndroid Build Coastguard Worker # From NDK docs: "although the option uses the name "libstdc++" for 376*6dbdd20aSAndroid Build Coastguard Worker # historical reasons, this is correct for libc++ as well. 377*6dbdd20aSAndroid Build Coastguard Worker "-static-libstdc++", 378*6dbdd20aSAndroid Build Coastguard Worker ] 379*6dbdd20aSAndroid Build Coastguard Worker lib_dirs = [ android_lib_dir ] 380*6dbdd20aSAndroid Build Coastguard Worker } 381*6dbdd20aSAndroid Build Coastguard Worker} 382*6dbdd20aSAndroid Build Coastguard Worker 383*6dbdd20aSAndroid Build Coastguard Workerconfig("debug_noopt") { 384*6dbdd20aSAndroid Build Coastguard Worker cflags = [] 385*6dbdd20aSAndroid Build Coastguard Worker if (is_win) { 386*6dbdd20aSAndroid Build Coastguard Worker cflags = [ "/Od" ] 387*6dbdd20aSAndroid Build Coastguard Worker } else { 388*6dbdd20aSAndroid Build Coastguard Worker cflags = [ "-O0" ] 389*6dbdd20aSAndroid Build Coastguard Worker } 390*6dbdd20aSAndroid Build Coastguard Worker if (is_android || is_linux) { 391*6dbdd20aSAndroid Build Coastguard Worker cflags += [ "-funwind-tables" ] 392*6dbdd20aSAndroid Build Coastguard Worker } 393*6dbdd20aSAndroid Build Coastguard Worker} 394*6dbdd20aSAndroid Build Coastguard Worker 395*6dbdd20aSAndroid Build Coastguard Workerconfig("release") { 396*6dbdd20aSAndroid Build Coastguard Worker # Compiler flags for release builds. 397*6dbdd20aSAndroid Build Coastguard Worker if (is_win) { 398*6dbdd20aSAndroid Build Coastguard Worker cflags = [ 399*6dbdd20aSAndroid Build Coastguard Worker "/O2", 400*6dbdd20aSAndroid Build Coastguard Worker "/Zc:inline", 401*6dbdd20aSAndroid Build Coastguard Worker ] 402*6dbdd20aSAndroid Build Coastguard Worker } else if (is_android) { 403*6dbdd20aSAndroid Build Coastguard Worker cflags = [ "-O2" ] 404*6dbdd20aSAndroid Build Coastguard Worker } else if (is_fuzzer) { 405*6dbdd20aSAndroid Build Coastguard Worker cflags = [ "-O1" ] 406*6dbdd20aSAndroid Build Coastguard Worker } else { 407*6dbdd20aSAndroid Build Coastguard Worker cflags = [ "-O3" ] 408*6dbdd20aSAndroid Build Coastguard Worker } 409*6dbdd20aSAndroid Build Coastguard Worker if (!is_win) { 410*6dbdd20aSAndroid Build Coastguard Worker cflags += [ 411*6dbdd20aSAndroid Build Coastguard Worker "-fdata-sections", 412*6dbdd20aSAndroid Build Coastguard Worker "-ffunction-sections", 413*6dbdd20aSAndroid Build Coastguard Worker ] 414*6dbdd20aSAndroid Build Coastguard Worker } 415*6dbdd20aSAndroid Build Coastguard Worker 416*6dbdd20aSAndroid Build Coastguard Worker # Linker flags for release builds. 417*6dbdd20aSAndroid Build Coastguard Worker if (is_win) { 418*6dbdd20aSAndroid Build Coastguard Worker ldflags = [ 419*6dbdd20aSAndroid Build Coastguard Worker "/OPT:REF", 420*6dbdd20aSAndroid Build Coastguard Worker "/OPT:ICF", 421*6dbdd20aSAndroid Build Coastguard Worker "/INCREMENTAL:NO", 422*6dbdd20aSAndroid Build Coastguard Worker "/FIXED:NO", 423*6dbdd20aSAndroid Build Coastguard Worker ] 424*6dbdd20aSAndroid Build Coastguard Worker } else if (is_mac) { 425*6dbdd20aSAndroid Build Coastguard Worker ldflags = [ "-dead_strip" ] 426*6dbdd20aSAndroid Build Coastguard Worker } else if (!is_win && !is_wasm) { 427*6dbdd20aSAndroid Build Coastguard Worker ldflags = [ 428*6dbdd20aSAndroid Build Coastguard Worker "-Wl,--gc-sections", 429*6dbdd20aSAndroid Build Coastguard Worker "-Wl,--icf=all", 430*6dbdd20aSAndroid Build Coastguard Worker "-Wl,-O1", 431*6dbdd20aSAndroid Build Coastguard Worker ] 432*6dbdd20aSAndroid Build Coastguard Worker } 433*6dbdd20aSAndroid Build Coastguard Worker defines = [ "NDEBUG" ] 434*6dbdd20aSAndroid Build Coastguard Worker} 435*6dbdd20aSAndroid Build Coastguard Worker 436*6dbdd20aSAndroid Build Coastguard Workerconfig("shared_library") { 437*6dbdd20aSAndroid Build Coastguard Worker if (is_android || is_linux) { 438*6dbdd20aSAndroid Build Coastguard Worker ldflags = [ "-fPIC" ] 439*6dbdd20aSAndroid Build Coastguard Worker } 440*6dbdd20aSAndroid Build Coastguard Worker} 441*6dbdd20aSAndroid Build Coastguard Worker 442*6dbdd20aSAndroid Build Coastguard Workerconfig("executable") { 443*6dbdd20aSAndroid Build Coastguard Worker ldflags = [] 444*6dbdd20aSAndroid Build Coastguard Worker 445*6dbdd20aSAndroid Build Coastguard Worker # Android will refuse to run executables if they aren't position independent. 446*6dbdd20aSAndroid Build Coastguard Worker # Instead on Linux there isn't any need and they break ASan (goo.gl/paFR6K). 447*6dbdd20aSAndroid Build Coastguard Worker # The OSS-Fuzz provided AFL library is not PIC, so we we cannot use -fPIE 448*6dbdd20aSAndroid Build Coastguard Worker # for the fuzzer executables. 449*6dbdd20aSAndroid Build Coastguard Worker if ((is_android || is_linux) && !is_wasm && !is_fuzzer) { 450*6dbdd20aSAndroid Build Coastguard Worker asmflags = [ "-fPIE" ] 451*6dbdd20aSAndroid Build Coastguard Worker cflags = [ "-fPIE" ] 452*6dbdd20aSAndroid Build Coastguard Worker ldflags += [ "-pie" ] 453*6dbdd20aSAndroid Build Coastguard Worker } 454*6dbdd20aSAndroid Build Coastguard Worker 455*6dbdd20aSAndroid Build Coastguard Worker # -rpath stores the path to the linked shared libraries into the binary, so 456*6dbdd20aSAndroid Build Coastguard Worker # that they can be launched without passing any LD_LIBRARY_PATH. It's 457*6dbdd20aSAndroid Build Coastguard Worker # supported only by Linux, not Android. But concretely we need this only when 458*6dbdd20aSAndroid Build Coastguard Worker # use_custom_libcxx=true && custom_libcxx_is_static=false, which happens only 459*6dbdd20aSAndroid Build Coastguard Worker # on Linux right now. 460*6dbdd20aSAndroid Build Coastguard Worker if (is_linux && !is_wasm) { 461*6dbdd20aSAndroid Build Coastguard Worker ldflags += [ 462*6dbdd20aSAndroid Build Coastguard Worker "-Wl,-rpath=\$ORIGIN/.", 463*6dbdd20aSAndroid Build Coastguard Worker "-Wl,-rpath-link=.", 464*6dbdd20aSAndroid Build Coastguard Worker ] 465*6dbdd20aSAndroid Build Coastguard Worker } 466*6dbdd20aSAndroid Build Coastguard Worker} 467*6dbdd20aSAndroid Build Coastguard Worker 468*6dbdd20aSAndroid Build Coastguard Worker# This config is only added to certain leaf target types (see BUILDCONFIG.gn). 469*6dbdd20aSAndroid Build Coastguard Worker# This allows us to remove the config (and thus the dependency) on a per-target 470*6dbdd20aSAndroid Build Coastguard Worker# basis. If the config was applied to source_sets, then they would unavoidably 471*6dbdd20aSAndroid Build Coastguard Worker# carry the dependency onto liblog to the final target. 472*6dbdd20aSAndroid Build Coastguard Workerconfig("android_liblog") { 473*6dbdd20aSAndroid Build Coastguard Worker if (is_android) { 474*6dbdd20aSAndroid Build Coastguard Worker libs = [ "log" ] 475*6dbdd20aSAndroid Build Coastguard Worker } 476*6dbdd20aSAndroid Build Coastguard Worker} 477*6dbdd20aSAndroid Build Coastguard Worker 478*6dbdd20aSAndroid Build Coastguard Worker# Checks that tools/install-build-deps has been run since it last changed. 479*6dbdd20aSAndroid Build Coastguard Workerperfetto_check_build_deps("check_build_deps") { 480*6dbdd20aSAndroid Build Coastguard Worker args = [] 481*6dbdd20aSAndroid Build Coastguard Worker} 482*6dbdd20aSAndroid Build Coastguard Worker 483*6dbdd20aSAndroid Build Coastguard Workerperfetto_check_build_deps("check_build_deps_android") { 484*6dbdd20aSAndroid Build Coastguard Worker args = [ "--android" ] 485*6dbdd20aSAndroid Build Coastguard Worker} 486