如何覆盖工具链文件中cmake模块的设置?

时间:2018-12-05 13:51:40

标签: cmake gnu cmake-modules

我有一个CMake工具链文件,可以在x86_64-linux主机上为arm-linux交叉编译。 在配置期间,我的工具链文件被解析,并且它(正确)找到了GNU编译器。因此它将加载GNU.cmake(在我的情况下为/usr/share/cmake-3.10/Modules/Compiler/GNU.cmake)。我不清楚这里的包含层次结构(找不到文档。知道了任何链接)。但是看起来像这样:

  • CMakeLists.txt根到project()
  • 我的toolchain.cmake
  • 模块目录中的内容(包括GNU.cmake
  • %_INIT变量加载到%缓存变量
  • project()之后继续

说我希望此目标仅通过-O2优化来构建。我将其设置在工具链中,因为对于许多项目而言,它是全局的。

set(CMAKE_CXX_FLAGS_RELEASE_INIT "-O2")

,但随后装入GNU.cmake并附加“ -O3”。因此,我的设置被覆盖。之后,我只能在我的项目CMakeLists.txt文件中覆盖它。我将必须为每个项目执行此操作,而开发人员会错过此!!

所以,我的问题是(重复标题):如何从工具链文件中覆盖CMake模块的设置?

1 个答案:

答案 0 :(得分:0)

由于您指出的原因,您无法执行此操作。也许这可能被认为是对工具链文件的限制,但这是当前的工作方式。

现在深入研究模块,加载GNU.cmake的模块是CMakeCInformation.cmakeCMakeCXXInformation.cmake

使用变量GNU.cmake,可以使用在CMAKE_USER_MAKE_RULES_OVERRIDE_<lang>之后加载的另一个文件来覆盖这些设置。我发现这封旧邮件对此进行了说明:https://cmake.org/pipermail/cmake/2008-April/021337.html

这里也提到:https://cmake.org/cmake/help/latest/variable/CMAKE_USER_MAKE_RULES_OVERRIDE.html?highlight=cmake_user_make_rules_override

那么您可以做的是通过在此覆盖文件中执行以下操作来更改值:

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