CMake测试我是否处于脚本模式

4
我想要使用相同的cmake文件作为脚本和包含文件。
do_something.cmake:
function(do_something)
   # do something
endfunction

if(CMAKE_IS_SCRIPTING_MODE) # this variable does not exist!
   do_something()
endif

这样我就可以轻松地从CMake项目和shell中调用我的脚本。如何做到这一点?
2个回答

5

虽然CMAKE_SCRIPT_MODE_FILE是可以的,但你不能简单地检查它是否已设置。如果你从脚本中包含这个文件,可能会遇到问题。

例子:

HelloWorld.cmake

include_guard()
function(hello_world)
   message("Hello World")
endfunction()

if(CMAKE_SCRIPT_MODE_FILE)
   hello_world()
endif()

script.cmake

include(HelloWorld)
hello_world()

这会打印两次“Hello World”。但是,您仅想在HelloWorld.cmake是脚本文件时执行hello_world()
因此,您必须检查该文件是否是脚本文件:
if(CMAKE_SCRIPT_MODE_FILE MATCHES HelloWorld)

或者更好的方式(因为您可以复制&粘贴它):

if(CMAKE_SCRIPT_MODE_FILE AND NOT CMAKE_PARENT_LIST_FILE)

这样,我们可以检查是否处于脚本模式并且直接调用(而非被包含在其他文件中)。


抱歉提出这个问题,但这个详细说明并没有反映在最初的问题中,而将其改编成答案在我提供的答案超过2个月后看起来有点不公平。此外,引用的文档清楚地指出变量的内容设置为脚本文件的完整路径,因此您可以在适当的测试中自由使用它(就像您所做的那样),这最终又会再次使用CMAKE_SCRIPT_MODE_FILE - compor
好的,我们来说一种不同的方法。顺便说一句:对于大多数情况(甚至是原始问题),if(NOT CMAKE_PARENT_LIST_FILE)就足够了。 - kuga

4

我想你正在寻找CMAKE_SCRIPT_MODE_FILE

在cmake(1) -P脚本模式下运行时,CMake将此变量设置为脚本文件的完整路径。当运行以配置CMakeLists.txt文件时,此变量未设置。


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