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