gpt4 book ai didi

python - CMake:安装配置时尚未创建的文件

转载 作者:太空宇宙 更新时间:2023-11-04 01:16:57 25 4
gpt4 key购买 nike

我确实有一个带有 Protobuf 接口(interface)的项目,我需要使用 CMake 为 Python 编译和安装它。

我的 CMakeLists.txt 如下所示:

file(GLOB PROTO_INPUT "*.proto")
add_custom_target(BuildPythonInterface ALL
protoc -I=${CMAKE_CURRENT_SOURCE_DIR} --python_out=${CMAKE_CURRENT_BINARY_DIR} ${PROTO_INPUT}
DEPENDS ${PROTO_INPUT})
file(GLOB PROTOBUF_INTERFACE "${CMAKE_CURRENT_BINARY_DIR}/*_pb2.py")
LIST(APPEND PROTOBUF_INTERFACE "${INIT_PY}" )
install(FILES ${PROTOBUF_INTERFACE} DESTINATION "lib/python2.7/site-packages/${PROJECT_NAME}/proto/")

当运行它两次时,它确实像一个魅力一样工作,但是如果我删除我的构建目录并从头开始配置它,那么 file(GLOB) 找不到 Python 的 protobuf 接口(interface)文件PROTOBUF_INTERFACE "${CMAKE_CURRENT_BINARY_DIR}/*_pb2.py") 因为它们尚不存在,直到 make all 命令运行一次。

有没有办法让 CMake 在运行一次构建后执行上面的代码行?或者可能是其他(更清洁?)的方法?

最佳答案

首选的 CMake 方法是显式列出输入和输出文件,而不是使用 file(GLOB)。这有多种原因;你面对的是其中之一;事实上,使用 GLOB,添加文件不会导致 CMake 自动重新运行(因此文件不会被拾取)是另一个事实。

不过,如果 GLOB 是您特定场景中的最佳方式(正如您在评论中提到的),您可以使用 install(DIRECTORY) 解决此问题而不是安装文件。像这样:

file(GLOB PROTO_INPUT "*.proto")

add_custom_target(BuildPythonInterface ALL
protoc -I=${CMAKE_CURRENT_SOURCE_DIR} --python_out=${CMAKE_CURRENT_BINARY_DIR}/ToBeInstalled ${PROTO_INPUT}
DEPENDS ${PROTO_INPUT})

install(
DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/ToBeInstalled/
DESTINATION "lib/python2.7/site-packages/${PROJECT_NAME}/proto/"
FILES_MATCHING PATTERN "*_pb2.py"
)

install(FILES ${INIT_PY} DESTINATION "lib/python2.7/site-packages/${PROJECT_NAME}/proto/")

注意 DIRECTORY 参数中的尾部斜杠。重要的是:如果它不存在,名称 ToBeInstalled 将附加到目标目录。使用尾部斜线,此附加被抑制。

关于python - CMake:安装配置时尚未创建的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23883723/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com