"""cc_toolchain_config rule for configuring CUDA toolchains on Linux, Mac, and Windows.""" load( "@bazel_tools//tools/cpp:cc_toolchain_config_lib.bzl", "action_config", "artifact_name_pattern", "env_entry", "env_set", "feature", "feature_set", "flag_group", "flag_set", "tool", "tool_path", "variable_with_value", "with_feature_set", ) load("@bazel_tools//tools/build_defs/cc:action_names.bzl", "ACTION_NAMES") def all_assembly_actions(): return [ ACTION_NAMES.assemble, ACTION_NAMES.preprocess_assemble, ] def all_compile_actions(): return [ ACTION_NAMES.assemble, ACTION_NAMES.c_compile, ACTION_NAMES.cpp_compile, ACTION_NAMES.cpp_header_parsing, ACTION_NAMES.cpp_module_codegen, ACTION_NAMES.cpp_module_compile, ACTION_NAMES.linkstamp_compile, ACTION_NAMES.preprocess_assemble, ] def all_c_compile_actions(): return [ ACTION_NAMES.c_compile, ] def all_cpp_compile_actions(): return [ ACTION_NAMES.cpp_compile, ACTION_NAMES.cpp_header_parsing, ACTION_NAMES.cpp_module_codegen, ACTION_NAMES.cpp_module_compile, ACTION_NAMES.linkstamp_compile, ] def all_preprocessed_actions(): return [ ACTION_NAMES.c_compile, ACTION_NAMES.cpp_compile, ACTION_NAMES.cpp_header_parsing, ACTION_NAMES.cpp_module_codegen, ACTION_NAMES.cpp_module_compile, ACTION_NAMES.linkstamp_compile, ACTION_NAMES.preprocess_assemble, ] def all_link_actions(): return [ ACTION_NAMES.cpp_link_executable, ACTION_NAMES.cpp_link_dynamic_library, ACTION_NAMES.cpp_link_nodeps_dynamic_library, ] def all_executable_link_actions(): return [ ACTION_NAMES.cpp_link_executable, ] def all_shared_library_link_actions(): return [ ACTION_NAMES.cpp_link_dynamic_library, ACTION_NAMES.cpp_link_nodeps_dynamic_library, ] def all_archive_actions(): return [ACTION_NAMES.cpp_link_static_library] def all_strip_actions(): return [ACTION_NAMES.strip] def _library_to_link(flag_prefix, value, iterate = None): return flag_group( flags = [ "{}%{{libraries_to_link.{}}}".format( flag_prefix, iterate if iterate else "name", ), ], iterate_over = ("libraries_to_link." + iterate if iterate else None), expand_if_equal = variable_with_value( name = "libraries_to_link.type", value = value, ), ) def _surround_static_library(prefix, suffix): return [ flag_group( flags = [prefix, "%{libraries_to_link.name}", suffix], expand_if_true = "libraries_to_link.is_whole_archive", ), flag_group( flags = ["%{libraries_to_link.name}"], expand_if_false = "libraries_to_link.is_whole_archive", ), ] def _prefix_static_library(prefix): return [ flag_group( flags = ["%{libraries_to_link.name}"], expand_if_false = "libraries_to_link.is_whole_archive", ), flag_group( flags = [prefix + "%{libraries_to_link.name}"], expand_if_true = "libraries_to_link.is_whole_archive", ), ] def _static_library_to_link(alwayslink_prefix, alwayslink_suffix = None): if alwayslink_suffix: flag_groups = _surround_static_library(alwayslink_prefix, alwayslink_suffix) else: flag_groups = _prefix_static_library(alwayslink_prefix) return flag_group( flag_groups = flag_groups, expand_if_equal = variable_with_value( name = "libraries_to_link.type", value = "static_library", ), ) def _iterate_flag_group(iterate_over, flags = [], flag_groups = []): return flag_group( iterate_over = iterate_over, expand_if_available = iterate_over, flag_groups = flag_groups, flags = flags, ) def _libraries_to_link_group(flavour): if flavour == "linux": return _iterate_flag_group( iterate_over = "libraries_to_link", flag_groups = [ flag_group( flags = ["-Wl,--start-lib"], expand_if_equal = variable_with_value( name = "libraries_to_link.type", value = "object_file_group", ), ), _library_to_link("", "object_file_group", "object_files"), flag_group( flags = ["-Wl,--end-lib"], expand_if_equal = variable_with_value( name = "libraries_to_link.type", value = "object_file_group", ), ), _library_to_link("", "object_file"), _library_to_link("", "interface_library"), _static_library_to_link("-Wl,-whole-archive", "-Wl,-no-whole-archive"), _library_to_link("-l", "dynamic_library"), _library_to_link("-l:", "versioned_dynamic_library"), ], ) elif flavour == "darwin": return _iterate_flag_group( iterate_over = "libraries_to_link", flag_groups = [ _library_to_link("", "object_file_group", "object_files"), _library_to_link("", "object_file"), _library_to_link("", "interface_library"), _static_library_to_link("-Wl,-force_load,"), _library_to_link("-l", "dynamic_library"), _library_to_link("-l:", "versioned_dynamic_library"), ], ) elif flavour == "msvc": return _iterate_flag_group( iterate_over = "libraries_to_link", flag_groups = [ _library_to_link("", "object_file_group", "object_files"), _library_to_link("", "object_file"), _library_to_link("", "interface_library"), _static_library_to_link("/WHOLEARCHIVE:"), ], ) def _action_configs_with_tool(path, actions): return [ action_config( action_name = name, enabled = True, tools = [tool(path = path)], ) for name in actions ] def _action_configs(assembly_path, c_compiler_path, cc_compiler_path, archiver_path, linker_path, strip_path): return _action_configs_with_tool( assembly_path, all_assembly_actions(), ) + _action_configs_with_tool( c_compiler_path, all_c_compile_actions(), ) + _action_configs_with_tool( cc_compiler_path, all_cpp_compile_actions(), ) + _action_configs_with_tool( archiver_path, all_archive_actions(), ) + _action_configs_with_tool( linker_path, all_link_actions(), ) + _action_configs_with_tool( strip_path, all_strip_actions(), ) def _tool_paths(cpu, ctx): if cpu in ["local", "darwin"]: return [ tool_path(name = "gcc", path = ctx.attr.host_compiler_path), tool_path(name = "ar", path = ctx.attr.host_compiler_prefix + ( "/ar" if cpu == "local" else "/libtool" )), tool_path(name = "compat-ld", path = ctx.attr.host_compiler_prefix + "/ld"), tool_path(name = "cpp", path = ctx.attr.host_compiler_prefix + "/cpp"), tool_path(name = "dwp", path = ctx.attr.host_compiler_prefix + "/dwp"), tool_path(name = "gcov", path = ctx.attr.host_compiler_prefix + "/gcov"), tool_path(name = "ld", path = ctx.attr.host_compiler_prefix + "/ld"), tool_path(name = "nm", path = ctx.attr.host_compiler_prefix + "/nm"), tool_path(name = "objcopy", path = ctx.attr.host_compiler_prefix + "/objcopy"), tool_path(name = "objdump", path = ctx.attr.host_compiler_prefix + "/objdump"), tool_path(name = "strip", path = ctx.attr.host_compiler_prefix + "/strip"), ] elif cpu == "x64_windows": return [ tool_path(name = "ar", path = ctx.attr.msvc_lib_path), tool_path(name = "ml", path = ctx.attr.msvc_ml_path), tool_path(name = "cpp", path = ctx.attr.msvc_cl_path), tool_path(name = "gcc", path = ctx.attr.msvc_cl_path), tool_path(name = "gcov", path = "wrapper/bin/msvc_nop.bat"), tool_path(name = "ld", path = ctx.attr.msvc_link_path), tool_path(name = "nm", path = "wrapper/bin/msvc_nop.bat"), tool_path( name = "objcopy", path = "wrapper/bin/msvc_nop.bat", ), tool_path( name = "objdump", path = "wrapper/bin/msvc_nop.bat", ), tool_path( name = "strip", path = "wrapper/bin/msvc_nop.bat", ), ] else: fail("Unreachable") def _sysroot_group(): return flag_group( flags = ["--sysroot=%{sysroot}"], expand_if_available = "sysroot", ) def _no_canonical_prefixes_group(extra_flags): return flag_group( flags = [ "-no-canonical-prefixes", ] + extra_flags, ) def _cuda_set(cuda_path, actions): if cuda_path: return [flag_set( actions = actions, flag_groups = [ flag_group( flags = ["--cuda-path=" + cuda_path], ), ], )] else: return [] def _nologo(): return flag_group(flags = ["/nologo"]) def _features(cpu, compiler, ctx): if cpu in ["local", "darwin"]: return [ feature(name = "no_legacy_features"), feature( name = "all_compile_flags", enabled = True, flag_sets = [ flag_set( actions = all_compile_actions(), flag_groups = [ flag_group( flags = ["-MD", "-MF", "%{dependency_file}"], expand_if_available = "dependency_file", ), flag_group( flags = ["-gsplit-dwarf"], expand_if_available = "per_object_debug_info_file", ), ], ), flag_set( actions = all_preprocessed_actions(), flag_groups = [ flag_group( flags = ["-frandom-seed=%{output_file}"], expand_if_available = "output_file", ), _iterate_flag_group( flags = ["-D%{preprocessor_defines}"], iterate_over = "preprocessor_defines", ), _iterate_flag_group( flags = ["-include", "%{includes}"], iterate_over = "includes", ), _iterate_flag_group( flags = ["-iquote", "%{quote_include_paths}"], iterate_over = "quote_include_paths", ), _iterate_flag_group( flags = ["-I%{include_paths}"], iterate_over = "include_paths", ), _iterate_flag_group( flags = ["-isystem", "%{system_include_paths}"], iterate_over = "system_include_paths", ), _iterate_flag_group( flags = ["-F", "%{framework_include_paths}"], iterate_over = "framework_include_paths", ), ], ), flag_set( actions = all_cpp_compile_actions(), flag_groups = [ flag_group(flags = ["-fexperimental-new-pass-manager"]), ] if compiler == "clang" else [], ), flag_set( actions = all_compile_actions(), flag_groups = [ flag_group( flags = [ "-Wno-builtin-macro-redefined", "-D__DATE__=\"redacted\"", "-D__TIMESTAMP__=\"redacted\"", "-D__TIME__=\"redacted\"", ], ), flag_group( flags = ["-fPIC"], expand_if_available = "pic", ), flag_group( flags = ["-fPIE"], expand_if_not_available = "pic", ), flag_group( flags = [ "-U_FORTIFY_SOURCE", "-D_FORTIFY_SOURCE=1", "-fstack-protector", "-Wall", ] + ctx.attr.host_compiler_warnings + [ "-fno-omit-frame-pointer", ], ), _no_canonical_prefixes_group( ctx.attr.extra_no_canonical_prefixes_flags, ), ], ), flag_set( actions = all_compile_actions(), flag_groups = [flag_group(flags = ["-DNDEBUG"])], with_features = [with_feature_set(features = ["disable-assertions"])], ), flag_set( actions = all_compile_actions(), flag_groups = [ flag_group( flags = [ "-g0", "-O2", "-ffunction-sections", "-fdata-sections", ], ), ], with_features = [with_feature_set(features = ["opt"])], ), flag_set( actions = all_compile_actions(), flag_groups = [flag_group(flags = ["-g"])], with_features = [with_feature_set(features = ["dbg"])], ), ] + _cuda_set( ctx.attr.cuda_path, all_compile_actions(), ) + [ flag_set( actions = all_compile_actions(), flag_groups = [ _iterate_flag_group( flags = ["%{user_compile_flags}"], iterate_over = "user_compile_flags", ), _sysroot_group(), flag_group( expand_if_available = "source_file", flags = ["-c", "%{source_file}"], ), flag_group( expand_if_available = "output_assembly_file", flags = ["-S"], ), flag_group( expand_if_available = "output_preprocess_file", flags = ["-E"], ), flag_group( expand_if_available = "output_file", flags = ["-o", "%{output_file}"], ), ], ), ], ), feature( name = "all_archive_flags", enabled = True, flag_sets = [ flag_set( actions = all_archive_actions(), flag_groups = [ flag_group( expand_if_available = "linker_param_file", flags = ["@%{linker_param_file}"], ), flag_group(flags = ["rcsD"]), flag_group( flags = ["%{output_execpath}"], expand_if_available = "output_execpath", ), flag_group( iterate_over = "libraries_to_link", flag_groups = [ flag_group( flags = ["%{libraries_to_link.name}"], expand_if_equal = variable_with_value( name = "libraries_to_link.type", value = "object_file", ), ), flag_group( flags = ["%{libraries_to_link.object_files}"], iterate_over = "libraries_to_link.object_files", expand_if_equal = variable_with_value( name = "libraries_to_link.type", value = "object_file_group", ), ), ], expand_if_available = "libraries_to_link", ), ], ), ], ), feature( name = "all_link_flags", enabled = True, flag_sets = [ flag_set( actions = all_shared_library_link_actions(), flag_groups = [flag_group(flags = ["-shared"])], ), flag_set( actions = all_link_actions(), flag_groups = [ flag_group(flags = ( ["-Wl,-no-as-needed"] if cpu == "local" else [] ) + [ "-B" + ctx.attr.linker_bin_path, ]), flag_group( flags = ["@%{linker_param_file}"], expand_if_available = "linker_param_file", ), _iterate_flag_group( flags = ["%{linkstamp_paths}"], iterate_over = "linkstamp_paths", ), flag_group( flags = ["-o", "%{output_execpath}"], expand_if_available = "output_execpath", ), _iterate_flag_group( flags = ["-L%{library_search_directories}"], iterate_over = "library_search_directories", ), _iterate_flag_group( iterate_over = "runtime_library_search_directories", flags = [ "-Wl,-rpath,$ORIGIN/%{runtime_library_search_directories}", ] if cpu == "local" else [ "-Wl,-rpath,@loader_path/%{runtime_library_search_directories}", ], ), _libraries_to_link_group("darwin" if cpu == "darwin" else "linux"), _iterate_flag_group( flags = ["%{user_link_flags}"], iterate_over = "user_link_flags", ), flag_group( flags = ["-Wl,--gdb-index"], expand_if_available = "is_using_fission", ), flag_group( flags = ["-Wl,-S"], expand_if_available = "strip_debug_symbols", ), flag_group(flags = ["-lc++" if cpu == "darwin" else "-lstdc++"]), _no_canonical_prefixes_group( ctx.attr.extra_no_canonical_prefixes_flags, ), ], ), flag_set( actions = all_executable_link_actions(), flag_groups = [flag_group(flags = ["-pie"])], ), ] + ([ flag_set( actions = all_link_actions(), flag_groups = [flag_group(flags = [ "-Wl,-z,relro,-z,now", ])], ), ] if cpu == "local" else []) + ([ flag_set( actions = all_link_actions(), flag_groups = [ flag_group(flags = ["-Wl,--gc-sections"]), flag_group( flags = ["-Wl,--build-id=md5", "-Wl,--hash-style=gnu"], ), ], ), ] if cpu == "local" else []) + ([ flag_set( actions = all_link_actions(), flag_groups = [flag_group(flags = ["-undefined", "dynamic_lookup"])], ), ] if cpu == "darwin" else []) + _cuda_set( ctx.attr.cuda_path, all_link_actions(), ) + [ flag_set( actions = all_link_actions(), flag_groups = [ _sysroot_group(), ], ), ], ), feature(name = "disable-assertions"), feature( name = "opt", implies = ["disable-assertions"], ), feature(name = "fastbuild"), feature(name = "dbg"), feature(name = "supports_dynamic_linker", enabled = True), feature(name = "pic", enabled = True), feature(name = "supports_pic", enabled = True), feature(name = "has_configured_linker_path", enabled = True), ] elif cpu == "x64_windows": return [ feature(name = "no_legacy_features"), feature( name = "common_flags", enabled = True, env_sets = [ env_set( actions = all_compile_actions() + all_link_actions() + all_archive_actions(), env_entries = [ env_entry(key = "PATH", value = ctx.attr.msvc_env_path), env_entry(key = "INCLUDE", value = ctx.attr.msvc_env_include), env_entry(key = "LIB", value = ctx.attr.msvc_env_lib), env_entry(key = "TMP", value = ctx.attr.msvc_env_tmp), env_entry(key = "TEMP", value = ctx.attr.msvc_env_tmp), ], ), ], ), feature( name = "all_compile_flags", enabled = True, flag_sets = [ flag_set( actions = all_compile_actions(), flag_groups = [ flag_group( flags = [ "-B", "external/local_config_cuda/crosstool/windows/msvc_wrapper_for_nvcc.py", ], ), _nologo(), flag_group( flags = [ "/DCOMPILER_MSVC", "/DNOMINMAX", "/D_WIN32_WINNT=0x0600", "/D_CRT_SECURE_NO_DEPRECATE", "/D_CRT_SECURE_NO_WARNINGS", "/D_SILENCE_STDEXT_HASH_DEPRECATION_WARNINGS", "/bigobj", "/Zm500", "/J", "/Gy", "/GF", "/EHsc", "/wd4351", "/wd4291", "/wd4250", "/wd4996", ], ), _iterate_flag_group( flags = ["/I%{quote_include_paths}"], iterate_over = "quote_include_paths", ), _iterate_flag_group( flags = ["/I%{include_paths}"], iterate_over = "include_paths", ), _iterate_flag_group( flags = ["/I%{system_include_paths}"], iterate_over = "system_include_paths", ), _iterate_flag_group( flags = ["/D%{preprocessor_defines}"], iterate_over = "preprocessor_defines", ), ], ), flag_set( actions = all_preprocessed_actions(), flag_groups = [flag_group(flags = ["/showIncludes"])], ), flag_set( actions = all_compile_actions(), flag_groups = [flag_group(flags = ["/MT"])], with_features = [with_feature_set(features = ["static_link_msvcrt_no_debug"])], ), flag_set( actions = all_compile_actions(), flag_groups = [flag_group(flags = ["/MD"])], with_features = [with_feature_set(features = ["dynamic_link_msvcrt_no_debug"])], ), flag_set( actions = all_compile_actions(), flag_groups = [flag_group(flags = ["/MTd"])], with_features = [with_feature_set(features = ["static_link_msvcrt_debug"])], ), flag_set( actions = all_compile_actions(), flag_groups = [flag_group(flags = ["/MDd"])], with_features = [with_feature_set(features = ["dynamic_link_msvcrt_debug"])], ), flag_set( actions = all_compile_actions(), flag_groups = [flag_group(flags = ["/Od", "/Z7", "/DDEBUG"])], with_features = [with_feature_set(features = ["dbg"])], ), flag_set( actions = all_compile_actions(), flag_groups = [flag_group(flags = ["/Od", "/Z7", "/DDEBUG"])], with_features = [with_feature_set(features = ["fastbuild"])], ), flag_set( actions = all_compile_actions(), flag_groups = [flag_group(flags = ["/O2", "/DNDEBUG"])], with_features = [with_feature_set(features = ["opt"])], ), flag_set( actions = all_preprocessed_actions(), flag_groups = [ _iterate_flag_group( flags = ["%{user_compile_flags}"], iterate_over = "user_compile_flags", ), ] + ([ flag_group(flags = ctx.attr.host_unfiltered_compile_flags), ] if ctx.attr.host_unfiltered_compile_flags else []), ), flag_set( actions = [ACTION_NAMES.assemble], flag_groups = [ flag_group( flag_groups = [ flag_group( flags = ["/Fo%{output_file}", "/Zi"], expand_if_not_available = "output_preprocess_file", ), ], expand_if_available = "output_file", expand_if_not_available = "output_assembly_file", ), ], ), flag_set( actions = all_preprocessed_actions(), flag_groups = [ flag_group( flag_groups = [ flag_group( flags = ["/Fo%{output_file}"], expand_if_not_available = "output_preprocess_file", ), ], expand_if_available = "output_file", expand_if_not_available = "output_assembly_file", ), flag_group( flag_groups = [ flag_group( flags = ["/Fa%{output_file}"], expand_if_available = "output_assembly_file", ), ], expand_if_available = "output_file", ), flag_group( flag_groups = [ flag_group( flags = ["/P", "/Fi%{output_file}"], expand_if_available = "output_preprocess_file", ), ], expand_if_available = "output_file", ), ], ), flag_set( actions = all_compile_actions(), flag_groups = [ flag_group( flags = ["/c", "%{source_file}"], expand_if_available = "source_file", ), ], ), ], ), feature( name = "all_archive_flags", enabled = True, flag_sets = [ flag_set( actions = all_archive_actions(), flag_groups = [ _nologo(), flag_group( flags = ["/OUT:%{output_execpath}"], expand_if_available = "output_execpath", ), ], ), ], ), feature( name = "all_link_flags", enabled = True, flag_sets = [ flag_set( actions = all_shared_library_link_actions(), flag_groups = [flag_group(flags = ["/DLL"])], ), flag_set( actions = all_link_actions(), flag_groups = [ _nologo(), _iterate_flag_group( flags = ["%{linkstamp_paths}"], iterate_over = "linkstamp_paths", ), flag_group( flags = ["/OUT:%{output_execpath}"], expand_if_available = "output_execpath", ), ], ), flag_set( actions = all_shared_library_link_actions(), flag_groups = [ flag_group( flags = ["/IMPLIB:%{interface_library_output_path}"], expand_if_available = "interface_library_output_path", ), ], ), flag_set( actions = all_link_actions() + all_archive_actions(), flag_groups = [ _libraries_to_link_group("msvc"), ], ), flag_set( actions = all_link_actions(), flag_groups = [ flag_group(flags = ["/SUBSYSTEM:CONSOLE"]), _iterate_flag_group( flags = ["%{user_link_flags}"], iterate_over = "user_link_flags", ), flag_group(flags = ["/MACHINE:X64"]), ], ), flag_set( actions = all_link_actions() + all_archive_actions(), flag_groups = [ flag_group( flags = ["@%{linker_param_file}"], expand_if_available = "linker_param_file", ), ], ), flag_set( actions = all_link_actions(), flag_groups = [flag_group(flags = ["/DEFAULTLIB:libcmt.lib"])], with_features = [with_feature_set(features = ["static_link_msvcrt_no_debug"])], ), flag_set( actions = all_link_actions(), flag_groups = [flag_group(flags = ["/DEFAULTLIB:msvcrt.lib"])], with_features = [with_feature_set(features = ["dynamic_link_msvcrt_no_debug"])], ), flag_set( actions = all_link_actions(), flag_groups = [flag_group(flags = ["/DEFAULTLIB:libcmtd.lib"])], with_features = [with_feature_set(features = ["static_link_msvcrt_debug"])], ), flag_set( actions = all_link_actions(), flag_groups = [flag_group(flags = ["/DEFAULTLIB:msvcrtd.lib"])], with_features = [with_feature_set(features = ["dynamic_link_msvcrt_debug"])], ), flag_set( actions = all_link_actions(), flag_groups = [flag_group(flags = ["/DEBUG:FULL", "/INCREMENTAL:NO"])], with_features = [with_feature_set(features = ["dbg"])], ), flag_set( actions = all_link_actions(), flag_groups = [ flag_group(flags = ["/DEBUG:FASTLINK", "/INCREMENTAL:NO"]), ], with_features = [with_feature_set(features = ["fastbuild"])], ), flag_set( actions = all_link_actions(), flag_groups = [ flag_group( flags = ["/DEF:%{def_file_path}", "/ignore:4070"], expand_if_available = "def_file_path", ), ], ), ], ), feature(name = "parse_showincludes", enabled = True), feature(name = "no_stripping", enabled = True), feature( name = "targets_windows", enabled = True, implies = ["copy_dynamic_libraries_to_binary"], ), feature(name = "copy_dynamic_libraries_to_binary"), feature( name = "generate_pdb_file", requires = [ feature_set(features = ["dbg"]), feature_set(features = ["fastbuild"]), ], ), feature(name = "static_link_msvcrt"), feature( name = "static_link_msvcrt_no_debug", requires = [ feature_set(features = ["fastbuild"]), feature_set(features = ["opt"]), ], ), feature( name = "dynamic_link_msvcrt_no_debug", requires = [ feature_set(features = ["fastbuild"]), feature_set(features = ["opt"]), ], ), feature( name = "static_link_msvcrt_debug", requires = [feature_set(features = ["dbg"])], ), feature( name = "dynamic_link_msvcrt_debug", requires = [feature_set(features = ["dbg"])], ), feature( name = "dbg", implies = ["generate_pdb_file"], ), feature( name = "fastbuild", implies = ["generate_pdb_file"], ), feature( name = "opt", ), feature(name = "windows_export_all_symbols"), feature(name = "no_windows_export_all_symbols"), feature(name = "supports_dynamic_linker", enabled = True), feature( name = "supports_interface_shared_libraries", enabled = True, ), feature(name = "has_configured_linker_path", enabled = True), ] else: fail("Unreachable") def _impl(ctx): cpu = ctx.attr.cpu compiler = ctx.attr.compiler if (cpu == "darwin"): toolchain_identifier = "local_darwin" target_cpu = "darwin" target_libc = "macosx" compiler = "compiler" action_configs = _action_configs( assembly_path = ctx.attr.host_compiler_path, c_compiler_path = ctx.attr.host_compiler_path, cc_compiler_path = ctx.attr.host_compiler_path, archiver_path = ctx.attr.host_compiler_prefix + "/libtool", linker_path = ctx.attr.host_compiler_path, strip_path = ctx.attr.host_compiler_prefix + "/strip", ) artifact_name_patterns = [] elif (cpu == "local"): toolchain_identifier = "local_linux" target_cpu = "local" target_libc = "local" compiler = "compiler" action_configs = _action_configs( assembly_path = ctx.attr.host_compiler_path, c_compiler_path = ctx.attr.host_compiler_path, cc_compiler_path = ctx.attr.host_compiler_path, archiver_path = ctx.attr.host_compiler_prefix + "/ar", linker_path = ctx.attr.host_compiler_path, strip_path = ctx.attr.host_compiler_prefix + "/strip", ) artifact_name_patterns = [] elif (cpu == "x64_windows"): toolchain_identifier = "local_windows" target_cpu = "x64_windows" target_libc = "msvcrt" compiler = "msvc-cl" action_configs = _action_configs( assembly_path = ctx.attr.msvc_ml_path, c_compiler_path = ctx.attr.msvc_cl_path, cc_compiler_path = ctx.attr.msvc_cl_path, archiver_path = ctx.attr.msvc_lib_path, linker_path = ctx.attr.msvc_link_path, strip_path = "fake_tool_strip_not_supported", ) artifact_name_patterns = [ artifact_name_pattern( category_name = "object_file", prefix = "", extension = ".obj", ), artifact_name_pattern( category_name = "static_library", prefix = "", extension = ".lib", ), artifact_name_pattern( category_name = "alwayslink_static_library", prefix = "", extension = ".lo.lib", ), artifact_name_pattern( category_name = "executable", prefix = "", extension = ".exe", ), artifact_name_pattern( category_name = "dynamic_library", prefix = "", extension = ".dll", ), artifact_name_pattern( category_name = "interface_library", prefix = "", extension = ".if.lib", ), ] else: fail("Unreachable") out = ctx.actions.declare_file(ctx.label.name) ctx.actions.write(out, "Fake executable") return [ cc_common.create_cc_toolchain_config_info( ctx = ctx, features = _features(cpu, compiler, ctx), action_configs = action_configs, artifact_name_patterns = artifact_name_patterns, cxx_builtin_include_directories = ctx.attr.builtin_include_directories, toolchain_identifier = toolchain_identifier, host_system_name = "local", target_system_name = "local", target_cpu = target_cpu, target_libc = target_libc, compiler = compiler, abi_version = "local", abi_libc_version = "local", tool_paths = _tool_paths(cpu, ctx), make_variables = [], builtin_sysroot = ctx.attr.builtin_sysroot, cc_target_os = None, ), DefaultInfo( executable = out, ), ] cc_toolchain_config = rule( implementation = _impl, attrs = { "cpu": attr.string(mandatory = True, values = ["darwin", "local", "x64_windows"]), "compiler": attr.string(values = ["clang", "msvc", "unknown"], default = "unknown"), "builtin_include_directories": attr.string_list(), "extra_no_canonical_prefixes_flags": attr.string_list(), "host_compiler_path": attr.string(), "host_compiler_prefix": attr.string(), "host_compiler_warnings": attr.string_list(), "host_unfiltered_compile_flags": attr.string_list(), "linker_bin_path": attr.string(), "builtin_sysroot": attr.string(), "cuda_path": attr.string(), "msvc_cl_path": attr.string(default = "msvc_not_used"), "msvc_env_include": attr.string(default = "msvc_not_used"), "msvc_env_lib": attr.string(default = "msvc_not_used"), "msvc_env_path": attr.string(default = "msvc_not_used"), "msvc_env_tmp": attr.string(default = "msvc_not_used"), "msvc_lib_path": attr.string(default = "msvc_not_used"), "msvc_link_path": attr.string(default = "msvc_not_used"), "msvc_ml_path": attr.string(default = "msvc_not_used"), }, provides = [CcToolchainConfigInfo], executable = True, )