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