mirror of https://github.com/bazelbuild/rules_cc
1340 lines
49 KiB
Python
1340 lines
49 KiB
Python
# Copyright 2019 The Bazel Authors. All rights reserved.
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
# you may not use this file except in compliance with the License.
|
|
# You may obtain a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
# See the License for the specific language governing permissions and
|
|
# limitations under the License.
|
|
|
|
"""A Starlark cc_toolchain configuration rule for Windows"""
|
|
|
|
load("@rules_cc//cc:action_names.bzl", "ACTION_NAMES")
|
|
load(
|
|
"@rules_cc//cc: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",
|
|
)
|
|
|
|
all_compile_actions = [
|
|
ACTION_NAMES.c_compile,
|
|
ACTION_NAMES.cpp_compile,
|
|
ACTION_NAMES.linkstamp_compile,
|
|
ACTION_NAMES.assemble,
|
|
ACTION_NAMES.preprocess_assemble,
|
|
ACTION_NAMES.cpp_header_parsing,
|
|
ACTION_NAMES.cpp_module_compile,
|
|
ACTION_NAMES.cpp_module_codegen,
|
|
ACTION_NAMES.clif_match,
|
|
ACTION_NAMES.lto_backend,
|
|
]
|
|
|
|
all_cpp_compile_actions = [
|
|
ACTION_NAMES.cpp_compile,
|
|
ACTION_NAMES.linkstamp_compile,
|
|
ACTION_NAMES.cpp_header_parsing,
|
|
ACTION_NAMES.cpp_module_compile,
|
|
ACTION_NAMES.cpp_module_codegen,
|
|
ACTION_NAMES.clif_match,
|
|
]
|
|
|
|
preprocessor_compile_actions = [
|
|
ACTION_NAMES.c_compile,
|
|
ACTION_NAMES.cpp_compile,
|
|
ACTION_NAMES.linkstamp_compile,
|
|
ACTION_NAMES.preprocess_assemble,
|
|
ACTION_NAMES.cpp_header_parsing,
|
|
ACTION_NAMES.cpp_module_compile,
|
|
ACTION_NAMES.clif_match,
|
|
]
|
|
|
|
codegen_compile_actions = [
|
|
ACTION_NAMES.c_compile,
|
|
ACTION_NAMES.cpp_compile,
|
|
ACTION_NAMES.linkstamp_compile,
|
|
ACTION_NAMES.assemble,
|
|
ACTION_NAMES.preprocess_assemble,
|
|
ACTION_NAMES.cpp_module_codegen,
|
|
ACTION_NAMES.lto_backend,
|
|
]
|
|
|
|
all_link_actions = [
|
|
ACTION_NAMES.cpp_link_executable,
|
|
ACTION_NAMES.cpp_link_dynamic_library,
|
|
ACTION_NAMES.cpp_link_nodeps_dynamic_library,
|
|
]
|
|
|
|
def _use_msvc_toolchain(ctx):
|
|
return ctx.attr.cpu == "x64_windows" and (ctx.attr.compiler == "msvc-cl" or ctx.attr.compiler == "clang-cl")
|
|
|
|
def _impl(ctx):
|
|
if _use_msvc_toolchain(ctx):
|
|
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:
|
|
artifact_name_patterns = [
|
|
artifact_name_pattern(
|
|
category_name = "executable",
|
|
prefix = "",
|
|
extension = ".exe",
|
|
),
|
|
]
|
|
|
|
if _use_msvc_toolchain(ctx):
|
|
cpp_link_nodeps_dynamic_library_action = action_config(
|
|
action_name = ACTION_NAMES.cpp_link_nodeps_dynamic_library,
|
|
implies = [
|
|
"nologo",
|
|
"shared_flag",
|
|
"linkstamps",
|
|
"output_execpath_flags",
|
|
"input_param_flags",
|
|
"user_link_flags",
|
|
"default_link_flags",
|
|
"linker_subsystem_flag",
|
|
"linker_param_file",
|
|
"msvc_env",
|
|
"no_stripping",
|
|
"has_configured_linker_path",
|
|
"def_file",
|
|
],
|
|
tools = [tool(path = ctx.attr.msvc_link_path)],
|
|
)
|
|
|
|
cpp_link_static_library_action = action_config(
|
|
action_name = ACTION_NAMES.cpp_link_static_library,
|
|
implies = [
|
|
"nologo",
|
|
"archiver_flags",
|
|
"input_param_flags",
|
|
"linker_param_file",
|
|
"msvc_env",
|
|
],
|
|
tools = [tool(path = ctx.attr.msvc_lib_path)],
|
|
)
|
|
|
|
assemble_action = action_config(
|
|
action_name = ACTION_NAMES.assemble,
|
|
implies = [
|
|
"compiler_input_flags",
|
|
"compiler_output_flags",
|
|
"nologo",
|
|
"msvc_env",
|
|
"sysroot",
|
|
],
|
|
tools = [tool(path = ctx.attr.msvc_ml_path)],
|
|
)
|
|
|
|
preprocess_assemble_action = action_config(
|
|
action_name = ACTION_NAMES.preprocess_assemble,
|
|
implies = [
|
|
"compiler_input_flags",
|
|
"compiler_output_flags",
|
|
"nologo",
|
|
"msvc_env",
|
|
"sysroot",
|
|
],
|
|
tools = [tool(path = ctx.attr.msvc_ml_path)],
|
|
)
|
|
|
|
c_compile_action = action_config(
|
|
action_name = ACTION_NAMES.c_compile,
|
|
implies = [
|
|
"compiler_input_flags",
|
|
"compiler_output_flags",
|
|
"default_compile_flags",
|
|
"nologo",
|
|
"msvc_env",
|
|
"parse_showincludes",
|
|
"user_compile_flags",
|
|
"sysroot",
|
|
"unfiltered_compile_flags",
|
|
],
|
|
tools = [tool(path = ctx.attr.msvc_cl_path)],
|
|
)
|
|
|
|
cpp_compile_action = action_config(
|
|
action_name = ACTION_NAMES.cpp_compile,
|
|
implies = [
|
|
"compiler_input_flags",
|
|
"compiler_output_flags",
|
|
"default_compile_flags",
|
|
"nologo",
|
|
"msvc_env",
|
|
"parse_showincludes",
|
|
"user_compile_flags",
|
|
"sysroot",
|
|
"unfiltered_compile_flags",
|
|
],
|
|
tools = [tool(path = ctx.attr.msvc_cl_path)],
|
|
)
|
|
|
|
cpp_link_executable_action = action_config(
|
|
action_name = ACTION_NAMES.cpp_link_executable,
|
|
implies = [
|
|
"nologo",
|
|
"linkstamps",
|
|
"output_execpath_flags",
|
|
"input_param_flags",
|
|
"user_link_flags",
|
|
"default_link_flags",
|
|
"linker_subsystem_flag",
|
|
"linker_param_file",
|
|
"msvc_env",
|
|
"no_stripping",
|
|
],
|
|
tools = [tool(path = ctx.attr.msvc_link_path)],
|
|
)
|
|
|
|
cpp_link_dynamic_library_action = action_config(
|
|
action_name = ACTION_NAMES.cpp_link_dynamic_library,
|
|
implies = [
|
|
"nologo",
|
|
"shared_flag",
|
|
"linkstamps",
|
|
"output_execpath_flags",
|
|
"input_param_flags",
|
|
"user_link_flags",
|
|
"default_link_flags",
|
|
"linker_subsystem_flag",
|
|
"linker_param_file",
|
|
"msvc_env",
|
|
"no_stripping",
|
|
"has_configured_linker_path",
|
|
"def_file",
|
|
],
|
|
tools = [tool(path = ctx.attr.msvc_link_path)],
|
|
)
|
|
|
|
action_configs = [
|
|
assemble_action,
|
|
preprocess_assemble_action,
|
|
c_compile_action,
|
|
cpp_compile_action,
|
|
cpp_link_executable_action,
|
|
cpp_link_dynamic_library_action,
|
|
cpp_link_nodeps_dynamic_library_action,
|
|
cpp_link_static_library_action,
|
|
]
|
|
else:
|
|
action_configs = []
|
|
|
|
if _use_msvc_toolchain(ctx):
|
|
msvc_link_env_feature = feature(
|
|
name = "msvc_link_env",
|
|
env_sets = [
|
|
env_set(
|
|
actions = all_link_actions +
|
|
[ACTION_NAMES.cpp_link_static_library],
|
|
env_entries = [env_entry(key = "LIB", value = ctx.attr.msvc_env_lib)],
|
|
),
|
|
],
|
|
)
|
|
|
|
shared_flag_feature = feature(
|
|
name = "shared_flag",
|
|
flag_sets = [
|
|
flag_set(
|
|
actions = [
|
|
ACTION_NAMES.cpp_link_dynamic_library,
|
|
ACTION_NAMES.cpp_link_nodeps_dynamic_library,
|
|
],
|
|
flag_groups = [flag_group(flags = ["/DLL"])],
|
|
),
|
|
],
|
|
)
|
|
|
|
determinism_feature = feature(
|
|
name = "determinism",
|
|
enabled = True,
|
|
flag_sets = [
|
|
flag_set(
|
|
actions = [ACTION_NAMES.c_compile, ACTION_NAMES.cpp_compile],
|
|
flag_groups = [
|
|
flag_group(
|
|
flags = [
|
|
"/wd4117",
|
|
"-D__DATE__=\"redacted\"",
|
|
"-D__TIMESTAMP__=\"redacted\"",
|
|
"-D__TIME__=\"redacted\"",
|
|
] + (["-Wno-builtin-macro-redefined"] if ctx.attr.compiler == "clang-cl" else []),
|
|
),
|
|
],
|
|
),
|
|
],
|
|
)
|
|
|
|
sysroot_feature = feature(
|
|
name = "sysroot",
|
|
flag_sets = [
|
|
flag_set(
|
|
actions = [
|
|
ACTION_NAMES.assemble,
|
|
ACTION_NAMES.preprocess_assemble,
|
|
ACTION_NAMES.c_compile,
|
|
ACTION_NAMES.cpp_compile,
|
|
ACTION_NAMES.cpp_header_parsing,
|
|
ACTION_NAMES.cpp_module_compile,
|
|
ACTION_NAMES.cpp_module_codegen,
|
|
ACTION_NAMES.cpp_link_executable,
|
|
ACTION_NAMES.cpp_link_dynamic_library,
|
|
ACTION_NAMES.cpp_link_nodeps_dynamic_library,
|
|
],
|
|
flag_groups = [
|
|
flag_group(
|
|
flags = ["--sysroot=%{sysroot}"],
|
|
iterate_over = "sysroot",
|
|
expand_if_available = "sysroot",
|
|
),
|
|
],
|
|
),
|
|
],
|
|
)
|
|
|
|
unfiltered_compile_flags_feature = feature(
|
|
name = "unfiltered_compile_flags",
|
|
flag_sets = [
|
|
flag_set(
|
|
actions = [
|
|
ACTION_NAMES.preprocess_assemble,
|
|
ACTION_NAMES.c_compile,
|
|
ACTION_NAMES.cpp_compile,
|
|
ACTION_NAMES.cpp_header_parsing,
|
|
ACTION_NAMES.cpp_module_compile,
|
|
ACTION_NAMES.cpp_module_codegen,
|
|
],
|
|
flag_groups = [
|
|
flag_group(
|
|
flags = ["%{unfiltered_compile_flags}"],
|
|
iterate_over = "unfiltered_compile_flags",
|
|
expand_if_available = "unfiltered_compile_flags",
|
|
),
|
|
],
|
|
),
|
|
],
|
|
)
|
|
|
|
compiler_param_file_feature = feature(
|
|
name = "compiler_param_file",
|
|
)
|
|
|
|
copy_dynamic_libraries_to_binary_feature = feature(
|
|
name = "copy_dynamic_libraries_to_binary",
|
|
)
|
|
|
|
input_param_flags_feature = feature(
|
|
name = "input_param_flags",
|
|
flag_sets = [
|
|
flag_set(
|
|
actions = [
|
|
ACTION_NAMES.cpp_link_dynamic_library,
|
|
ACTION_NAMES.cpp_link_nodeps_dynamic_library,
|
|
],
|
|
flag_groups = [
|
|
flag_group(
|
|
flags = ["/IMPLIB:%{interface_library_output_path}"],
|
|
expand_if_available = "interface_library_output_path",
|
|
),
|
|
],
|
|
),
|
|
flag_set(
|
|
actions = all_link_actions,
|
|
flag_groups = [
|
|
flag_group(
|
|
flags = ["%{libopts}"],
|
|
iterate_over = "libopts",
|
|
expand_if_available = "libopts",
|
|
),
|
|
],
|
|
),
|
|
flag_set(
|
|
actions = all_link_actions +
|
|
[ACTION_NAMES.cpp_link_static_library],
|
|
flag_groups = [
|
|
flag_group(
|
|
iterate_over = "libraries_to_link",
|
|
flag_groups = [
|
|
flag_group(
|
|
iterate_over = "libraries_to_link.object_files",
|
|
flag_groups = [flag_group(flags = ["%{libraries_to_link.object_files}"])],
|
|
expand_if_equal = variable_with_value(
|
|
name = "libraries_to_link.type",
|
|
value = "object_file_group",
|
|
),
|
|
),
|
|
flag_group(
|
|
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(
|
|
flag_groups = [flag_group(flags = ["%{libraries_to_link.name}"])],
|
|
expand_if_equal = variable_with_value(
|
|
name = "libraries_to_link.type",
|
|
value = "interface_library",
|
|
),
|
|
),
|
|
flag_group(
|
|
flag_groups = [
|
|
flag_group(
|
|
flags = ["%{libraries_to_link.name}"],
|
|
expand_if_false = "libraries_to_link.is_whole_archive",
|
|
),
|
|
flag_group(
|
|
flags = ["/WHOLEARCHIVE:%{libraries_to_link.name}"],
|
|
expand_if_true = "libraries_to_link.is_whole_archive",
|
|
),
|
|
],
|
|
expand_if_equal = variable_with_value(
|
|
name = "libraries_to_link.type",
|
|
value = "static_library",
|
|
),
|
|
),
|
|
],
|
|
expand_if_available = "libraries_to_link",
|
|
),
|
|
],
|
|
),
|
|
],
|
|
)
|
|
|
|
fastbuild_feature = feature(
|
|
name = "fastbuild",
|
|
flag_sets = [
|
|
flag_set(
|
|
actions = [ACTION_NAMES.c_compile, ACTION_NAMES.cpp_compile],
|
|
flag_groups = [flag_group(flags = ["/Od", "/Z7"])],
|
|
),
|
|
flag_set(
|
|
actions = all_link_actions,
|
|
flag_groups = [
|
|
flag_group(
|
|
flags = [ctx.attr.fastbuild_mode_debug_flag, "/INCREMENTAL:NO"],
|
|
),
|
|
],
|
|
),
|
|
],
|
|
implies = ["generate_pdb_file"],
|
|
)
|
|
|
|
user_compile_flags_feature = feature(
|
|
name = "user_compile_flags",
|
|
flag_sets = [
|
|
flag_set(
|
|
actions = [
|
|
ACTION_NAMES.preprocess_assemble,
|
|
ACTION_NAMES.c_compile,
|
|
ACTION_NAMES.cpp_compile,
|
|
ACTION_NAMES.cpp_header_parsing,
|
|
ACTION_NAMES.cpp_module_compile,
|
|
ACTION_NAMES.cpp_module_codegen,
|
|
],
|
|
flag_groups = [
|
|
flag_group(
|
|
flags = ["%{user_compile_flags}"],
|
|
iterate_over = "user_compile_flags",
|
|
expand_if_available = "user_compile_flags",
|
|
),
|
|
],
|
|
),
|
|
],
|
|
)
|
|
|
|
archiver_flags_feature = feature(
|
|
name = "archiver_flags",
|
|
flag_sets = [
|
|
flag_set(
|
|
actions = [ACTION_NAMES.cpp_link_static_library],
|
|
flag_groups = [
|
|
flag_group(
|
|
flags = ["/OUT:%{output_execpath}"],
|
|
expand_if_available = "output_execpath",
|
|
),
|
|
flag_group(
|
|
flags = ["/MACHINE:X64"],
|
|
),
|
|
],
|
|
),
|
|
],
|
|
)
|
|
|
|
default_link_flags_feature = feature(
|
|
name = "default_link_flags",
|
|
enabled = True,
|
|
flag_sets = [
|
|
flag_set(
|
|
actions = all_link_actions,
|
|
flag_groups = [flag_group(flags = ctx.attr.default_link_flags)],
|
|
),
|
|
],
|
|
)
|
|
|
|
static_link_msvcrt_feature = feature(name = "static_link_msvcrt")
|
|
|
|
dynamic_link_msvcrt_debug_feature = feature(
|
|
name = "dynamic_link_msvcrt_debug",
|
|
flag_sets = [
|
|
flag_set(
|
|
actions = [ACTION_NAMES.c_compile, ACTION_NAMES.cpp_compile],
|
|
flag_groups = [flag_group(flags = ["/MDd"])],
|
|
),
|
|
flag_set(
|
|
actions = all_link_actions,
|
|
flag_groups = [flag_group(flags = ["/DEFAULTLIB:msvcrtd.lib"])],
|
|
),
|
|
],
|
|
requires = [feature_set(features = ["dbg"])],
|
|
)
|
|
|
|
dbg_feature = feature(
|
|
name = "dbg",
|
|
flag_sets = [
|
|
flag_set(
|
|
actions = [ACTION_NAMES.c_compile, ACTION_NAMES.cpp_compile],
|
|
flag_groups = [flag_group(flags = ["/Od", "/Z7"])],
|
|
),
|
|
flag_set(
|
|
actions = all_link_actions,
|
|
flag_groups = [
|
|
flag_group(
|
|
flags = [ctx.attr.dbg_mode_debug_flag, "/INCREMENTAL:NO"],
|
|
),
|
|
],
|
|
),
|
|
],
|
|
implies = ["generate_pdb_file"],
|
|
)
|
|
|
|
opt_feature = feature(
|
|
name = "opt",
|
|
flag_sets = [
|
|
flag_set(
|
|
actions = [ACTION_NAMES.c_compile, ACTION_NAMES.cpp_compile],
|
|
flag_groups = [flag_group(flags = ["/O2"])],
|
|
),
|
|
],
|
|
implies = ["frame_pointer"],
|
|
)
|
|
|
|
supports_interface_shared_libraries_feature = feature(
|
|
name = "supports_interface_shared_libraries",
|
|
enabled = True,
|
|
)
|
|
|
|
user_link_flags_feature = feature(
|
|
name = "user_link_flags",
|
|
flag_sets = [
|
|
flag_set(
|
|
actions = all_link_actions,
|
|
flag_groups = [
|
|
flag_group(
|
|
flags = ["%{user_link_flags}"],
|
|
iterate_over = "user_link_flags",
|
|
expand_if_available = "user_link_flags",
|
|
),
|
|
],
|
|
),
|
|
],
|
|
)
|
|
|
|
default_compile_flags_feature = feature(
|
|
name = "default_compile_flags",
|
|
enabled = True,
|
|
flag_sets = [
|
|
flag_set(
|
|
actions = [
|
|
ACTION_NAMES.assemble,
|
|
ACTION_NAMES.preprocess_assemble,
|
|
ACTION_NAMES.linkstamp_compile,
|
|
ACTION_NAMES.c_compile,
|
|
ACTION_NAMES.cpp_compile,
|
|
ACTION_NAMES.cpp_header_parsing,
|
|
ACTION_NAMES.cpp_module_compile,
|
|
ACTION_NAMES.cpp_module_codegen,
|
|
ACTION_NAMES.lto_backend,
|
|
ACTION_NAMES.clif_match,
|
|
],
|
|
flag_groups = [
|
|
flag_group(
|
|
flags = [
|
|
"/DCOMPILER_MSVC",
|
|
"/DNOMINMAX",
|
|
"/D_WIN32_WINNT=0x0601",
|
|
"/D_CRT_SECURE_NO_DEPRECATE",
|
|
"/D_CRT_SECURE_NO_WARNINGS",
|
|
"/bigobj",
|
|
"/Zm500",
|
|
"/EHsc",
|
|
"/wd4351",
|
|
"/wd4291",
|
|
"/wd4250",
|
|
"/wd4996",
|
|
],
|
|
),
|
|
],
|
|
),
|
|
],
|
|
)
|
|
|
|
msvc_compile_env_feature = feature(
|
|
name = "msvc_compile_env",
|
|
env_sets = [
|
|
env_set(
|
|
actions = [
|
|
ACTION_NAMES.c_compile,
|
|
ACTION_NAMES.cpp_compile,
|
|
ACTION_NAMES.cpp_module_compile,
|
|
ACTION_NAMES.cpp_module_codegen,
|
|
ACTION_NAMES.cpp_header_parsing,
|
|
ACTION_NAMES.assemble,
|
|
ACTION_NAMES.preprocess_assemble,
|
|
],
|
|
env_entries = [env_entry(key = "INCLUDE", value = ctx.attr.msvc_env_include)],
|
|
),
|
|
],
|
|
)
|
|
|
|
preprocessor_defines_feature = feature(
|
|
name = "preprocessor_defines",
|
|
enabled = True,
|
|
flag_sets = [
|
|
flag_set(
|
|
actions = [
|
|
ACTION_NAMES.assemble,
|
|
ACTION_NAMES.preprocess_assemble,
|
|
ACTION_NAMES.c_compile,
|
|
ACTION_NAMES.cpp_compile,
|
|
ACTION_NAMES.cpp_header_parsing,
|
|
ACTION_NAMES.cpp_module_compile,
|
|
],
|
|
flag_groups = [
|
|
flag_group(
|
|
flags = ["/D%{preprocessor_defines}"],
|
|
iterate_over = "preprocessor_defines",
|
|
),
|
|
],
|
|
),
|
|
],
|
|
)
|
|
|
|
generate_pdb_file_feature = feature(
|
|
name = "generate_pdb_file",
|
|
)
|
|
|
|
output_execpath_flags_feature = feature(
|
|
name = "output_execpath_flags",
|
|
flag_sets = [
|
|
flag_set(
|
|
actions = all_link_actions,
|
|
flag_groups = [
|
|
flag_group(
|
|
flags = ["/OUT:%{output_execpath}"],
|
|
expand_if_available = "output_execpath",
|
|
),
|
|
],
|
|
),
|
|
],
|
|
)
|
|
|
|
dynamic_link_msvcrt_no_debug_feature = feature(
|
|
name = "dynamic_link_msvcrt_no_debug",
|
|
flag_sets = [
|
|
flag_set(
|
|
actions = [ACTION_NAMES.c_compile, ACTION_NAMES.cpp_compile],
|
|
flag_groups = [flag_group(flags = ["/MD"])],
|
|
),
|
|
flag_set(
|
|
actions = all_link_actions,
|
|
flag_groups = [flag_group(flags = ["/DEFAULTLIB:msvcrt.lib"])],
|
|
),
|
|
],
|
|
requires = [
|
|
feature_set(features = ["fastbuild"]),
|
|
feature_set(features = ["opt"]),
|
|
],
|
|
)
|
|
|
|
disable_assertions_feature = feature(
|
|
name = "disable_assertions",
|
|
enabled = True,
|
|
flag_sets = [
|
|
flag_set(
|
|
actions = [ACTION_NAMES.c_compile, ACTION_NAMES.cpp_compile],
|
|
flag_groups = [flag_group(flags = ["/DNDEBUG"])],
|
|
with_features = [with_feature_set(features = ["opt"])],
|
|
),
|
|
],
|
|
)
|
|
|
|
has_configured_linker_path_feature = feature(name = "has_configured_linker_path")
|
|
|
|
supports_dynamic_linker_feature = feature(name = "supports_dynamic_linker", enabled = True)
|
|
|
|
no_stripping_feature = feature(name = "no_stripping")
|
|
|
|
linker_param_file_feature = feature(
|
|
name = "linker_param_file",
|
|
flag_sets = [
|
|
flag_set(
|
|
actions = all_link_actions +
|
|
[ACTION_NAMES.cpp_link_static_library],
|
|
flag_groups = [
|
|
flag_group(
|
|
flags = ["@%{linker_param_file}"],
|
|
expand_if_available = "linker_param_file",
|
|
),
|
|
],
|
|
),
|
|
],
|
|
)
|
|
|
|
ignore_noisy_warnings_feature = feature(
|
|
name = "ignore_noisy_warnings",
|
|
enabled = True,
|
|
flag_sets = [
|
|
flag_set(
|
|
actions = [ACTION_NAMES.cpp_link_static_library],
|
|
flag_groups = [flag_group(flags = ["/ignore:4221"])],
|
|
),
|
|
],
|
|
)
|
|
|
|
no_legacy_features_feature = feature(name = "no_legacy_features")
|
|
|
|
parse_showincludes_feature = feature(
|
|
name = "parse_showincludes",
|
|
flag_sets = [
|
|
flag_set(
|
|
actions = [
|
|
ACTION_NAMES.preprocess_assemble,
|
|
ACTION_NAMES.c_compile,
|
|
ACTION_NAMES.cpp_compile,
|
|
ACTION_NAMES.cpp_module_compile,
|
|
ACTION_NAMES.cpp_header_parsing,
|
|
],
|
|
flag_groups = [flag_group(flags = ["/showIncludes"])],
|
|
),
|
|
],
|
|
)
|
|
|
|
static_link_msvcrt_no_debug_feature = feature(
|
|
name = "static_link_msvcrt_no_debug",
|
|
flag_sets = [
|
|
flag_set(
|
|
actions = [ACTION_NAMES.c_compile, ACTION_NAMES.cpp_compile],
|
|
flag_groups = [flag_group(flags = ["/MT"])],
|
|
),
|
|
flag_set(
|
|
actions = all_link_actions,
|
|
flag_groups = [flag_group(flags = ["/DEFAULTLIB:libcmt.lib"])],
|
|
),
|
|
],
|
|
requires = [
|
|
feature_set(features = ["fastbuild"]),
|
|
feature_set(features = ["opt"]),
|
|
],
|
|
)
|
|
|
|
treat_warnings_as_errors_feature = feature(
|
|
name = "treat_warnings_as_errors",
|
|
flag_sets = [
|
|
flag_set(
|
|
actions = [ACTION_NAMES.c_compile, ACTION_NAMES.cpp_compile],
|
|
flag_groups = [flag_group(flags = ["/WX"])],
|
|
),
|
|
],
|
|
)
|
|
|
|
windows_export_all_symbols_feature = feature(name = "windows_export_all_symbols")
|
|
|
|
no_windows_export_all_symbols_feature = feature(name = "no_windows_export_all_symbols")
|
|
|
|
include_paths_feature = feature(
|
|
name = "include_paths",
|
|
enabled = True,
|
|
flag_sets = [
|
|
flag_set(
|
|
actions = [
|
|
ACTION_NAMES.assemble,
|
|
ACTION_NAMES.preprocess_assemble,
|
|
ACTION_NAMES.c_compile,
|
|
ACTION_NAMES.cpp_compile,
|
|
ACTION_NAMES.cpp_header_parsing,
|
|
ACTION_NAMES.cpp_module_compile,
|
|
],
|
|
flag_groups = [
|
|
flag_group(
|
|
flags = ["/I%{quote_include_paths}"],
|
|
iterate_over = "quote_include_paths",
|
|
),
|
|
flag_group(
|
|
flags = ["/I%{include_paths}"],
|
|
iterate_over = "include_paths",
|
|
),
|
|
flag_group(
|
|
flags = ["/I%{system_include_paths}"],
|
|
iterate_over = "system_include_paths",
|
|
),
|
|
],
|
|
),
|
|
],
|
|
)
|
|
|
|
linkstamps_feature = feature(
|
|
name = "linkstamps",
|
|
flag_sets = [
|
|
flag_set(
|
|
actions = all_link_actions,
|
|
flag_groups = [
|
|
flag_group(
|
|
flags = ["%{linkstamp_paths}"],
|
|
iterate_over = "linkstamp_paths",
|
|
expand_if_available = "linkstamp_paths",
|
|
),
|
|
],
|
|
),
|
|
],
|
|
)
|
|
|
|
targets_windows_feature = feature(
|
|
name = "targets_windows",
|
|
enabled = True,
|
|
implies = ["copy_dynamic_libraries_to_binary"],
|
|
)
|
|
|
|
linker_subsystem_flag_feature = feature(
|
|
name = "linker_subsystem_flag",
|
|
flag_sets = [
|
|
flag_set(
|
|
actions = all_link_actions,
|
|
flag_groups = [flag_group(flags = ["/SUBSYSTEM:CONSOLE"])],
|
|
),
|
|
],
|
|
)
|
|
|
|
static_link_msvcrt_debug_feature = feature(
|
|
name = "static_link_msvcrt_debug",
|
|
flag_sets = [
|
|
flag_set(
|
|
actions = [ACTION_NAMES.c_compile, ACTION_NAMES.cpp_compile],
|
|
flag_groups = [flag_group(flags = ["/MTd"])],
|
|
),
|
|
flag_set(
|
|
actions = all_link_actions,
|
|
flag_groups = [flag_group(flags = ["/DEFAULTLIB:libcmtd.lib"])],
|
|
),
|
|
],
|
|
requires = [feature_set(features = ["dbg"])],
|
|
)
|
|
|
|
frame_pointer_feature = feature(
|
|
name = "frame_pointer",
|
|
flag_sets = [
|
|
flag_set(
|
|
actions = [ACTION_NAMES.c_compile, ACTION_NAMES.cpp_compile],
|
|
flag_groups = [flag_group(flags = ["/Oy-"])],
|
|
),
|
|
],
|
|
)
|
|
|
|
compiler_output_flags_feature = feature(
|
|
name = "compiler_output_flags",
|
|
flag_sets = [
|
|
flag_set(
|
|
actions = [ACTION_NAMES.assemble],
|
|
flag_groups = [
|
|
flag_group(
|
|
flag_groups = [
|
|
flag_group(
|
|
flags = ["/Fo%{output_file}", "/Zi"],
|
|
expand_if_available = "output_file",
|
|
expand_if_not_available = "output_assembly_file",
|
|
),
|
|
],
|
|
expand_if_not_available = "output_preprocess_file",
|
|
),
|
|
],
|
|
),
|
|
flag_set(
|
|
actions = [
|
|
ACTION_NAMES.preprocess_assemble,
|
|
ACTION_NAMES.c_compile,
|
|
ACTION_NAMES.cpp_compile,
|
|
ACTION_NAMES.cpp_header_parsing,
|
|
ACTION_NAMES.cpp_module_compile,
|
|
ACTION_NAMES.cpp_module_codegen,
|
|
],
|
|
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",
|
|
),
|
|
],
|
|
),
|
|
],
|
|
)
|
|
|
|
nologo_feature = feature(
|
|
name = "nologo",
|
|
flag_sets = [
|
|
flag_set(
|
|
actions = [
|
|
ACTION_NAMES.c_compile,
|
|
ACTION_NAMES.cpp_compile,
|
|
ACTION_NAMES.cpp_module_compile,
|
|
ACTION_NAMES.cpp_module_codegen,
|
|
ACTION_NAMES.cpp_header_parsing,
|
|
ACTION_NAMES.assemble,
|
|
ACTION_NAMES.preprocess_assemble,
|
|
ACTION_NAMES.cpp_link_executable,
|
|
ACTION_NAMES.cpp_link_dynamic_library,
|
|
ACTION_NAMES.cpp_link_nodeps_dynamic_library,
|
|
ACTION_NAMES.cpp_link_static_library,
|
|
],
|
|
flag_groups = [flag_group(flags = ["/nologo"])],
|
|
),
|
|
],
|
|
)
|
|
|
|
smaller_binary_feature = feature(
|
|
name = "smaller_binary",
|
|
enabled = True,
|
|
flag_sets = [
|
|
flag_set(
|
|
actions = [ACTION_NAMES.c_compile, ACTION_NAMES.cpp_compile],
|
|
flag_groups = [flag_group(flags = ["/Gy", "/Gw"])],
|
|
with_features = [with_feature_set(features = ["opt"])],
|
|
),
|
|
flag_set(
|
|
actions = all_link_actions,
|
|
flag_groups = [flag_group(flags = ["/OPT:ICF", "/OPT:REF"])],
|
|
with_features = [with_feature_set(features = ["opt"])],
|
|
),
|
|
],
|
|
)
|
|
|
|
compiler_input_flags_feature = feature(
|
|
name = "compiler_input_flags",
|
|
flag_sets = [
|
|
flag_set(
|
|
actions = [
|
|
ACTION_NAMES.assemble,
|
|
ACTION_NAMES.preprocess_assemble,
|
|
ACTION_NAMES.c_compile,
|
|
ACTION_NAMES.cpp_compile,
|
|
ACTION_NAMES.cpp_header_parsing,
|
|
ACTION_NAMES.cpp_module_compile,
|
|
ACTION_NAMES.cpp_module_codegen,
|
|
],
|
|
flag_groups = [
|
|
flag_group(
|
|
flags = ["/c", "%{source_file}"],
|
|
expand_if_available = "source_file",
|
|
),
|
|
],
|
|
),
|
|
],
|
|
)
|
|
|
|
def_file_feature = feature(
|
|
name = "def_file",
|
|
flag_sets = [
|
|
flag_set(
|
|
actions = all_link_actions,
|
|
flag_groups = [
|
|
flag_group(
|
|
flags = ["/DEF:%{def_file_path}", "/ignore:4070"],
|
|
expand_if_available = "def_file_path",
|
|
),
|
|
],
|
|
),
|
|
],
|
|
)
|
|
|
|
msvc_env_feature = feature(
|
|
name = "msvc_env",
|
|
env_sets = [
|
|
env_set(
|
|
actions = [
|
|
ACTION_NAMES.c_compile,
|
|
ACTION_NAMES.cpp_compile,
|
|
ACTION_NAMES.cpp_module_compile,
|
|
ACTION_NAMES.cpp_module_codegen,
|
|
ACTION_NAMES.cpp_header_parsing,
|
|
ACTION_NAMES.assemble,
|
|
ACTION_NAMES.preprocess_assemble,
|
|
ACTION_NAMES.cpp_link_executable,
|
|
ACTION_NAMES.cpp_link_dynamic_library,
|
|
ACTION_NAMES.cpp_link_nodeps_dynamic_library,
|
|
ACTION_NAMES.cpp_link_static_library,
|
|
],
|
|
env_entries = [
|
|
env_entry(key = "PATH", value = ctx.attr.msvc_env_path),
|
|
env_entry(key = "TMP", value = ctx.attr.msvc_env_tmp),
|
|
env_entry(key = "TEMP", value = ctx.attr.msvc_env_tmp),
|
|
],
|
|
),
|
|
],
|
|
implies = ["msvc_compile_env", "msvc_link_env"],
|
|
)
|
|
features = [
|
|
no_legacy_features_feature,
|
|
nologo_feature,
|
|
has_configured_linker_path_feature,
|
|
no_stripping_feature,
|
|
targets_windows_feature,
|
|
copy_dynamic_libraries_to_binary_feature,
|
|
default_compile_flags_feature,
|
|
msvc_env_feature,
|
|
msvc_compile_env_feature,
|
|
msvc_link_env_feature,
|
|
include_paths_feature,
|
|
preprocessor_defines_feature,
|
|
parse_showincludes_feature,
|
|
generate_pdb_file_feature,
|
|
shared_flag_feature,
|
|
linkstamps_feature,
|
|
output_execpath_flags_feature,
|
|
archiver_flags_feature,
|
|
input_param_flags_feature,
|
|
linker_subsystem_flag_feature,
|
|
user_link_flags_feature,
|
|
default_link_flags_feature,
|
|
linker_param_file_feature,
|
|
static_link_msvcrt_feature,
|
|
static_link_msvcrt_no_debug_feature,
|
|
dynamic_link_msvcrt_no_debug_feature,
|
|
static_link_msvcrt_debug_feature,
|
|
dynamic_link_msvcrt_debug_feature,
|
|
dbg_feature,
|
|
fastbuild_feature,
|
|
opt_feature,
|
|
frame_pointer_feature,
|
|
disable_assertions_feature,
|
|
determinism_feature,
|
|
treat_warnings_as_errors_feature,
|
|
smaller_binary_feature,
|
|
ignore_noisy_warnings_feature,
|
|
user_compile_flags_feature,
|
|
sysroot_feature,
|
|
unfiltered_compile_flags_feature,
|
|
compiler_param_file_feature,
|
|
compiler_output_flags_feature,
|
|
compiler_input_flags_feature,
|
|
def_file_feature,
|
|
windows_export_all_symbols_feature,
|
|
no_windows_export_all_symbols_feature,
|
|
supports_dynamic_linker_feature,
|
|
supports_interface_shared_libraries_feature,
|
|
]
|
|
else:
|
|
targets_windows_feature = feature(
|
|
name = "targets_windows",
|
|
implies = ["copy_dynamic_libraries_to_binary"],
|
|
enabled = True,
|
|
)
|
|
|
|
copy_dynamic_libraries_to_binary_feature = feature(name = "copy_dynamic_libraries_to_binary")
|
|
|
|
gcc_env_feature = feature(
|
|
name = "gcc_env",
|
|
enabled = True,
|
|
env_sets = [
|
|
env_set(
|
|
actions = [
|
|
ACTION_NAMES.c_compile,
|
|
ACTION_NAMES.cpp_compile,
|
|
ACTION_NAMES.cpp_module_compile,
|
|
ACTION_NAMES.cpp_module_codegen,
|
|
ACTION_NAMES.cpp_header_parsing,
|
|
ACTION_NAMES.assemble,
|
|
ACTION_NAMES.preprocess_assemble,
|
|
ACTION_NAMES.cpp_link_executable,
|
|
ACTION_NAMES.cpp_link_dynamic_library,
|
|
ACTION_NAMES.cpp_link_nodeps_dynamic_library,
|
|
ACTION_NAMES.cpp_link_static_library,
|
|
],
|
|
env_entries = [
|
|
env_entry(key = "PATH", value = ctx.attr.tool_bin_path),
|
|
],
|
|
),
|
|
],
|
|
)
|
|
|
|
default_compile_flags_feature = feature(
|
|
name = "default_compile_flags",
|
|
enabled = True,
|
|
flag_sets = [
|
|
flag_set(
|
|
actions = [
|
|
ACTION_NAMES.linkstamp_compile,
|
|
ACTION_NAMES.cpp_compile,
|
|
ACTION_NAMES.cpp_header_parsing,
|
|
ACTION_NAMES.cpp_module_compile,
|
|
ACTION_NAMES.cpp_module_codegen,
|
|
ACTION_NAMES.lto_backend,
|
|
ACTION_NAMES.clif_match,
|
|
],
|
|
flag_groups = [flag_group(flags = ["-std=gnu++0x"])],
|
|
),
|
|
],
|
|
)
|
|
|
|
default_link_flags_feature = feature(
|
|
name = "default_link_flags",
|
|
enabled = True,
|
|
flag_sets = [
|
|
flag_set(
|
|
actions = all_link_actions,
|
|
flag_groups = [flag_group(flags = ["-lstdc++"])],
|
|
),
|
|
],
|
|
)
|
|
|
|
supports_dynamic_linker_feature = feature(
|
|
name = "supports_dynamic_linker",
|
|
enabled = True,
|
|
)
|
|
|
|
if ctx.attr.cpu == "x64_windows" and ctx.attr.compiler == "mingw-gcc":
|
|
compiler_param_file_feature = feature(
|
|
name = "compiler_param_file",
|
|
)
|
|
|
|
features = [
|
|
targets_windows_feature,
|
|
copy_dynamic_libraries_to_binary_feature,
|
|
gcc_env_feature,
|
|
default_compile_flags_feature,
|
|
compiler_param_file_feature,
|
|
default_link_flags_feature,
|
|
supports_dynamic_linker_feature,
|
|
]
|
|
else:
|
|
supports_pic_feature = feature(
|
|
name = "supports_pic",
|
|
enabled = True,
|
|
)
|
|
supports_start_end_lib_feature = feature(
|
|
name = "supports_start_end_lib",
|
|
enabled = True,
|
|
)
|
|
|
|
dbg_feature = feature(name = "dbg")
|
|
|
|
opt_feature = feature(name = "opt")
|
|
|
|
sysroot_feature = feature(
|
|
name = "sysroot",
|
|
enabled = True,
|
|
flag_sets = [
|
|
flag_set(
|
|
actions = [
|
|
ACTION_NAMES.preprocess_assemble,
|
|
ACTION_NAMES.linkstamp_compile,
|
|
ACTION_NAMES.c_compile,
|
|
ACTION_NAMES.cpp_compile,
|
|
ACTION_NAMES.cpp_header_parsing,
|
|
ACTION_NAMES.cpp_module_compile,
|
|
ACTION_NAMES.cpp_module_codegen,
|
|
ACTION_NAMES.lto_backend,
|
|
ACTION_NAMES.clif_match,
|
|
ACTION_NAMES.cpp_link_executable,
|
|
ACTION_NAMES.cpp_link_dynamic_library,
|
|
ACTION_NAMES.cpp_link_nodeps_dynamic_library,
|
|
],
|
|
flag_groups = [
|
|
flag_group(
|
|
flags = ["--sysroot=%{sysroot}"],
|
|
expand_if_available = "sysroot",
|
|
),
|
|
],
|
|
),
|
|
],
|
|
)
|
|
|
|
fdo_optimize_feature = feature(
|
|
name = "fdo_optimize",
|
|
flag_sets = [
|
|
flag_set(
|
|
actions = [ACTION_NAMES.c_compile, ACTION_NAMES.cpp_compile],
|
|
flag_groups = [
|
|
flag_group(
|
|
flags = [
|
|
"-fprofile-use=%{fdo_profile_path}",
|
|
"-fprofile-correction",
|
|
],
|
|
expand_if_available = "fdo_profile_path",
|
|
),
|
|
],
|
|
),
|
|
],
|
|
provides = ["profile"],
|
|
)
|
|
|
|
user_compile_flags_feature = feature(
|
|
name = "user_compile_flags",
|
|
enabled = True,
|
|
flag_sets = [
|
|
flag_set(
|
|
actions = [
|
|
ACTION_NAMES.assemble,
|
|
ACTION_NAMES.preprocess_assemble,
|
|
ACTION_NAMES.linkstamp_compile,
|
|
ACTION_NAMES.c_compile,
|
|
ACTION_NAMES.cpp_compile,
|
|
ACTION_NAMES.cpp_header_parsing,
|
|
ACTION_NAMES.cpp_module_compile,
|
|
ACTION_NAMES.cpp_module_codegen,
|
|
ACTION_NAMES.lto_backend,
|
|
ACTION_NAMES.clif_match,
|
|
],
|
|
flag_groups = [
|
|
flag_group(
|
|
flags = ["%{user_compile_flags}"],
|
|
iterate_over = "user_compile_flags",
|
|
expand_if_available = "user_compile_flags",
|
|
),
|
|
],
|
|
),
|
|
],
|
|
)
|
|
|
|
features = [
|
|
targets_windows_feature,
|
|
copy_dynamic_libraries_to_binary_feature,
|
|
gcc_env_feature,
|
|
supports_pic_feature,
|
|
supports_start_end_lib_feature,
|
|
default_compile_flags_feature,
|
|
default_link_flags_feature,
|
|
fdo_optimize_feature,
|
|
supports_dynamic_linker_feature,
|
|
dbg_feature,
|
|
opt_feature,
|
|
user_compile_flags_feature,
|
|
sysroot_feature,
|
|
]
|
|
|
|
tool_paths = [
|
|
tool_path(name = name, path = path)
|
|
for name, path in ctx.attr.tool_paths.items()
|
|
]
|
|
|
|
return cc_common.create_cc_toolchain_config_info(
|
|
ctx = ctx,
|
|
features = features,
|
|
action_configs = action_configs,
|
|
artifact_name_patterns = artifact_name_patterns,
|
|
cxx_builtin_include_directories = ctx.attr.cxx_builtin_include_directories,
|
|
toolchain_identifier = ctx.attr.toolchain_identifier,
|
|
host_system_name = ctx.attr.host_system_name,
|
|
target_system_name = ctx.attr.target_system_name,
|
|
target_cpu = ctx.attr.cpu,
|
|
target_libc = ctx.attr.target_libc,
|
|
compiler = ctx.attr.compiler,
|
|
abi_version = ctx.attr.abi_version,
|
|
abi_libc_version = ctx.attr.abi_libc_version,
|
|
tool_paths = tool_paths,
|
|
)
|
|
|
|
cc_toolchain_config = rule(
|
|
implementation = _impl,
|
|
attrs = {
|
|
"abi_libc_version": attr.string(),
|
|
"abi_version": attr.string(),
|
|
"compiler": attr.string(),
|
|
"cpu": attr.string(mandatory = True),
|
|
"cxx_builtin_include_directories": attr.string_list(),
|
|
"dbg_mode_debug_flag": attr.string(),
|
|
"default_link_flags": attr.string_list(default = []),
|
|
"fastbuild_mode_debug_flag": attr.string(),
|
|
"host_system_name": attr.string(),
|
|
"msvc_cl_path": attr.string(default = "vc_installation_error.bat"),
|
|
"msvc_env_include": attr.string(default = "msvc_not_found"),
|
|
"msvc_env_lib": attr.string(default = "msvc_not_found"),
|
|
"msvc_env_path": attr.string(default = "msvc_not_found"),
|
|
"msvc_env_tmp": attr.string(default = "msvc_not_found"),
|
|
"msvc_lib_path": attr.string(default = "vc_installation_error.bat"),
|
|
"msvc_link_path": attr.string(default = "vc_installation_error.bat"),
|
|
"msvc_ml_path": attr.string(default = "vc_installation_error.bat"),
|
|
"target_libc": attr.string(),
|
|
"target_system_name": attr.string(),
|
|
"tool_bin_path": attr.string(default = "not_found"),
|
|
"tool_paths": attr.string_dict(),
|
|
"toolchain_identifier": attr.string(),
|
|
},
|
|
provides = [CcToolchainConfigInfo],
|
|
)
|