【问题标题】:CMake: custom_target argument forwarding to specific commandCMake:custom_target 参数转发到特定命令
【发布时间】:2020-01-13 15:41:07
【问题描述】:

我想在激活 python 虚拟环境的同时执行 python 脚本。 此脚本 (run_smth.py) 有输入参数。

是否有可能创建自定义目标run_my_script,以便在配置后只需键入make run_my_script arg1 arg2,这将等于. /path_to_venv/bin/activate && python3 run_smth.py arg1 arg2

问题是我希望在完成 CMake 配置后能够以方便的方式执行此脚本。

【问题讨论】:

  • 是的,你可以这样做,但是将通过make 传递给自定义目标的参数是困难的,如果不是不可能的话。这些论点arg1 arg2 的静态程度如何?如果您在 CMake 配置时设置它们(即cmake -DARG1=arg1 -DARG2=arg2),这将是可以实现的。
  • @squareskittles 更具体地说,就是手动运行一些自动化测试。为了做到这一点,有人需要 a) 激活 python 虚拟环境(通过 build 文件夹中的特殊目标创建); b) 调用放置在 src 目录中某处的 python 脚本。该脚本有一些标志(如配置/测试模式的路径等)。我想避免步骤'a'并弄乱相对路径,只需调用例如'make run_tests -sanity'

标签: python cmake


【解决方案1】:

我不知道有任何支持将参数传递给 CMake 自定义目标,正如您所描述的那样。在您的情况下,参数需要通过 make 传递,但 CMake 还需要支持通过 Visual Studio、Ninja 和其他生成器传递它们。

因此,我可以看到这项工作的一种方法是在 CMake 配置阶段对参数进行硬编码。您可以配置 CMake,并传递您打算运行自定义目标的参数:

cmake -DARG1=arg1 -DARG2=arg2 ..

这会将参数封装在 ARG1ARG2 CMake 变量中,因此您的 custom target 可能看起来像这样:

add_custom_target(run_my_script
    COMMAND ${CMAKE_BINARY_DIR}/path_to_venv/bin/activate 
        && python3 ${CMAKE_CURRENT_LIST_DIR}/run_smth.py ${ARG1} ${ARG2}
    WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}
)

这假设您的 run_smth.py 脚本与包含此命令的 CMake 文件位于同一目录中,通过使用 CMAKE_CURRENT_LIST_DIR。同样,该目录用作运行 python 脚本的工作目录。

如果在 CMake 配置阶段设置脚本参数过于严格,您还可以创建多个 CMake 自定义目标(例如,一些用于不同的测试模式,如 run_my_script_sanityrun_my_script_regression):

# Create a custom target for the sanity tests.
add_custom_target(run_my_script_sanity
    COMMAND ${CMAKE_BINARY_DIR}/path_to_venv/bin/activate 
        && python3 ${CMAKE_CURRENT_LIST_DIR}/run_smth.py -sanity ${ARG2}
    WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}
)
# Create a custom target for the regression tests.
add_custom_target(run_my_script_regression
    COMMAND ${CMAKE_BINARY_DIR}/path_to_venv/bin/activate 
        && python3 ${CMAKE_CURRENT_LIST_DIR}/run_smth.py -regression ${ARG2}
    WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}
)

【讨论】:

  • 感谢您的想法。可能在为特定配置预定义自定义目标时有些东西,但无论如何,如果我没有找到一种方法来转发参数,我将不得不再编写一个脚本来做我想做的事。是的,我知道 CMake 参数,但如果其他开发人员需要使用不同的选项运行测试,我不想强​​迫他们重新配置项目。
猜你喜欢
  • 2015-07-08
  • 2010-12-12
  • 1970-01-01
  • 2016-04-27
  • 1970-01-01
  • 2020-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多