为什么在CMake中的脚本内部不能访问变量?

the*_*tar 6 cmake

我有一个名为" install_copy_dlls.cmake " 的脚本,它被调用以从顶级cmake文件执行,如下所示.

INSTALL(SCRIPT"install_copy_dlls.cmake")

并且,我有一个名为" USE_OSG_STATIC " 的变量,如果我使用静态编译的OpenSceneGraph设置为ON,如果我使用动态编译的OpenSceneGraph则设置为OFF.

我需要在install_copy_dlls.cmake脚本中使用此变量.

所以,这是install_copy_dlls.cmake文件的样子.

复制其他所需的dll ...

if(NOT USE_OSG_STATIC)//如果是动态OSG

复制osg dlls

在这里,我尝试使用"message"来打印USE_OSG_STATIC变量,它不会打印任何内容.

任何人都可以解释为什么我不能在脚本文件中使用变量?

小智 10

Can anyone explain me why I can not use variables in Script file?
Run Code Online (Sandbox Code Playgroud)

install(SCRIPT ...)命令就像cmake -P一样.因此,没有变量从父脚本转发到子级(直到您明确定义一个):

> cat run.cmake 
if(A)
  message("A: ${A}")
else()
  message("A is empty")
endif()
> cmake -P run.cmake 
A is empty
> cmake -DA=15 -P run.cmake 
A: 15
Run Code Online (Sandbox Code Playgroud)

使用CMakeLists.txt:

> cat CMakeLists.txt
cmake_minimum_required(VERSION 2.8)
set(A 43)
execute_process(COMMAND ${CMAKE_COMMAND} -P run.cmake)
> cmake -H. -B_builds
A is empty
Run Code Online (Sandbox Code Playgroud)

转发到子进程:

> cat CMakeLists.txt
cmake_minimum_required(VERSION 2.8)
set(A 43)
execute_process(COMMAND ${CMAKE_COMMAND} -DA=${A} -P run.cmake)
> cmake -H. -B_builds 
A: 43
Run Code Online (Sandbox Code Playgroud)

解决方案#1(转发)

使用install(CODE ...)命令可以为run.cmake脚本定义变量:

> cat CMakeLists.txt
install(
    CODE
    "execute_process(
        COMMAND
        ${CMAKE_COMMAND}
        -DA=${A}
        -P
        ${CMAKE_CURRENT_LIST_DIR}/run.cmake
    )"
)
> cmake -H. -B_builds -DA=554
> cmake --build _builds --target install
Install the project...
-- Install configuration: ""
A: 554
Run Code Online (Sandbox Code Playgroud)

解决方案#2(配置)

您可以使用configure_file命令配置安装脚本:

> cat run.cmake.in 
set(A @A@)

if(A)
  message("A: ${A}")
else()
  message("A is empty")
endif()
> cat CMakeLists.txt    
set(custom_script ${PROJECT_BINARY_DIR}/custom_install_scripts/run.cmake)
configure_file(run.cmake.in ${custom_script} @ONLY)
install(SCRIPT ${custom_script})
> cmake -H. -B_builds -DA=42
> cmake --build _builds --target install
Install the project...
-- Install configuration: ""
A: 42
Run Code Online (Sandbox Code Playgroud)


Div*_*ide 7

我找到了一个更简单的解决方案:在前面的install()调用中设置变量:

install(CODE "set(A \"${A}\")")
install(SCRIPT cmake/custom_script.cmake)
Run Code Online (Sandbox Code Playgroud)

最终将其渲染为cmake_install脚本,大致如下:

set(A "Avalue")
include(/path/to/cmake/custom_script.cmake)
Run Code Online (Sandbox Code Playgroud)

这正是您所需要的。