如何从add_custom_target/command中调用CMake函数?

26

能否在add_custom_targetadd_custom_command中调用CMake函数?

我知道可以将CMake函数移到Python(或其他语言)脚本中,并从add_custom_target / command中调用它,但我想避免让大量脚本与现有的CMake基础设施混在一起。

我想实现的是使用CPack生成二进制构件的zip包,并将其发布到构件库中。对于发布部分,我已经创建了CMake函数,但现在需要将打包和发布组合在一起。

感谢您提前的任何帮助/提示。


我寻找了相同的内容,几分钟后我意识到这是不可能的,因为cmake是一个生成构建器。例如,在您的IDE中运行此命令时,将在不同的时间运行,而此时cmake并不存在。 - Lothar
1个回答

39

我在为 BVLC/Caffe 编写 CMake 构建系统时遇到了这个问题。最终我将函数内容放入单独的 CMake 脚本中,并通过调用 add_custom_target 内部的该脚本来解决了这个问题:

add_custom_target(target_name
    COMMAND ${CMAKE_COMMAND} -P path_to_script
)

使用-P选项调用CMake会使其作为脚本语言运行。您可以在脚本中使用任何 CMake 函数。


28
让我想不通的是,你不能直接从add_custom_command中调用像FILE这样的cmake命令。 - xaxxon
6
实际上,我发现它并不会,但你可以向“forward”现有定义添加一堆-D开关到子CMake脚本中:add_custom_command( OUTPUT Dockerfile.base COMMAND ${CMAKE_COMMAND} -D DISTRO_NAME=${DISTRO_NAME} -D DISTRO_VERSION=${DISTRO_VERSION} -D PROJECT_TEMPLATE_DIR=${PROJECT_TEMPLATE_DIR} -P ${CMAKE_MODULE_PATH}/ConfigureDockerfileBase.cmake COMMENT "配置Dockerfile.base文件。" ) - Rastikan
1
如果我想要实现这样的逻辑:只有在变量被定义时才执行该脚本,我该如何在 add_custom_target 中编写代码呢?@Adam - Lewis Chan
当函数在.cmake文件中时,它可以很好地工作,是否有选项可以调用在同一CMakeLists.txt文件中定义的函数?@Adam Kosiorek - joepol
如何从该脚本中返回值? - Ragul
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接