Cmake 如何使安装目标依赖于生成的(protobuf)文件
我们有一个项目,在这个项目中,我们有不同的应用程序,它们带有protobuf定义,我们提供了python绑定作为副作用。我们遇到了一个问题,当我们想将它们与软件的其余部分一起安装时,cmake抱怨要创建的绑定不存在 这是一个行为错误的最小示例:Cmake 如何使安装目标依赖于生成的(protobuf)文件,cmake,dependencies,Cmake,Dependencies,我们有一个项目,在这个项目中,我们有不同的应用程序,它们带有protobuf定义,我们提供了python绑定作为副作用。我们遇到了一个问题,当我们想将它们与软件的其余部分一起安装时,cmake抱怨要创建的绑定不存在 这是一个行为错误的最小示例: // foo.proto message Foo { uint32 foo = 1; } # CMakeLists.txt project(foobar) cmake_minimum_required(VERSION 3.16) find_p
// 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.
当我运行
makeinstall
时,如何说服CMake构建绑定?函数protobuf\u generate\u cpp
和protobuf\u generate\u python
实际上是创建自定义命令()。这在这些功能的中有所说明
要使自定义命令正常工作,它应该是某个目标,该目标使用自定义命令创建的文件(或取决于该文件)
在protobuf\u generate\u cpp
的情况下,通常使用add\u library
/add\u executable
命令执行消耗
但是可以创建一个依赖于给定文件的自定义目标:
protobuf\u generate\u cpp(FOO\u SRC FOO\u HDR FOO.proto)
protobuf_generate_python(FOO_PY FOO.proto)
添加自定义目标(原型目标全部依赖${FOO\u SRC}${FOO\u HDR}${FOO\u PY})
是否可以拆分add\u custom\u target
声明和依赖项?我试着做一个add_custom_target(proto_target ALL)
,然后是add_target_依赖项(proto_target${FOO_PY})
,但这不起作用,而add_custom_target(proto_target ALL dependensited${FOO_PY})起作用。这是一个更大系统的一部分,如果我只需要引入一个目标,并在以后添加依赖项(这是一些内部函数的一部分,我不想创建很多目标),这对我来说是很方便的。此外,我不知道在文档中的何处搜索此行为。在创建自定义目标时,只能使用dependence
子句指定文件的依赖关系。此外,如果文件是由add_custom_命令
生成的,则只能将其添加到同一目录中的目标:这在中有明确说明。但在任何时候,您都可以使用命令“附加”到其他目标。