CMake:安装尚未在配置时间创建的文件

2024-09-30 22:14:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要用一个protoke来编译一个protoke和一个安装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/")

当运行两次时,它确实像一个符咒一样工作,但是如果我删除我的构建目录并从头开始配置它,那么在make all命令运行一次之前,make all不会找到Python的protobuf接口文件,因为它们还不存在。在

有没有办法让CMake在运行了一次构建之后执行上面的代码行? 或者其他人(清洁工?)这样做的方式?在


Tags: cmakeinputmakedircurrentallglobinterface
1条回答
网友
1楼 · 发布于 2024-09-30 22:14:46

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

然而,如果GLOBs是您特定场景中的最佳方法(正如您在评论中提到的),那么您可以通过使用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将被附加到目标目录中。对于尾随斜杠,此附加将被抑制。在

相关问题 更多 >