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

时间:2013-12-26 23:48:30

标签: 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变量,它不会打印任何内容。

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

2 个答案:

答案 0 :(得分:10)

Can anyone explain me why I can not use variables in Script file?

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

使用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

转发到子进程:

> 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

解决方案#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

解决方案#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

答案 1 :(得分:5)

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

install(CODE "set(A \"${A}\")")
install(SCRIPT cmake/custom_script.cmake)

这最终会在cmake_install脚本中呈现为:

set(A "Avalue")
include(/path/to/cmake/custom_script.cmake)

这正是你所需要的。