【发布时间】:2017-11-14 16:41:28
【问题描述】:
几乎可以从任何地方设置 CMake 缓存变量(参见此处@Florian 的What's the CMake syntax to set and use variables?)。我假设设置值在任何地方都可见,甚至对于之前解析的 CMake 列表也是如此,但事实并非如此。
用例
- 模块 A 使用
${CMAKE_MYDEF}。 - 模块 B 设置缓存变量
CMAKE_MYDEF。 -
add_subdirectory(A)在add_subdirectory(B)之前被调用。
显示行为的简短示例
cmake_minimum_required(VERSION 3.7)
project(test)
add_executable(EXEC test.cpp)
target_compile_definitions(EXEC PRIVATE MYDEF=${CMAKE_MYDEF})
set(CMAKE_MYDEF "MyValue" CACHE STRING "")
问题
- 无论我添加模块 A 和模块 B 的顺序如何,如何确保
CMAKE_MYDEF具有所需的值? - 是否有任何方法可以确保 CMake 配置步骤重新运行两次,或者(如果适用)只要缓存变量发生更改? (这可能不是一个干净的解决方案,但由于我使用的是遗留代码,因此并非所有事情都可以完美地完成。)
- 是否有缓存变量的替代方法来获得相同的结果,而无需手动重新运行 CMake 配置?
- 是否可以在生成阶段设置编译器定义(即当所有 CMake 缓存变量都已知并设置时)?使用某种生成器表达式?
编辑:简短示例解决方案
按照@Florian 的回答,这里是显示解决方案的改编示例:
cmake_minimum_required(VERSION 3.7)
project(test)
add_executable(EXEC test.cpp)
target_link_libraries(EXEC MyOtherLib)
add_library(MyOtherLib INTERFACE)
set(CMAKE_MYDEF "MyValue" CACHE STRING "")
target_compile_definitions(MyOtherLib INTERFACE MYDEF=${CMAKE_MYDEF})
【问题讨论】:
标签: cmake