根据the documentation,add_custom_target()
创建了一个目标,并且始终考虑到日期"。但是,文档also says add_dependencies()
可以在顶级目标之间添加依赖关系,包括add_custom_target()
添加的关联。如果始终执行add_custom_target()
,那么将它与add_dependencies()
一起使用是否有任何实际意义?
答案 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()
一起使用是否有任何实际意义?
add_dependencies(A B)
不会自动构建。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并不是很清楚,因此我也遇到了类似的问题。将自定义目标添加到构建系统有两个方面:
考虑第一个问题,如果我们希望在构建系统中使用自定义目标,则应使用“全部”选项或add_dependencies()
命令。我认为文档中的这句话:
默认情况下,任何内容都不取决于自定义目标。
暗示如果我们不使用“全部”选项或使任何其他目标依赖于自定义目标-该自定义目标逻辑将不会出现在生成的构建系统中。
关于第二个方面,短语:
添加没有输出的目标,因此它将始终被构建。
表示在(重新)构建项目时始终会构建自定义目标(考虑到我们已经使用“ All” / add_dependencies()使用了它),因为自定义目标不会生成任何生成的输出依赖关系解析逻辑可以跟踪,因此无法确定何时应重建此类目标(因此,假定始终应构建自定义目标)。
总结上面的内容:当不仅需要在构建系统中定义目标,还需要在生成的构建系统中使用该目标时,我们应该使用带有add_dependencies()
命令的自定义目标,因为自定义目标始终仅在生成的构建系统中已经实现时才执行。