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

Я не спрашиваю об этом только для себя. Я надеюсь, что этот вопрос послужит справкой для многих новичков, которые, как и я, сочли его крайне озадаченным относительно того, что именно происходило за кулисами, когда для такого маленького 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 перед сборкой проекта?

2 ответа

Решение

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

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 пытался избавить вас в первую очередь.

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

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/ компилятора.

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

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

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

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

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

Другие вопросы по тегам