cmake - 如何使安装目标依赖于生成的(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
?
解决方案
函数protobuf_generate_cpp
和protobuf_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})
推荐阅读
- javascript - Vue&TypeScript:如果将 .vue 文件中的脚本部分从 JavaScript 重写为 TypeScript,则“找不到文件”
- package - ArrayFire.jl 和 chol
- javascript - 如何在编辑页面上显示数据库中的州和城市名称?
- python-3.x - Python Zeep:如何获取/检索标头信息:字符集
- java - 如何动态地将多个值添加到 HashMap 中的单个键?
- mysql - MYSQL 触发器中的 CASE 语句
- javascript - 将 JS 对象链接到 HTML div 时遇到问题
- excel - Excel VBA 文本框填充组合框
- mysql - sql - 查找该月的最大分数时如何按月分组?
- javascript - 在 react 上渲染 api 响应数组对象