【发布时间】:2021-11-27 15:58:27
【问题描述】:
我正在使用 Google protobuf-c-rpc 编写概念验证项目。
我想使用 CMake 来构建项目。我正在使用 CMake 3.19 版
这是我的目录结构:
├── build
│ ├── CMakeCache.txt
│ └── CMakeFiles
├── CMakeLists.txt
├── interfaces
|------ example.proto
└── src
├── client
├───── foo_client.py
└── server
|-- include
|── example-server.c
我已经在本地构建并安装了 protobuf-c-rpc 及其依赖项
我想用CMake构建如下:
- Glob 接口文件夹并编译所有
*.proto文件 - 从 *.proto 文件生成 C 头文件和源文件,并将它们分别放在 ${PROJECT_SOURCE_DIR}/server/include 和 ${PROJECT_SOURCE_DIR}/server/ 中
- 从 *.proto 文件生成 python 代码并将它们放在 ${PROJECT_SOURCE_DIR}/client/core 中
- 编译生成的C文件(包括example-server.c)
- 将步骤 4 中的目标文件与 protobuff-c 库链接(目前,我只设法为 protobuf-c* 构建静态库)
到目前为止,这是我的 CMakeLists.txt 文件:
cmake_minimum_required(VERSION 3.10)
# set the project name
project(MyProj VERSION 0.10)
file(GLOB PROTOBUF_DEFINITION_FILES "interfaces/*.proto")
set(PROTOBUF_INPUT_DIRECTORY "${PROJECT_SOURCE_DIR}")
set(PROTOBUF_OUTPUT_DIRECTORY "${PROJECT_SOURCE_DIR}/src/")
foreach(file ${PROTOBUF_DEFINITION_FILES})
# Generate C stubs
set(PROTOBUF_C_ARGUMENTS "protoc-c --proto_path=\"${PROTOBUF_INPUT_DIRECTORY}\" --c_out=\"${PROTOBUF_OUTPUT_DIRECTORY}\server\" \"${file}\"")
execute_process(COMMAND ${PROTOBUF_C_ARGUMENTS}
WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
RESULT_VARIABLE PROTOBUF_C_RESULT
OUTPUT_VARIABLE PROTOBUF_C_OUTPUT_VARIABLE)
# Generate Python bindings
set(PROTOBUF_ARGUMENTS "protoc --proto_path=\"${PROTOBUF_INPUT_DIRECTORY}\" --python_out=\"${PROTOBUF_OUTPUT_DIRECTORY}\client\" \"${file}\"")
execute_process(COMMAND ${PROTOBUF_ARGUMENTS}
WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
RESULT_VARIABLE PROTOBUF_RESULT
OUTPUT_VARIABLE PROTOBUF_OUTPUT_VARIABLE)
endforeach()
# Move C headers to include folder
file(GLOB GENERATED_C_HEADERS
"${PROTOBUF_OUTPUT_DIRECTORY}/server/*.pb-c.h"
)
file(COPY ${GENERATED_C_HEADERS} DESTINATION "${PROTOBUF_OUTPUT_DIRECTORY}/server/include/")
# file(REMOVE "${GENERATED_C_HEADERS}" ) doesn't work? why can't I use variable here?
file(REMOVE "${PROTOBUF_OUTPUT_DIRECTORY}/server/*.pb-c.h")
file(GLOB PROTOBUF_MODELS_INCLUDES "src/server/*.pb-c.c" "src/server/includes/*.h")
# Need to build (compile + link) my custom C sources + generated C stubs + link to protobuf-c-* libraries
# ... ?
如何修改上面的CMakeLists.txt,实现我上面描述的工作流程?
[[编辑]]
如果我还可以在 CMakeLists 选项中指定 C 可执行文件的调试和发布版本,那就太好了
【问题讨论】:
-
“(目前,我只设法为 protobuf-c* 构建静态库)” - 所以你向我们展示的代码除了链接之外什么都做?我不明白你的问题。顺便说一句,命令规范
COMMAND ${PROTOBUF_OUTPUT_DIRECTORY}似乎是错误的。不应该是COMMAND ${PROTOBUF_ARGUMENTS}吗? -
现有 CMakeLists.txt 文件不满足要求 2、3、4 和 5(文件未存放在正确的文件夹中) - 我想我可以添加单独的行来生成 C 和 Python 文件...我正在调查您对
${PROTOBUF_ARGUMENTS}的查询 -
您是否尝试在命令行中实现需求2(从
.proto生成C 文件)?了解成功的命令行有助于为execute_process构造参数。 -
@Tsyvarev 查看我的问题中对 CMakeLists.txt 文件所做的编辑
-
对于要求 4,您需要在
add_executable或add_library调用中枚举要编译的所有文件。 (第一个创建可执行文件,第二个创建一个库)。对于收集文件,您可以像往常一样使用file(GLOB)。有关与 Protobuf 的链接,请参见例如 that question。
标签: c cmake protocol-buffers grpc cmakelists-options