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

Однако это не единственный вариант составления Make-файлов с использованием данной библиотеки.

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

После инсталляции LibMPU на вашу GNU/Linux систему в распоряжении пользователя, помимо самой библиотеки, будет находиться m4-скрипт /usr/share/aclocal/libmpu.m4. Скрипт libmpu.m4 предназначен для использования в проектах, создаваемых с помошью утилит Autoconf, Automake.

Рассмотрим теперь создание простой программы main, но уже в виде исходного проекта, созданного по канонам GNU.

Программа main.c будет выглядеть следующим образом:

#ifdef HAVE_CONFIG_H
#include <config.h>
#endif

#include <libmpu.h>
#include <stdio.h>

int main( void )
{
  int  rc = 0;

  __mpu_init();
  __mpu_extra_warnings = 1;

  {
    mpu_real128_t r, d;
    __mpu_char8_t   s[6000];
    int  nb = NB_R128;

    ascii_to_real( r, "3.1415926535898", nb );
    ascii_to_real( d, "2.0", nb );

    r_div( r, r, d, nb );
    real_to_ascii( s, r, _real_mant_digs(nb), 'E', 0, 0, nb );
    printf( "rc = %d; s = %s\n", rc, s );
  }

  __mpu_free_context();

  return( rc );
}

Для сборки нашей программы необходимо составить исходный Makefile.am, который будет использован утилитой Automake для создания рабочего Make-файла проекта:

ACLOCAL_AMFLAGS = -I m4

bin_PROGRAMS = main

main_SOURCES = main.c

main_CFLAGS  = $(LIBMPU_CFLAGS)
main_LDFLAGS = $(LIBMPU_LDFLAGS)
main_LDADD   = $(LIBMPU_LIBS)

Здесь видно, что поставлять мы будем единственную программу main, исходный код которой записан в файле main.c и, кроме того, программа будет использовать библиотеку LibMPU.

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

Для этого нам необходимо создать скрипт configure, исходным описанием которого будет наш собственный файл configure.ac:

AC_PREREQ([2.71])

AC_INIT([main],[1.0.1],[Andrey V.Kosteltsev <support@radix-linux.su>],[main],[https://radix-linux.su])

AM_INIT_AUTOMAKE([dist-xz no-dist-gzip])

AC_CONFIG_HEADERS(config.h)
AC_CONFIG_MACRO_DIRS([m4])

AC_CHECK_LIBMPU([1.0.15],[yes],_have_libmpu=yes,_have_libmpu=no)

if test "x$_have_libmpu" = "xyes" ; then
  AC_DEFINE(HAVE_LIBMPU, [1], [Define if libmpu is available])
fi

AC_CONFIG_FILES([ Makefile ])
AC_OUTPUT

Основным моментом здесь является использование функции AC_CHECK_LIBMPU(), которая позволит нам определить наличие LibMPU в системе пользователя и декларировать в результирующем Make-файле все необходимые переменные для сборки нашей программы.

Первым аргументом функции AC_CHECK_LIBMPU() является минимальная версия LibMPU пригодная для работы нашей программы. Второй аргумент – это значение по умолчанию опции --with-libmpu, которая будет задаваться во время конфигурирования исходного кода нашего проекта на машине пользователя. Третий аргумент задает действие, выполняемое в случае обнаружения LibMPU в системе, а четвертый – действие, выполняемое в том случае, если библиотека LibMPU не будет найдена.

Если, во время конфигурирования нашего проекта, библиотека будет найдена в системе, то в заголовочном файле config.h будет определена константа HAVE_LIBMPU.

Итак, для создания нашего проекта, нам пришлось создать вручную всего три файла: Makefile.am, configure.ac, main.c. Все остальное для нас сделают утилиты GNU.

Завершить работу над проектом можно с помощью следующих комманд:

touch AUTHORS ChangeLog NEWS README

aclocal --install -I m4 --force
autoheader
automake --gnu --add-missing --copy --force-missing
autoconf --force

Теперь для создания отчуждаемого исходного проекта нам достаточно запустить скрипт configure:

./configure --prefix=/usr

и создать архив main-1.0.1.tar.xz:

make dist

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

Сборка проекта

На стороне конечного пользователя, сборка и инсталляция нашего проекта будет выглядеть следующим образом:

tar xJvf main-1.0.1.tar.xz
mkdir build
cd build
../main-1.0.1/configure --prefix=/usr
make
make install

Если пользователь не хочет устанавливать программу main в системный каталог /usr/bin, то вместо выполнения команды

make install

он может инсталлировать программу main в другой каталог, например, в ${HOME}/usr/bin:

make install DESTDIR=${HOME}

Литература:

Контакты:

Комментарии (0)