【发布时间】:2021-02-24 03:24:52
【问题描述】:
我正在使用顶级CMakeLists.txt 文件生成Makefiles 的交叉编译项目。一些交叉编译的源代码是由基于主机的代码生成工具生成的;由于该工具需要不同的工具链,因此顶级CMakeLists.txt 使用ExternalProject_Add() 调用代码生成器子目录的CMakeLists.txt,并将BUILD_ALWAYS 设置为TRUE。代码生成目标依赖于代码生成器目标,所以在初始构建时先构建代码生成器,然后生成代码,再将整个shebang编译成最终结果。
如果我更改代码生成器的源代码,那么代码生成器可执行文件将在下一个make 上正确重建。问题:相关代码生成目标不会被重建。 ExternalProject_Add() 目标似乎无法指示何时/是否应该重建目标的任何依赖项。
例如,如果代码生成器目标是使用Add_Custom_Command() 配置的,那么我将使用OUTPUT 关键字来指定生成的可执行文件,并且任何依赖目标都可以配置为在代码生成器可执行文件的时间戳已更新。
(为清楚起见进行编辑:在为Add_Custom_Command() 指定OUTPUT 文件后,我将使用Add_Custom_Target() 创建一个便利目标,其DEPENDS 关键字引用Add_Custom_Command() 的OUTPUT 文件。我'然后让代码生成目标依赖于这个便利目标。但是,AFAIK,这对我不起作用。)
有没有办法配置基于ExternalProject_Add() 的目标,以便在主目标的输出发生变化时自动重建依赖目标?
【问题讨论】:
-
据我了解,只有使用
add_executable或add_library创建的目标才能拥有“主要目标的输出”文件。所有其他目标(包括ExternalProject_Add创建的目标)都没有此类文件,因此您需要明确使用add_custom_command的DEPENDS 参数依赖于代码生成器。请注意,add_custom_command不会创建/声明 target:此命令仅声明 file 的依赖项。在 CMake 中,“文件”和“目标”是不同的东西。 -
根据您的最后一句话添加了说明。但是,我不认为第一句话的建议对我有用。如果文件(
ExternalProject_Add()的输出)比依赖对象更新,CMake 必须以某种方式触发构建依赖目标。
标签: cmake dependencies cross-compiling