在 CMake 中构建时运行 python 脚本,不需要依赖项

Posted

技术标签:

【中文标题】在 CMake 中构建时运行 python 脚本,不需要依赖项【英文标题】:Running a python script at build time in CMake, requires no dependencies 【发布时间】:2021-02-11 09:54:46 【问题描述】:

我有一个 python 脚本 h2py.py 将头文件 .hpp 转换为 .py 文件。

我希望每次使用 CMake 构建项目时都运行这个 python 脚本。 没有其他项目或文件依赖于脚本生成的文件。

到目前为止,我已经尝试过:

find_package(PythonInterp REQUIRED)

add_custom_target(
 run ALL
 COMMAND $PYTHON_EXECUTABLE $CMAKE_CURRENT_SOURCE_DIR/include/converter/h2py.py $CMAKE_CURRENT_SOURCE_DIR/include/converter/
 COMMENT "Converting .hpp file to .py file"
)

add_dependencies(converter run)

但这不会生成 .hpp 文件的 .py 等效文件(在脚本中指定)

EDIT :当我在终端中运行 python 脚本 h2py.py 时,它会按预期生成 .hpp 文件的 .py 等效值。但是当我运行 CMake 文件时它不会生成 .py 文件。

这是整个 CMake 文件:

cmake_minimum_required(VERSION 2.8.3)
project(converter)

set(CMAKE_BUILD_TYPE release)
add_compile_options(-std=c++11)

## Find catkin macros and libraries
## if COMPONENTS list like find_package(catkin REQUIRED COMPONENTS xyz)
## is used, also find other catkin packages
find_package(catkin REQUIRED
    roscpp
    geometry_msgs
    eigen_conversions
    std_msgs
    tf_conversions
    tf
    genmsg
    message_generation
    sensor_msgs
    rospy
    gazebo_msgs
)

catkin_package(
    #DEPENDS Eigen libpcl-all-dev gnuplot
    CATKIN_DEPENDS roscpp sensor_msgs tf_conversions tf geometry_msgs message_generation
    INCLUDE_DIRS include
    LIBRARIES $PROJECT_NAME
    )
###########
## Build ##
###########

## Specify additional locations of header fils
## Your package locations should be listed before other locations
include_directories(
 include
 $catkin_INCLUDE_DIRS
)

## Declare a C++ library
 add_library($PROJECT_NAME
   src/$PROJECT_NAME/motion_covariance.cpp
   src/$PROJECT_NAME/tf_utils.cpp
 )

target_link_libraries($PROJECT_NAME  $catkin_LIBRARIES  $Boost_LIBRARIES  )

find_package(PythonInterp REQUIRED)

add_custom_target(
 run ALL
 COMMAND $PYTHON_EXECUTABLE $CMAKE_CURRENT_SOURCE_DIR/include/converter/h2py.py $CMAKE_CURRENT_SOURCE_DIR/include/converter/
 COMMENT "Converting .hpp file to .py file"
)

add_dependencies(converter run)

【问题讨论】:

“但是这不会生成 .hpp 文件的 .py 等效文件(在脚本中指定)” - 你的意思是你的命令在构建时不运行该项目?我发现这是不可能的,因为您为 add_custom_target 指定了 ALL 关键字。请详细说明你的情况。 当我在终端中运行 python 脚本 h2py.py 时,它会按预期生成 .hpp 文件的 .py eqvivalent。但是当我运行 CMake 文件时它不会生成 .py 文件 可能您的脚本没有准备好从构建目录运行。如果您希望 CMake 从另一个目录(例如从源目录)运行您的脚本,请将适当的 WORKING_DIRECTORY 选项添加到 add_custom_command。如果这不起作用,那么问题出在您的 python 脚本中,如果不查看它,我们将无法帮助您。 感谢@Tsyvarev,通过设置WORKING_DIRECTORY,它开始工作了!!! 【参考方案1】:

根据@Tsyvarev 的评论,通过将 WORKING_DIRECTORY 选项设置为 add_custom_command 解决了问题!

【讨论】:

以上是关于在 CMake 中构建时运行 python 脚本,不需要依赖项的主要内容,如果未能解决你的问题,请参考以下文章

如何在构建之前使CMake运行python脚本,以便为我的项目生成文件以在构建中使用?

如何在CMAKE和CLION中的每次构建后运行复制脚本? [重复]

如何使用 Visual Studio Code 为 cmake 添加预构建步骤?

在 CMake 中使用 setup.py 构建 python 包

当 CMake 中的生成器或输入发生更改时,如何仅构建自动生成的代码?

如何在 CMake 中构建过程后复制目标的所有运行时依赖项?