CMake用于protobuff-c-rpc项目-生成c和python文件



我正在使用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构建如下:

  1. 删除interfaces文件夹并编译所有的*.proto文件
  2. 生成C头文件和源文件。并将它们分别放在${PROJECT_SOURCE_DIR}/server/include和${PROJECT_SOURCE_DIR}/server/
  3. 生成python代码从*。原型文件放在$ {PROJECT_SOURCE_DIR}/客户/核心
  4. 编译生成的C文件(包括example-server.c)
  5. 将步骤4中的对象文件与protobuf-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可执行

不要在CMake配置阶段这样做。在构建阶段完成。

CMake是一个构建系统生成器,构建系统需要依赖项。模型的依赖性。这个文件取决于那个文件和这个命令

这是一个简短的脚本,也许应该让你开始。我在这里写了脚本,它可能充满了错误和拼写错误:

# Glob the interfaces folder 
file(GLOB files interfaces/*.proto)
set(pythonouts) # list for python output files
set(srcs)  # list for c/h generated sources
foreach(file IN LISTS files)
get_filename_component(out ${file} NAME_WE)
# Generate C headers and source files from the *.proto files and place 
# them in ${PROJECT_SOURCE_DIR}/server/include and 
# ${PROJECT_SOURCE_DIR}/server/ respectively
add_custom_command(
COMMENT "Generate this and that from ${file} using proto-c"
COMMAND protoc-c
--proto_path=${PROTOBUF_INPUT_DIRECTORY}
--c_out=${PROTOBUF_OUTPUT_DIRECTORY}/server/
${file}
COMMAND ${CMAKE_COMMAND} -E copy
${PROTOBUF_OUTPUT_DIRECTORY}/server/${out}.pb-c.h
${PROTOBUF_OUTPUT_DIRECTORY}/server/include/${out}.pb-c.h
COMMAND ${CMAKE_COMMAND} -E remove
${PROTOBUF_OUTPUT_DIRECTORY}/server/${out}.pb-c.h
DEPENDS
${file}
OUTPUT
${PROTOBUF_OUTPUT_DIRECTORY}server${out}.pb-c.c
${PROTOBUF_OUTPUT_DIRECTORY}serverinclude${out}.pb-c.h
VERBATIM
)
list(APPEND srcs
${PROTOBUF_OUTPUT_DIRECTORY}serverinclude${out}.pb-c.h
${PROTOBUF_OUTPUT_DIRECTORY}server${out}.pb-c.c
)
# Generate python code from the *.proto files and place
# them in ${PROJECT_SOURCE_DIR}/client/core
add_custom_command(
COMMENT "Generate python this and that from ${file} using proto"
COMMAND proto ....
DEPENDS ${file}
OUTPUT
${PROTOBUF_OUTPUT_DIRECTORY}server${out}.pb.python
VERBATIM
)
list(APPEND pythonouts
${PROTOBUF_OUTPUT_DIRECTORY}server${out}.pb.python
)
endfor()
add_custom_command(gen-python-files ALL)
depends(gen-python-files ${pythonouts})
# Compile the C files generated (including example-server.c)
add_executable(someexe example-server.c ${srcs})
# Link the object files from step 4 with the protobuff-c libs (currently, I have only managed to build the static libs for protobuf-c*)
# https://cmake.org/cmake/help/latest/module/FindProtobuf.html
find_package(Protobuf REQUIRED)
target_link_libraries(someexe PUHBLIC ${Protobuf_LIBRARIES})

如果你想自己做的话,你可能会想从cmake findprotobuf中获得灵感。

最新更新