我想使用相同的 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 调用我的脚本。如何才能做到这一点?
虽然 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)
这样,我们检查是否处于脚本模式以及是否被直接调用(不包括在内)。