Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions .gitmodules
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,12 @@
[submodule "firmware/c_board/bsp/tinyusb"]
path = firmware/c_board/bsp/tinyusb
url = https://github.com/qzhhhi/tinyusb.git
[submodule "firmware/c_board/bsp/cmsis-device-f4"]
path = firmware/c_board/bsp/cmsis-device-f4
url = https://github.com/STMicroelectronics/cmsis-device-f4.git
[submodule "firmware/c_board/bsp/stm32f4xx-hal-driver"]
path = firmware/c_board/bsp/stm32f4xx-hal-driver
url = https://github.com/STMicroelectronics/stm32f4xx-hal-driver.git
[submodule "firmware/c_board/bsp/cmsis-core"]
path = firmware/c_board/bsp/cmsis-core
url = https://github.com/STMicroelectronics/cmsis-core.git
110 changes: 110 additions & 0 deletions .scripts/patch_cubemx
Original file line number Diff line number Diff line change
@@ -0,0 +1,110 @@
#!/usr/bin/env python3

import argparse
import re
import sys
from pathlib import Path


STALE_FILES = (
Path(".mxproject"),
Path("CMakeLists.txt"),
Path("CMakePresets.json"),
Path("cmake/starm-clang.cmake"),
)

PATCH_RULES = (
(
re.compile(
r"/[^\s\"')]+/Drivers/STM32F4xx_HAL_Driver/(?P<suffix>[^\s\"')]+)"
),
r"${LIBRMCS_STM32_HAL_DRIVER_ROOT}/\g<suffix>",
),
(
re.compile(
r"/[^\s\"')]+/Drivers/CMSIS/Device/ST/STM32F4xx/(?P<suffix>[^\s\"')]+)"
),
r"${LIBRMCS_STM32_DEVICE_ROOT}/\g<suffix>",
),
(
re.compile(r"/[^\s\"')]+/Drivers/CMSIS/Include(?=$|[\s\"')])"),
r"${LIBRMCS_CMSIS_CORE_INCLUDE_DIR}",
),
)

ABSOLUTE_PATH_PATTERN = re.compile(r"(?:(?<=^)|(?<=[\s(]))/[^\s\"')]+")
PROJECT_LINK_LIBRARIES_PATTERN = re.compile(
r"target_link_libraries\(\$\{CMAKE_PROJECT_NAME\}\s+\$\{MX_LINK_LIBS\}\)"
)


def parse_args() -> argparse.Namespace:
parser = argparse.ArgumentParser(
description="Patch CubeMX-generated CMake files for librmcs layout."
)
parser.add_argument(
"--cubemx-root",
type=Path,
default=None,
help="Path to CubeMX root (default: firmware/c_board/cubemx).",
)
return parser.parse_args()


def resolve_cubemx_root(cubemx_root_arg: Path | None) -> Path:
if cubemx_root_arg is not None:
return cubemx_root_arg.resolve()
return (Path(__file__).resolve().parent.parent / "firmware/c_board/cubemx").resolve()


def remove_stale_files(cubemx_root: Path) -> None:
for rel_path in STALE_FILES:
(cubemx_root / rel_path).unlink(missing_ok=True)


def patch_stm32cubemx_cmake(cubemx_root: Path) -> None:
cmake_file = cubemx_root / "cmake/stm32cubemx/CMakeLists.txt"
if not cmake_file.is_file():
raise FileNotFoundError(f"Missing CubeMX CMake file: {cmake_file}")

original = cmake_file.read_text(encoding="utf-8")
patched = original

for pattern, replacement in PATCH_RULES:
patched = pattern.sub(replacement, patched)

patched = PROJECT_LINK_LIBRARIES_PATTERN.sub(
"target_link_libraries(${CMAKE_PROJECT_NAME} PRIVATE ${MX_LINK_LIBS})",
patched,
)

unresolved = sorted(set(ABSOLUTE_PATH_PATTERN.findall(patched)))
if unresolved:
unresolved_text = "\n".join(f" - {path}" for path in unresolved)
raise ValueError(
"Found unresolved absolute paths in stm32cubemx CMake file:\n"
f"{unresolved_text}"
)

if patched != original:
cmake_file.write_text(patched, encoding="utf-8")


def main() -> int:
args = parse_args()
cubemx_root = resolve_cubemx_root(args.cubemx_root)

if not cubemx_root.is_dir():
raise FileNotFoundError(f"CubeMX root directory not found: {cubemx_root}")

patch_stm32cubemx_cmake(cubemx_root)
remove_stale_files(cubemx_root)
return 0


if __name__ == "__main__":
try:
raise SystemExit(main())
except Exception as exc: # pylint: disable=broad-exception-caught
print(f"Error: {exc}", file=sys.stderr)
raise SystemExit(1)
16 changes: 7 additions & 9 deletions firmware/c_board/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -23,11 +23,11 @@ enable_language(C CXX ASM)
set(LIBRMCS_PROJECT_ROOT "${CMAKE_CURRENT_SOURCE_DIR}/../..")
cmake_path(ABSOLUTE_PATH LIBRMCS_PROJECT_ROOT NORMALIZE)

set(LIBRMCS_STM32_HAL_DRIVER_ROOT "${CMAKE_CURRENT_SOURCE_DIR}/bsp/stm32f4xx-hal-driver")
set(LIBRMCS_STM32_DEVICE_ROOT "${CMAKE_CURRENT_SOURCE_DIR}/bsp/cmsis-device-f4")
set(LIBRMCS_CMSIS_CORE_ROOT "${CMAKE_CURRENT_SOURCE_DIR}/bsp/cmsis-core")
set(LIBRMCS_CMSIS_CORE_INCLUDE_DIR "${LIBRMCS_CMSIS_CORE_ROOT}/Core/Include")
set(LIBRMCS_TINYUSB_ROOT "${CMAKE_CURRENT_SOURCE_DIR}/bsp/tinyusb")
if(NOT EXISTS "${LIBRMCS_TINYUSB_ROOT}/src/tusb.h")
message(FATAL_ERROR "TinyUSB submodule not found at ${LIBRMCS_TINYUSB_ROOT}. "
"Run: git submodule update --init firmware/c_board/bsp/tinyusb")
endif()

if(NOT DEFINED LIBRMCS_PROJECT_VERSION OR LIBRMCS_PROJECT_VERSION STREQUAL "")
execute_process(
Expand All @@ -42,12 +42,10 @@ message(STATUS "Librmcs project version: ${LIBRMCS_PROJECT_VERSION}")

add_executable(${CMAKE_PROJECT_NAME})

# Add libstdc++ for C++ code. This is consumed by stm32cubemx/CMakeLists.txt
# via TOOLCHAIN_LINK_LIBRARIES.
# Add libstdc++ for C++ code.
list(APPEND TOOLCHAIN_LINK_LIBRARIES "stdc++")

# Bring in CubeMX generated HAL build definitions.
add_subdirectory(bsp/HAL/cmake/stm32cubemx)
add_subdirectory(cubemx/cmake/stm32cubemx)

add_library(tinyusb_device OBJECT)
target_sources(tinyusb_device PRIVATE
Expand Down Expand Up @@ -153,7 +151,7 @@ target_compile_definitions(${CMAKE_PROJECT_NAME} PRIVATE
# Remove wrong libob.a dependency (CubeMX toolchain quirk)
list(REMOVE_ITEM CMAKE_C_IMPLICIT_LINK_LIBRARIES ob)

target_link_libraries(${CMAKE_PROJECT_NAME}
target_link_libraries(${CMAKE_PROJECT_NAME} PRIVATE
stm32cubemx
tinyusb_device
)
2 changes: 1 addition & 1 deletion firmware/c_board/CMakePresets.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
"hidden": true,
"generator": "Ninja",
"binaryDir": "${sourceDir}/build",
"toolchainFile": "${sourceDir}/bsp/HAL/cmake/gcc-arm-none-eabi.cmake"
"toolchainFile": "${sourceDir}/cubemx/cmake/gcc-arm-none-eabi.cmake"
},
{
"name": "debug",
Expand Down
39 changes: 0 additions & 39 deletions firmware/c_board/bsp/HAL/.mxproject

This file was deleted.

68 changes: 0 additions & 68 deletions firmware/c_board/bsp/HAL/CMakeLists.txt

This file was deleted.

38 changes: 0 additions & 38 deletions firmware/c_board/bsp/HAL/CMakePresets.json

This file was deleted.

Loading