Bernd
Pol
Ian
Wadham

# Сборка и управление проектом

Здесь затрагиваются только компилируемые языки, такие как C++, &Java;, фортран.

В руководстве затронуты такие темы:

- Краткое описание &automanag;

- Использование менеджера Automake содержит основы работы &automanag;,

## Краткое описание &automanag;

В главе Системы сборки был изложен краткий обзор систем сборки, часто использующихся в UNIX. Здесь они рассматриваются подробнее.

Существует некоторая неразбериха с тем, как называть программы такого типа, в &GNU; описаниях Automake, Autoconf и Libtool, называет их системами сборки (build systems). QMake называет себя средством для написания файлов Makefile для разных компиляторов и платформ (a tool to write Makefiles for different compilers and platforms) . В KDE также часто используется термин системы управления проектом (project management systems). Мы будем использовать последний для обозначения встроенных окружений в &kdevelop;, которые организуют и собирают проекты. В этой секции, однако, он будет использоваться в смысле автоматизированные системы сборки.

### Потребность в автоматизированных системах сборки

Если у вас простая программа Hello World, написанная на чистом C, вы можете скомпилировать и скомпоновать её с помощью &gcc; `-o hello hello.c` и запустить командой `./hello`, так что вам даже не и не нужен `Makefile`.

Если же у вас программа, написанная на C, с несколькими модулями и заголовочными файлами, и вы сделали её исключительно для себя, вам будет нужен простой `Makefile`, который легко написать собственноручно (см. `info Make`).

Проблемы возникают когда:

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

- У вас иерархическая структура каталогов с исходниками,

- Вы используете библиотеки, не являющиеся стандартными библиотеками набора &UNIX;, такие как &Qt; или библиотеки &kde;,

- Вы используете пред-процессор для генерирования части исходного кода, например, MOC pre-compiler от Qt,

- Вы хотите распространять ваше приложение в Сети, для людей с другим дистрибутивом &UNIX;/&Linux;, набором программного и аппаратного обеспечения,

- Вам нужна автоматическая установка и удаление установленной программы,

- Вы хотите сделать своё приложение частью &kde;.

Если хотя бы одна из перечисленных ситуаций применима к вам, тогда вам потребуется система сборки. В примере выше мы использовали &gcc; для компиляции и сборки программы Hello World, но не все компиляторы C имеют название &gcc;. Так что, если вы будете распространять своё приложение, вполне может найтись человек, имеющий другой компилятор в своей системе. И здесь на помощь приходят файлы Makefile, содержащие такие данные, как, например, имя компилятора в данной системе.

Система сборки заботится о том, чтобы ваше приложение можно было автоматически скомпилировать на любой совместимой платформе.

- Она найдёт расположение библиотек,

- скомпилирует и

- установит компоненты вашего приложения

- в корректные каталоги системы

Коротко, система сборки предлагает простой и безопасный метод компилирования и установки вашего приложения в конечной системе. как было сказано выше, &kdevelop; поставляется с тремя автоматизированными системами сборки и возможностью создавать файлы Makefile вручную:

- Automake, использующий стандартные инструменты разработки &GNU;.

- QMake, использующий менеджер проектов trolltech.

- ANT, использующий менеджер проекта Apache ANT (для &Java;)

- Специальный позволит вам писать файлы `Makefile` самостоятельно.

Один из этих вариантов вам нужно будет выбрать при создании нового проекта, и выбор будет трудно сменить позже, так что заранее определите, какая система сборки наиболее подходит вам.

### Руководства по Autoconf/Automake/Libtool

Доступно несколько руководств по системе сборки &GNU; (`Autoconf`, `Automake` и `Libtool`), используемой менеджером &automanag;.

- Краткое руководство autoconf (оригинал на английском), написанное Кристофером Картисом, и доступное на домашней странице KDevelop. В нём делается акцент на основные этапы редактирования `Makefile`.

- Более подробное руководство можно найти в большом сборнике руководств Разработка ПО с GNU.

- Книжку про Autoconf, Automake, and Libtool можно найти по адресу . Это наиболее полное введение в &GNU; Autotools. Также прочитать о GNU Automake на русском вы можете здесь:

### Что делает &automanag;?

Мастеру приложений потребуется инициализировать файлы `Makefile.am` при создании проекта, использующего Систему сборки &GNU;, например C++ KDE. В процессе разработки, &automanag; создаёт файлы `Makefile.am` для проектов, использующих Систему сборки &GNU;, и сопровождает их.

В каждом каталоге вашего проекта, содержащего файлы, которые требуется компилировать или устанавливать, находится один файл `Makefile.am`. В нём находятся указания ко компиляции, сборки и установке, а также список подкаталогов, также имеющих `Makefile.am`.

Каталоги вашего проекта и исходники могут быть разбросаны в структуре любой глубины, или же в подкаталогах одного уровня.

Цель Системы сборки &GNU; — создать структуру исходников, которую можно скомпилировать, построить и установить на любой системе &UNIX; или &Linux;, используя простые команды:

    ./configure
    make
    make install    # с правами "root".

и удалить установленную программу командой `make uninstall` (также от root).

Как это работает? `configure` — это сценарий, который

- собирает информацию о системе, на которой работает, например, какой компилятор в ней установлен и какие библиотеки доступны и где, а потом

- рекурсивно создаёт файлы `Makefile` используя `Makefile.in` как шаблон.

Файлы `Makefile.in` — это входные файлы, шаблоны с базовой информацией для файлов `Makefile`, которые будут созданы из них путём заполнения в них определённой, зависимой от системы, информации. Всё это происходит под управлением `Automake`.

Процесс перехода от `Makefile.am` (`.am` означает шаблон Automake) к `Makefile` управляется &promanag;, через утилиту `Autoconf`, макрос `M4` и пр.

Когда выполняется `make`, он автоматически собирает информацию об окружении, такую как путь к компиляторам и библиотекам. Аналогично, `make install` перемещает компоненты приложения, такие как исполнимые файлы, документацию, в корректные места окружения.

Если вы распространяете ваше приложение как tarball (архив, который можно создать в KDevelop), в нём будут включены файлы `Makefile.in` и скрипт `configure`, чтобы его можно было собрать и установить на системе, где нет `Automake`, `Autoconf` или KDevelop. Файлы `Makefile.am` также включаются, для того случая, когда потребуется безболезненно вмешаться в исходный код.

Правила усложняются если вы также распространяете программу через хранилище, основанное на web, такое как . &cvs; &kde;

### Подытожим возможности Automake Manager

- Генерирование файлов `Makefile.am` в подкаталогах (называемых subprojects).

- Обновление файлов `Makefile.am` при изменении структуры проекта.

- Обновление файлов `Makefile.am` при добавлении или удалении файлов из проекта.

- Настройка параметров сборки или установки отдельных файлов, изменение `Makefile.am` в соответствии с этим.

- Настройка параметров, используемых при сборке и установке (например имена библиотек).

### Содержание файлов Automake

Файл `Makefile.am` содержит строки с именами переменных, знаком равно и списком файлов или значением параметра. Имена переменных состоят из двух частей, например `bin_PROGRAMS`, `myapp_SOURCES` или `kdelnk_DATA`. Вторая часть называется первичной (primary) и представляет что-то, что нужно собрать или установить. Первая часть называется приставкой (prefix) и представляет:

- Каталог, куда нужно устанавливать (например `bin`),

- Спецификатор (например `myapp` для `SOURCES`, это говорит о том, что исходные файлы, перечисленные поле `myapp_SOURCES` входят в сборку `myapp`),

- Специальная приставка `noinst` (no installation), используется для перечисления заголовочных файлов (`.h`),

- Специальная приставка `EXTRA` для вещей, зависящих от конфигурации системы.

Для подробностей о `Automake` и файлах `Makefile.am` см. `info Automake`.

&automanag; создаёт и обновляет переменные и их значения. Далее приведён пример `Makefile.am` для приложения с названием `myapp`.

    ## Makefile.am для myapp

    # устанавливаемая программы.  её имя используется
    # для всех переменных Makefile.am
    bin_PROGRAMS = myapp

    # путь include для X, qt и KDE
    INCLUDES = $(all_includes)

    # пути к библиотекам.
    myapp_LDFLAGS = $(KDE_RPATH) $(all_libraries)

    # библиотеки, с которыми компоновать.
    myapp_LDADD   = $(LIB_KFILE) $(LIB_KDEPRINT)

    # что компилировать для myapp
    myapp_SOURCES = main.cpp myapp.cpp myappview.cpp

    # заголовки
    noinst_HEADERS = myapp.h myappview.h

    # разрешить automoc обрабатывать все исходные meta файлы (moc)
    METASOURCES = AUTO

    KDE_ICON = myapp

    # куда пойдёт файл kdelnk
    kdelnkdir = $(kde_appsdir)/Utilities
    kdelnk_DATA = myapp.desktop

    # куда пойдёт XML-GUI файл ресурсов
    rcdir = $(kde_datadir)/myapp
    rc_DATA = myappui.rc

    AM_CXXFLAGS = -DMY_C++_PREPROCESSOR_OPTION

Как вы видите, большинство пунктов справа — набор символов в форме `$(xxx)`. Это переменные окружения, определённые в собственно окружении &kde;. Они заменяются действительными значениями когда `./configure` генерирует файлы `Makefile` из шаблонов.

Также, команда `./configure --help` отобразит список вещей, которые вы можете изменить во время сборки/компиляции. В частности, команда:

    ./configure --prefix=/где/вы/желаете

будет перенаправлять устанавливаемые файлы куда вы захотите, сменой значения внутренней переменной `$(prefix)` на `/где/вы/желаете`.

## Использование менеджера Automake

В этой главе вы найдёте краткое описание элементов &automanag; и как их использовать. В частности:

- Окно &automanag; описывает структуру окна &automanag;.

- Элементы верхнего окна.

- Элементы нижнего окна с деталями.

- Навигация по &automanag; содержит список основных действий, которые вы можете выполнять в &automanag;.

- Контекстные меню в &automanag; описывает окна, появляющиеся после выбора какого-либо действия в &automanag;.

### Окно &automanag;

- &automanag; запускается в отдельном окне. Верхняя часть называется Overall View, а нижняя — Detail View. Между ними располагается узкая панель, которую можно перетаскивать для регулировки размеров верхнего и нижнего окон. В режиме IDEAl можно также изменять ширину окна.

- Вверху каждого окна есть панель инструментов, кнопки на которой активируются, когда выбирается элемент из списка в окне. роме того действия над элементами можно совершать через их контекстные меню.

- В режиме IDEAl также есть две дополнительные кнопки, слева на заголовке окна – треугольная стрелка вправо и точка. Первая закрывает окно, а вторая сохраняет его открытым даже если активировано другое окно &kdevelop; (иначе окно &automanag; будет автоматически закрыто сразу после передачи фокуса на другое окно).

### Окно Overall View

Окно Overall View содержит древовидный список каталогов вашего проекта, содержащих программные файлы, документацию или другие данные. В каждом из них находится файл `Makefile.am`, называемый в &automanag; подпроектом (subproject). Как показано на рисунке, есть три стандартных подпроекта:

- `src` – исходники вашего приложения,

- `doc` – руководство приложения (Handbook),

- `po` – файлы перевода, содержащие перевод всей текстовой информации вашего приложения (например, заголовки окон, пункты меню, названия кнопок).

Обратите внимание, что `doc` всегда содержит подкаталог `en`. Это потому, что основной язык документации KDE — английский (en). Если ваше приложение станет частью KDE, команды перевода KDE переведёт его с английского на другие языки, размещаемые в других каталогах, например `ru` (русский) или `uk` (украинский). Сообщения в файле `po` также будут переведены, что позволит использовать ваше приложение людям, не знающим английский.

Подкаталоги `doc` и `po` служат для разных целей. `doc` содержит документацию, такую как руководство, `po` содержит сообщения для перевода пользовательского интерфейса, встроенного в исходники данного приложения.

Окно Общее просмотр (Overall View) также служит как средство навигации. Если вы выберите подпроект, подробности о нём будут отображены в окне Detail View.

### Окно Detail View

Окно Detail View содержит древовидный список файлов подпроекта, выделенного в окне Overall View, а также правила компиляции, сборки и установки для них.

#### Цели

Древовидный список в Detail View имеет два уровня. Верхний состоит из т.н. целей (target) &automanag;, и нижний содержит списки файлов, составляющие каждую цель.

Принцип цели &automanag; отличается от цели `Makefile`. Коротко:

- Определение способа компиляции, сборки и установки набора файлов, известно как цель в &automanag;, и как переменная в `Automake`.

- Цель в `make` — параметр команды `make` (например `make install`, `make clean`).

  Тем не менее, все переменные файла `Makefile.am` представляютподцель (sub-target) в `make`.

### Навигация в &automanag;

При щелчке в окне Overall View или Detail View на + или -, рядом с именем подпроекта или цели, приведёт развёртыванию или свёртыванию дерева.

#### открытие файла для правки

При щелчке на файле в окне "Детали", он откроется в окне редактирования . &kdevelop;

#### Активирование кнопок &automanag;

При щелчке на имени подпроекта в окне Overall View или цели в Detail View, активируются некоторые кнопки панели инструментов.

Рекомендуется использовать контекстные меню вместо панели инструментов, т.к. так легче видеть и понимать что вы делаете.

Действия над подпроектами и целями широко действуют на структуру, компиляцию, сборку и установку вашего приложения.

#### Контекстные меню

В контекстном меню подпроекта, цели или файла можно выбрать действия над ним, например добавить цель в подпроект, добавит или удалить файл в цель (из цели).

### Контекстные меню &automanag;

Далее изложен обзор контекстных меню &automanag;. Более подробное их описание вы найдёте в следующей главе.

#### Контекстное меню файла

На рисунке ниже, выбран значок `hi-16app-myapp.png` из цели Icon data in myapp подпроекта myapp/src.

- Действие по умолчанию — Удалить файл из цели.

- Подменю CVS содержит действия над файлом, касающиеся CVS.

- Открыть в позволяет открыть файл любой командой (например, в нашем случае, мы можем открыть значок в KIcon).

- Perforce — проприетарный пакет, аналогичный CVS.

#### Контекстное меню цели

На рисунке ниже, выбрана цель myapp (Program in bin) подпроекта myapp/src.

- Параметры только для целей, содержащих исходные файлы. Вы сможете указать ключи компоновщика и пути, по которым производить поиск библиотек, а также вы можете указать список библиотек, с которыми нужно компоновать ваше приложение.

- Создать файл приведёт к созданию нового файла.

- Добавить существующие файлы приведёт к добавлению файла.

- Удалить приведёт к удалению цели и всех её файлов с диска.

- Сделать цель активной только для целей, содержащих исходные файлы. Активирует текущую цель — новые файлы всегда добавляются в неё

- Собрать цель приведёт к сборке текущей цели.

#### Контекстное меню подпроекта

Меню подпроекта позволяет делать большие изменения в структуре вашего проекта, а также способ его компиляции, сборки и установки.

- Параметры содержит параметры компиляции, сборки и установки проекта. В появившемся диалоге будут вкладки Compiler, Includes, Prefixes и Build Order.

- Добавить подпроект создаст новый подкаталог в структуре проекта и начальный файл Makefile.am.

- Добавить цель откроет диалог, где вы сможете установить правила компиляции, сборки и установки файлов подпроекта.

- Добавить сервис (... в процессе написания ...)

- Добавить приложение (... в процессе написания ...)

- Добавить существующие подпроекты... (... в процессе написания ...)

- Удалить подпроект — правильный способ удаления подпроекта. При этом также "подправятся" файлы `Makefile.am`. Кроме того, будет предложено удалить все файлы, находящиеся в подкаталоге. Используйте это с осторожностью.

- Собрать приведёт к сборке текущего подпроекта.

- Пересоздать (... в процессе написания ...)

- Очистить (... в процессе написания ...)

- Установить (... в процессе написания ...)

- Установить (с правами root) (... в процессе написания ...)

## Automake

(... в процессе написания ...)

### Autoconf

#### Эффект скрипта configure

`Makefile.in` в `Makefile`

    prefix = @prefix@
    INSTALL = @INSTALL@
    build_triplet = @build@
    CXX = @CXX@

    prefix = /home/bernd/kde3
    INSTALL = /usr/bin/ginstall -c -p
    build_triplet = i686-pc-linux-gnu
    CXX = g++

`config.h.in` в `config.h`

    /* Define if you have libz */
    #undef HAVE_LIBZ
    /* Размер `int', как подсчитано sizeof. */
    #undef SIZEOF_INT

    /* Define if you have libz */
    #define HAVE_LIBZ 1
    /* Размер `int', как подсчитано sizeof. */
    #define SIZEOF_INT 4

### Automake

(... в процессе написания ...)

### &automanag;

#### Снимок экрана менеджера automake

### Сборка и установка библиотек

- -rpath

- PIC

- static

- plugins: no-undefined

## Специальные файлы makefile и сценарии сборки

(... в процессе написания ...)

## Параметры компилятора

(... в процессе написания ...)

## Параметры make

(... в процессе написания ...)