Improve PICO_CONFIG_HEADER correctness in Bazel
diff --git a/bazel/BUILD.bazel b/bazel/BUILD.bazel
index 037b513..e4ab8f3 100644
--- a/bazel/BUILD.bazel
+++ b/bazel/BUILD.bazel
@@ -35,6 +35,21 @@
     ],
 )
 
+genrule(
+    name = "empty_extra_headers_file",
+    outs = ["generated_extra_include/pico_config_extra_headers.h"],
+    cmd = "echo > $@",
+    cmd_bat = "copy NUL $@",
+    visibility = ["//visibility:private"],
+)
+
+cc_library(
+    name = "no_extra_headers",
+    hdrs = ["generated_extra_include/pico_config_extra_headers.h"],
+    includes = ["generated_extra_include"],
+    visibility = ["//visibility:private"],
+)
+
 # An empty stub, useful for label_flag flags that need to point to a library,
 # but for some purposes the library needs to be a no-op.
 cc_library(
diff --git a/bazel/config/BUILD.bazel b/bazel/config/BUILD.bazel
index bfd2941..88dc5d3 100644
--- a/bazel/config/BUILD.bazel
+++ b/bazel/config/BUILD.bazel
@@ -122,22 +122,22 @@
     build_setting_default = False,
 )
 
-# PICO_BAZEL_CONFIG: PICO_CONFIG_EXTRA_HEADER, [Bazel only] The cc_library that provides "pico_config_extra_headers.h", default=//src/common/pico_base:no_extra_headers, group=pico_base
+# PICO_BAZEL_CONFIG: PICO_CONFIG_EXTRA_HEADER, [Bazel only] The cc_library that provides "pico_config_extra_headers.h", default=//bazel:no_extra_headers, group=pico_base
 label_flag(
     name = "PICO_CONFIG_EXTRA_HEADER",
-    build_setting_default = "//src/common/pico_base:no_extra_headers",
+    build_setting_default = "//bazel:no_extra_headers",
 )
 
 # PICO_BAZEL_CONFIG: PICO_CONFIG_PLATFORM_HEADER, [Bazel only] The cc_library that provides "pico_config_platform_headers.h", default=//src/common/pico_base:default_platform_headers, group=pico_base
 label_flag(
     name = "PICO_CONFIG_PLATFORM_HEADER",
-    build_setting_default = "//src/common/pico_base:default_platform_headers",
+    build_setting_default = "//src/boards:default",
 )
 
-# PICO_BAZEL_CONFIG: PICO_CONFIG_HEADER, [Bazel only] The cc_library that defines PICO_BOARD, PICO_CONFIG_HEADER, and other SDK critical defines (overrides PICO_BOARD setting), default=//src/boards:default, group=pico_base
+# PICO_BAZEL_CONFIG: PICO_CONFIG_HEADER, [Bazel only] The cc_library that defines PICO_BOARD, PICO_CONFIG_HEADER, and other SDK critical defines (overrides PICO_BOARD setting), default=//bazel:generate_config_header, group=pico_base
 label_flag(
     name = "PICO_CONFIG_HEADER",
-    build_setting_default = "//src/boards:default",
+    build_setting_default = "//bazel:generate_config_header",
 )
 
 # PICO_BAZEL_CONFIG: PICO_BTSTACK_CONFIG, [Bazel only] The cc_library that provides btstack_config.h, default=//bazel:empty_cc_lib, group=wireless
diff --git a/bazel/defs.bzl b/bazel/defs.bzl
index 14364ad..0e9df1a 100644
--- a/bazel/defs.bzl
+++ b/bazel/defs.bzl
@@ -1,3 +1,6 @@
+load("@bazel_skylib//rules:write_file.bzl", "write_file")
+load("@rules_cc//cc:defs.bzl", "cc_library")
+
 def _pico_generate_pio_header_impl(ctx):
     generated_headers = []
     for f in ctx.files.srcs:
@@ -87,3 +90,27 @@
         "@pico-sdk//bazel/constraint:is_pico_w": [],
         "//conditions:default": ["@platforms//:incompatible"],
     })
+
+def pico_board_config(name, platform_includes, **kwargs):
+    """A helper macro for declaring a Pico board to use with PICO_CONFIG_HEADER.
+
+    This generates pico_config_platform_headers.h using the list of
+    includes provided in `platform_includes`, and the final artifact is
+    a cc_library that you can configure //bazel/config:PICO_CONFIG_HEADER to
+    point to.
+    """
+    _hdr_dir = "{}_generated_includes".format(name)
+    _hdr_path = "{}/pico_config_platform_headers.h".format(_hdr_dir)
+    write_file(
+        name = "{}_platform_headers_file".format(name),
+        out = _hdr_path,
+        content = ['#include "{}"'.format(inc) for inc in platform_includes],
+    )
+    kwargs.setdefault("hdrs", [])
+    kwargs["hdrs"].append(_hdr_path)
+    kwargs.setdefault("includes", [])
+    kwargs["includes"].append(_hdr_dir)
+    cc_library(
+        name = name,
+        **kwargs
+    )
diff --git a/bazel/util/transition.bzl b/bazel/util/transition.bzl
index 2a5e32c..d0baf0d 100644
--- a/bazel/util/transition.bzl
+++ b/bazel/util/transition.bzl
@@ -26,6 +26,7 @@
     from. The common `src` attr tells the transition which build rule to apply
     the transition to.
     """
+
     def _flag_override_impl(settings, attrs):
         final_overrides = {}
         if flag_overrides != None:
diff --git a/src/boards/BUILD.bazel b/src/boards/BUILD.bazel
index 2390ad0..ba0dfa2 100644
--- a/src/boards/BUILD.bazel
+++ b/src/boards/BUILD.bazel
@@ -1,3 +1,4 @@
+load("//bazel:defs.bzl", "pico_board_config")
 load("//bazel/util:multiple_choice_flag.bzl", "declare_flag_choices", "flag_choice")
 
 package(default_visibility = ["//visibility:public"])
@@ -62,14 +63,18 @@
 
 # PICO_BUILD_DEFINE: PICO_BOARD, Name of board, type=string, default=CMake PICO_BOARD variable, group=pico_base
 [
-    cc_library(
+    pico_board_config(
         name = board,
         hdrs = BOARD_CHOICE_FILES,
         defines = [
             'PICO_BOARD=\\"{}\\"'.format(board),
-            'PICO_CONFIG_HEADER="boards/{}.h"'.format(board),
         ],
         includes = ["include"],
+        platform_includes = [
+            "cmsis/rename_exceptions.h",
+            "boards/{}.h".format(board),
+        ],
+        deps = ["//src/rp2_common/cmsis:rename_exceptions"],
     )
     for board in BOARD_CHOICES
 ]
diff --git a/src/common/pico_base/BUILD.bazel b/src/common/pico_base/BUILD.bazel
index e05d916..73fd1f2 100644
--- a/src/common/pico_base/BUILD.bazel
+++ b/src/common/pico_base/BUILD.bazel
@@ -1,5 +1,4 @@
 load("@bazel_skylib//rules:run_binary.bzl", "run_binary")
-load("@bazel_skylib//rules:write_file.bzl", "write_file")
 
 package(default_visibility = ["//visibility:public"])
 
@@ -154,49 +153,3 @@
         ":pico_base_interface",
     ],
 )
-
-genrule(
-    name = "empty_extra_headers_file",
-    outs = ["generated_include/pico_config_extra_headers.h"],
-    cmd = "echo > $@",
-    cmd_bat = "copy NUL $@",
-    visibility = ["//visibility:private"],
-)
-
-_RP2040_DEFAULT_HEADER_CONTENTS = [
-    '#include "cmsis/rename_exceptions.h"',
-]
-
-write_file(
-    name = "rp2040_default_platform_headers_file",
-    out = "generated_rp2040_include/pico_config_platform_headers.h",
-    content = _RP2040_DEFAULT_HEADER_CONTENTS,
-)
-
-genrule(
-    name = "empty_paltform_headers_file",
-    outs = ["generated_include/pico_config_platform_headers.h"],
-    cmd = "echo > $@",
-    cmd_bat = "copy NUL $@",
-    visibility = ["//visibility:private"],
-)
-
-cc_library(
-    name = "no_extra_headers",
-    hdrs = ["generated_include/pico_config_extra_headers.h"],
-    includes = ["generated_include"],
-    visibility = ["//visibility:private"],
-)
-
-cc_library(
-    name = "default_platform_headers",
-    hdrs = select({
-        "//bazel/constraint:host": ["generated_include/pico_config_platform_headers.h"],
-        "//conditions:default": ["generated_rp2040_include/pico_config_platform_headers.h"],
-    }),
-    includes = select({
-        "//bazel/constraint:host": ["generated_include"],
-        "//conditions:default": ["generated_rp2040_include"],
-    }),
-    visibility = ["//visibility:private"],
-)
diff --git a/src/rp2_common/cmsis/BUILD.bazel b/src/rp2_common/cmsis/BUILD.bazel
index f7fca7b..c378729 100644
--- a/src/rp2_common/cmsis/BUILD.bazel
+++ b/src/rp2_common/cmsis/BUILD.bazel
@@ -8,15 +8,16 @@
     name = "rename_exceptions",
     hdrs = ["include/cmsis/rename_exceptions.h"],
     # This is mildly odd, but intentional. We really don't want this header
-    # to have extra deps, but this should always be defined.
-    defines = ["LIB_CMSIS_CORE=1"],
+    # to have extra deps, and this header is touched by the host build.
+    defines = select({
+        "//bazel/constraint:host": [],
+        "//conditions:default": ["LIB_CMSIS_CORE=1"],
+    }),
     includes = ["include"],
-    target_compatible_with = compatible_with_rp2(),
 )
 
 cc_library(
     name = "cmsis_core",
-    defines = ["LIB_CMSIS_CORE=1"],
     srcs = [
         "stub/CMSIS/Device/RaspberryPi/RP2040/Source/system_RP2040.c",
     ],
@@ -33,6 +34,7 @@
         "stub/CMSIS/Device/RaspberryPi/RP2040/Include/RP2040.h",
         "stub/CMSIS/Device/RaspberryPi/RP2040/Include/system_RP2040.h",
     ],
+    defines = ["LIB_CMSIS_CORE=1"],
     includes = [
         "stub/CMSIS/Core/Include",
         "stub/CMSIS/Device/RaspberryPi/RP2040/Include",
diff --git a/src/rp2_common/pico_standard_link/BUILD.bazel b/src/rp2_common/pico_standard_link/BUILD.bazel
index 1117b27..536909e 100644
--- a/src/rp2_common/pico_standard_link/BUILD.bazel
+++ b/src/rp2_common/pico_standard_link/BUILD.bazel
@@ -97,6 +97,7 @@
         "//bazel/config:PICO_DEFAULT_BINARY_INFO",
         "//bazel/config:PICO_DEFAULT_LINKER_SCRIPT",
         "//src/common/pico_base:pico_base_interface",
+        "//src/rp2_common/cmsis:cmsis_core",
         "//src/rp2_common/pico_bootrom",
         "//src/rp2_common/pico_platform",
         "//src/rp2_common/pico_platform:hardware_regs",