在CMake中配置代码时包装库的缓存变量

时间:2014-12-29 17:20:22

标签: cmake cmake-gui

我必须构建一个使用另一个库的库,如何使另一个库的变量不显示在CMake-Gui中,而是使用由我的CMake脚本配置的值?

例如,当我的应用程序是为Mobile构建的时候,我已经有了OpenGL ES的标志,但SDL“VIDEO_OPENGLES”变量仍然显示在GUI中。问题是,由于我的构建脚本已经知道发生了什么,它可以愉快地预先配置其他脚本,而不是污染需要编译我的代码的用户的Gui。

另外,我想知道如果2个库偶然出现2个具有相同名称但以不同方式使用的变量会发生什么。

1 个答案:

答案 0 :(得分:3)

关键字是变量的INTERNAL属性。看一下这个例子:

测试/的CMakeLists.txt:

cmake_minimum_required(VERSION 2.8)

Project(Test)

add_subdirectory(Component1)
add_subdirectory(Component2)

测试/的Component1 /的CMakeLists.txt:

cmake_minimum_required(VERSION 2.8.11)

project(Component1)

set(SOURCES test1.c)

set(Component1_CONF "SomeValue" CACHE STRING "Component1_CONF description")
message(STATUS "Component1_CONF=${Component1_CONF}")

add_library(Component1 ${SOURCES})
target_include_directories(
  Component1 INTERFACE
  "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>"
  "$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}>"
)

测试/ COMPONENT2 /的CMakeLists.txt:

project(Component2)

set(SOURCES test1.c)

set(Component2_CONF "/etc/passwd" CACHE FILEPATH "Component2_CONF description")

add_executable(Component2 ${SOURCES})
target_link_libraries(Component2 Component1)

实际上Component2可以是静态库,也可以是共享而不是可执行文件,无关紧要。

现在,如果您在首要目录上运行cmake-gui并运行Configure,则会看到Component1_CONFComponent2_CONF。但是,如果您更改顶级CMakeLists.txt并添加强制设置Component1_CONF的行:

cmake_minimum_required(VERSION 2.8)

Project(Test)

set(Component1_CONF "Other value" CACHE INTERNAL "Component1_CONF forced value" FORCE)
add_subdirectory(Component1)
add_subdirectory(Component2)

您将有效隐藏Component1_CONF cmake-gui甚至命令行(-DComponent1_CONF=Boo)配置。

另外,您应该注意,通常只在当前范围内设置变量(除非使用PARENT关键字)。因此,在某个目录中设置的变量不会影响在对等子目录和父子目录中设置的变量。但是,如果变量设置在相同的范围内(例如,当您从父CMakeLists.txt中运行配置测试时),则是,它们可能会相互干扰。为防止此CMake使用命名约定,该约定明确地将变量与不同的包分开。大多数配置宏都接收“prefix”参数,该参数指定宏中设置的变量的名称前缀,因此宏用户(即应用程序CMakeLists.txt)可以明确地将测试变量与不同的依赖包分开。