Использование CMake с несколькими компиляторами для одного и того же языка

18

Кажется, что CMake довольно укоренился в своем представлении, что для всех исходных файлов C ++ должен быть один и только один CMAKE_CXX_COMPILER. Я не могу найти способ переопределить это для каждой цели. Это делает комбинацию компиляции хоста и кросс в одном CMakeLists.txt очень сложным с помощью встроенных средств CMake.

Итак, мой вопрос: какой лучший способ использовать несколько компиляторов для одного и того же языка (например, C ++)?

    
задан cdleary 03.03.2012 в 03:50
источник

3 ответа

12

Это невозможно сделать с помощью CMake.

CMake сохраняет только один набор свойств компилятора, который совместно используется всеми объектами в файле CMakeLists.txt. Если вы хотите использовать два компилятора, вам нужно запустить CMake дважды. Это даже верно для, например, построение 32-битных и 64-битных двоичных файлов из одной и той же инструментальной цепочки компилятора.

Быстрый и грязный способ использования пользовательских команд. Но тогда вы получаете то, что в основном прославленные shell-скрипты, что, вероятно, не то, что вы хотите.

Чистым решением является: Не помещайте их в тот же CMakeLists.txt! В любом случае вы не можете связывать между различными архитектурами, поэтому им не нужно находиться в одном файле. Вы можете уменьшить избыточность путем реорганизации общих частей сценариев CMake в отдельные файлы и include() them.

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

    
ответ дан ComicSansMS 03.03.2012 в 11:32
  • Кажется, что add_directory (other_build_kind_folder) - это возможность, а не создание пользовательской оболочки, так как это то, что я делал, и, похоже, это работает. :-) –  cdleary 04.03.2012 в 18:51
  • @cdleary Не могли бы вы пояснить, как это работает? Как add_subdirectory (или вы действительно имеете в виду add_directory?) Позволяет вам переключать инструментальные цепочки? –  Kyle Strand 27.04.2015 в 23:56
  • Ничего себе, это действительно очень плохой дизайн ... –  Andrew Wagner 29.06.2016 в 18:32
  • В основном исправлены, но есть методы для массажа CMake для использования как хоста, так и набора наборов компиляторов, управляемых из одной сборки. См. Этот вопрос и ответ для аналогичного сценария, который я успешно использовал в нескольких проектах реального мира в течение некоторого времени. @ Ответ Билла, рекомендующий ExternalProject, также является хорошим советом. –  Craig Scott 16.07.2016 в 04:46
3

Вы можете посмотреть ExternalProject: Ссылка

    
ответ дан Bill Hoffman 06.03.2012 в 18:34
0

Чтобы продлить ответ @Bill Hoffman: Создайте свой проект как супер-сборку, используя какой-то шаблон, например, здесь Ссылка который будет настраивать как зависимости, так и ваш проект как внешний проект (автономная среда cmake configure / build / install).

    
ответ дан Gabriel 17.01.2018 в 10:26