| # Copyright 2020 The Pigweed Authors |
| # |
| # 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 |
| # |
| # https://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("//build_overrides/pigweed.gni") |
| |
| import("$dir_pw_build/defaults.gni") |
| import("$dir_pw_toolchain/clang_tools.gni") |
| |
| declare_args() { |
| # Sets the sanitizer to pass to clang. Valid values are "address", "memory", |
| # "thread", "undefined", "undefined_heuristic". |
| pw_toolchain_SANITIZERS = [] |
| |
| # Indicates if this toolchain supports generating coverage reports from |
| # pw_test targets. |
| # |
| # For example, the static analysis toolchains that run `clang-tidy` instead |
| # of the test binary itself cannot generate coverage reports. |
| # |
| # This is typically set by individual toolchains and not by GN args. |
| pw_toolchain_COVERAGE_ENABLED = false |
| |
| # List of source files to selectively collect coverage. |
| pw_toolchain_PROFILE_SOURCE_FILES = [] |
| |
| # Indicates if this toolchain supports building fuzzers. This is typically |
| # set by individual toolchains and not by GN args. |
| pw_toolchain_FUZZING_ENABLED = false |
| |
| # Indicates if this build is a part of OSS-Fuzz, which needs to be able to |
| # provide its own compiler and flags. This violates the build hermeticisim and |
| # should only be used for OSS-Fuzz. |
| pw_toolchain_OSS_FUZZ_ENABLED = false |
| } |
| |
| # Specifies the tools used by host Clang toolchains. |
| _host_clang_toolchain = { |
| forward_variables_from(pw_toolchain_clang_tools, "*") |
| is_host_toolchain = true |
| static_analysis = { |
| # Enable static analysis for host clang based toolchains. |
| enabled = true |
| } |
| } |
| |
| # Common default scope shared by all host Clang toolchains. |
| _defaults = { |
| # TODO: b/234888755 - amend toolchain declaration process to |
| # remove this hack. |
| default_configs = [] |
| default_configs = pigweed_default_configs + [ |
| "$dir_pw_build:extra_debugging", |
| "$dir_pw_toolchain/host_clang:no_system_libcpp", |
| "$dir_pw_toolchain/host_clang:xcode_sysroot", |
| "$dir_pw_toolchain/host_clang:no_ms_compatibility", |
| ] |
| |
| # OSS-Fuzz uses -stdlib=libc++, which isn't included in the CIPD-provided |
| # Linux sysroot (it instead provides libstdc++). |
| if (!pw_toolchain_OSS_FUZZ_ENABLED) { |
| default_configs += [ "$dir_pw_toolchain/host_clang:linux_sysroot" ] |
| } |
| |
| pw_build_LINK_DEPS = [ dir_pw_libc ] |
| } |
| |
| pw_toolchain_host_clang = { |
| debug = { |
| name = "host_clang_debug" |
| forward_variables_from(_host_clang_toolchain, "*") |
| defaults = { |
| forward_variables_from(_defaults, "*") |
| default_configs += [ "$dir_pw_build:optimize_debugging" ] |
| foreach(sanitizer, pw_toolchain_SANITIZERS) { |
| default_configs += |
| [ "$dir_pw_toolchain/host_clang:sanitize_$sanitizer" ] |
| } |
| } |
| } |
| |
| speed_optimized = { |
| name = "host_clang_speed_optimized" |
| forward_variables_from(_host_clang_toolchain, "*") |
| defaults = { |
| forward_variables_from(_defaults, "*") |
| default_configs += [ "$dir_pw_build:optimize_speed" ] |
| foreach(sanitizer, pw_toolchain_SANITIZERS) { |
| default_configs += |
| [ "$dir_pw_toolchain/host_clang:sanitize_$sanitizer" ] |
| } |
| } |
| } |
| |
| size_optimized = { |
| name = "host_clang_size_optimized" |
| forward_variables_from(_host_clang_toolchain, "*") |
| defaults = { |
| forward_variables_from(_defaults, "*") |
| default_configs += [ "$dir_pw_build:optimize_size_clang" ] |
| foreach(sanitizer, pw_toolchain_SANITIZERS) { |
| default_configs += |
| [ "$dir_pw_toolchain/host_clang:sanitize_$sanitizer" ] |
| } |
| } |
| } |
| |
| fuzz = { |
| name = "host_clang_fuzz" |
| cc = "" |
| cxx = "" |
| forward_variables_from(_host_clang_toolchain, |
| "*", |
| [ |
| "cc", |
| "cxx", |
| ]) |
| |
| # OSS-Fuzz sets compiler paths. See |
| # google.github.io/oss-fuzz/getting-started/new-project-guide/#Requirements. |
| if (pw_toolchain_OSS_FUZZ_ENABLED) { |
| cc = getenv("CC") |
| cxx = getenv("CXX") |
| } |
| if (cc == "") { |
| cc = _host_clang_toolchain.cc |
| } |
| if (cxx == "") { |
| cxx = _host_clang_toolchain.cxx |
| } |
| defaults = { |
| forward_variables_from(_defaults, "*") |
| |
| pw_toolchain_FUZZING_ENABLED = true |
| if (pw_toolchain_OSS_FUZZ_ENABLED) { |
| default_configs += [ "$dir_pw_fuzzer:oss_fuzz_instrumentation" ] |
| } else { |
| default_configs += [ "$dir_pw_fuzzer:instrumentation" ] |
| } |
| |
| # Fuzz faster. |
| default_configs += [ "$dir_pw_build:optimize_speed" ] |
| |
| # Default to ASan for fuzzing, which is what we typically care about. |
| if (pw_toolchain_SANITIZERS == []) { |
| pw_toolchain_SANITIZERS = [ "address" ] |
| } |
| foreach(sanitizer, pw_toolchain_SANITIZERS) { |
| default_configs += |
| [ "$dir_pw_toolchain/host_clang:sanitize_$sanitizer" ] |
| } |
| } |
| } |
| |
| asan = { |
| name = "host_clang_asan" |
| forward_variables_from(_host_clang_toolchain, "*") |
| defaults = { |
| forward_variables_from(_defaults, "*") |
| |
| # Use debug mode to get proper debug information. |
| default_configs += [ "$dir_pw_build:optimize_debugging" ] |
| default_configs += [ "$dir_pw_toolchain/host_clang:sanitize_address" ] |
| } |
| } |
| |
| ubsan = { |
| name = "host_clang_ubsan" |
| forward_variables_from(_host_clang_toolchain, "*") |
| defaults = { |
| forward_variables_from(_defaults, "*") |
| |
| # Use debug mode to get proper debug information. |
| default_configs += [ "$dir_pw_build:optimize_debugging" ] |
| default_configs += [ "$dir_pw_toolchain/host_clang:sanitize_undefined" ] |
| } |
| } |
| |
| ubsan_heuristic = { |
| name = "host_clang_ubsan_heuristic" |
| forward_variables_from(_host_clang_toolchain, "*") |
| defaults = { |
| forward_variables_from(_defaults, "*") |
| |
| # Use debug mode to get proper debug information. |
| default_configs += [ "$dir_pw_build:optimize_debugging" ] |
| default_configs += |
| [ "$dir_pw_toolchain/host_clang:sanitize_undefined_heuristic" ] |
| } |
| } |
| |
| msan = { |
| name = "host_clang_msan" |
| forward_variables_from(_host_clang_toolchain, "*") |
| defaults = { |
| forward_variables_from(_defaults, "*") |
| |
| # Use debug mode to get proper debug information. |
| default_configs += [ "$dir_pw_build:optimize_debugging" ] |
| default_configs += [ "$dir_pw_toolchain/host_clang:sanitize_memory" ] |
| } |
| } |
| |
| tsan = { |
| name = "host_clang_tsan" |
| forward_variables_from(_host_clang_toolchain, "*") |
| defaults = { |
| forward_variables_from(_defaults, "*") |
| |
| # Use debug mode to get proper debug information. |
| default_configs += [ "$dir_pw_build:optimize_debugging" ] |
| default_configs += [ "$dir_pw_toolchain/host_clang:sanitize_thread" ] |
| } |
| } |
| |
| coverage = { |
| name = "host_clang_coverage" |
| forward_variables_from(_host_clang_toolchain, "*") |
| defaults = { |
| forward_variables_from(_defaults, "*") |
| |
| # Use debug mode to get proper debug information. |
| default_configs += [ "$dir_pw_build:optimize_debugging" ] |
| default_configs += [ "$dir_pw_toolchain/host_clang:coverage" ] |
| |
| # Enable PW toolchain arguments for coverage. This will only apply to |
| # binaries built using this toolchain. |
| pw_toolchain_COVERAGE_ENABLED = true |
| } |
| } |
| } |
| |
| # Describes host clang toolchains. |
| pw_toolchain_host_clang_list = [ |
| pw_toolchain_host_clang.debug, |
| pw_toolchain_host_clang.speed_optimized, |
| pw_toolchain_host_clang.size_optimized, |
| pw_toolchain_host_clang.fuzz, |
| pw_toolchain_host_clang.asan, |
| pw_toolchain_host_clang.ubsan, |
| pw_toolchain_host_clang.ubsan_heuristic, |
| pw_toolchain_host_clang.msan, |
| pw_toolchain_host_clang.tsan, |
| pw_toolchain_host_clang.coverage, |
| ] |