LINUX.ORG.RU

CMake toolchain

 


0

1

Имеется toolchain-файл для CMake, который определяет с помощью set переменные CMAKE_C_COMPILER и CMAKE_CXX_COMPILER. Проблема в том, что в некоторых IDE (как минимум Qt Creator и NetBeans, но не CLion или работа с проектом из командной строки) попытка открыть проект приводит к бесконечному циклу конфигурирования проекта, а затем вывода сообщения:

You have changed variables that require your cache to be deleted.
Configure will be re-run and you may have to reset some variables.
The following variables have changed:
CMAKE_C_COMPILER= /usr/bin/gcc
CMAKE_CXX_COMPILER= /usr/bin/g++

Вроде как файл тулчейна специально нужен, чтобы объявить пути к компиляторам при кросс-компиляции, что же я делаю не так?

★★★★★

Последнее исправление: KivApple (всего исправлений: 2)

Ответ на: комментарий от Harald

CMake поддерживают больше IDE + он быстрее работает. И вообще ответ не по теме.

KivApple ★★★★★
() автор топика
Последнее исправление: KivApple (всего исправлений: 1)
Ответ на: комментарий от Pavval

никто и не закапывал, хипсторы не при чём

больше половины GNU/Linux автотулзами собирается

Harald ★★★★★
()

Не уверен, но разве надо заносить переменную в кеш? Она же у тебя в файле прописана, соответственно, каждый раз при вызове cmake значение не будет меняться. Пальцем в небо: убери её из кеша и не клади туда (set(CMAKE_C_COMPILER ${MCU_COMPILER}))

XMs ★★★★★
()
cmake /path/to/main/cmakelists.txt -DCMAKE_TOOLCHAIN_FILE=you_toolchain_file $other_args_pass_to_cmake

- правильный способ использовать toolchain_file.

https://github.com/KivApple/mcu-info-util/blob/master/misc/cmake-project/CMak... - сударь, документацию по cmake читать непробовал ?

dhampire ★★★
()
Последнее исправление: dhampire (всего исправлений: 1)
Ответ на: комментарий от FeyFre

чойта cygwin не предлагать, прекрасно там всё работает :)

Harald ★★★★★
()
Ответ на: комментарий от XMs

Про CACHE я добавил уже после написания вопроса на форум - и всё заработало. Изначально там был как раз твой вариант и проблема имела место быть. Вопрос в том, насколько это криво.

KivApple ★★★★★
() автор топика
Последнее исправление: KivApple (всего исправлений: 1)
Ответ на: комментарий от dhampire

У меня специфический случай - я собираю не обычную программу, а прошивку для микроконтроллера. И в данном случае используемый тулчайн - это именно часть проекта, а с другим тулчайном проект гарантированно не соберётся.

Требование не определять тулчайн внутри проекта для нормальных программ вполне логично - обычно программу собирают под текущую систему, если нет, то должна быть возможность без правки самого проекта произвести кросскомпиляцию. Но в моём случае это ненужно, вредно и неудобно.

KivApple ★★★★★
() автор топика
Ответ на: комментарий от XMs

И тут есть два варианта:

1) Перезаписать переменные CMAKE_C_COMPILER и CMAKE_CXX_COMPILER после директивы project. Это костыль, ибо не будет работать проверка компилятора и некоторые другие внутренние механизмы CMake. С тем же успехом можно пройтись sed по итоговому Makefile и заменить gcc на avr-gcc.

2) Указать тулчайн с помощью параметра командной строки CMake. То есть через настройки IDE. Зачем? Это тавтология. Прошивка и так жёстко привязана к конкретному тулчайну. При смене микроконтроллера придётся править исходники и изменение CMakeLists.txt - самое простое.

Какой профит от неуказывания тулчайна в файле проекта прошивки? Какой НЕпрофит я знаю - лишние телодвижения при компиляции проекта, либо при импорте проекта в IDE. А какой профит? То что ты можешь по-быстрому без правки проектного файла скомпилировать прошивку для AVR компилятором для ARM и увидеть тонны ошибок компиляции?

Даже если предположить использование некоторого фреймворка, который нивелирует различие между платформами, на разных платах банально пины разные используются.

Документацию CMake касательно тулчайнов писали с расчётом на обычные приложения. Отказ от хардкода тулчайна в этом случае даёт профит - можно легко кросс-компилировать проект, не редактируя его.

KivApple ★★★★★
() автор топика
Последнее исправление: KivApple (всего исправлений: 3)
Ответ на: комментарий от KivApple

Тебе никто не мешает объединить два файла в один. Я это скидывал лишь как пример реализации без перезаписывания CMAKE_C[XX]_COMPILER, если что

XMs ★★★★★
()
Ответ на: комментарий от KivApple

У меня специфический случай - я собираю не обычную программу, а прошивку для микроконтроллера. И в данном случае используемый тулчайн - это именно часть проекта, а с другим тулчайном проект гарантированно не соберётся.

Это как-то должно изменить поведение инструмента явно описанное в документации ?

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

Не требование, но поведение cmake описанное в документации.

Но в моём случае это ненужно, вредно и неудобно.

Зато строить троллейбус из буханки «нужно, полезно и удобно»

dhampire ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.