CMake Tutorial — различия между версиями

Материал из Викиконспекты
Перейти к: навигация, поиск
Строка 58: Строка 58:
  
 
запишет в переменную "VARIABLE" значение "The variable's value".
 
запишет в переменную "VARIABLE" значение "The variable's value".
Чтобы где-либо использовать значение этой переменной, нужно написать ${VARIABLES}.
+
Чтобы где-либо использовать значение этой переменной, нужно написать ${VARIABLE}.
  
 
Чтобы добавить к переменной некий текст, можно сделать так:
 
Чтобы добавить к переменной некий текст, можно сделать так:
  
  set(VARIABLE "${VARIABLES} new text")
+
  set(VARIABLE "${VARIABLE} new text")
  
 
Как видите, использовать значение можно и внутри кавычек.
 
Как видите, использовать значение можно и внутри кавычек.
Строка 92: Строка 92:
  
 
Надеюсь, и это понятно.
 
Надеюсь, и это понятно.
 +
 +
=== Самое важное - подключение библиотек ===
 +
 +
Научимся искать и подключать библиотеки при помощи cmake на примере Boost.
 +
Для начала установим переменные для буста:
 +
 +
set(Boost_USE_STATIC_LIBS OFF)
 +
set(Boost_USE_MULTITHREADED ON)
 +
 +
Первое - мы не хотим, чтобы буст подключался к нам статически (т.е. хотим динамическую линковку). <span style="color:#a0a0a0">Если ты, %username%, не знаешь, что это, пока просто забей и используй этот флаг так, как написано. Но в ближайшее время узнай, о чем речь.</span> 
 +
Второй флаг разрешает бусту внутри своих магических реализации использовать треды для распараллеливания и прочих радостей.
 +
 +
Итак, мы установили флаги. Давайте найдем буст!
 +
 +
find_package(Boost REQUIRED)
 +
 +
Нашли. Опция "REQUIRED" говорит о том, что библиотека необходима проекту.
 +
Без нее cmake решит, что отсутствие данной библиотеки - не так уж и страшно, и будет собирать дальше.

Версия 21:41, 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". Чтобы где-либо использовать значение этой переменной, нужно написать ${VARIABLE}.

Чтобы добавить к переменной некий текст, можно сделать так:

set(VARIABLE "${VARIABLE} 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/")

Надеюсь, и это понятно.

Самое важное - подключение библиотек

Научимся искать и подключать библиотеки при помощи cmake на примере Boost. Для начала установим переменные для буста:

set(Boost_USE_STATIC_LIBS OFF)
set(Boost_USE_MULTITHREADED ON)

Первое - мы не хотим, чтобы буст подключался к нам статически (т.е. хотим динамическую линковку). Если ты, %username%, не знаешь, что это, пока просто забей и используй этот флаг так, как написано. Но в ближайшее время узнай, о чем речь. Второй флаг разрешает бусту внутри своих магических реализации использовать треды для распараллеливания и прочих радостей.

Итак, мы установили флаги. Давайте найдем буст!

find_package(Boost REQUIRED)

Нашли. Опция "REQUIRED" говорит о том, что библиотека необходима проекту. Без нее cmake решит, что отсутствие данной библиотеки - не так уж и страшно, и будет собирать дальше.