blob: b86d290e02c516f442af1b9f67d227c52f63e440 [file] [log] [blame]
# Copyright 2025 Google LLC
#
# 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.
load("@bazel_tools//tools/build_defs/cc:action_names.bzl", "ACTION_NAMES")
load(
"@bazel_tools//tools/cpp:cc_toolchain_config_lib.bzl",
"feature",
"feature_set",
"flag_group",
"flag_set",
"tool_path",
)
all_link_actions = [
ACTION_NAMES.cpp_link_executable,
ACTION_NAMES.cpp_link_dynamic_library,
ACTION_NAMES.cpp_link_nodeps_dynamic_library,
]
all_compile_actions = [
ACTION_NAMES.c_compile,
ACTION_NAMES.assemble,
ACTION_NAMES.preprocess_assemble,
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,
]
def _impl(ctx):
tool_paths = [
tool_path(
name = "clang",
path = "wrappers/clang",
),
tool_path(
name = "gcc",
path = "wrappers/gcc",
),
tool_path(
name = "ld",
path = "wrappers/ld",
),
tool_path(
name = "ar",
path = "wrappers/ar",
),
tool_path(
name = "cpp",
path = "wrappers/cpp",
),
tool_path(
name = "gcov",
path = "/bin/false",
),
tool_path(
name = "nm",
path = "/bin/false",
),
tool_path(
name = "objdump",
path = "/bin/false",
),
tool_path(
name = "objcopy",
path = "wrappers/objcopy",
),
tool_path(
name = "strip",
path = "/bin/false",
),
]
# This is huge. Won't fit in 8K itcm,
# but should fit in the highmem variant.
printf_float_feature = feature(
name = "printf_float",
enabled = False,
flag_sets = [
flag_set(
actions = all_link_actions,
flag_groups = [
flag_group(
flags = [
"-u",
"_printf_float",
],
),
],
),
],
)
warnings_feature = feature(
name = "warnings",
enabled = True,
flag_sets = [
flag_set(
actions = all_compile_actions,
flag_groups = [
flag_group(
flags = [
"-Wall",
"-Werror",
],
),
],
),
],
)
includes_feature = feature(
name = "includes",
enabled = True,
flag_sets = [
flag_set(
actions = all_compile_actions,
flag_groups = [
flag_group(
flags = [
"-nostdinc",
"-isystem",
"external/toolchain_kelvin_v2/riscv32-unknown-elf/include/c++/15.0.1",
"-isystem",
"external/toolchain_kelvin_v2/riscv32-unknown-elf/include/c++/15.0.1/backward",
"-isystem",
"external/toolchain_kelvin_v2/riscv32-unknown-elf/include/c++/15.0.1/riscv32-unknown-elf",
"-isystem",
"external/toolchain_kelvin_v2/lib/gcc/riscv32-unknown-elf/15.0.1/include",
"-isystem",
"external/toolchain_kelvin_v2/riscv32-unknown-elf/include",
],
),
],
),
],
)
optimization_compile_flag_set = flag_set(
actions = all_compile_actions,
flag_groups = [
flag_group(
flags = [
"-g3",
"-Os",
"-ffunction-sections",
"-fdata-sections",
"-ffreestanding",
],
),
],
)
optimization_link_flag_set = flag_set(
actions = all_link_actions,
flag_groups = [
flag_group(
flags = [
"-Wl,--gc-sections",
],
),
],
)
architecture_flag_set = flag_set(
actions = all_compile_actions,
flag_groups = [
flag_group(
flags = [
"-march=rv32imf_zve32x_zicsr_zifencei_zbb",
"-mabi=ilp32",
"-mcmodel=medany",
"-nostdlib",
],
),
],
)
nano_spec_flag_set = flag_set(
actions = all_link_actions,
flag_groups = [
flag_group(
flags = [
"--specs=nano.specs",
"-lm",
"-lc",
"-lgcc",
"-nostartfiles",
],
),
],
)
semihosting_spec_flag_set = flag_set(
actions = all_link_actions,
flag_groups = [
flag_group(
flags = [
"--specs=htif_nano.specs",
"-lsemihost",
"-lm",
"-lc",
"-lgcc",
],
),
],
)
spec_flag_set = semihosting_spec_flag_set if ctx.attr.semihosting else nano_spec_flag_set
sys_feature = feature(
name = "sys_spec",
enabled = True,
flag_sets = [
architecture_flag_set,
spec_flag_set,
],
)
dbg_flag_set = flag_set(
actions = all_compile_actions,
flag_groups = [
flag_group(
flags = [
"-g3",
"-O0",
],
),
],
)
dbg_feature = feature(
name = "dbg",
enabled = False,
flag_sets = [
dbg_flag_set,
],
provides = ["compilation_mode"],
)
fastbuild_feature = feature(
name = "fastbuild",
enabled = False,
flag_sets = [
optimization_compile_flag_set,
optimization_link_flag_set,
],
provides = ["compilation_mode"],
)
opt_feature = feature(
name = "opt",
enabled = False,
flag_sets = [
optimization_compile_flag_set,
optimization_link_flag_set,
],
provides = ["compilation_mode"],
)
strip_debug_symbols_feature = feature(
name = "strip_debug_symbols",
flag_sets = [
flag_set(
actions = all_link_actions,
flag_groups = [
flag_group(
flags = ["-g"],
expand_if_available = "strip_debug_symbols",
),
],
),
],
)
return cc_common.create_cc_toolchain_config_info(
ctx = ctx,
toolchain_identifier = "kelvin_v2_toolchain",
host_system_name = "local",
target_system_name = "kelvin_v2",
target_cpu = "riscv32",
target_libc = "newlib",
compiler = "clang",
abi_version = "ilp32",
abi_libc_version = "ilp32",
features = [
includes_feature,
printf_float_feature,
sys_feature,
warnings_feature,
dbg_feature,
fastbuild_feature,
opt_feature,
strip_debug_symbols_feature,
],
tool_paths = tool_paths,
)
kelvin_v2_cc_toolchain_config = rule(
implementation = _impl,
attrs = {
"semihosting": attr.bool()
},
provides = [CcToolchainConfigInfo],
)