Hatred's Log Place

DON'T PANIC!

Feb 18, 2010 - 3 minute read - programming

./configure для qmake-based проектов

./configure для qmake-based проектов

Что бы очень не заморачиваться с формированием ./configure скрипта (и configure.exe программы для windows) при помощи autotools, когда вся их мощь не очень нужна, поможет проект qconf

Для Арчеводов, можно собрать из AUR svn версию: http://aur.archlinux.org/packages.php?ID=18686

Далее, на правах вольного пересказа английского README.

Intro

Итак, собираем, устанавливаем. Далее идем в корень вашего проекта, где лежит qmake файл, cоздаем там, для примера, файл myproject.qc примерно следующего содержания (это xml файл):

<qconf>
  <name>myproject</name>
  <profile>myproject.pro</profile>
</qconf>

дале пускаем: qconf myproject.qc

На выходе получаем скрипт ./confugure с функционалом, в базовой части соответствующей autotools.

Если запустить без аргумента, будет выбран первый найденный .qc файл, если их найдено не будет - автоматически будет выбран первый .pro файл, и на основе его собран минимальный .qc файл (как в примере выше).

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

Итак, на этот момент мы имеем готовый ./configure скрипт, который запускаем без параметров или смотрим ./configure --help.

Как это работает

После запуска ./configure, будет сформирован файл conf.pri, в котором будут содержаться различные переменные, отвечающие за сборку, основные из которых:

  • PREFIX
  • BINDIR
  • LIBDIR
  • QTDIR

Этот файл вы можете включать в ваш .pro файл: include(conf.pri)

Т.е. обобщая, как это работает: qconf формирует, на основе .qc файла, скрипт ./configure, который, будучи запущенным, выполняет нужные вам проверки, создает conf.pri, запускает qmake для вашего .pro файла, который (как я выше написал) может включать conf.pri файл (соответственно, все что будет записано в conf.pri - будет доступно для qmake).

Возможные директивы для .qc файла

  • <name>NAME</name> - имя проекта
  • <profile>FILE.pro</profile> - .pro файл проекта
  • <dep>...</dep> - описываем зависимости, проверка на которые будет проводиться:```xml
    * `"type"` - определяет модуль (примеры модулей идут вместе с qconf, правда только два: qt31.qcm и qt41.qcm). Если type задана как **pkg**, проверка происходит при помощи pkg-config (выводы --libs и --cflags будут добавлены при компиляции):
     * опрашивается параметры:
       * `"name"`
       * `"pkgname"`
       * `"version"` в которой могут содержаться знаки отношения: ">=", "<=", иначе принимается "="
    * `<required />` - определяет обязательность зависимости
    * `<disabled />` - зависимость выключена
    
  • <arg>DESRIPTION</arg> - дополнительные агрументы для скрипта ./configure, сам аргумент будет доступен через переменную окружения QC_NAME (большими буквами, можно достучаться в модулях проверки через getenv), включают атрибуты:
    • "name" - имя
    • "arg" - значение
  • <lib /> - включает режима, когда собираемый проект - библиотека
    • <static /> - в случае, если <lib />, собирать статическую библиотеку
  • <noprefix /> - очищает PREFIX
  • <nobindir /> - очищает BINDIR
  • <prefix>PATH</prefix> - задаем PREFIX (по умолчанию: /usr/local)
  • <bindir>PATH</bindir> - задаем BINDIR (по умолчанию: PREFIX/bin)
  • <incdir>PATH</incdir> - задаем INCDIR (по умолчанию: PREFIX/include)
  • <libdir>PATH</libdir> - задаем LIBDIR (по умолчанию: PREFIX/lib)
  • <datadir>PATH</datadir> - задаем DATADIR (по умолчанию: PREFIX/share)
  • <qtdir>PATH</qtdir> - задаем QTDIR
  • <moddir>PATH</moddir> - добавляет пути поиска модулей для
  • <qt3 /> - конфигурация для qt3 окружения (но сама qconf зависит от qt>=4.1, используйте версию 1.1 для qt3)

Да, пример где используется - psi, там же, в директории qcm можно найти очень много приятных модулей проверки.

Ну и да, это всего лишь помощь к qmake, но не замена. Его тоже настраивать нужно. И читать руководства по нему.

PS пока очень сумбурно, потому как, сейчас сам только с ним столкнулся, потом будет дополняться, уточняться.