Как перезаписать настройки из модулей cmake из файла toolchain?

У меня есть файл CMake Toolchain, который кросс-компилируется для arm-linux на хосте x86_64-linux. Во время настройки мой инструментальный файл анализируется, и он (правильно) находит компилятор GNU. Поэтому он будет загружать GNU.cmake (в моем случае /usr/share/cmake-3.10/Modules/Compiler/GNU.cmake). Для меня непонятна иерархия включений (не могу найти документацию. Любая ссылка доступна). Однако это выглядит так:

  • корень CMakeLists.txt в project()
  • мой toolchain.cmake
  • вещи в модулях dir (включая GNU.cmake)
  • грузы %_INIT переменные к % Кэшированные переменные
  • продолжить после project()

Скажем, я хочу, чтобы эта цель строилась только с оптимизацией -O2. Я установил его в своем наборе инструментов, потому что он является глобальным для многих проектов.

set(CMAKE_CXX_FLAGS_RELEASE_INIT "-O2")

но затем загружается GNU.cmake и добавляет его с "-O3". Поэтому мои настройки перезаписываются. После этого я могу перезаписать его только в своих проектах. CMakeLists.txt файлы. Я должен был бы сделать это для каждого проекта, и разработчики будут пропускать это!

Итак, мой вопрос (повторяя заголовок): Как переписать настройки из модулей CMake из файла toolchain?

1 ответ

По указанным вами причинам вы не можете этого сделать. Может быть, это можно считать ограничением файлов цепочки инструментов, но именно так оно и работает в настоящее время.

Теперь копаться в модулях, модуль, который загружает GNU.cmake является CMakeCInformation.cmake а также 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 файл.

Другие вопросы по тегам