xref: /aosp_15_r20/external/angle/build/config/clang/BUILD.gn (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1*8975f5c5SAndroid Build Coastguard Worker# Copyright 2013 The Chromium Authors
2*8975f5c5SAndroid Build Coastguard Worker# Use of this source code is governed by a BSD-style license that can be
3*8975f5c5SAndroid Build Coastguard Worker# found in the LICENSE file.
4*8975f5c5SAndroid Build Coastguard Worker
5*8975f5c5SAndroid Build Coastguard Workerimport("//build/config/pch.gni")
6*8975f5c5SAndroid Build Coastguard Workerimport("//build/config/rust.gni")
7*8975f5c5SAndroid Build Coastguard Workerimport("clang.gni")
8*8975f5c5SAndroid Build Coastguard Worker
9*8975f5c5SAndroid Build Coastguard Workerif (is_ios) {
10*8975f5c5SAndroid Build Coastguard Worker  import("//build/config/apple/mobile_config.gni")  # For `target_environment`
11*8975f5c5SAndroid Build Coastguard Worker}
12*8975f5c5SAndroid Build Coastguard Worker
13*8975f5c5SAndroid Build Coastguard Worker# Helper function for adding cflags to use a clang plugin.
14*8975f5c5SAndroid Build Coastguard Worker# - `plugin` is the name of the plugin.
15*8975f5c5SAndroid Build Coastguard Worker# - `plugin_arguments` is a list of arguments to pass to the plugin.
16*8975f5c5SAndroid Build Coastguard Workertemplate("clang_plugin") {
17*8975f5c5SAndroid Build Coastguard Worker  config(target_name) {
18*8975f5c5SAndroid Build Coastguard Worker    forward_variables_from(invoker,
19*8975f5c5SAndroid Build Coastguard Worker                           [
20*8975f5c5SAndroid Build Coastguard Worker                             "cflags",
21*8975f5c5SAndroid Build Coastguard Worker                             "configs",
22*8975f5c5SAndroid Build Coastguard Worker                           ])
23*8975f5c5SAndroid Build Coastguard Worker    if (!defined(cflags)) {
24*8975f5c5SAndroid Build Coastguard Worker      cflags = []
25*8975f5c5SAndroid Build Coastguard Worker    }
26*8975f5c5SAndroid Build Coastguard Worker
27*8975f5c5SAndroid Build Coastguard Worker    if (defined(invoker.plugin)) {
28*8975f5c5SAndroid Build Coastguard Worker      cflags += [
29*8975f5c5SAndroid Build Coastguard Worker        "-Xclang",
30*8975f5c5SAndroid Build Coastguard Worker        "-add-plugin",
31*8975f5c5SAndroid Build Coastguard Worker        "-Xclang",
32*8975f5c5SAndroid Build Coastguard Worker        invoker.plugin,
33*8975f5c5SAndroid Build Coastguard Worker      ]
34*8975f5c5SAndroid Build Coastguard Worker    }
35*8975f5c5SAndroid Build Coastguard Worker
36*8975f5c5SAndroid Build Coastguard Worker    if (defined(invoker.plugin_arguments)) {
37*8975f5c5SAndroid Build Coastguard Worker      foreach(flag, invoker.plugin_arguments) {
38*8975f5c5SAndroid Build Coastguard Worker        cflags += [
39*8975f5c5SAndroid Build Coastguard Worker          "-Xclang",
40*8975f5c5SAndroid Build Coastguard Worker          "-plugin-arg-${invoker.plugin}",
41*8975f5c5SAndroid Build Coastguard Worker          "-Xclang",
42*8975f5c5SAndroid Build Coastguard Worker          flag,
43*8975f5c5SAndroid Build Coastguard Worker        ]
44*8975f5c5SAndroid Build Coastguard Worker      }
45*8975f5c5SAndroid Build Coastguard Worker    }
46*8975f5c5SAndroid Build Coastguard Worker  }
47*8975f5c5SAndroid Build Coastguard Worker}
48*8975f5c5SAndroid Build Coastguard Worker
49*8975f5c5SAndroid Build Coastguard Workerclang_plugin("raw_ptr_check") {
50*8975f5c5SAndroid Build Coastguard Worker  if (clang_use_chrome_plugins || clang_use_raw_ptr_plugin) {
51*8975f5c5SAndroid Build Coastguard Worker    # The plugin is built directly into clang, so there's no need to load it
52*8975f5c5SAndroid Build Coastguard Worker    # dynamically.
53*8975f5c5SAndroid Build Coastguard Worker    plugin = "raw-ptr-plugin"
54*8975f5c5SAndroid Build Coastguard Worker    plugin_arguments = [
55*8975f5c5SAndroid Build Coastguard Worker      "check-raw-ptr-to-stack-allocated",
56*8975f5c5SAndroid Build Coastguard Worker      "disable-check-raw-ptr-to-stack-allocated-error",
57*8975f5c5SAndroid Build Coastguard Worker
58*8975f5c5SAndroid Build Coastguard Worker      # TODO(crbug.com/40944547): Remove when raw_ptr check has been enabled
59*8975f5c5SAndroid Build Coastguard Worker      # for the dawn repo.
60*8975f5c5SAndroid Build Coastguard Worker      "raw-ptr-exclude-path=" +
61*8975f5c5SAndroid Build Coastguard Worker          rebase_path("//third_party/dawn/", root_build_dir),
62*8975f5c5SAndroid Build Coastguard Worker    ]
63*8975f5c5SAndroid Build Coastguard Worker
64*8975f5c5SAndroid Build Coastguard Worker    if (enable_check_raw_ptr_fields) {
65*8975f5c5SAndroid Build Coastguard Worker      plugin_arguments += [
66*8975f5c5SAndroid Build Coastguard Worker        "check-raw-ptr-fields",
67*8975f5c5SAndroid Build Coastguard Worker        "check-span-fields",
68*8975f5c5SAndroid Build Coastguard Worker      ]
69*8975f5c5SAndroid Build Coastguard Worker    }
70*8975f5c5SAndroid Build Coastguard Worker
71*8975f5c5SAndroid Build Coastguard Worker    if (enable_check_raw_ref_fields) {
72*8975f5c5SAndroid Build Coastguard Worker      plugin_arguments += [ "check-raw-ref-fields" ]
73*8975f5c5SAndroid Build Coastguard Worker    }
74*8975f5c5SAndroid Build Coastguard Worker  }
75*8975f5c5SAndroid Build Coastguard Worker}
76*8975f5c5SAndroid Build Coastguard Worker
77*8975f5c5SAndroid Build Coastguard Workerclang_plugin("find_bad_constructs") {
78*8975f5c5SAndroid Build Coastguard Worker  if (clang_use_chrome_plugins) {
79*8975f5c5SAndroid Build Coastguard Worker    # The plugin is built directly into clang, so there's no need to load it
80*8975f5c5SAndroid Build Coastguard Worker    # dynamically.
81*8975f5c5SAndroid Build Coastguard Worker    plugin = "find-bad-constructs"
82*8975f5c5SAndroid Build Coastguard Worker    plugin_arguments = [
83*8975f5c5SAndroid Build Coastguard Worker      "span-ctor-from-string-literal",
84*8975f5c5SAndroid Build Coastguard Worker      "raw-ref-template-as-trivial-member",
85*8975f5c5SAndroid Build Coastguard Worker      "raw-span-template-as-trivial-member",
86*8975f5c5SAndroid Build Coastguard Worker      "check-stack-allocated",
87*8975f5c5SAndroid Build Coastguard Worker    ]
88*8975f5c5SAndroid Build Coastguard Worker
89*8975f5c5SAndroid Build Coastguard Worker    if (is_linux || is_chromeos || is_android || is_fuchsia) {
90*8975f5c5SAndroid Build Coastguard Worker      plugin_arguments += [ "check-ipc" ]
91*8975f5c5SAndroid Build Coastguard Worker    }
92*8975f5c5SAndroid Build Coastguard Worker
93*8975f5c5SAndroid Build Coastguard Worker    configs = [ ":raw_ptr_check" ]
94*8975f5c5SAndroid Build Coastguard Worker  }
95*8975f5c5SAndroid Build Coastguard Worker}
96*8975f5c5SAndroid Build Coastguard Worker
97*8975f5c5SAndroid Build Coastguard Worker# A plugin for incrementally applying the -Wunsafe-buffer-usage warning.
98*8975f5c5SAndroid Build Coastguard Worker#
99*8975f5c5SAndroid Build Coastguard Worker# To use the plugin, the project must specify a path as
100*8975f5c5SAndroid Build Coastguard Worker# `clang_unsafe_buffers_paths` in the `//.gn` file. This path points to a text
101*8975f5c5SAndroid Build Coastguard Worker# file that controls where the warning is checked.
102*8975f5c5SAndroid Build Coastguard Worker#
103*8975f5c5SAndroid Build Coastguard Worker# See //build/config/unsafe_buffers_paths.txt for an example file, this it the
104*8975f5c5SAndroid Build Coastguard Worker# file used by Chromium.
105*8975f5c5SAndroid Build Coastguard Worker#
106*8975f5c5SAndroid Build Coastguard Worker# This build configuration is not supported when `enable_precompiled_headers`
107*8975f5c5SAndroid Build Coastguard Worker# is on because the pragmas that enable and disable unsafe-buffers warnings are
108*8975f5c5SAndroid Build Coastguard Worker# not serialized to precompiled header files, and thus we get warnings that we
109*8975f5c5SAndroid Build Coastguard Worker# should not.
110*8975f5c5SAndroid Build Coastguard Workerclang_plugin("unsafe_buffers") {
111*8975f5c5SAndroid Build Coastguard Worker  if (clang_use_chrome_plugins && clang_unsafe_buffers_paths != "" &&
112*8975f5c5SAndroid Build Coastguard Worker      !enable_precompiled_headers) {
113*8975f5c5SAndroid Build Coastguard Worker    cflags = [ "-DUNSAFE_BUFFERS_BUILD" ]
114*8975f5c5SAndroid Build Coastguard Worker    plugin = "unsafe-buffers"
115*8975f5c5SAndroid Build Coastguard Worker    plugin_arguments =
116*8975f5c5SAndroid Build Coastguard Worker        [ rebase_path(clang_unsafe_buffers_paths, root_build_dir) ]
117*8975f5c5SAndroid Build Coastguard Worker  }
118*8975f5c5SAndroid Build Coastguard Worker}
119*8975f5c5SAndroid Build Coastguard Worker
120*8975f5c5SAndroid Build Coastguard Worker# Enables some extra Clang-specific warnings. Some third-party code won't
121*8975f5c5SAndroid Build Coastguard Worker# compile with these so may want to remove this config.
122*8975f5c5SAndroid Build Coastguard Workerconfig("extra_warnings") {
123*8975f5c5SAndroid Build Coastguard Worker  cflags = [
124*8975f5c5SAndroid Build Coastguard Worker    "-Wheader-hygiene",
125*8975f5c5SAndroid Build Coastguard Worker
126*8975f5c5SAndroid Build Coastguard Worker    # Warns when a const char[] is converted to bool.
127*8975f5c5SAndroid Build Coastguard Worker    "-Wstring-conversion",
128*8975f5c5SAndroid Build Coastguard Worker
129*8975f5c5SAndroid Build Coastguard Worker    "-Wtautological-overlap-compare",
130*8975f5c5SAndroid Build Coastguard Worker  ]
131*8975f5c5SAndroid Build Coastguard Worker}
132*8975f5c5SAndroid Build Coastguard Worker
133*8975f5c5SAndroid Build Coastguard Workergroup("llvm-symbolizer_data") {
134*8975f5c5SAndroid Build Coastguard Worker  if (is_win) {
135*8975f5c5SAndroid Build Coastguard Worker    data = [ "$clang_base_path/bin/llvm-symbolizer.exe" ]
136*8975f5c5SAndroid Build Coastguard Worker  } else {
137*8975f5c5SAndroid Build Coastguard Worker    data = [ "$clang_base_path/bin/llvm-symbolizer" ]
138*8975f5c5SAndroid Build Coastguard Worker  }
139*8975f5c5SAndroid Build Coastguard Worker}
140*8975f5c5SAndroid Build Coastguard Worker
141*8975f5c5SAndroid Build Coastguard Workertemplate("clang_lib") {
142*8975f5c5SAndroid Build Coastguard Worker  if (!defined(invoker.libname)) {
143*8975f5c5SAndroid Build Coastguard Worker    not_needed(invoker, "*")
144*8975f5c5SAndroid Build Coastguard Worker    config(target_name) {
145*8975f5c5SAndroid Build Coastguard Worker    }
146*8975f5c5SAndroid Build Coastguard Worker  } else {
147*8975f5c5SAndroid Build Coastguard Worker    config(target_name) {
148*8975f5c5SAndroid Build Coastguard Worker      _dir = ""
149*8975f5c5SAndroid Build Coastguard Worker      _libname = invoker.libname
150*8975f5c5SAndroid Build Coastguard Worker      _prefix = "lib"
151*8975f5c5SAndroid Build Coastguard Worker      _suffix = ""
152*8975f5c5SAndroid Build Coastguard Worker      _ext = "a"
153*8975f5c5SAndroid Build Coastguard Worker      if (is_win) {
154*8975f5c5SAndroid Build Coastguard Worker        _dir = "windows"
155*8975f5c5SAndroid Build Coastguard Worker        _prefix = ""
156*8975f5c5SAndroid Build Coastguard Worker        _ext = "lib"
157*8975f5c5SAndroid Build Coastguard Worker        if (current_cpu == "x64") {
158*8975f5c5SAndroid Build Coastguard Worker          _suffix = "-x86_64"
159*8975f5c5SAndroid Build Coastguard Worker        } else if (current_cpu == "x86") {
160*8975f5c5SAndroid Build Coastguard Worker          _suffix = "-i386"
161*8975f5c5SAndroid Build Coastguard Worker        } else if (current_cpu == "arm64") {
162*8975f5c5SAndroid Build Coastguard Worker          _suffix = "-aarch64"
163*8975f5c5SAndroid Build Coastguard Worker        } else {
164*8975f5c5SAndroid Build Coastguard Worker          assert(false)  # Unhandled cpu type
165*8975f5c5SAndroid Build Coastguard Worker        }
166*8975f5c5SAndroid Build Coastguard Worker      } else if (is_apple) {
167*8975f5c5SAndroid Build Coastguard Worker        _dir = "darwin"
168*8975f5c5SAndroid Build Coastguard Worker      } else if (is_linux || is_chromeos) {
169*8975f5c5SAndroid Build Coastguard Worker        if (current_cpu == "x64") {
170*8975f5c5SAndroid Build Coastguard Worker          _dir = "x86_64-unknown-linux-gnu"
171*8975f5c5SAndroid Build Coastguard Worker        } else if (current_cpu == "x86") {
172*8975f5c5SAndroid Build Coastguard Worker          _dir = "i386-unknown-linux-gnu"
173*8975f5c5SAndroid Build Coastguard Worker        } else if (current_cpu == "arm") {
174*8975f5c5SAndroid Build Coastguard Worker          _dir = "armv7-unknown-linux-gnueabihf"
175*8975f5c5SAndroid Build Coastguard Worker        } else if (current_cpu == "arm64") {
176*8975f5c5SAndroid Build Coastguard Worker          _dir = "aarch64-unknown-linux-gnu"
177*8975f5c5SAndroid Build Coastguard Worker        } else {
178*8975f5c5SAndroid Build Coastguard Worker          assert(false)  # Unhandled cpu type
179*8975f5c5SAndroid Build Coastguard Worker        }
180*8975f5c5SAndroid Build Coastguard Worker      } else if (is_fuchsia) {
181*8975f5c5SAndroid Build Coastguard Worker        if (current_cpu == "x64") {
182*8975f5c5SAndroid Build Coastguard Worker          _dir = "x86_64-unknown-fuchsia"
183*8975f5c5SAndroid Build Coastguard Worker        } else if (current_cpu == "arm64") {
184*8975f5c5SAndroid Build Coastguard Worker          _dir = "aarch64-unknown-fuchsia"
185*8975f5c5SAndroid Build Coastguard Worker        } else {
186*8975f5c5SAndroid Build Coastguard Worker          assert(false)  # Unhandled cpu type
187*8975f5c5SAndroid Build Coastguard Worker        }
188*8975f5c5SAndroid Build Coastguard Worker      } else if (is_android) {
189*8975f5c5SAndroid Build Coastguard Worker        _dir = "linux"
190*8975f5c5SAndroid Build Coastguard Worker        if (current_cpu == "x64") {
191*8975f5c5SAndroid Build Coastguard Worker          _suffix = "-x86_64-android"
192*8975f5c5SAndroid Build Coastguard Worker        } else if (current_cpu == "x86") {
193*8975f5c5SAndroid Build Coastguard Worker          _suffix = "-i686-android"
194*8975f5c5SAndroid Build Coastguard Worker        } else if (current_cpu == "arm") {
195*8975f5c5SAndroid Build Coastguard Worker          _suffix = "-arm-android"
196*8975f5c5SAndroid Build Coastguard Worker        } else if (current_cpu == "arm64") {
197*8975f5c5SAndroid Build Coastguard Worker          _suffix = "-aarch64-android"
198*8975f5c5SAndroid Build Coastguard Worker        } else if (current_cpu == "riscv64") {
199*8975f5c5SAndroid Build Coastguard Worker          _suffix = "-riscv64-android"
200*8975f5c5SAndroid Build Coastguard Worker        } else {
201*8975f5c5SAndroid Build Coastguard Worker          assert(false)  # Unhandled cpu type
202*8975f5c5SAndroid Build Coastguard Worker        }
203*8975f5c5SAndroid Build Coastguard Worker      } else {
204*8975f5c5SAndroid Build Coastguard Worker        assert(false)  # Unhandled target platform
205*8975f5c5SAndroid Build Coastguard Worker      }
206*8975f5c5SAndroid Build Coastguard Worker
207*8975f5c5SAndroid Build Coastguard Worker      _clang_lib_dir = "$clang_base_path/lib/clang/$clang_version/lib"
208*8975f5c5SAndroid Build Coastguard Worker      _lib_file = "${_prefix}clang_rt.${_libname}${_suffix}.${_ext}"
209*8975f5c5SAndroid Build Coastguard Worker      libs = [ "$_clang_lib_dir/$_dir/$_lib_file" ]
210*8975f5c5SAndroid Build Coastguard Worker    }
211*8975f5c5SAndroid Build Coastguard Worker  }
212*8975f5c5SAndroid Build Coastguard Worker}
213*8975f5c5SAndroid Build Coastguard Worker
214*8975f5c5SAndroid Build Coastguard Worker# Adds a dependency on the Clang runtime library clang_rt.builtins.
215*8975f5c5SAndroid Build Coastguard Workerclang_lib("compiler_builtins") {
216*8975f5c5SAndroid Build Coastguard Worker  if (is_mac) {
217*8975f5c5SAndroid Build Coastguard Worker    libname = "osx"
218*8975f5c5SAndroid Build Coastguard Worker  } else if (is_ios) {
219*8975f5c5SAndroid Build Coastguard Worker    if (target_environment == "simulator") {
220*8975f5c5SAndroid Build Coastguard Worker      libname = "iossim"
221*8975f5c5SAndroid Build Coastguard Worker    } else if (target_environment == "catalyst") {
222*8975f5c5SAndroid Build Coastguard Worker      libname = "osx"
223*8975f5c5SAndroid Build Coastguard Worker    } else {
224*8975f5c5SAndroid Build Coastguard Worker      libname = "ios"
225*8975f5c5SAndroid Build Coastguard Worker    }
226*8975f5c5SAndroid Build Coastguard Worker  } else {
227*8975f5c5SAndroid Build Coastguard Worker    libname = "builtins"
228*8975f5c5SAndroid Build Coastguard Worker  }
229*8975f5c5SAndroid Build Coastguard Worker}
230*8975f5c5SAndroid Build Coastguard Worker
231*8975f5c5SAndroid Build Coastguard Worker# Adds a dependency on the Clang runtime library clang_rt.profile.
232*8975f5c5SAndroid Build Coastguard Workerclang_lib("compiler_profile") {
233*8975f5c5SAndroid Build Coastguard Worker  if (!toolchain_has_rust) {
234*8975f5c5SAndroid Build Coastguard Worker    # This is only used when `toolchain_has_rust` to support Rust linking.
235*8975f5c5SAndroid Build Coastguard Worker    #
236*8975f5c5SAndroid Build Coastguard Worker    # Don't define libname which makes this target do nothing.
237*8975f5c5SAndroid Build Coastguard Worker  } else if (is_mac) {
238*8975f5c5SAndroid Build Coastguard Worker    libname = "profile_osx"
239*8975f5c5SAndroid Build Coastguard Worker  } else if (is_ios) {
240*8975f5c5SAndroid Build Coastguard Worker    if (target_environment == "simulator") {
241*8975f5c5SAndroid Build Coastguard Worker      libname = "profile_iossim"
242*8975f5c5SAndroid Build Coastguard Worker    } else if (target_environment == "catalyst") {
243*8975f5c5SAndroid Build Coastguard Worker      # We don't enable clang coverage on iOS device builds, and the library is
244*8975f5c5SAndroid Build Coastguard Worker      # not part of the Clang package tarball as a result.
245*8975f5c5SAndroid Build Coastguard Worker      #
246*8975f5c5SAndroid Build Coastguard Worker      # Don't define libname which makes this target do nothing.
247*8975f5c5SAndroid Build Coastguard Worker    } else {
248*8975f5c5SAndroid Build Coastguard Worker      # We don't enable clang coverage on iOS device builds, and the library is
249*8975f5c5SAndroid Build Coastguard Worker      # not part of the Clang package tarball as a result.
250*8975f5c5SAndroid Build Coastguard Worker      #
251*8975f5c5SAndroid Build Coastguard Worker      # Don't define libname which makes this target do nothing.
252*8975f5c5SAndroid Build Coastguard Worker    }
253*8975f5c5SAndroid Build Coastguard Worker  } else {
254*8975f5c5SAndroid Build Coastguard Worker    libname = "profile"
255*8975f5c5SAndroid Build Coastguard Worker  }
256*8975f5c5SAndroid Build Coastguard Worker}
257