| """Utilities for llvm targets""" |
| |
| load("@rules_cc//cc:defs.bzl", "CcInfo") |
| |
| def _cc_stdcc17_transition_impl(settings, attr): |
| # clang --cxxopt=-std=c++17 --host_cxxopt=-std=c++17 |
| # msvc --cxxopt=/std:c++17 --host_cxxopt=/std:c++17 |
| host_opt = settings["//command_line_option:host_cxxopt"] |
| tgt_opt = settings["//command_line_option:cxxopt"] |
| |
| host_opt.extend(attr.cxxopts) |
| tgt_opt.extend(attr.cxxopts) |
| |
| return { |
| "//command_line_option:cxxopt": tgt_opt, |
| "//command_line_option:host_cxxopt": host_opt, |
| } |
| |
| _cc_stdcc17_transition = transition( |
| implementation = _cc_stdcc17_transition_impl, |
| inputs = [ |
| "//command_line_option:host_cxxopt", |
| "//command_line_option:cxxopt", |
| ], |
| outputs = [ |
| "//command_line_option:host_cxxopt", |
| "//command_line_option:cxxopt", |
| ], |
| ) |
| |
| _CXX_OPTS = select({ |
| "@platforms//os:windows": ["/std:c++17"], |
| "//conditions:default": ["-std=c++17"], |
| }) |
| |
| _COMMON_ATTRS = { |
| "cxxopts": attr.string_list( |
| doc = "Flags to inject into `--host_cxxopt` and `--cxxopt` command line flags.", |
| mandatory = True, |
| ), |
| "target": attr.label( |
| doc = "The target to transition.", |
| mandatory = True, |
| ), |
| } |
| |
| def _cc_stdcc17_transitioned_target_impl(ctx): |
| providers = [] |
| |
| if CcInfo in ctx.attr.target: |
| providers.append(ctx.attr.target[CcInfo]) |
| |
| if DefaultInfo in ctx.attr.target: |
| info = ctx.attr.target[DefaultInfo] |
| kwargs = { |
| "files": info.files, |
| "runfiles": info.default_runfiles, |
| } |
| |
| if info.files_to_run and info.files_to_run.executable: |
| exe = info.files_to_run.executable |
| kwargs["executable"] = ctx.actions.declare_file("{}.{}".format(ctx.label.name, exe.extension).rstrip(".")) |
| ctx.actions.symlink( |
| output = kwargs["executable"], |
| target_file = exe, |
| is_executable = True, |
| ) |
| |
| providers.append(DefaultInfo(**kwargs)) |
| |
| if OutputGroupInfo in ctx.attr.target: |
| providers.append(ctx.attr.target[OutputGroupInfo]) |
| |
| return providers |
| |
| _cc_stdcc17_transitioned_library = rule( |
| doc = "A rule to transition a C++ library to build with stdc++17.", |
| implementation = _cc_stdcc17_transitioned_target_impl, |
| cfg = _cc_stdcc17_transition, |
| attrs = _COMMON_ATTRS, |
| ) |
| |
| _cc_stdcc17_transitioned_binary = rule( |
| doc = "A rule to transition a C++ binary to build with stdc++17.", |
| implementation = _cc_stdcc17_transitioned_target_impl, |
| cfg = _cc_stdcc17_transition, |
| attrs = _COMMON_ATTRS, |
| executable = True, |
| ) |
| |
| def cc_stdcc17_transitioned_library(name, **kwargs): |
| _cc_stdcc17_transitioned_library( |
| name = name, |
| cxxopts = _CXX_OPTS, |
| **kwargs |
| ) |
| |
| def cc_stdcc17_transitioned_binary(name, **kwargs): |
| _cc_stdcc17_transitioned_binary( |
| name = name, |
| cxxopts = _CXX_OPTS, |
| **kwargs |
| ) |