1

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

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

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

4

1 回答 1

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使用关键字)。因此,在某个目录中设置的变量不会影响在对等子目录和父子目录中设置的变量。但是,如果变量设置在相同的范围内(例如,当您从 parent 运行配置测试时CMakeLists.txt),那么是的,它们可能会相互干扰。为了防止这种情况,CMake 使用了明确地将变量与不同包分开的命名约定。大多数配置宏接收“prefix”参数,该参数指定宏中设置的变量的名称前缀,因此宏用户(即应用程序 CMakeLists.txt)可以显式地将测试变量与不同的依赖包分开。

于 2015-01-10T09:22:25.200 回答