xref: /llvm-project/llvm/utils/gn/secondary/clang/tools/driver/BUILD.gn (revision 78735d8070a8e4f2024d58baa5a4cacc9fa08d3e)
1import("//llvm/utils/gn/build/driver_executable.gni")
2import("//llvm/utils/gn/build/symlink_or_copy.gni")
3import("//llvm/utils/gn/build/write_cmake_config.gni")
4import("//llvm/version.gni")
5
6symlinks = [
7  # target_name, symlink_target pairs: GN doesn't support '+' in rule names.
8  [
9    "clangxx",
10    "clang++",
11  ],
12  [
13    "clang-cl",
14    "clang-cl",
15  ],
16  [
17    "clang-cpp",
18    "clang-cpp",
19  ],
20]
21foreach(target, symlinks) {
22  symlink_or_copy(target[0]) {
23    deps = [ ":clang" ]
24    source = "clang"
25    output = "$root_out_dir/bin/${target[1]}"
26  }
27}
28
29# //:clang depends on this symlink target, see comment in //BUILD.gn.
30group("symlinks") {
31  deps = [ ":clang" ]
32  foreach(target, symlinks) {
33    deps += [ ":${target[0]}" ]
34  }
35}
36
37if (host_os == "mac") {
38  write_cmake_config("write_info_plist") {
39    input = "Info.plist.in"
40    output = "$target_gen_dir/Info.plist"
41    values = [
42      "TOOL_INFO_BUILD_VERSION=$llvm_version_major.$llvm_version_minor",
43      "TOOL_INFO_NAME=clang",
44      "TOOL_INFO_UTI=org.llvm.clang",
45      "TOOL_INFO_VERSION=$llvm_version",
46    ]
47  }
48}
49
50driver_executable("clang") {
51  configs += [ "//llvm/utils/gn/build:clang_code" ]
52  deps = [
53    "//clang/include/clang/Config",
54    "//clang/lib/Basic",
55    "//clang/lib/CodeGen",
56    "//clang/lib/Driver",
57    "//clang/lib/Frontend",
58    "//clang/lib/FrontendTool",
59    "//clang/lib/Headers",
60    "//clang/tools/clang-linker-wrapper",
61    "//clang/tools/clang-nvlink-wrapper",
62    "//clang/tools/clang-offload-bundler",
63    "//clang/tools/clang-offload-packager",
64    "//llvm/include/llvm/Config:llvm-config",
65    "//llvm/lib/Analysis",
66    "//llvm/lib/CodeGen",
67    "//llvm/lib/IR",
68    "//llvm/lib/MC",
69    "//llvm/lib/MC/MCParser",
70    "//llvm/lib/Option",
71    "//llvm/lib/Support",
72    "//llvm/lib/Target:TargetsToBuild",
73    "//llvm/lib/TargetParser",
74    "//llvm/lib/Transforms/IPO",
75    "//llvm/lib/Transforms/InstCombine",
76    "//llvm/lib/Transforms/Instrumentation",
77    "//llvm/lib/Transforms/ObjCARC",
78    "//llvm/lib/Transforms/Scalar",
79    "//llvm/lib/Transforms/Utils",
80    "//llvm/lib/Transforms/Vectorize",
81  ]
82  assert_no_deps = [ "//llvm/lib/Debuginfod" ]
83  if (host_os == "mac") {
84    deps += [ ":write_info_plist" ]
85    plist = get_target_outputs(":write_info_plist")
86    ldflags = [ "-Wl,-sectcreate,__TEXT,__info_plist," +
87                rebase_path(plist[0], root_out_dir) ]
88
89    # On macOS, libcxx headers are bundled with the compiler, not with the
90    # sysroot. As a convenience, automatically copy them over when buildling
91    # clang.  This is different from the CMake build, which requires devs to
92    # explicitly build the "libcxx" target (which also needlessly compiles the
93    # libcxx sources) to get a working compiler.
94    deps += [ "//libcxx/include:copy_headers" ]
95  }
96  sources = [
97    "cc1_main.cpp",
98    "cc1as_main.cpp",
99    "cc1gen_reproducer_main.cpp",
100    "driver.cpp",
101  ]
102}
103