xref: /llvm-project/llvm/utils/gn/secondary/clang/test/BUILD.gn (revision decf88d3e962ae78d65997e14be52ea6537ea98a)
1import("//clang/lib/ARCMigrate/enable.gni")
2import("//clang/lib/StaticAnalyzer/Frontend/enable.gni")
3import("//llvm/include/llvm/Config/config.gni")
4import("//llvm/lib/Target/targets.gni")
5import("//llvm/triples.gni")
6import("//llvm/utils/gn/build/libs/pthread/enable.gni")
7import("//llvm/utils/gn/build/libs/zlib/enable.gni")
8import("//llvm/utils/gn/build/libs/zstd/enable.gni")
9import("//llvm/utils/gn/build/write_cmake_config.gni")
10import("//llvm/utils/llvm-lit/lit_path_function.gni")
11import("//llvm/version.gni")
12import("clang_lit_site_cfg_files.gni")
13
14template("write_lit_config") {
15  write_cmake_config(target_name) {
16    input = invoker.input
17    output = invoker.output
18    dir = get_path_info(output, "dir")
19    values = [
20      "LIT_SITE_CFG_IN_HEADER=" +
21          "## Autogenerated from $input, do not edit\n\n" + lit_path_function,
22      "CLANG_BINARY_DIR=" +
23          rebase_path(get_label_info("//clang", "target_out_dir"), dir),
24      "CLANG_SOURCE_DIR=" + rebase_path("//clang", dir),
25      "LLVM_BINARY_DIR=" +
26          rebase_path(get_label_info("//llvm", "target_out_dir"), dir),
27      "LLVM_LIBS_DIR=",  # needed only for shared builds
28      "LLVM_SOURCE_DIR=" + rebase_path("//llvm", dir),
29      "LLVM_TOOLS_DIR=" + rebase_path("$root_out_dir/bin", dir),
30      "LLVM_TARGET_TRIPLE=$llvm_target_triple",
31    ]
32    if (host_os == "win") {
33      # See comment for Windows solink in llvm/utils/gn/build/toolchain/BUILD.gn
34      values += [ "SHLIBDIR=" + rebase_path("$root_out_dir/bin", dir) ]
35    } else {
36      values += [ "SHLIBDIR=" + rebase_path("$root_out_dir/lib", dir) ]
37    }
38    values += invoker.extra_values
39  }
40}
41
42write_lit_config("lit_site_cfg") {
43  # Fully-qualified instead of relative for LIT_SITE_CFG_IN_HEADER.
44  input = "//clang/test/lit.site.cfg.py.in"
45  output = clang_lit_site_cfg_file
46  dir = get_path_info(output, "dir")
47  extra_values = [
48    "LLVM_WITH_Z3=0",
49    "CLANG_BUILD_EXAMPLES=0",
50    "CLANG_BUILT_STANDALONE=0",
51    "CLANG_DEFAULT_CXX_STDLIB=",  # Empty string means "default value" here.
52    "CLANG_DEFAULT_PIE_ON_LINUX=0",
53    "CLANG_ENABLE_CIR=0",
54    "CLANG_PLUGIN_SUPPORT=0",  # FIXME: Analysis/plugins need global -fPIC
55    "CURRENT_TOOLS_DIR=" + rebase_path("$root_out_dir/bin", dir),
56    "CLANG_VENDOR_UTI=org.llvm.clang",
57
58    # This is only used if LLVM_USE_SANITIZER includes lsan and the host
59    # OS is macOS. Since the GN build currently never uses LLVM_USE_SANITIZER,
60    # this is never read.  If it's ever needed,
61    # utils/gn/build/toolchain/BUILD.gn should get the compiler from a variable
62    # that's also read here -- but that should happen after multi-toolchain
63    # builds exist, to make sure it's a toolchain var.
64    "CMAKE_CXX_COMPILER=c++",
65    "CMAKE_C_COMPILER=cc",
66    "ENABLE_BACKTRACES=1",
67    "ENABLE_SHARED=0",
68    "LLVM_EXTERNAL_LIT=",
69    "LLVM_HOST_TRIPLE=$llvm_current_triple",
70    "LLVM_LIT_TOOLS_DIR=",  # Intentionally empty, matches cmake build.
71    "LLVM_TOOL_LLVM_DRIVER_BUILD=0",  # FIXME: Add actual support for this.
72    "LLVM_USE_SANITIZER=",
73    "LLVM_VERSION_MAJOR=$llvm_version_major",
74    "Python3_EXECUTABLE=$python_path",
75    "USE_Z3_SOLVER=",
76    "PPC_LINUX_DEFAULT_IEEELONGDOUBLE=0",
77  ]
78
79  if (clang_enable_arcmt) {
80    extra_values += [ "CLANG_ENABLE_ARCMT=1" ]
81  } else {
82    extra_values += [ "CLANG_ENABLE_ARCMT=0" ]
83  }
84
85  if (clang_enable_static_analyzer) {
86    extra_values += [ "CLANG_ENABLE_STATIC_ANALYZER=1" ]
87  } else {
88    extra_values += [ "CLANG_ENABLE_STATIC_ANALYZER=0" ]
89  }
90
91  if (llvm_enable_zlib) {
92    extra_values += [ "LLVM_ENABLE_ZLIB=1" ]
93  } else {
94    extra_values += [ "LLVM_ENABLE_ZLIB=0" ]  # Must be 0.
95  }
96
97  if (llvm_enable_zstd) {
98    extra_values += [ "LLVM_ENABLE_ZSTD=1" ]
99  } else {
100    extra_values += [ "LLVM_ENABLE_ZSTD=0" ]  # Must be 0.
101  }
102
103  if (host_cpu == "x64") {
104    extra_values += [ "HOST_ARCH=x86_64" ]
105  } else if (host_cpu == "arm64") {
106    extra_values += [ "HOST_ARCH=arm64" ]
107  } else if (host_cpu == "ppc64") {
108    extra_values += [ "HOST_ARCH=powerpc64le" ]
109  } else {
110    assert(false, "unimplemented host_cpu " + host_cpu)
111  }
112
113  if (host_os == "mac") {
114    extra_values += [ "LLVM_PLUGIN_EXT=.dylib" ]
115  } else if (host_os == "win") {
116    extra_values += [ "LLVM_PLUGIN_EXT=.dll" ]
117  } else {
118    extra_values += [ "LLVM_PLUGIN_EXT=.so" ]
119  }
120
121  if (host_os == "win") {
122    extra_values += [
123      # See comment for Windows solink in llvm/utils/gn/build/toolchain/BUILD.gn
124      "CMAKE_LIBRARY_OUTPUT_DIRECTORY=" + rebase_path("$root_out_dir/bin", dir),
125      "LLVM_LIT_ERRC_MESSAGES=no such file or directory;is a directory;" +
126          "invalid argument;permission denied",
127      "PERL_EXECUTABLE=",
128    ]
129  } else {
130    extra_values += [
131      "CMAKE_LIBRARY_OUTPUT_DIRECTORY=" + rebase_path("$root_out_dir/lib", dir),
132      "LLVM_LIT_ERRC_MESSAGES=",
133      "PERL_EXECUTABLE=/usr/bin/perl",
134    ]
135  }
136
137  if (llvm_enable_reverse_iteration) {
138    extra_values += [ "LLVM_ENABLE_REVERSE_ITERATION=1" ]
139  } else {
140    extra_values += [ "LLVM_ENABLE_REVERSE_ITERATION=0" ]  # Must be 0.
141  }
142
143  if (llvm_enable_threads) {
144    extra_values += [ "LLVM_ENABLE_THREADS=1" ]
145  } else {
146    extra_values += [ "LLVM_ENABLE_THREADS=0" ]  # Must be 0.
147  }
148}
149
150write_lit_config("lit_unit_site_cfg") {
151  # Fully-qualified instead of relative for LIT_SITE_CFG_IN_HEADER.
152  input = "//clang/test/Unit/lit.site.cfg.py.in"
153  output = clang_lit_unit_site_cfg_file
154  extra_values = [ "LLVM_BUILD_MODE=." ]
155}
156
157# This target should contain all dependencies of check-clang.
158# //:default depends on it, so that ninja's default target builds all
159# prerequisites for check-clang but doesn't run check-clang itself.
160group("test") {
161  deps = [
162    ":lit_site_cfg",
163    ":lit_unit_site_cfg",
164    "//clang/lib/Headers",
165    "//clang/tools/apinotes-test",
166    "//clang/tools/c-index-test",
167    "//clang/tools/clang-diff",
168    "//clang/tools/clang-format",
169    "//clang/tools/clang-fuzzer/dictionary:clang-fuzzer-dictionary",
170    "//clang/tools/clang-import-test",
171    "//clang/tools/clang-installapi",
172    "//clang/tools/clang-offload-bundler",
173    "//clang/tools/clang-refactor",
174    "//clang/tools/clang-repl",
175    "//clang/tools/clang-scan-deps",
176    "//clang/tools/clang-sycl-linker",
177    "//clang/tools/diagtool",
178    "//clang/tools/driver:symlinks",
179    "//clang/unittests",
180    "//clang/utils/TableGen:clang-tblgen",
181    "//clang/utils/hmaptool",
182    "//llvm/tools/llc",
183    "//llvm/tools/llvm-ar:symlinks",
184    "//llvm/tools/llvm-as",
185    "//llvm/tools/llvm-bcanalyzer",
186    "//llvm/tools/llvm-cat",
187    "//llvm/tools/llvm-config",
188    "//llvm/tools/llvm-cxxfilt",
189    "//llvm/tools/llvm-dis",
190    "//llvm/tools/llvm-dwarfdump",
191    "//llvm/tools/llvm-ifs",
192    "//llvm/tools/llvm-lto",
193    "//llvm/tools/llvm-lto2",
194    "//llvm/tools/llvm-modextract",
195    "//llvm/tools/llvm-nm:symlinks",
196    "//llvm/tools/llvm-objcopy:symlinks",
197    "//llvm/tools/llvm-objdump:symlinks",
198    "//llvm/tools/llvm-pdbutil",
199    "//llvm/tools/llvm-profdata",
200    "//llvm/tools/llvm-rc:symlinks",
201    "//llvm/tools/llvm-readobj:symlinks",
202    "//llvm/tools/llvm-readtapi:symlinks",
203    "//llvm/tools/llvm-symbolizer:symlinks",
204    "//llvm/tools/obj2yaml",
205    "//llvm/tools/opt",
206    "//llvm/tools/yaml2obj",
207    "//llvm/utils/FileCheck",
208    "//llvm/utils/count",
209    "//llvm/utils/llvm-lit",
210    "//llvm/utils/not",
211    "//llvm/utils/split-file",
212  ]
213  if (clang_enable_arcmt) {
214    deps += [
215      "//clang/tools/arcmt-test",
216      "//clang/tools/c-arcmt-test",
217    ]
218  }
219  if (clang_enable_static_analyzer) {
220    deps += [
221      "//clang/tools/clang-check",
222      "//clang/tools/clang-extdef-mapping",
223    ]
224  }
225
226  # FIXME: clang_build_examples
227  testonly = true
228}
229
230action("check-clang") {
231  script = "$root_out_dir/bin/llvm-lit"
232  if (host_os == "win") {
233    script += ".py"
234  }
235  args = [
236    "-sv",
237    rebase_path(".", root_out_dir),
238  ]
239  outputs = [ "$target_gen_dir/run-lit" ]  # Non-existing, so that ninja runs it
240                                           # each time.
241
242  # Since check-clang is always dirty, //:default doesn't depend on it so that
243  # it's not part of the default ninja target.  Hence, check-clang shouldn't
244  # have any deps except :test. so that the default target is sure to build
245  # all the deps.
246  deps = [ ":test" ]
247  testonly = true
248
249  pool = "//:console"
250}
251