CMake Tutorial — различия между версиями
(→Старт) |
Bobrov (обсуждение | вклад) |
||
Строка 19: | Строка 19: | ||
add_executable(test test.cpp) | add_executable(test test.cpp) | ||
− | Теперь запускаем (из консоли) в этой папке команду "cmake CMakeLists.txt" (аргументом можно передавать не только файл, но и | + | Теперь запускаем (из консоли) в этой папке команду "cmake CMakeLists.txt" (аргументом можно передавать не только файл, но и директорию, в которой он лежит, тогда cmake найдет его сам). |
− | cmake | + | |
− | + | cmake будет использовать переданный (или найденный) файл проекта (тот самый CMakeLists.txt), и в '''текущей''' директории будет создавать проект. | |
− | + | Проект - это много-много файлов и директорий, из которых нас больше всего интересует Makefile. | |
+ | |||
+ | Makefile - это файл, нужный для утилиты make. | ||
+ | Именно она запускает компиляторы, линковщики и прочие радости. Запускаем make в '''каталоге сборки''' (т.е. там же, где Вы запускали cmake). | ||
В консоли вылезет примерно такой текст: | В консоли вылезет примерно такой текст: | ||
Строка 34: | Строка 37: | ||
= We need to go deeper = | = We need to go deeper = | ||
− | Поразбираемся с различными | + | Поразбираемся с различными возможностями cmake. |
=== Указание необходимой версии cmake === | === Указание необходимой версии cmake === | ||
Строка 62: | Строка 65: | ||
Как видите, использовать значение можно и внутри кавычек. | Как видите, использовать значение можно и внутри кавычек. | ||
− | Переменные активно используются различными библиотеками - для установки флагов, параметров сборки/линковки и прочих вкусностей. | + | Переменные активно используются различными библиотеками - для установки флагов, параметров сборки/линковки и прочих вкусностей, об этом чуть-чуть попозже. |
+ | |||
+ | Пример коше'гного проекта со списком сорцов в отдельной переменной: | ||
+ | |||
+ | cmake_minimum_required(VERSION 2.6) | ||
+ | |||
+ | set(SOURCES test.cpp lib1.cpp lib2.cpp) | ||
+ | |||
+ | add_executable(test ${SOURCES}) | ||
+ | |||
+ | === Устанавливаем команды компилятору === | ||
+ | |||
+ | add_definitions(-std=c++11 -Wall) | ||
+ | |||
+ | Компилятору при компиляции добавляются соответствующие опции. | ||
+ | Кто не знает: "-std=c++11" включает в gcc поддержку стандарта c++11, "-Wall" говорит gcc выводить все предупреждения. | ||
+ | Сказать флаги для с++ можно и через переменные: | ||
+ | |||
+ | set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -Wall") | ||
+ | |||
+ | === Папка с хедерами === | ||
+ | |||
+ | Допустим, Вы хотите, чтобы хедеры (файлики, подключаемые через #include) искались еще и в каталогах "headers/" и "more_headers/": | ||
+ | |||
+ | include_directories("headers/" "more_headers/") | ||
+ | |||
+ | Надеюсь, и это понятно. |
Версия 21:25, 29 марта 2013
// Тут скоро будет туториал по CMake.
Содержание
Что это и зачем нужно
CMake — кроссплатформенная автоматизированная система сборки проектов. Непосредственно сборкой она не занимается, а только генерирует Makefile, который потом будет выполнен утилитой make.
CMake может проверять наличие необходимых библиотек и подключать их, собирать проекты под разными компиляторами и операционными системами. Т.е. у вас есть куча кода и файлик, содержащий информацию для cmake, и чтобы скомпилить это дело где-нибудь еще, вам нужно просто запустить там cmake, который сделает всё сам. Удобно, полезно, просто. Дисклеймер: Никита все еще считает, что cmake не нужен, но Никита извращенец и просто дурак.
Старт
Предполагается, что найти и скачать сам cmake ты, %username%, в состоянии. //а если нет?
Предположим, у Вас есть исходничек "test.cpp". Для начала нужно создать файлик для cmake, который обычно называют "CMakeLists.txt", и написать туда вот это:
add_executable(test test.cpp)
Теперь запускаем (из консоли) в этой папке команду "cmake CMakeLists.txt" (аргументом можно передавать не только файл, но и директорию, в которой он лежит, тогда cmake найдет его сам).
cmake будет использовать переданный (или найденный) файл проекта (тот самый CMakeLists.txt), и в текущей директории будет создавать проект. Проект - это много-много файлов и директорий, из которых нас больше всего интересует Makefile.
Makefile - это файл, нужный для утилиты make. Именно она запускает компиляторы, линковщики и прочие радости. Запускаем make в каталоге сборки (т.е. там же, где Вы запускали cmake). В консоли вылезет примерно такой текст:
Scanning dependencies of target test [100%] Building CXX object CMakeFiles/test.dir/test.cpp.o Linking CXX executable test [100%] Built target test
А у Вас в папочке появится исполняемый файл "test". Запустите, убедитесь, что это действительно то, что ожидается от компилляции файла "test.cpp".
We need to go deeper
Поразбираемся с различными возможностями cmake.
Указание необходимой версии cmake
cmake_minimum_required(VERSION 2.6)
Если используемая версия cmake меньше 2.6, он не захочет работать. Писать эту команду всегда - хороший стиль.
Название проекта
project(visualization)
Тут все понятно. Тоже хороший стиль.
Переменные
В cmake можно создавать текстовые переменные. Команда
set(VARIABLE The variable's value)
запишет в переменную "VARIABLE" значение "The variable's value". Чтобы где-либо использовать значение этой переменной, нужно написать ${VARIABLES}.
Чтобы добавить к переменной некий текст, можно сделать так:
set(VARIABLE "${VARIABLES} new text")
Как видите, использовать значение можно и внутри кавычек. Переменные активно используются различными библиотеками - для установки флагов, параметров сборки/линковки и прочих вкусностей, об этом чуть-чуть попозже.
Пример коше'гного проекта со списком сорцов в отдельной переменной:
cmake_minimum_required(VERSION 2.6) set(SOURCES test.cpp lib1.cpp lib2.cpp) add_executable(test ${SOURCES})
Устанавливаем команды компилятору
add_definitions(-std=c++11 -Wall)
Компилятору при компиляции добавляются соответствующие опции. Кто не знает: "-std=c++11" включает в gcc поддержку стандарта c++11, "-Wall" говорит gcc выводить все предупреждения. Сказать флаги для с++ можно и через переменные:
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -Wall")
Папка с хедерами
Допустим, Вы хотите, чтобы хедеры (файлики, подключаемые через #include) искались еще и в каталогах "headers/" и "more_headers/":
include_directories("headers/" "more_headers/")
Надеюсь, и это понятно.