CMake и Qt 4

<< Предыдущая Содержание

Хотя у Qt есть свой собственный генератор make-файлов – утилита qmake, использование cmake для сборки проектов Qt дает множество преимуществ. Пакет cmake обеспечивает единообразие процесса сборки для различных приложений. С помощью cmake можно собирать комплексы приложений, часть из которых использует Qt, а часть – нет. Вот как выглядит файл CMakeLists.txt, предназначенный для сборки программы imageviewer, которая содержит, помимо собственно исходных текстов, файлы ресурсов и файлы переводов.

project(imageviewer C CXX)
cmake_minimum_required(VERSION 2.6.0)
set (CMAKE_IN_SOURCE_BUILD TRUE)
set(SOURCES main.cpp mainwindow.cpp)
set(UIS MainWindow.ui)
set(MOC_HEADERS mainwindow.h)
set (RCCS imageviewer.qrc)
set(QM_FILES imageviewer_ru.qm)
set (TS_FILES imageviewer_ru.ts)
add_definitions(-Wall -g)
find_package(Qt4 REQUIRED)
include(${QT_USE_FILE})
qt4_wrap_ui(UI_HEADERS ${UIS})
qt4_wrap_cpp(MOC_SRCS ${MOC_HEADERS})
qt4_add_resources(RCC_SRCS ${RCCS})
include_directories(${CMAKE_BINARY_DIR})
add_executable(imageviewer ${SOURCES} ${UI_HEADERS} ${MOC_SRCS} ${RCC_SRCS} ${QM_FILES})
target_link_libraries(imageviewer ${QT_LIBRARIES})
add_custom_target(translations DEPENDS ${QM_FILES})
qt4_add_translation(${QM_FILES} ${SOURCES} ${MOC_SRCS} ${UI_HEADERS} ${TS_FILES}) 

Предполагается, что вы уже прочитали первые три статьи про CMAKE, поэтому останавливаться на общих элементах файла CMakeLists.txt мы не будем. Прежде всего, мы определяем переменные, которые содержат перечни исходных файлов проекта Qt. Имена файлов C++ содержатся в переменной SOURCES. Имена файлов дизайнера интерфейса содержатся в переменной UIS. Переменная MOC_HEADERS содержит имена файлов, к которым следует применить утилиту moc. Переменной RCCS присваиваем имя файла описания ресурсов (файл с расширением qrc). Переменная TS_FILES содержит имена файлов-исходников перевода (файлы с расширением ts, созданные в программе linguist). Наконец, переменная QM_FILES указывает, как должен называться бинарный модуль перевода. Имена этих переменных можно выбирать произвольно.

Подключаем пакет расширений CMake для работы с Qt 4.x:

find_package(Qt4 REQUIRED)

После ключевого слова REQUIRED можно указывать модули Qt, требуемые приложению (например: QtCore QtGui QtSql). Можно так же указать минимальную требуемую версию Qt:

find_package(Qt4 4.6 REQUIRED)

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

set(QT_DONT_USE_QTGUI ON) 

Кроме того модуль Qt4 объявляет различные переменные, в которых содержатся пути к заголовочным файлам, утилитам и библиотекам Qt. Например, для связывания приложения с библиотеками Qt мы используем переменную QT_LIBRARIES. Переменная QT_USE_FILE содержит список дополнительных модулей расширения CMake, которые нужно подключить к проекту для работы с выбранными модулями Qt.

Команда qt4_wrap_ui() генерирует классы, описывающие графический интерфейс, из файлов с расширением ui (с помощью утилиты uic). Первый аргумент этой команды – имя переменной, в которой будут сохранены имена файлов, полученных в результате выполнения uic. В нашем случае это будет файл ui_MainWindow.h. Второй параметр команды – это переменная UIS, из которой берутся имена исходных файлов для передаче утилите uic. У команды qt4_wrap_ui() может быть еще и третий параметр – OPTIONS. Например:

qt4_wrap_ui(UI_HEADERS ${UIS} OPTIONS -n)

В этом случае утилита uic будет вызвана с ключом –n.

Команда qt4_wrap_cpp() похожа на qt4_wrap_ui(). Она вызывает утилиту moc для списка имен файлов, переданных ей во втором аргументе и сохраняет результаты работы moc в переменной, которая передана ей в качестве первого аргумента. Так же как и у qt4_wrap_ui(), у qt4_wrap_cpp() существует необязательный параметр OPTIONS, с помощью которого можно задать ключи командной строки для программы moc. Команда qt4_add_resources() делает то же, что и qt4_wrap_ui() и qt4_wrap_cpp(), только для ресурсов. Вторым аргументом команды должен быть список файлов qrc, из коорых, с помощью утилиты rcc, будут созданы модули ресурсов. У этой команды так же есть дополнительный параметр OPTIONS.

Команда qt4_add_translation() выполняет преобразование файлов исходников перевода (второй аргумент) в файлы с расширением qm, имена которых сохраняются в переменной, переданной команде в качестве первого аргумента. У этой команды нет дополнительного параметра OPTIONS.

Часто бывает полезно сделать так, чтобы для сборки наиболее подвижных элементов проекта (например, модулей переводов интерфейса) существовала отдельная цель сборки. Команда add_custom_target() позволяет нам задать специальную цель сборки. Первый аргумент команды – имя цели. У команды много дополнительных параметров, но использовать их все необязательно. В минимальном случае достаточно параметра DEPENDS, за которым следует список файлов, которые должны быть созданы в результате выполнения цели. В файле CMakeLists.txt должна присутствовать команда, создающая эти файлы (в нашем примере это команда qt4_add_translation()). В результате, когда система CMake создаст Make-файл для сборки приложения, мы сможем скомандовать

make translations

для обновления модулей перевода (без сборки остального проекта). При сборке всего проекта модули перевода так же  будут собраны по умолчанию.

Демонстрационный проект

<< Предыдущая Содержание

Понравился контент? Нажми:

© 2011  Андрей Боровский <anb@symmetrica.net>


На главную