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

kug*_*uga 4 cmake

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

do_something.cmake:

function(do_something)
   # do something
endfunction

if(CMAKE_IS_SCRIPTING_MODE) # this variable does not exist!
   do_something()
endif
Run Code Online (Sandbox Code Playgroud)

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

kug*_*uga 5

虽然 CMAKE_SCRIPT_MODE_FILE 没问题,但您不能简单地检查它是否已设置。当您从脚本中包含此文件时,您可能会遇到问题。

例子:

HelloWorld.cmake

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

if(CMAKE_SCRIPT_MODE_FILE)
   hello_world()
endif()
Run Code Online (Sandbox Code Playgroud)

脚本.cmake

include(HelloWorld)
hello_world()
Run Code Online (Sandbox Code Playgroud)

这将打印“Hello World”两次。但您只想在脚本文件存在hello_world()时执行。HelloWorld.cmake

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

if(CMAKE_SCRIPT_MODE_FILE MATCHES HelloWorld)
Run Code Online (Sandbox Code Playgroud)

或更好(因为你可以复制和粘贴它):

if(CMAKE_SCRIPT_MODE_FILE AND NOT CMAKE_PARENT_LIST_FILE)
Run Code Online (Sandbox Code Playgroud)

这样,我们检查是否处于脚本模式以及是否被直接调用(不包括在内)。