0

我想要一个简单的例子来说明DEPENDS文件生成的选项add_custom_command(OUTPUT ...),也就是说,如果我们对DEPENDS部分进行注释,示例将给出不同的输出或完全崩溃。

在下面的例子中(有文件london并且good.cpp在当前工作目录中),DEPENDS是可有可无的:

cmake_minimum_required(VERSION 3.10)
project(Tutorial VERSION 1.0)

add_custom_command(OUTPUT foo
COMMAND cp london foo
#DEPENDS london
COMMENT "I'm testing the new method.")

add_executable(cake good.cpp foo)

我确实阅读了文档。我对构建系统知之甚少,无论是 Make 还是 CMake。第一句话Specify files on which the command depends.让我很困惑。我不明白命令如何依赖于其他文件,在我的随便的例子中,命令行本身似乎可以找到所有内容。我想要一个 CMake 代码示例来展示命令如何依赖其他文件,并在 DEPENDS 的必要帮助下。

4

1 回答 1

0

文档中的短语

指定命令所依赖的文件。

更好理解为

指定命令输出文件的内容所依赖的文件。

可以猜到,命令的输出文件的内容cp london foo 仅取决于 from london,因此为 指定选项是合理DEPENDS londonadd_custom_command

作为构建系统,CMake 使用 DEPENDS 中的信息来决定是否运行命令。如果:

  • OUTPUT文件已在上次运行时创建,并且
  • 自上次运行以来,该DEPENDS文件尚未更新,

那么该命令将不会再次运行。原因很简单:如果结果是相同的文件,则无需运行该命令。


考虑到 source ( CMAKE_SOURCE_DIR) 和 build ( CMAKE_BINARY_DIR) 目录分离,示例可以重写如下:

cmake_minimum_required(VERSION 3.10)
project(Tutorial VERSION 1.0)

add_custom_command(
  OUTPUT foo # relative path denotes a file in the build directory
  COMMAND cp ${CMAKE_SOURCE_DIR}/london foo # The command will be run from the build directory,
    # so need to use absolute path for the file in the source directory
  DEPENDS london # relative path is resolved in the source directory,
    # assuming that corresponded file is already existed
  WORKING_DIRECTORY ${CMAKE_BINARY_DIR} # specifies a directory from which run the COMMAND
    # build directory is used by default, so the option can be omitted
  COMMENT "I'm testing the new method."
)

add_executable(cake
  good.cpp # relative path is resolved in the source directory,
    # assuming that corresponded file is already existed
  foo # because given file is absent in the source directory,
    # the path is resolved relative to the build directory.
)

第一次构建项目时,foo将构建两者和可执行文件。

第二次构建项目时(不更改london),不会重建任何内容。

当更改london文件并再次构建项目时,foo将重新构建(因为它依赖于london)。在foo重建时,可执行文件也将被重建,因为它依赖于foo.

于 2021-11-16T12:22:15.797 回答