1""" Generate CcToolchainConfigInfo for LLVM """
2
3load(
4    "@bazel_tools//tools/cpp:cc_toolchain_config_lib.bzl",
5    "artifact_name_pattern",
6    "feature",
7)
8load("//bazel/toolchain_rules/cc_tools:clang.bzl", clang_compile_action_configs = "compile_action_configs")
9load("//bazel/toolchain_rules/cc_tools:ld.lld.bzl", ld_lld_link_action_configs = "link_action_configs")
10load("//bazel/toolchain_rules/cc_tools:ld64.lld.bzl", ld64_lld_link_action_configs = "link_action_configs")
11load("//bazel/toolchain_rules/cc_tools:lld_link.bzl", lld_link_link_action_configs = "link_action_configs")
12load("//bazel/toolchain_rules/cc_tools:llvm_ar.bzl", llvm_ar_archive_action_configs = "archive_action_configs")
13load("//bazel/toolchain_rules/cc_tools:llvm_strip.bzl", llvm_strip_strip_action_configs = "strip_action_configs")
14load("//bazel/toolchain_rules/cc_tools:wasm_ld.bzl", wasm_ld_link_action_configs = "link_action_configs")
15
16APPLE_ARTIFACT_NAME_PATTERNS = [
17    # Artifact name patterns differ from the defaults only for dynamic libraries.
18    artifact_name_pattern(
19        category_name = "dynamic_library",
20        prefix = "lib",
21        extension = ".dylib",
22    ),
23]
24
25LINUX_ARTIFACT_NAME_PATTERNS = [
26    # Artifact name patterns are the default.
27]
28
29WASM_ARTIFACT_NAME_PATTERNS = [
30    # Artifact name patterns differ from the defaults only for executables.
31    artifact_name_pattern(
32        category_name = "executable",
33        prefix = "",
34        extension = ".wasm",
35    ),
36]
37
38WINDOWS_ARTIFACT_NAME_PATTERNS = [
39    artifact_name_pattern(
40        category_name = "object_file",
41        prefix = "",
42        extension = ".obj",
43    ),
44    artifact_name_pattern(
45        category_name = "static_library",
46        prefix = "",
47        extension = ".lib",
48    ),
49    artifact_name_pattern(
50        category_name = "alwayslink_static_library",
51        prefix = "",
52        extension = ".lo.lib",
53    ),
54    artifact_name_pattern(
55        category_name = "executable",
56        prefix = "",
57        extension = ".exe",
58    ),
59    artifact_name_pattern(
60        category_name = "dynamic_library",
61        prefix = "",
62        extension = ".dll",
63    ),
64    artifact_name_pattern(
65        category_name = "interface_library",
66        prefix = "",
67        extension = ".if.lib",
68    ),
69]
70
71TARGET_CONFIG = {
72    "aarch64-apple-darwin": struct(
73        artifact_name_patterns = APPLE_ARTIFACT_NAME_PATTERNS,
74        compile_action_configs = clang_compile_action_configs,
75        archive_action_configs = llvm_ar_archive_action_configs,
76        link_action_configs = ld64_lld_link_action_configs,
77        strip_action_configs = llvm_strip_strip_action_configs,
78    ),
79    "aarch64-apple-ios": struct(
80        artifact_name_patterns = APPLE_ARTIFACT_NAME_PATTERNS,
81        compile_action_configs = clang_compile_action_configs,
82        archive_action_configs = llvm_ar_archive_action_configs,
83        link_action_configs = ld64_lld_link_action_configs,
84        strip_action_configs = llvm_strip_strip_action_configs,
85    ),
86    "aarch64-linux-android": struct(
87        artifact_name_patterns = LINUX_ARTIFACT_NAME_PATTERNS,
88        compile_action_configs = clang_compile_action_configs,
89        archive_action_configs = llvm_ar_archive_action_configs,
90        link_action_configs = ld_lld_link_action_configs,
91        strip_action_configs = llvm_strip_strip_action_configs,
92    ),
93    "aarch64-unknown-linux-gnu": struct(
94        artifact_name_patterns = LINUX_ARTIFACT_NAME_PATTERNS,
95        compile_action_configs = clang_compile_action_configs,
96        archive_action_configs = llvm_ar_archive_action_configs,
97        link_action_configs = ld_lld_link_action_configs,
98        strip_action_configs = llvm_strip_strip_action_configs,
99    ),
100    "wasm32-unknown-unknown": struct(
101        artifact_name_patterns = WASM_ARTIFACT_NAME_PATTERNS,
102        compile_action_configs = clang_compile_action_configs,
103        archive_action_configs = llvm_ar_archive_action_configs,
104        link_action_configs = wasm_ld_link_action_configs,
105        strip_action_configs = llvm_strip_strip_action_configs,
106    ),
107    "wasm32-wasi": struct(
108        artifact_name_patterns = WASM_ARTIFACT_NAME_PATTERNS,
109        compile_action_configs = clang_compile_action_configs,
110        archive_action_configs = llvm_ar_archive_action_configs,
111        link_action_configs = wasm_ld_link_action_configs,
112        strip_action_configs = llvm_strip_strip_action_configs,
113    ),
114    "x86_64-apple-darwin": struct(
115        artifact_name_patterns = APPLE_ARTIFACT_NAME_PATTERNS,
116        compile_action_configs = clang_compile_action_configs,
117        archive_action_configs = llvm_ar_archive_action_configs,
118        link_action_configs = ld64_lld_link_action_configs,
119        strip_action_configs = llvm_strip_strip_action_configs,
120    ),
121    "x86_64-pc-windows-msvc": struct(
122        artifact_name_patterns = WINDOWS_ARTIFACT_NAME_PATTERNS,
123        compile_action_configs = clang_compile_action_configs,
124        archive_action_configs = llvm_ar_archive_action_configs,
125        link_action_configs = lld_link_link_action_configs,
126        strip_action_configs = llvm_strip_strip_action_configs,
127    ),
128    "x86_64-unknown-linux-gnu": struct(
129        artifact_name_patterns = LINUX_ARTIFACT_NAME_PATTERNS,
130        compile_action_configs = clang_compile_action_configs,
131        archive_action_configs = llvm_ar_archive_action_configs,
132        link_action_configs = ld_lld_link_action_configs,
133        strip_action_configs = llvm_strip_strip_action_configs,
134    ),
135}
136
137def _llvm_cc_toolchain_config_impl(ctx):
138    target_config = TARGET_CONFIG[ctx.attr.target]
139
140    compile_action_configs = target_config.compile_action_configs(
141        clang = ctx.attr.clang,
142        target = ctx.attr.target,
143        builtin_include_directories = ctx.attr.builtin_include_directories,
144        builtin_framework_directories = ctx.attr.builtin_framework_directories,
145        compile_flags = ctx.attr.compile_flags,
146        dbg_compile_flags = ctx.attr.dbg_compile_flags,
147        fastbuild_compile_flags = ctx.attr.fastbuild_compile_flags,
148        opt_compile_flags = ctx.attr.opt_compile_flags,
149        remap_path_prefix = ctx.attr.remap_path_prefix,
150    )
151
152    archive_action_configs = target_config.archive_action_configs(
153        llvm = ctx.attr.llvm,
154        archive_flags = ctx.attr.archive_flags,
155    )
156
157    link_action_configs = target_config.link_action_configs(
158        llvm = ctx.attr.llvm,
159        builtin_library_directories = ctx.attr.builtin_library_directories,
160        builtin_libraries = ctx.attr.builtin_libraries,
161        builtin_framework_directories = ctx.attr.builtin_framework_directories,
162        builtin_frameworks = ctx.attr.builtin_frameworks,
163        builtin_executable_objects = ctx.attr.builtin_executable_objects,
164        link_flags = ctx.attr.link_flags,
165        dbg_link_flags = ctx.attr.dbg_link_flags,
166        fastbuild_link_flags = ctx.attr.fastbuild_link_flags,
167        opt_link_flags = ctx.attr.opt_link_flags,
168    )
169
170    strip_action_configs = target_config.strip_action_configs(
171        llvm = ctx.attr.llvm,
172    )
173
174    return cc_common.create_cc_toolchain_config_info(
175        ctx = ctx,
176        features = [
177            feature(name = "no_legacy_features", enabled = True),
178            feature(name = "supports_start_end_lib", enabled = ctx.attr.supports_start_end_lib),
179            feature(name = "supports_interface_shared_libraries", enabled = False),
180            feature(name = "supports_dynamic_linker", enabled = True),
181            feature(name = "has_configured_linker_path", enabled = True),
182            feature(name = "static_link_cpp_runtimes", enabled = False),
183            feature(name = "supports_pic", enabled = True),
184        ],
185        action_configs = compile_action_configs +
186                         archive_action_configs +
187                         link_action_configs +
188                         strip_action_configs,
189        artifact_name_patterns = target_config.artifact_name_patterns,
190        cxx_builtin_include_directories = ctx.attr.builtin_include_directories,
191        toolchain_identifier = ctx.attr.name,
192        host_system_name = None,
193        target_system_name = ctx.attr.target,
194        target_cpu = "unused",
195        target_libc = "unused",
196        compiler = "unused",
197        abi_version = None,
198        abi_libc_version = None,
199        tool_paths = [],
200        make_variables = [],
201        builtin_sysroot = None,
202        cc_target_os = None,
203    )
204
205llvm_cc_toolchain_config = rule(
206    implementation = _llvm_cc_toolchain_config_impl,
207    attrs = {
208        "archive_flags": attr.string_list(),
209        "builtin_executable_objects": attr.string_list(),
210        "builtin_framework_directories": attr.string_list(),
211        "builtin_frameworks": attr.string_list(),
212        "builtin_include_directories": attr.string_list(),
213        "builtin_libraries": attr.string_list(),
214        "builtin_library_directories": attr.string_list(),
215        "clang": attr.string(mandatory = True),
216        "compile_flags": attr.string_list(),
217        "dbg_compile_flags": attr.string_list(),
218        "dbg_link_flags": attr.string_list(),
219        "fastbuild_compile_flags": attr.string_list(),
220        "fastbuild_link_flags": attr.string_list(),
221        "link_flags": attr.string_list(),
222        "llvm": attr.string(mandatory = True),
223        "opt_compile_flags": attr.string_list(),
224        "opt_link_flags": attr.string_list(),
225        "remap_path_prefix": attr.string(),
226        "supports_start_end_lib": attr.bool(default = True),
227        "target": attr.string(mandatory = True),
228    },
229    provides = [CcToolchainConfigInfo],
230)
231