繁体   English   中英

我是否总是需要 CMake 中的目标?

[英]Do I always need a target in CMake?

我有一个 python 脚本,它为我生成一些文件,在我的脚本中,我有一个参数--outputdir来指定 output 文件的位置。 我想运行这个脚本来生成这些文件并在以后安装它们。 我用了

add_custom_command(
 COMMAND python3.6 ${CMAKE_CURRENT_SOURCE_DIR}/generateFiles.py
 ARGS --outputdir ${CMAKE_CURRENT_BINARY_DIR})

所以 output 文件是在${CMAKE_CURRENT_BINARY_DIR}下生成的,我可以稍后安装它们。

但上面的代码不起作用,因为我必须使用错误消息中的TARGETOUTPUT 所以如果我使用一个虚拟的:

add_custom_target(dummy ALL)
add_custom_command(
     TARGET dummy
     COMMAND python3.6 ${CMAKE_CURRENT_SOURCE_DIR}/generateFiles.py
     ARGS --outputdir ${CMAKE_CURRENT_BINARY_DIR})

这刚刚奏效,我可以看到文件是在${CMAKE_CURRENT_BINARY_DIR}下生成的。 我相信如果我使用类似的东西:

add_custom_target(dummy 
                  COMMAND python3.6 ${CMAKE_CURRENT_SOURCE_DIR}/generateFiles.py
                   ARGS --outputdir ${CMAKE_CURRENT_BINARY_DIR})

这也应该有效。 我的问题是为什么我仍然需要一个dummy目标? 实际上,只需使用COMMAND我就可以运行我的脚本,使用 args 我可以指定 output 文件的生成位置,然后使用一些安装命令我可以安装文件。 那么在这种情况下使用dummy目标是否正确,我必须使用它吗? 注意generateFiles.py在构建过程中不会更改,并且每次都会生成相同的文件。 谢谢,我是 CMake 的新手。

在项目构建期间执行的所有操作都是作为某个目标的一部分执行的。

这是 CMake 的概念,它与许多构建工具的概念相关:Make、Ninja、MSVC 等。因为 CMake 实际上将构建项目的工作委托给其中一个构建工具,所以概念的相似性非常重要。

所以是的,当你想在构建过程中声明一些要执行的命令时,你需要将此命令添加到某个目标:

  • add_custom_target创建新目标
  • add_custom_command(TARGET)将 COMMAND 附加到指定的目标
  • add_custom_command(OUTPUT)将命令附加到目标,这取决于 OUTPUT 子句中给出的文件。

请注意,虽然 CMake 具有默认执行的all目标的概念(当未指定目标时),但它不允许将命令直接附加到该目标。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM