1

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

  • CMakeLists.txtproject()
  • 我的工具链.cmake
  • 模块目录中的东西(包括GNU.cmake
  • 将变量加载%_INIT%缓存变量
  • 之后继续project()

假设我希望这个目标仅使用 -O2 优化来构建。我将它设置在我的工具链中,因为它对于许多项目都是全局的。

set(CMAKE_CXX_FLAGS_RELEASE_INIT "-O2")

但随后GNU.cmake被加载并附加“-O3”。因此我的设置被覆盖。在此之后,我只能在我的项目CMakeLists.txt文件中覆盖它。我必须为每个项目都这样做,开发人员会错过这个!

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

4

1 回答 1

2

由于您指出的原因,您不能这样做。也许这可以被认为是工具链文件的限制,但这就是它目前的工作方式。

现在深入研究模块,加载的模块GNU.cmakeCMakeCInformation.cmakeand CMakeCXXInformation.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文件中进行设置。

于 2018-12-22T22:45:52.310 回答