flowchart TD
subgraph sub1
direction LR
A[CMake配置阶段] --> B[ev_add_project函数]
B --> C[检测interfaces目录]
C --> D["收集YAML文件 (file GLOB)"]
end
subgraph sub2
direction LR
E[调用_ev_add_interfaces函数] --> F[生成C++接口头文件]
F --> G[编译使用这些接口的模块]
end
sub1 --> sub2
接口YAML文件识别
CMake首先在 cmake/everest-generate.cmake 文件中的 ev_add_project 函数中检查项目是否包含interfaces目录:
# check for interfaces
set (INTERFACES_DIR "${EVEREST_PROJECT_DIR}/interfaces")
if (EXISTS ${INTERFACES_DIR})
message(STATUS "Adding interface definitions from ${INTERFACES_DIR}")
file(GLOB INTERFACE_FILES
${INTERFACES_DIR}/*.yaml
)
_ev_add_interfaces(${INTERFACE_FILES})
if (CALLED_FROM_WITHIN_PROJECT)
install(
DIRECTORY ${INTERFACES_DIR}
DESTINATION "${CMAKE_INSTALL_DATADIR}/everest"
FILES_MATCHING PATTERN "*.yaml"
)
endif ()
endif ()接口代码生成
系统调用 _ev_add_interfaces 函数处理这些YAML文件
add_custom_command(
# ...
COMMAND
${EV_CLI} interface generate-headers
--disable-clang-format
--schemas-dir "$<TARGET_PROPERTY:generate_cpp_files,EVEREST_SCHEMA_DIR>"
--output-dir "$<TARGET_PROPERTY:generate_cpp_files,EVEREST_GENERATED_INCLUDE_DIR>/generated/interfaces"
--everest-dir ${EVEREST_PROJECT_DIRS}
# ...
)这个命令使用EV_CLI工具将YAML接口定义转换为C++头文件。
生成的文件位置
生成的接口头文件位于构建目录的generated/include/generated/interfaces目录中。
整体工作流程
在构建时
CMake收集所有接口YAML文件
使用EV_CLI工具将YAML转换为C++头文件
生成对应的接口实现基类
在模块开发中
模块开发者继承和实现这些自动生成的接口基类
利用生成的接口代码实现模块间通信
在运行时
模块通过这些接口连接和通信
框架根据配置文件连接提供和请求相同接口的模块