
- •Введение
- •1. Компилятор GCC
- •2. Компилятор G++
- •3. Автоматизация компиляции и сборки программ с помощью утилиты make
- •4. Отладчик gdb
- •5. Средства обеспечения переносимости и распространения Makefile
- •7. Задания для самостоятельного выполнения
- •Заключение
- •Список литературы
- •Приложение 1. Список ключей компиляторов GCC и G++
- •Приложение 2. Список команд для отладчика gdb
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