背景
上面的文章中提出了一种 STM32 + Git 多人协作开发方案,该方案虽然能对单个 STM32 项目进行较好的版本管理,却无法较好的进行驱动复用。如果希望维护一套可以在项目中复用的驱动,能采用的方案只有单独维护驱动仓库,在使用的时候复制到项目仓库内。这种形式会导致下游难以收到上游的更新,下游发现了 bug 自行修复也难以同步到上游,造成各模块不同步。
本文将提出基于 submodule 的模块分离方案。
IMPORTANT
该方案依赖 CMake,需要使用 STM32CubeMX 的 CMake 工具链
使用模块仓库
在新项目中使用
假设我们有一个模块仓库地址 https://github.com/HITSZ-WTRobot/motor_drivers
要使用这个仓库需要三步
-
将这个仓库添加到 submodule
例如,模块目录在
./Modules,我们进入这个目录cd Modules(或者直接在./Modules打开终端),并运行1
git submodule add https://github.com/HITSZ-WTRobot/motor_drivers
-
将这个 submodule 目录添加到 CMake
在根目录的
CMakeLists.txt里新增1
add_subdirectory(Modules/motor_drivers/UserCode)
INFO
大部分情况下 add_subdirectory 传入的参数都是 submodule 下的 UserCode 路径。
少数情况如 s-curve-planner 仓库是直接导入根路径
-
将 模块添加到 target
在根目录的 CMakeLists.txt 里找到
1
target_link_libraries(${CMAKE_PROJECT_NAME} ...)
在里面添加模块名,一般情况下模块名是仓库名
INFO
模块名可以在 模块目录/UserCode/CMakeLists.txt 里找到,格式如下
1
add_library(motor_drivers STATIC ${ALL_SOURCES})
这里
motor_drivers就是模块名
拉取一个使用了模块的项目
在拉取有 submodule 的项目后,需要在项目根目录再运行
1 | git submodule update --init --remote |
更新项目里的模块
运行
1 | git submodule update --remote |
模块仓库编写
为了使模块仓库能够独立编译,模块仓库也应当是一个完整的项目。在之前的协作方案中我们提出
所有的项目代码都应当放在
UserCode下,并分层编写
所以模块只需在 UserCode 下创建一个 CMakeLists.txt,并从中导出模块。
INFO
由于模块编写需要 CMake 基础,如果只是使用仓库不需要知道,本文不具体介绍
以下是一份示例
1 | # UserCode/CMakeLists.txt |