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

Как работает 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 до того, как он построит проект?

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

find_package(Boost 1.45.0 COMPONENTS filesystem regex)

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

Ответ 3

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

Файл CMakeLists.txt является входом в систему сборки CMake для сборки пакетов программного обеспечения.... Файл CMakeLists.txt, используемый для проекта catkin, представляет собой стандартный ванильный файл CMakeLists.txt с несколькими дополнительными ограничениями.