| # 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], |
| ) |