Как именно работает CMake?

158

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

cmake_minimum_required (VERSION 2.6)
project(Tutorial)
add_executable(Tutorial tutorial.cpp)

и такой маленький tutorial.cpp

int main() { return 0; } 

генерируется так много файлов

CMakeCache.txt  cmake_install.cmake  Makefile
CMakeLists.txt  tutorial.cpp

и CMakeFilesпапка с таким количеством файлов и папок

CMakeCCompiler.cmake               CMakeOutput.log    Makefile.cmake
cmake.check_cache                  CMakeSystem.cmake  progress.marks
CMakeCXXCompiler.cmake             CMakeTmp           TargetDirectories.txt
CMakeDetermineCompilerABI_C.bin    CompilerIdC        Tutorial.dir
CMakeDetermineCompilerABI_CXX.bin  CompilerIdCXX
CMakeDirectoryInformation.cmake    Makefile2

Непонимание того, что происходило за кулисами (т. Е. Почему файлы должны были создаваться и какова их цель), было самым большим препятствием на пути изучения CMake.

Если кто-нибудь знает, не могли бы вы объяснить это ради потомков? Какова цель этих файлов, и когда я печатаю cmake ., что именно конфигурирует и генерирует cmake перед сборкой проекта?

навигационный
источник
1
Я знаю о сборках вне исходного кода. Если кто-то не выполнил сборку вне исходного кода и все еще ищет способ очистки сгенерированных файлов, этот метод работает хорошо: stackoverflow.com/a/12055610/453673
Nav
3
Там есть замечательное описание по адресу: aosabook.org/en/cmake.html и, возможно, подробный ответ на вопрос (который не может быть кратко изложен здесь).
parasrish
@SebTu Неработающая ссылка. Страница cmake.html не существует.
Nav
3
@Nav Yap, испортил синтаксис разметки, извините. Таким образом, здесь исправленная версия: Для новичков в cmake я действительно рекомендую прочитать архитектуру cmake . Он предоставляет достаточно информации, чтобы понять, как работает cmake, не вдаваясь в детали.
SebNag

Ответы:

92

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

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

Хорошая новость заключается в том, что CMake отлично справляется с тем, чтобы скрыть от вас много этого беспорядка: используйте сборки из исходного кода, и вам даже не нужно смотреть на сгенерированные файлы. Если вы до сих пор этого не делали (что, как мне кажется, имеет место, поскольку вы написали cmake .), пожалуйста, проверьте их, прежде чем продолжить . Смешивать каталог сборки и исходный код очень сложно с CMake, и это не то, как система должна использоваться.

В двух словах: вместо

cd <source_dir>
cmake .

всегда использовать

cd <build_dir_different_from_source_dir>
cmake <source_dir>

вместо. Я обычно использую пустую подпапку buildвнутри моего исходного каталога как каталог сборки.

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

  • Файлы проекта / Makefiles - что вас на самом деле интересует: файлы, необходимые для сборки проекта под выбранным генератором. Это может быть что угодно, от Unix Makefile до решения Visual Studio.
  • CMakeCache.txt - это постоянное хранилище строк ключ / значение, которое используется для кэширования значений между запусками. Значения, хранящиеся здесь, могут быть путями к библиотечным зависимостям или к тому, нужно ли вообще создавать дополнительный компонент. Список переменных в основном идентичен тому, который вы видите при запуске ccmakeили cmake-gui. Это может быть полезно время от времени, но я бы порекомендовал использовать вышеупомянутые инструменты для изменения любого из значений, если это возможно.
  • Созданные файлы - это может быть что угодно, от автоматически сгенерированных исходных файлов до экспортных макросов, которые помогут вам реинтегрировать ваш построенный проект с другими проектами CMake. Большинство из них генерируются только по требованию и не появятся в простом проекте, таком как тот, что задан вами.
  • Все остальное - это шум, который делает систему сборки счастливой. В частности, мне никогда не нужно было заботиться о том, что происходит внутри CMakeFilesподкаталога.

В общем, вы не должны связываться ни с одним из файлов, которые CMake генерирует для вас. Все проблемы могут быть решены изнутри CMakeLists.txtтак или иначе. Пока результат строит ваш проект, как ожидалось, у вас, вероятно, все в порядке. Не беспокойтесь слишком сильно о кровавых деталях - так как именно это CMake пытался избавить вас в первую очередь.

ComicSansMS
источник
Спасибо. Знал о сборках вне исходного кода, но, как вы увидите, цель задать этот вопрос состояла в том, чтобы понять больше. Часть вашего ответа CMakeCache.txt действительно помогла. Это такое объяснение, которое я искал. Кроме того, последнее предложение моего вопроса: « Что именно конфигурирует и генерирует cmake перед сборкой проекта »
Nav
1
CMakeFilesКаталог содержит CMakeError.logи CMakeOutput.logважные для устранения неполадок сборки CMake.
Серж Рогач
1
Две вещи , которые иногда вам нужно проверить в CMakeFiles/target_name.dirкаталоге являются flags.makeи link.txtфайлы. Я должен был проверить это в сложном проекте, который унаследовал флаги / связанный материал от проектов верхнего уровня. Например: У меня были некоторые ошибки, потому что TPL A зависел от TPL B. Также у моего проекта была зависимость от B, который я установил локально; но A использовал версию B из моей системы (а не из локальной установки), в которой были включены различные опции, и она появилась первой, что привело к ошибкам в моем проекте. Только глядя на link.txt, я смог узнать, что это происходит.
Бартгол
13

Как указано на его сайте:

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

В большинстве случаев он используется для генерации файлов проекта / создания - в вашем примере он создал те, Makefileкоторые используются для сборки вашего программного обеспечения (в основном на платформе Linux / Unix).

Cmake позволяет предоставлять кросс-платформенные файлы сборки, которые генерируют файлы проекта / сборки для конкретной платформы для конкретной компиляции / платформы.

Например, вы можете попробовать скомпилировать свое программное обеспечение в Windows с помощью Visual Studio, а затем с правильным синтаксисом в своем CMakeLists.txtфайле запустить

cmake .

в каталоге вашего проекта на платформе Windows Cmake сгенерирует все необходимые файлы проекта / решения ( .slnи т. д.).

Если вы хотите построить свое программное обеспечение на платформе Linux / Unix, вы просто перейдете в исходный каталог, где у вас есть CMakeLists.txtфайл, и запустите его, cmake .и он сгенерирует все файлы, необходимые для создания программного обеспечения с помощью простого makeили make all.

Здесь у вас есть очень хорошая презентация о ключевых функциональных возможностях Cmake http://www.elpauer.org/stuff/learning_cmake.pdf

РЕДАКТИРОВАТЬ

Если вы хотите, чтобы зависимая от платформы библиотека включала / определения переменных и т. Д., Вы можете использовать этот синтаксис в CMakeLists.txtфайле

IF(WIN32)
   ...do something...
 ELSE(WIN32)
   ...do something else...
 ENDIF(WIN32)

Существует также множество команд, с помощью которых вы можете предотвратить сбой сборки, и вместо этого Cmake уведомит вас о том, что, например, у вас нет библиотек boost filesystemи которые regexустановлены в вашей системе. Для этого вы можете использовать следующий синтаксис:

find_package(Boost 1.45.0 COMPONENTS filesystem regex)

Проверив, что он сгенерирует make-файлы для соответствующей системы / IDE / компилятора.

Patryk
источник
1
Спасибо, Патрик. Полезный ответ, но PDF-файл, на который вы ссылаетесь, объясняет в основном второй этап изучения CMake, который в основном является реализацией CMake. Я спрашиваю об объяснении первого этапа, когда человек должен понять, что же происходит в CMake!
Nav
@Nav Я немного расширил свой ответ. Вы все еще можете искать в Интернете для получения дополнительной информации.
Патрик
Это довольно далеко от ответа на заданный вопрос.
SenhorLucas
1

Как именно работает CMake - это вопрос для разработчиков, поэтому здесь нельзя ответить на этот вопрос.

Тем не менее, мы можем дать несколько полезных советов относительно того, когда вам следует использовать CMake и когда вам нужно беспокоиться о том, как он работает. Я также не фанат ответов «о, это просто работает» - потому что, особенно в программном обеспечении, НИЧТО никогда не «просто работает», и вы ВСЕГДА должны в какой-то момент разбираться с мельчайшими подробностями.

CMake - инструмент промышленной прочности. Он автоматизирует несколько ОЧЕНЬ сложных процессов и учитывает многие переменные, о которых вы можете не знать, особенно как довольно новый разработчик, возможно, работающий с ограниченными знаниями обо всех операционных системах и инструментах сборки, которые может обрабатывать CMake. Причина, по которой генерируется так много файлов и почему вещи кажутся такими сложными, заключается в том, что все эти другие системы сложны и должны учитываться и автоматизироваться. Кроме того, существуют проблемы «кэширования» и других возможностей инструмента, позволяющих сэкономить время. Чтобы понять все в CMake, нужно понимать все, что есть в этих инструментах сборки и ОС, и все возможные комбинации этих переменных, что, как вы можете себе представить, невозможно.

Важно отметить, что если вы не отвечаете за управление большой кроссплатформенной системой сборки, а ваша кодовая база составляет несколько KLOC, может быть, до 100KLOG, использование CMake похоже на использование удаления лесного дерева стоимостью 100 000 долларов. Машина для удаления сорняков из 2 футов на 2 фута цветника. (Кстати, если вы никогда не видели такую ​​машину, вы должны искать ее на YouTube, они потрясающие)

Если ваша система сборки небольшая и простая, вероятно, будет лучше просто написать свои собственные файлы сборки вручную или написать их самостоятельно. Когда ваши make-файлы становятся громоздкими или вам нужно собрать версию вашей системы на другой платформе, вы можете переключиться на CMake. На этом этапе вам предстоит решить множество проблем, и вы сможете задать более конкретные вопросы по этому поводу. А пока посмотрите некоторые замечательные книги, написанные о CMake, или, что еще лучше, напишите одну самостоятельно! 8)

Мистер Джепс
источник