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