| # 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" ] |
| } |
| } |