Как именно работает 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 ответа:
секрет в том, что вам не нужно понимать, что делают сгенерированные файлы.
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
fileIF(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 / компилятора.