xref: /aosp_15_r20/external/cronet/build/nocompile.gni (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker# Copyright 2011 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 Worker# This file is meant to be included into an target to create a unittest that
6*6777b538SAndroid Build Coastguard Worker# invokes a set of no-compile tests.  A no-compile test is a test that asserts
7*6777b538SAndroid Build Coastguard Worker# a particular construct will not compile.
8*6777b538SAndroid Build Coastguard Worker#
9*6777b538SAndroid Build Coastguard Worker# Usage:
10*6777b538SAndroid Build Coastguard Worker#
11*6777b538SAndroid Build Coastguard Worker# 1. Create a GN target:
12*6777b538SAndroid Build Coastguard Worker#
13*6777b538SAndroid Build Coastguard Worker#    import("//build/nocompile.gni")
14*6777b538SAndroid Build Coastguard Worker#
15*6777b538SAndroid Build Coastguard Worker#    nocompile_source_set("base_nocompile_tests") {
16*6777b538SAndroid Build Coastguard Worker#      sources = [
17*6777b538SAndroid Build Coastguard Worker#        "functional/one_not_equal_two_nocompile.nc",
18*6777b538SAndroid Build Coastguard Worker#      ]
19*6777b538SAndroid Build Coastguard Worker#      deps = [
20*6777b538SAndroid Build Coastguard Worker#        ":base"
21*6777b538SAndroid Build Coastguard Worker#      ]
22*6777b538SAndroid Build Coastguard Worker#    }
23*6777b538SAndroid Build Coastguard Worker#
24*6777b538SAndroid Build Coastguard Worker#    Note that by convention, nocompile tests use the `.nc` extension rather
25*6777b538SAndroid Build Coastguard Worker#    than the standard `.cc` extension: this is because the expectation lines
26*6777b538SAndroid Build Coastguard Worker#    often exceed 80 characters, which would make clang-format unhappy.
27*6777b538SAndroid Build Coastguard Worker#
28*6777b538SAndroid Build Coastguard Worker# 2. Add a dep from a related test binary to the nocompile source set:
29*6777b538SAndroid Build Coastguard Worker#
30*6777b538SAndroid Build Coastguard Worker#    test("base_unittests") {
31*6777b538SAndroid Build Coastguard Worker#      ...
32*6777b538SAndroid Build Coastguard Worker#      deps += [ ":base_nocompile_tests" ]
33*6777b538SAndroid Build Coastguard Worker#    }
34*6777b538SAndroid Build Coastguard Worker#
35*6777b538SAndroid Build Coastguard Worker# 3. Populate the .nc file with test cases. Expected compile failures should be
36*6777b538SAndroid Build Coastguard Worker#    annotated with a comment of the form:
37*6777b538SAndroid Build Coastguard Worker#
38*6777b538SAndroid Build Coastguard Worker#    // expected-error {{<expected error string here>}}
39*6777b538SAndroid Build Coastguard Worker#
40*6777b538SAndroid Build Coastguard Worker#    For example:
41*6777b538SAndroid Build Coastguard Worker#
42*6777b538SAndroid Build Coastguard Worker#    void OneDoesNotEqualTwo() {
43*6777b538SAndroid Build Coastguard Worker#      static_assert(1 == 2);  // expected-error {{static assertion failed due to requirement '1 == 2'}}
44*6777b538SAndroid Build Coastguard Worker#    }
45*6777b538SAndroid Build Coastguard Worker#
46*6777b538SAndroid Build Coastguard Worker#    The verification logic is built as part of clang; full documentation is at
47*6777b538SAndroid Build Coastguard Worker#    https://clang.llvm.org/doxygen/classclang_1_1VerifyDiagnosticConsumer.html.
48*6777b538SAndroid Build Coastguard Worker#
49*6777b538SAndroid Build Coastguard Worker# Also see:
50*6777b538SAndroid Build Coastguard Worker#   http://dev.chromium.org/developers/testing/no-compile-tests
51*6777b538SAndroid Build Coastguard Worker#
52*6777b538SAndroid Build Coastguard Workerimport("//build/config/clang/clang.gni")
53*6777b538SAndroid Build Coastguard Workerif (is_win) {
54*6777b538SAndroid Build Coastguard Worker  import("//build/toolchain/win/win_toolchain_data.gni")
55*6777b538SAndroid Build Coastguard Worker}
56*6777b538SAndroid Build Coastguard Worker
57*6777b538SAndroid Build Coastguard Workerdeclare_args() {
58*6777b538SAndroid Build Coastguard Worker  enable_nocompile_tests = is_clang && !is_nacl
59*6777b538SAndroid Build Coastguard Worker}
60*6777b538SAndroid Build Coastguard Worker
61*6777b538SAndroid Build Coastguard Workerif (enable_nocompile_tests) {
62*6777b538SAndroid Build Coastguard Worker  template("nocompile_source_set") {
63*6777b538SAndroid Build Coastguard Worker    action_foreach(target_name) {
64*6777b538SAndroid Build Coastguard Worker      testonly = true
65*6777b538SAndroid Build Coastguard Worker
66*6777b538SAndroid Build Coastguard Worker      script = "//tools/nocompile/wrapper.py"
67*6777b538SAndroid Build Coastguard Worker      sources = invoker.sources
68*6777b538SAndroid Build Coastguard Worker      if (defined(invoker.deps)) {
69*6777b538SAndroid Build Coastguard Worker        deps = invoker.deps
70*6777b538SAndroid Build Coastguard Worker      }
71*6777b538SAndroid Build Coastguard Worker
72*6777b538SAndroid Build Coastguard Worker      # An action is not a compiler, so configs is empty until it is explicitly
73*6777b538SAndroid Build Coastguard Worker      # set.
74*6777b538SAndroid Build Coastguard Worker      configs = default_compiler_configs
75*6777b538SAndroid Build Coastguard Worker      if (defined(invoker.configs)) {
76*6777b538SAndroid Build Coastguard Worker        configs += invoker.configs
77*6777b538SAndroid Build Coastguard Worker      }
78*6777b538SAndroid Build Coastguard Worker
79*6777b538SAndroid Build Coastguard Worker      # Disable the checks that the Chrome style plugin normally enforces to
80*6777b538SAndroid Build Coastguard Worker      # reduce the amount of boilerplate needed in nocompile tests.
81*6777b538SAndroid Build Coastguard Worker      configs -= [ "//build/config/clang:find_bad_constructs" ]
82*6777b538SAndroid Build Coastguard Worker
83*6777b538SAndroid Build Coastguard Worker      if (is_win) {
84*6777b538SAndroid Build Coastguard Worker        result_path =
85*6777b538SAndroid Build Coastguard Worker            "$target_out_dir/$target_name/{{source_name_part}}_placeholder.obj"
86*6777b538SAndroid Build Coastguard Worker      } else {
87*6777b538SAndroid Build Coastguard Worker        result_path =
88*6777b538SAndroid Build Coastguard Worker            "$target_out_dir/$target_name/{{source_name_part}}_placeholder.o"
89*6777b538SAndroid Build Coastguard Worker      }
90*6777b538SAndroid Build Coastguard Worker      rebased_obj_path = rebase_path(result_path, root_build_dir)
91*6777b538SAndroid Build Coastguard Worker
92*6777b538SAndroid Build Coastguard Worker      depfile = "${result_path}.d"
93*6777b538SAndroid Build Coastguard Worker      rebased_depfile_path = rebase_path(depfile, root_build_dir)
94*6777b538SAndroid Build Coastguard Worker      outputs = [ result_path ]
95*6777b538SAndroid Build Coastguard Worker
96*6777b538SAndroid Build Coastguard Worker      if (is_win) {
97*6777b538SAndroid Build Coastguard Worker        if (host_os == "win") {
98*6777b538SAndroid Build Coastguard Worker          cxx = "clang-cl.exe"
99*6777b538SAndroid Build Coastguard Worker        } else {
100*6777b538SAndroid Build Coastguard Worker          cxx = "clang-cl"
101*6777b538SAndroid Build Coastguard Worker        }
102*6777b538SAndroid Build Coastguard Worker      } else {
103*6777b538SAndroid Build Coastguard Worker        cxx = "clang++"
104*6777b538SAndroid Build Coastguard Worker      }
105*6777b538SAndroid Build Coastguard Worker
106*6777b538SAndroid Build Coastguard Worker      args = []
107*6777b538SAndroid Build Coastguard Worker
108*6777b538SAndroid Build Coastguard Worker      if (is_win) {
109*6777b538SAndroid Build Coastguard Worker        # ninja normally parses /showIncludes output, but the depsformat
110*6777b538SAndroid Build Coastguard Worker        # variable can only be set in compiler tools, not for custom actions.
111*6777b538SAndroid Build Coastguard Worker        # Unfortunately, this means the clang wrapper needs to generate the
112*6777b538SAndroid Build Coastguard Worker        # depfile itself.
113*6777b538SAndroid Build Coastguard Worker        args += [ "--generate-depfile" ]
114*6777b538SAndroid Build Coastguard Worker      }
115*6777b538SAndroid Build Coastguard Worker
116*6777b538SAndroid Build Coastguard Worker      args += [
117*6777b538SAndroid Build Coastguard Worker        rebase_path("$clang_base_path/bin/$cxx", root_build_dir),
118*6777b538SAndroid Build Coastguard Worker        "{{source}}",
119*6777b538SAndroid Build Coastguard Worker        rebased_obj_path,
120*6777b538SAndroid Build Coastguard Worker        rebased_depfile_path,
121*6777b538SAndroid Build Coastguard Worker        "--",
122*6777b538SAndroid Build Coastguard Worker        "{{cflags}}",
123*6777b538SAndroid Build Coastguard Worker        "{{cflags_cc}}",
124*6777b538SAndroid Build Coastguard Worker        "{{defines}}",
125*6777b538SAndroid Build Coastguard Worker        "{{include_dirs}}",
126*6777b538SAndroid Build Coastguard Worker
127*6777b538SAndroid Build Coastguard Worker        # No need to generate an object file for nocompile tests.
128*6777b538SAndroid Build Coastguard Worker        "-Xclang",
129*6777b538SAndroid Build Coastguard Worker        "-fsyntax-only",
130*6777b538SAndroid Build Coastguard Worker
131*6777b538SAndroid Build Coastguard Worker        # Enable clang's VerifyDiagnosticConsumer:
132*6777b538SAndroid Build Coastguard Worker        # https://clang.llvm.org/doxygen/classclang_1_1VerifyDiagnosticConsumer.html
133*6777b538SAndroid Build Coastguard Worker        "-Xclang",
134*6777b538SAndroid Build Coastguard Worker        "-verify",
135*6777b538SAndroid Build Coastguard Worker
136*6777b538SAndroid Build Coastguard Worker        # But don't require expected-note comments since that is not the
137*6777b538SAndroid Build Coastguard Worker        # primary point of the nocompile tests.
138*6777b538SAndroid Build Coastguard Worker        "-Xclang",
139*6777b538SAndroid Build Coastguard Worker        "-verify-ignore-unexpected=note",
140*6777b538SAndroid Build Coastguard Worker
141*6777b538SAndroid Build Coastguard Worker        # Disable the error limit so that nocompile tests do not need to be
142*6777b538SAndroid Build Coastguard Worker        # arbitrarily split up when they hit the default error limit.
143*6777b538SAndroid Build Coastguard Worker        "-ferror-limit=0",
144*6777b538SAndroid Build Coastguard Worker
145*6777b538SAndroid Build Coastguard Worker        # So funny characters don't show up in error messages.
146*6777b538SAndroid Build Coastguard Worker        "-fno-color-diagnostics",
147*6777b538SAndroid Build Coastguard Worker
148*6777b538SAndroid Build Coastguard Worker        # Always treat warnings as errors.
149*6777b538SAndroid Build Coastguard Worker        "-Werror",
150*6777b538SAndroid Build Coastguard Worker      ]
151*6777b538SAndroid Build Coastguard Worker
152*6777b538SAndroid Build Coastguard Worker      if (!is_win) {
153*6777b538SAndroid Build Coastguard Worker        args += [
154*6777b538SAndroid Build Coastguard Worker          # On non-Windows platforms, clang can generate the depfile.
155*6777b538SAndroid Build Coastguard Worker          "-MMD",
156*6777b538SAndroid Build Coastguard Worker          "-MF",
157*6777b538SAndroid Build Coastguard Worker          rebased_depfile_path,
158*6777b538SAndroid Build Coastguard Worker          "-MT",
159*6777b538SAndroid Build Coastguard Worker          rebased_obj_path,
160*6777b538SAndroid Build Coastguard Worker
161*6777b538SAndroid Build Coastguard Worker          # Non-Windows clang uses file extensions to determine how to treat
162*6777b538SAndroid Build Coastguard Worker          # various inputs, so explicitly tell it to treat all inputs (even
163*6777b538SAndroid Build Coastguard Worker          # those with weird extensions like .nc) as C++ source files.
164*6777b538SAndroid Build Coastguard Worker          "-x",
165*6777b538SAndroid Build Coastguard Worker          "c++",
166*6777b538SAndroid Build Coastguard Worker        ]
167*6777b538SAndroid Build Coastguard Worker      } else {
168*6777b538SAndroid Build Coastguard Worker        # For some reason, the Windows includes are not part of the default
169*6777b538SAndroid Build Coastguard Worker        # compiler configs. Set it explicitly here, since things like libc++
170*6777b538SAndroid Build Coastguard Worker        # depend on the VC runtime.
171*6777b538SAndroid Build Coastguard Worker        if (target_cpu == "x86") {
172*6777b538SAndroid Build Coastguard Worker          win_toolchain_data = win_toolchain_data_x86
173*6777b538SAndroid Build Coastguard Worker        } else if (target_cpu == "x64") {
174*6777b538SAndroid Build Coastguard Worker          win_toolchain_data = win_toolchain_data_x64
175*6777b538SAndroid Build Coastguard Worker        } else if (target_cpu == "arm64") {
176*6777b538SAndroid Build Coastguard Worker          win_toolchain_data = win_toolchain_data_arm64
177*6777b538SAndroid Build Coastguard Worker        } else {
178*6777b538SAndroid Build Coastguard Worker          error("Unsupported target_cpu, add it to win_toolchain_data.gni")
179*6777b538SAndroid Build Coastguard Worker        }
180*6777b538SAndroid Build Coastguard Worker        args += win_toolchain_data.include_flags_imsvc_list
181*6777b538SAndroid Build Coastguard Worker        args += [ "/showIncludes:user" ]
182*6777b538SAndroid Build Coastguard Worker      }
183*6777b538SAndroid Build Coastguard Worker
184*6777b538SAndroid Build Coastguard Worker      # Note: for all platforms, the depfile only lists user includes, and not
185*6777b538SAndroid Build Coastguard Worker      # system includes. If system includes change, the compiler flags are
186*6777b538SAndroid Build Coastguard Worker      # expected to artificially change in some way to invalidate and force the
187*6777b538SAndroid Build Coastguard Worker      # nocompile tests to run again.
188*6777b538SAndroid Build Coastguard Worker    }
189*6777b538SAndroid Build Coastguard Worker  }
190*6777b538SAndroid Build Coastguard Worker}
191