将add_custom_command / _target添加到不同的目录中以进行交叉编译

时间:2010-01-28 00:01:12

标签: cmake

在CMake中,我正在尝试构建一个项目,其中包含由不同工具链编译的多个不同处理器体系结构的库。对于每个体系结构,静态库都构建在多个子目录中,然后收集到根目录中的共享库中。到目前为止,我还没有弄清楚这一点。

我到目前为止最接近的是在子目录中使用add_custom_commandadd_custom_target来生成.a文件,然后尝试使用{将它们收集到根目录中的.so文件中再次{1}}和add_custom_command。但是,如果我将.so依赖项指向自定义命令输出列表,则makefile会显示“No rule to make ...”,因为自定义命令输出不会从子目录中导出。所以我尝试将.so依赖项指向子目录中的自定义目标列表,并且它抱怨它无法找到具有该名称的文件。

要把它放在代码表格中,这是我在子目录中的内容:

add_custom_target

在根目录中,我尝试了这个:

add_custom_command(OUTPUT subout.a COMMAND ${MYAR} ...)
add_custom_target(subout_target DEPENDS subout.a)

我得到“没有规则制作目标'sub / subout.a','my.so'需要。停止。”这是有道理的,因为add_custom_command(OUTPUT my.so COMMAND ${MYLD} ... DEPENDS sub/subout.a) add_custom_target(dll ALL DEPENDS my.so) 目标不会从目录中导出。

我试过这个:

add_custom_command

这实际上会导致生成sub / subout.a文件,但随后它就会死掉,说“没有规则可以使目标'subout_target'......”

我认为我真正想要的是能够模仿多个不同架构的add_custom_command(OUTPUT my.so COMMAND ${MYLD} ... DEPENDS subout_target) add_custom_target(dll ALL DEPENDS my.so) 行为。但显然,CMake不希望我这样做...... :)

有什么想法吗?

2 个答案:

答案 0 :(得分:8)

我认为您需要使用add_dependencies来定义使用add_custom_target定义的目标之间的依赖关系。 DEPENDS选项用于指定自定义规则中的文件级依赖项,但不指定目标级依赖项。

例如,生成.obj文件作为输出的命令使用DEPENDS来指定它取决于.cpp文件。此外,目标可以依赖于单个文件,而不仅仅依赖于其他目标。因此,对于文件级依赖项,请使用DEPENDS选项,但使用add_dependencies作为目标级别。

答案 1 :(得分:1)

现货!

add_dependencies 允许我在 add_custom_target 创建的目标之间创建最终的依赖关系'link', add_custom_target 生成 strong所需的目标> add_custom_command 在makefile中创建真实内容,即除非 输出,否add_custom_command add_custom_target 命令中被指定为依赖项。

然后为了让 add_custom_command 以正确的顺序执行,我必须使用 add_custom_target 中定义的目标名称作为 add_dependencies 即可。注意: add_custom_command add_custom_target 命令中指定的 OUTPUT 必须在单独的引用路径中指定,即:

add_custom_command(OUTPUT "out1 out2 out3" ...)  # WRONG!
add_custom_target(CUSTOMTARG1 "out1 out2 out3")  # WRONG!

add_custom_command(OUTPUT "out1" "out2" "out3" ...)  # RIGHT!
add_custom_target(CUSTOMTARG1 "out1" "out2" "out3")  # RIGHT!

如果我没有将它们放在单独的引用路径中,那么makefile每次都会构建输出,无论它们是否存在!