Как перезаписать настройки из модулей 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
файл.