首页 > 解决方案 > 如何使安装目标依赖于生成的(protobuf)文件

问题描述

我们有一个项目,我们有不同的应用程序,这些应用程序带有 protobuf 定义,我们为此提供 python 绑定作为副作用。我们遇到了问题,当我们想将它们与其他软件一起安装时,cmake 抱怨要创建的绑定不存在。

这是一个行为错误的最小样本:

// foo.proto
message Foo {
    uint32 foo = 1;
}

# CMakeLists.txt
project(foobar)
cmake_minimum_required(VERSION 3.16)

find_package(Protobuf REQUIRED)

protobuf_generate_cpp(FOO_SRC FOO_HDR foo.proto)
protobuf_generate_python(FOO_PY foo.proto)

install(FILES ${FOO_PY} DESTINATION "share/proto/")

$ make install
-- Configuring done
-- Generating done
-- Build files have been written to: /tmp/foobar
Install the project...
-- Install configuration: ""
CMake Error at cmake_install.cmake:41 (file):
  file INSTALL cannot find "/tmp/foobar/foo_pb2.py": No such file or
  directory.

我如何说服 CMake 在我运行时构建绑定make install

标签: cmakedependencies

解决方案


函数protobuf_generate_cppprotobuf_generate_python实际上是创建自定义命令add_custom_command)。这些功能的文档中对此进行了说明。

为了使自定义命令起作用,它应该是一些使用(或依赖于)自定义命令创建的文件的目标。

在的情况下protobuf_generate_cpp,通常使用add_library/add_executable命令执行消费。

但是可以创建一个取决于给定文件的自定义目标:

protobuf_generate_cpp(FOO_SRC FOO_HDR foo.proto)
protobuf_generate_python(FOO_PY foo.proto)

add_custom_target(proto_target ALL DEPENDS ${FOO_SRC} ${FOO_HDR} ${FOO_PY})

推荐阅读