blob: df24b5f59ec982ec92a12748edd4e4d9440ed36a [file] [log] [blame]
# Copyright 2013 The Chromium Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
import("//build/buildflag_header.gni")
import("//build/config/pch.gni")
import("//build/config/rust.gni")
import("//build/toolchain/goma.gni")
import("clang.gni")
if (is_ios) {
import("//build/config/ios/config.gni") # For `target_environment`
}
config("find_bad_constructs") {
if (clang_use_chrome_plugins) {
cflags = []
# The plugin is built directly into clang, so there's no need to load it
# dynamically.
cflags += [
"-Xclang",
"-add-plugin",
"-Xclang",
"find-bad-constructs",
"-Xclang",
"-plugin-arg-find-bad-constructs",
"-Xclang",
"raw-ref-template-as-trivial-member",
"-Xclang",
"-plugin-arg-find-bad-constructs",
"-Xclang",
"check-stack-allocated",
# TODO(danakj): Delete this after the next clang roll.
"-Xclang",
"-plugin-arg-find-bad-constructs",
"-Xclang",
"check-allow-auto-typedefs-better-nested",
"-Xclang",
"-plugin-arg-find-bad-constructs",
"-Xclang",
"check-raw-ptr-to-stack-allocated",
"-Xclang",
"-plugin-arg-find-bad-constructs",
"-Xclang",
"disable-check-raw-ptr-to-stack-allocated-error",
# TODO(crbug.com/40944547): Remove when raw_ptr check has been
# enabled for the dawn repo.
"-Xclang",
"-plugin-arg-find-bad-constructs",
"-Xclang",
"raw-ptr-exclude-path=/third_party/dawn/",
]
if (is_linux || is_chromeos || is_android || is_fuchsia) {
cflags += [
"-Xclang",
"-plugin-arg-find-bad-constructs",
"-Xclang",
"check-ipc",
]
}
if (enable_check_raw_ptr_fields) {
cflags += [
"-Xclang",
"-plugin-arg-find-bad-constructs",
"-Xclang",
"check-raw-ptr-fields",
]
}
if (enable_check_raw_ref_fields) {
cflags += [
"-Xclang",
"-plugin-arg-find-bad-constructs",
"-Xclang",
"check-raw-ref-fields",
]
}
}
}
# A plugin for incrementally applying the -Wunsafe-buffer-usage warning.
#
# To use the plugin, the project must specify a path as
# `clang_unsafe_buffers_paths` in the `//.gn` file. This path points to a text
# file that controls where the warning is checked.
#
# See //build/config/unsafe_buffers_paths.txt for an example file, this it the
# file used by Chromium.
#
# This build configuration is not supported when `enable_precompiled_headers`
# is on because the pragmas that enable and disable unsafe-buffers warnings are
# not serialized to precompiled header files, and thus we get warnings that we
# should not.
config("unsafe_buffers") {
if (clang_use_chrome_plugins && clang_unsafe_buffers_paths != "" &&
!use_goma && !enable_precompiled_headers) {
cflags = [
"-DUNSAFE_BUFFERS_BUILD",
"-Xclang",
"-add-plugin",
"-Xclang",
"unsafe-buffers",
"-Xclang",
"-plugin-arg-unsafe-buffers",
"-Xclang",
rebase_path(clang_unsafe_buffers_paths, root_build_dir),
]
}
}
buildflag_header("unsafe_buffers_buildflags") {
header = "unsafe_buffers_buildflags.h"
flags = [ "UNSAFE_BUFFERS_WARNING_ENABLED=$clang_use_chrome_plugins" ]
}
# Enables some extra Clang-specific warnings. Some third-party code won't
# compile with these so may want to remove this config.
config("extra_warnings") {
cflags = [
"-Wheader-hygiene",
# Warns when a const char[] is converted to bool.
"-Wstring-conversion",
"-Wtautological-overlap-compare",
]
}
group("llvm-symbolizer_data") {
if (is_win) {
data = [ "$clang_base_path/bin/llvm-symbolizer.exe" ]
} else {
data = [ "$clang_base_path/bin/llvm-symbolizer" ]
}
}
template("clang_lib") {
if (!defined(invoker.libname)) {
not_needed(invoker, "*")
config(target_name) {
}
} else {
config(target_name) {
_dir = ""
_libname = invoker.libname
_prefix = "lib"
_suffix = ""
_ext = "a"
if (is_win) {
_dir = "windows"
_prefix = ""
_ext = "lib"
if (current_cpu == "x64") {
_suffix = "-x86_64"
} else if (current_cpu == "x86") {
_suffix = "-i386"
} else if (current_cpu == "arm64") {
_suffix = "-aarch64"
} else {
assert(false) # Unhandled cpu type
}
} else if (is_apple) {
_dir = "darwin"
} else if (is_linux || is_chromeos) {
if (current_cpu == "x64") {
_dir = "x86_64-unknown-linux-gnu"
} else if (current_cpu == "x86") {
_dir = "i386-unknown-linux-gnu"
} else if (current_cpu == "arm") {
_dir = "armv7-unknown-linux-gnueabihf"
} else if (current_cpu == "arm64") {
_dir = "aarch64-unknown-linux-gnu"
} else {
assert(false) # Unhandled cpu type
}
} else if (is_fuchsia) {
if (current_cpu == "x64") {
_dir = "x86_64-unknown-fuchsia"
} else if (current_cpu == "arm64") {
_dir = "aarch64-unknown-fuchsia"
} else {
assert(false) # Unhandled cpu type
}
} else if (is_android) {
_dir = "linux"
if (current_cpu == "x64") {
_suffix = "-x86_64-android"
} else if (current_cpu == "x86") {
_suffix = "-i686-android"
} else if (current_cpu == "arm") {
_suffix = "-arm-android"
} else if (current_cpu == "arm64") {
_suffix = "-aarch64-android"
} else if (current_cpu == "riscv64") {
_suffix = "-riscv64-android"
} else {
assert(false) # Unhandled cpu type
}
} else {
assert(false) # Unhandled target platform
}
_clang_lib_dir = "$clang_base_path/lib/clang/$clang_version/lib"
_lib_file = "${_prefix}clang_rt.${_libname}${_suffix}.${_ext}"
libs = [ "$_clang_lib_dir/$_dir/$_lib_file" ]
}
}
}
# Adds a dependency on the Clang runtime library clang_rt.builtins.
clang_lib("compiler_builtins") {
if (!toolchain_has_rust) {
# Since there's no Rust in the toolchain, there's no concern that we'll use
# the Rust stdlib's intrinsics here.
#
# Don't define libname which makes this target do nothing.
} else if (is_mac) {
libname = "osx"
} else if (is_ios) {
if (target_environment == "simulator") {
libname = "iossim"
} else if (target_environment == "catalyst") {
libname = "osx"
} else {
libname = "ios"
}
} else {
libname = "builtins"
}
}
# Adds a dependency on the Clang runtime library clang_rt.profile.
clang_lib("compiler_profile") {
if (!toolchain_has_rust) {
# This is only used when `toolchain_has_rust` to support Rust linking.
#
# Don't define libname which makes this target do nothing.
} else if (is_mac) {
libname = "profile_osx"
} else if (is_ios) {
if (target_environment == "simulator") {
libname = "profile_iossim"
} else if (target_environment == "catalyst") {
# We don't enable clang coverage on iOS device builds, and the library is
# not part of the Clang package tarball as a result.
#
# Don't define libname which makes this target do nothing.
} else {
# We don't enable clang coverage on iOS device builds, and the library is
# not part of the Clang package tarball as a result.
#
# Don't define libname which makes this target do nothing.
}
} else {
libname = "profile"
}
}