为什么add_custom_target总是被视为过时?

时间:2018-02-13 01:43:08

标签: cmake

根据the documentationadd_custom_target()创建了一个目标,并且始终考虑到日期"。但是,文档also says add_dependencies()可以在顶级目标之间添加依赖关系,包括add_custom_target()添加的关联。如果始终执行add_custom_target(),那么将它与add_dependencies()一起使用是否有任何实际意义?

3 个答案:

答案 0 :(得分:2)

就CMake而言,add_custom_target不会产生任何可以跟踪以确定目标是否已过时的内容。

add_custom_command对比,您可以在其中指定命令生成的OUTPUT。据CMake所知,自定义目标只是一个黑盒子,任何事情都可能发生。这就是使它们难以正确集成到构建中的原因。

请注意,默认情况下,会完全跳过自定义目标,您只能显式构建它们(例如,通过调用make <my_target_name>)。您可以通过在调用ALL时指定add_custom_target选项或使另一个目标(已经是默认构建目标的一部分)依赖于您的自定义目标来使它们成为默认构建目标的一部分。

您通常无法通过依赖于其中一个输出工件来添加此依赖项,因为就CMake而言,自定义目标不会产生任何结果。这就是为什么你必须使用更古老的add_dependencies而不是。

答案 1 :(得分:1)

  

如果始终执行add_custom_target(),将add_dependencies()add_custom_target()一起使用是否有任何实际意义?

  1. 如果没有所有选项,则add_dependencies(A B)不会自动构建。
  2. 致电B,确保在目标A之前构建目标A,这样目标B可以安全地使用文件,为目标populateAddress() { const control = <FormArray>this.companyProfileForm.controls['addresses']; this.company.addresses.forEach(element => { control.push(element); }) } 创建。

答案 2 :(得分:1)

关于add_custom_target()命令的

CMake article并不是很清楚,因此我也遇到了类似的问题。将自定义目标添加到构建系统有两个方面:

  1. 此目标是否需要在我们的构建系统中使用? “已使用”的意思是“物化”-当将自定义目标不仅添加到构建系统定义中,而且将相应的逻辑添加到生成的构建系统中时,该逻辑将在构建期间执行。
  2. 何时应(重新)构建此目标(假设我们已经确定必须在我们的构建系统中使用此自定义目标)?

考虑第一个问题,如果我们希望在构建系统中使用自定义目标,则应使用“全部”选项或add_dependencies()命令。我认为文档中的这句话:

  

默认情况下,任何内容都不取决于自定义目标。

暗示如果我们不使用“全部”选项或使任何其他目标依赖于自定义目标-该自定义目标逻辑将不会出现在生成的构建系统中。

关于第二个方面,短语:

  

添加没有输出的目标,因此它将始终被构建。

表示在(重新)构建项目时始终会构建自定义目标(考虑到我们已经使用“ All” / add_dependencies()使用了它),因为自定义目标不会生成任何生成的输出依赖关系解析逻辑可以跟踪,因此无法确定何时应重建此类目标(因此,假定始终应构建自定义目标)。

总结上面的内容:当不仅需要在构建系统中定义目标,还需要在生成的构建系统中使用该目标时,我们应该使用带有add_dependencies()命令的自定义目标,因为自定义目标始终仅在生成的构建系统中已经实现时才执行。