Подтвердить что ты не робот

Как создать CMakeLists.txt?

Мне нужны некоторые указатели/советы о том, как автоматически создавать файлы CMakeLists.txt для CMake. Кто-нибудь знает о существующих генераторах? Я проверил те, которые перечислены в CMake Wiki, но, к сожалению, они мне не подходят.

У меня уже есть базовый Python script, который пересекает структуру моего проекта и генерирует необходимые файлы, но он действительно "немой" прямо сейчас. Я хотел бы увеличить его, чтобы учесть, например, различные платформы, для которых я создаю, компилятор\кросс-компилятор, который я использую, или разные версии зависимостей библиотек, которые у меня могут быть. У меня не так много опыта работы с CMake, и пример, который я мог бы основать на своей работе, или уже работающий генератор мог бы оказать большую помощь.

4b9b3361

Ответ 1

Я придерживаюсь мнения, что вам не нужно использовать автоматический скрипт для генерации CMakeLists.Txt, так как это очень простая задача, после того как вы поняли основную процедуру. Да, я согласен с тем, что понимание процедуры написания таковой, как описано в CMake Wiki, также сложно, так как слишком детально.

Очень простой пример, показывающий, как писать CMakeLists.txt, показан здесь, который, я думаю, будет полезен всем, даже тем, кто собирается написать CMakeLists.txt в первый раз.

Ответ 2

Ну, у меня тоже не так много опыта в Cmake, но для выполнения кросс-платформы нужно написать и изменить много файлов, включая файл CMakeLists.txt, я предлагаю использовать этот новый инструмент под названием ProjectGenerator Инструмент, это довольно круто, он делает всю дополнительную работу и позволяет легко генерировать такие файлы для 3'r сторонних источников с небольшими усилиями. Просто прочитайте README, прежде чем использовать его.

Ссылка: http://www.ogre3d.org/forums/viewtopic.php?f=1&t=54842

Ответ 3

Я думаю, что вы делаете это с ног на голову.

При использовании CMake вы должны сами писать CMakeLists.txt. Как правило, вам не нужно обрабатывать разные компиляторы, поскольку у CMake есть знания о них. Однако, если вам нужно, вы можете добавить код в CMakeFiles, чтобы делать разные вещи в зависимости от используемого вами инструмента.

Ответ 4

CLion - интегрированная среда разработки, полностью основанная на файле проекта CMake.

Он может генерировать сам файл CMakeLists.txt при использовании проекта импорта из источника

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

Ответ 5

Я поддерживаю программную среду C++, которая имеет более 1000 модулей (общие, статические библиотеки, программы) и использует более 20 сторонних разработчиков (boost, openCV, Qt, Qwt...). Эта программная среда содержит множество программ (~ 50), каждая из которых собирает несколько библиотек, программ и третьих лиц. Я использую CMake для генерации make файлов, и это действительно здорово.

Однако, если вы напишите свой CMakeLists.txt, как это рекомендуется делать (объявите модуль как библиотеку/программу, импортируете исходные файлы, добавляете зависимости...). Я согласен с celavek: поддержание этих файлов CMakeLists.txt - настоящая боль:

  • Когда вы добавляете новый файл в модуль, вам необходимо обновить его CMakeLists.txt
  • Когда вы обновляете стороннее устройство, вам необходимо обновить CMakeLists.txt всех модулей, использующих его
  • Когда вы добавляете новую зависимость (библиотека A теперь нуждается в библиотеке B), вам может потребоваться обновить CMakeLists.txt всех программ, используя A
  • Если вы хотите, чтобы новые глобальные настройки были изменены (настройка компилятора, предопределенная переменная, используемый стандарт C++), вам необходимо обновить все ваши CMakeLists.txt

Затем я вижу две стратегии решения этих проблем и, вероятно, одну из упомянутых ОП.

1- Имейте CMakeLists.txt хорошо написанное и достаточно умное, чтобы не зацикливаться на поведении, чтобы обновлять себя на лету. Это то, что мы имеем в нашей программной среде. Каждый модуль имеет стандартизированную файловую организацию (источники находятся в папке src, включения находятся в папке inc...) и имеют простые текстовые файлы для определения их зависимостей (с определенными нами ключевыми словами, такими как QT, чтобы сказать модуль). необходимо связать с Qt). Затем наш CMakeLists.txt представляет собой файл из двух строк и просто вызывает макрос cmake, который мы написали для автоматической настройки модуля. Как MCVE это будет:

CMakeLists.txt:

include( utl.cmake )
add_module( "mylib", lib )

utl.cmake:

macro( add_module name what )
    file(GLOB_RECURSE source_files "${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp")
    include_directories(${CMAKE_CURRENT_SOURCE_DIR}/inc)
    if ( what STREQUEL "lib" )
        add_library( ${name} SHARED ${source_files} )
    elseif ( what STREQUEL "prg" )
        add_executable( ${name} ${source_files} )
    endif()
    # TODO: Parse the simple texts files to add target_link_libraries accordingly
endmacro()

Затем для всех описанных выше ситуаций вам просто нужно обновить utl.cmake, а не тысячу CMakeLists.txt, которые у вас есть...

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

Тем не менее, остается много сценариев CMake для написания. И CMake язык сценариев отстой... инструмент очень мощный, правда, но область действия переменной сценария, кэш, болезненный и не очень хорошо документированный синтаксис (просто чтобы проверить, пуст ли список, вы должны спросить его размер и сохраните это в переменной!), факт, что это не объектно-ориентированный... поддерживать его реальная боль.

Итак, теперь я убежден, что действительно хороший подход может быть следующим:

2- полностью сгенерирует CMakeLists.txt из более мощного языка, такого как Python. Скрипт Python будет делать то же самое, что и наш utl.cmake, вместо этого он сгенерирует готовый к передаче инструмент CMake CMakeLists.txt (с форматом, предложенным в HelloWorld, без переменных, без функций... он будет только вызовите стандартную функцию CMake).

Я сомневаюсь, что такой универсальный инструмент существует, потому что сложно создать файлы CMakeLists.txt, которые сделают всех счастливыми, вам придется написать его самостоятельно. Обратите внимание, что gen-cmake делает это (генерирует CMakeLists.txt), но очень примитивно и, очевидно, поддерживает только Linux, но может быть хорошей отправной точкой.

Это может быть v2 нашей программной среды... однажды.

Примечание: Кроме того, если вы хотите, например, поддерживать qmake и cmake, хорошо написанный скрипт Python может генерировать как CMakeLists, так и pro файлы по требованию!

Ответ 6

Не уверен, является ли это проблемой, с которой столкнулся оригинальный автор, но поскольку я вижу множество ответов "просто напишите CMakefile.txt" выше, позвольте мне кратко объяснить, почему генерация CMakefiles может иметь смысл:

а) У меня есть другая система сборки, которой я вполне доволен

(и который охватывает большую многоплатформенную сборку большой коллекции   взаимосвязанных общих и статических библиотек, программ, скриптов   языковые расширения и инструменты, с различными внутренними и внешними   зависимости, причуды и варианты)

б) Даже если бы я его заменил, я бы не стал рассматривать cmake.

Я посмотрел на CMakefiles, и я не доволен синтаксисом  и не в восторге от семантики.

c) CLion использует только CMakefiles и Cmakefiles (и выглядит несколько интересным)

Итак, чтобы дать CLion шанс (я люблю PyCharm, так что это заманчиво), но чтобы продолжать использовать мою систему сборки, я бы с удовольствием использовал какой-нибудь инструмент, который позволил бы мне воплощать в жизнь   сделать generate_cmake и иметь все необходимые файлы CMake, сгенерированные на лету в соответствии с текущим информация извлечена из моей системы сборки. Я могу с радостью снабдить инструмент/скрипт информацией, из каких источников и заголовков состоит мое приложение, какие библиотеки и программы оно будет собирать, какие -I, -L, -D и т.д. Предполагается установить для которых компонент и т.д. и т.д.

Ну, конечно, я был бы намного счастливее, если бы JetBrains позволил предоставить какой-то прямой протокол подачи в IDE необходимой информации. (скажем, позволил мне предоставить собственную команду для компиляции, запуска и генерировать любые метаданные, которые им действительно нужны - я полагаю, что они в основном нуждаются в incdirs и определениях, которые нужно реализовать на лету, для анализа кода и libpaths для установки LD_LIBRARY_PATH для отладчика), без ссылки на cmake. CMake файлы в качестве протокола несколько сложны.

Ответ 7

Может быть, это может быть полезно:

https://conan.io/

Автор дал несколько выступлений о cmake и о том, как создавать модульные проекты с использованием cmake в CPPCon. Насколько я знаю, этот инструмент требует cmake, так что я предполагаю, что генерировать его, когда вы интегрируете новые пакеты или создаете новые пакеты. Недавно я прочитал кое-что о том, как написать описание проекта C/C++ более высокого уровня, используя файл YAML, но не уверен, является ли он частью conan или нет (то, что я прочитал, было от автора conan). Я никогда не использовал, и это что-то ожидающее для меня, так что, пожалуйста, если вы используете это и соответствуете вашим потребностям, прокомментируйте свое мнение об этом и как это соответствует вашему сценарию.