我有一个CMake工具链文件,可以在x86_64-linux主机上为arm-linux交叉编译。
在配置期间,我的工具链文件被解析,并且它(正确)找到了GNU编译器。因此它将加载GNU.cmake
(在我的情况下为/usr/share/cmake-3.10/Modules/Compiler/GNU.cmake
)。我不清楚这里的包含层次结构(找不到文档。知道了任何链接)。但是看起来像这样:
CMakeLists.txt
根到project()
GNU.cmake
)%_INIT
变量加载到%
缓存变量project()
之后继续说我希望此目标仅通过-O2优化来构建。我将其设置在工具链中,因为对于许多项目而言,它是全局的。
set(CMAKE_CXX_FLAGS_RELEASE_INIT "-O2")
,但随后装入GNU.cmake并附加“ -O3”。因此,我的设置被覆盖。之后,我只能在我的项目CMakeLists.txt
文件中覆盖它。我将必须为每个项目执行此操作,而开发人员会错过此!!
所以,我的问题是(重复标题):如何从工具链文件中覆盖CMake模块的设置?
答案 0 :(得分:0)
由于您指出的原因,您无法执行此操作。也许这可能被认为是对工具链文件的限制,但这是当前的工作方式。
现在深入研究模块,加载GNU.cmake
的模块是CMakeCInformation.cmake
和CMakeCXXInformation.cmake
。
使用变量GNU.cmake
,可以使用在CMAKE_USER_MAKE_RULES_OVERRIDE_<lang>
之后加载的另一个文件来覆盖这些设置。我发现这封旧邮件对此进行了说明:https://cmake.org/pipermail/cmake/2008-April/021337.html
那么您可以做的是通过在此覆盖文件中执行以下操作来更改值:
string(REPLACE "-O3" "-O2" CMAKE_CXX_FLAGS_RELEASE_INIT ${CMAKE_CXX_FLAGS_RELEASE_INIT })
我之前从未听说过这些变量,因此我不确定在设置CMAKE_USER_MAKE_RULES_OVERRIDE_<lang>
时它们在路径位置上如何工作。
我怀疑您可以从工具链文件而不是CMAKE_USER_MAKE_RULES_OVERRIDE_<lang>
文件中设置CMakeLists.txt
。