我有一个名为“ 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变量,它不会打印任何内容。
任何人都可以解释为什么我不能在脚本文件中使用变量吗?
答案 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
使用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
您可以使用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)
这正是你所需要的。