Как именно работает 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)