如果处于脚本模式,则进行CMake测试

如果处于脚本模式,则进行CMake测试,cmake,Cmake,我想使用相同的cmake文件作为脚本和包含文件 做点什么。做: function(do_something) # do something endfunction if(CMAKE_IS_SCRIPTING_MODE) # this variable does not exist! do_something() endif 这样,我可以轻松地从CMake项目和shell调用脚本。怎样才能做到这一点呢?我想你正在寻找 在cmake(1)-p脚本模式下运行时,cmake将此变量设置为

我想使用相同的cmake文件作为脚本和包含文件

做点什么。做:

function(do_something)
   # do something
endfunction

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

这样,我可以轻松地从CMake项目和shell调用脚本。怎样才能做到这一点呢?

我想你正在寻找

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


虽然CMAKE_脚本_模式_文件正常,但不能简单地检查是否已设置。从脚本中包含此文件时,可能会遇到问题

例如:

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
时,您只需要执行
HelloWorld()

因此,必须检查此文件是否为脚本文件:

if(CMAKE_SCRIPT_MODE_FILE MATCHES HelloWorld)
或者更好(因为您可以复制并粘贴它):


通过这种方式,我们可以检查我们是否处于脚本模式,以及是否直接调用了我们(不包括在内)。

很抱歉提出这一问题,但最初的问题中没有反映这种详细说明,根据我两个多月前提供的答案来看,将其裁剪成一个答案有点不公平。此外,引用的文档清楚地说明了变量的内容被设置为脚本文件的完整路径,因此您可以在适当的测试中使用它(就像您所做的那样),最终再次使用
CMAKE_script_MODE_file
。好吧,让我们说这是一种不同的方法。顺便说一句:
if(不是CMAKE\u PARENT\u LIST\u文件)
对于大多数情况(甚至对于原始问题)都足够了。
if(CMAKE_SCRIPT_MODE_FILE AND NOT CMAKE_PARENT_LIST_FILE)