Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка по программированию.pdf
Скачиваний:
44
Добавлен:
28.03.2015
Размер:
207.84 Кб
Скачать

5. Средства обеспечения переносимости и распространения Makefile

На сегодняшний момент существует множество UNIX-подоб- ных ОС и линейка ОС Windows. Для переносимости программ между ними возникает необходимость корректировать Makefile. Приведенный в предыдущем разделе Makefile для Linux не может быть корректно выполнен в Windows. Решение этой проблемы возможно с помощью скрипта или утилиты configure, входящей в состав инструментов, называемых GNU Autotools. Аналог такой возможности в средах быстрой разработки автору не известен.

Вкачестве утилиты configure чаще используется в ОС Windows,

вОС Linux configure реализуется как скрипт. В этом случае пользователю поставляются исходные файлы программы на языке программирования и скрипт configure, выполнение которого приводит к созданию Makefile. Следует учесть что при работе в Windows, набор инструментов Autotools устанавливается отдельно от набора MinGW. Последовательность действий пользователя заключается в выполнении команды:

./configure

Далее, выполняется работа с обычным Makefile.

make

make install

make clean

Для получения конфигурационного скрипта удалите из папки все файлы, кроме файлов с исходным текстом. Создайте два текстовых файла Makefile.am и configure.ac. Содержимое файла Makefile.am:

bin_PROGRAMS=HelloWorld.exe

HelloWorld_SOURCES=foo.h foo.cpp main.cpp

19

Значения записей:

bin_PROGRAMS=HelloWorld.exe - название конечного исполняемого файла.

HelloWorld_SOURCES=foo.h foo.cpp main.cpp - указывает на все исходные файлы, участвующие в сборке программы.

Содержимое файла configure.ac:

AC_INIT(main.cpp)

AM_INIT_AUTOMAKE(HelloWorld,0.1)

AC_PROG_CC

AC_PROG_CXX

AC_PROG_INSTALL

AC_OUTPUT(Makefile)

Скрипт configure.ac всегда начинается директивой AC_INIT и заканчиваться AC_OUTPUT. Значение команд.

AC_INIT(main.cpp) - инициализация скрипта. В качестве параметра передаётся название любого из исходных файлов. Проверяет, находится ли в данном каталоге такой файл и, если находится, считает текущий каталог рабочим.

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

AC_PROG_CC и AC_PROG_CXX - указывают, каким синтаксисом и с применением каких библиотек написана программа. Необходимы для выбора соответствующего компилятора. Если программа написана на C++ и использует стандартную библиотеку C++, выбирается директива AC_PROG_CXX. Если на С, выбирается AC_PROG_CC. В крупных программах, где используются элементы двух языков, пишутся обе директивы.

AC_PROG_INSTALL - указывает, что в make-файле необходимо

20

сформировать цель install, чтобы пользователь мог командой make install установить программу в системный каталог.

AC_OUTPUT - завершает скрипт и указывает, что конечный файл должен называться Makefile.

Дальше все операции будут рассматриваться применительно к ОС Linux, однако они имеют минимальные отличия от действий выполняемых для ОС Windows.

Для создания программы необходимо выполнить, находясь в папке с исходными файлами следующие команды:

aclocal

autoconf

touch README AUTHORS NEWS ChangeLog

automake -a

./configure

make

Разберём введеные команды:

aclocal сканирует файл configure.ac и, в зависимости от его директив, формирует макросы, предназначенные для autoconf и automake; эти макросы сохраняются в файле aclocal.m4;

autoconf формирует скрипт configure в зависимости от содержимого configure.ac;

automake формирует скрипт Makefile.in в зависимости от содержимого Makefile.am; в дальнейшем пользователь, запустив configure, сформирует Makefile на основании Makefile.in. Флаг -a означает, что, если программа не найдёт в каталоге проекта файлов install-sh, missing, INSTALL, COPYING, depcomp, она автоматически создаёт их. Наличие этих файлов обязательно в соответствии с их стандартым набором в GNU программе. В случае их отсутствия automake не сможет выполниться. Для их создания используется команда touch NEWS README AUTHORS ChangeLog, которая меняет время моди-

21

фикации файлов на текущее, а в случае отсутствия файла, создвет его пустым.

Распространение исполняемых файлов происходит в виде дистрибутивов, создать который можно следующей командой:

make dist

Обратите внимание, Makefile созданный автоматически содержит разделы, которые ранее не упоминались, например, dist. Благодаря этому разделу и появляется возможность создать дистрибутив. В результате должен появиться файл HelloWorld-0.1.tar.gz.

После этой операции программа полностью готова к распространению.

Для установки полученного дистрибутива необходимо выполнить следующие действия:

разархивировать дистрибутив

gunzip kalkul-0.1.tar.gz

tar xf kalkul-0.1.tar

перейти в каталог с дистрибутивом

cd HelloWorld-0.1

сформировать makefile

./configure

собрать программу

make

установить её в системный каталог

su root

make install

exit

очистить разархивированный каталог от ненужных файлов

make clean

Чтобы удалить программу выполните команды:

su root

22

make uninstall

exit

Программа выполненная по стандарту проекта GNU состоящая из нескольких файлов, должна иметь определенную структуру папок и файлов. В корневом каталоге должны быть расположены только текстовые файлы README, INSTALL, AUTHORS, THANKS, ChangeLog, COPYING, а также файлы имющие отношение к сборке программы. Все остальные файлы обычно располагаются во вложенных каталогах.

Вложенные каталоги имеют следующие названия: src – содержит все файлы исходного кода;

lib – необязательный каталог; содержит исходные коды библиотек, используемых сразу несколькими программами, а также участков кода, имеющих отношение к переносимости программ;

doc – содержит документацию к программе;

m4 – содержит макросы для autoconf, которые передаются другим разработчикам;

intl – содержит участки программы, отвечающие за интернационализацию программы, то есть перевода её интерфейса на разные языки;

po – содержит списки сообщений, с помощью которых программа общается с пользователем; здесь же – варианты этих сообщений на языках разных народов, предназначенные для интернационализации.

Однако возможны другие варианты расположения файлов. Применительно к программе HelloWorld файлы с исходным ко-

дом (main.cpp, foo.h, foo.cpp) необходимо помесить в каталоге src. Все остальные файлы и каталоги нужно удалить.

Далее выполним все операции по созданию исполняемого файла с учетом структуры каталогов.

23

В корневом каталоге проекта создадим файл Makefile.am, поместив в него следующий текст:

SUBDIRS = src

В каталоге src также создадим файл с таким же названием Makefile.am. Его содержимое:

bin_PROGRAMS=HelloWorld

HelloWorld_SOURCES=foo.h foo.cpp main.cpp

В корневом каталоге создадим файл configure.ac, следующего содержания:

AC_INIT(src/main.cpp)

AM_INIT_AUTOMAKE(HelloWorld,0.1)

AC_PROG_CC

AC_PROG_CXX

AC_PROG_INSTALL

AC_OUTPUT(Makefile src/Makefile)

В начальном макросе AC_INIT указывается, что исходные файлы расположены в каталоге src, а в конечном AC_OUTPUT указываем сразу на оба формируемых файла Makefile.

Генерируем конфигурационный скрипт:

aclocal

autoconf

touch README AUTHORS NEWS ChangeLog

automake -a

Собираем программу:

./configure

make

Создадим архив:

make dist

Обратите внимание на строку в сгенерированном make-файле:

DEFS

=

-DPACKAGE_NAME=\"\"

-DPACKAGE_TARNAME=\"\" -DPACKAGE_VERSION=\"\"

24

-DPACKAGE_STRING=\"\" -DPACKAGE_BUGREPORT=\"\"

-DPACKAGE=\"HelloWorld\" -DVERSION=\"0.1\"

Таким путём make-файл указывает на имя и версию пакета, которые были переданы директивой AM_INIT_AUTOMAKE(HelloWorld, 0.1) в файле configure.ac. Таким же образом передаются и другие параметры. Если их будет много, то эта строка в make-файле станет слишком длинной. Следует учесть, что некоторые UNIX-системы имеют лимит на длину строки в скриптах, при превышении которого скрипты не обрабатываются. Кроме того найти ошибку в длинной строке значительно сложнее.

Для преодоления этих сложностей используемые параметры указываются в заголовочном файле config.h с помощью макроса #define. Применение этой возможности приведет к следующим изменениям в программе.

В начале всех файлов с исходным кодом необходимо вставить макрос подключения файла config.h и защиты от повторного включения:

#ifdef HAVE_CONFIG_H

#include <config.h>

#endif

В корневом каталоге проекта создайте файл configure.ac, включающий следующие строки.

AC_INIT(src/main.cpp)

AM_CONFIG_HEADER(src/config.h)

AM_INIT_AUTOMAKE(HelloWorld,0.1)

AC_PROG_CC

AC_PROG_CXX

AC_PROG_INSTALL

AC_OUTPUT(Makefile src/Makefile)

Файл Makefile.am в корневом каталоге проекта содержит одну

25

строку:

SUBDIRS = src

Файл Makefile.am в каталоге src содержит строки:

bin_PROGRAMS=HelloWorld

HelloWorld_SOURCES=foo.h foo.cpp main.cpp

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

HelloWorld_LDADD = -lm

Команды формирования конфигурационного скрипта:

aclocal

autoconf

touch NEWS README AUTHORS ChangeLog

autoheader

automake -a

В результате, помимо всего прочего, сформировался файл config.h.in, в котором указаны все макросы препроцессора, которые войдут в будущий заголовочный файл config.h. Файл config.h будет формироваться на машине пользователя по команде ./configure, и его структура будет зависеть от конфигурации компьютера пользователя. Создадим Makefile:

./configure

make

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

DEFS = -DHAVE_CONFIG_H

Далее можно создавать дистрибутив: make dist

26