rules: Query C++ toolchain for cocotb builds

This change updates the cocotb rules to correctly query the C++
toolchain for the compiler and linker executables. Previously, the
rules were implicitly relying on system paths for these tools.

By using `ctx.toolchains["@bazel_tools//tools/cpp:toolchain_type"].cc`,
we ensure that the build is hermetic and uses the toolchain provided
by Bazel, making it more robust and reproducible.

Change-Id: Idbc0812724e9ebf364ee4c0eccfbc404726c3cc1
diff --git a/rules/coco_tb.bzl b/rules/coco_tb.bzl
index f8ad747..229b7ca 100644
--- a/rules/coco_tb.bzl
+++ b/rules/coco_tb.bzl
@@ -19,6 +19,10 @@
 load("@rules_python//python:defs.bzl", "py_library")
 
 def _verilator_cocotb_model_impl(ctx):
+    cc_toolchain = ctx.toolchains["@bazel_tools//tools/cpp:toolchain_type"].cc
+    ar_executable = cc_toolchain.ar_executable
+    compiler_executable = cc_toolchain.compiler_executable
+    ld_executable = cc_toolchain.ld_executable
     hdl_toplevel = ctx.attr.hdl_toplevel
     outdir_name = hdl_toplevel + "_build"
 
@@ -38,7 +42,7 @@
             --public-flat-rw \
             --prefix Vtop \
             -o {hdl_toplevel} \
-            -LDFLAGS "-Wl,-rpath external/kelvin_pip_deps_cocotb/cocotb/lib -L{cocotb_lib_path} -lcocotbvpi_verilator" \
+            -LDFLAGS "-Wl,-rpath {cocotb_lib_path} -L{cocotb_lib_path} -lcocotbvpi_verilator" \
             {trace} \
             {cflags} \
             $PWD/{verilator_cpp} \
@@ -55,11 +59,14 @@
         trace = "--trace" if ctx.attr.trace else "",
     )
 
-    make_cmd = "PATH=`dirname $(which ld)`:$PATH make -j $(nproc) -C {outdir} -f Vtop.mk {trace} CXX=`which g++` AR=`which ar` LINK=`which g++` > {make_log} 2>&1".format(
-        outdir=outdir,
-        cocotb_lib_path=cocotb_lib_path,
-        make_log=make_log.path,
+    make_cmd = "PATH=`dirname {ld}`:$PATH make -j $(nproc) -C {outdir} -f Vtop.mk {trace} CXX={cxx} AR={ar} LINK={cxx} > {make_log} 2>&1".format(
+        outdir = outdir,
+        cocotb_lib_path = cocotb_lib_path,
+        make_log = make_log.path,
         trace = "VM_TRACE=1" if ctx.attr.trace else "",
+        ar = ar_executable,
+        ld = ld_executable,
+        cxx = compiler_executable,
     )
 
     script = " && ".join([verilator_cmd.strip(), make_cmd])