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


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

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 101

2 ответа:

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

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

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

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

cd <source_dir>
cmake .

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

cd <build_dir_different_from_source_dir>
cmake <source_dir>
. Я обычно использую пустую подпапку build в моей исходной папки в качестве каталога сборки.

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

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

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

как указано на его веб-сайте:

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

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

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

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

cmake .

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

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

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

EDIT

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

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

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

find_package(Boost 1.45.0 COMPONENTS filesystem regex)

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