2011-12-15 2 views
1

В настоящее время я работаю над обновлением набора двоичных файлов C++, каждый из которых использует свой собственный набор Makefile для чего-то более современного, основанного на Autotools. Однако я не могу понять, как включить стороннюю библиотеку (например, Oracle Instant Client) в процесс сборки/упаковки.Autotools: Включая предварительно созданную стороннюю библиотеку

Это что-то действительно простое, что я пропустил?

Изменить, чтобы добавить больше деталей

Моя текущая среда сборки выглядит следующим образом:

/src 
    /lib 
     /libfoo 
      ... source and header files 
      Makefile 
     /oci #Oracle Instant Client 
      ... header and shared libraries 
      Makefile 
    /bin 
     /bar 
      ... source and header files 
      Makefile 
    Makefile 
/build 
    /bin 
    /lib 

build.sh 

Сегодня верхний build.sh уровень выполняет следующие действия:

  1. Запускает каждый файл Make's lib и копирует вывод в/build/lib
  2. Запускает каждый бинар y Makefile и скопировал вывод в/build/bin

Каждый Makefile имеет набор жестко установленных путей к различным каталогам родственных сестер. Излишне говорить, что это стало кошмаром для поддержания. Я начал тестировать autotools, но там, где я застрял, вычисляется эквивалент копирования /src/lib/oci/*.so в/build/lib для компоновки времени, связывающего и связывающего в дистрибутив.

+0

Что это за программа от autotools так или иначе ... –

+0

Ее встроенный набор программ, которые я использую на работе. – chotchki

+0

Ну, есть обычные механизмы autotools для проверки и/или включения для библиотек, начиная с 'AC_SEARCH_LIBS', или просто используя' myprog_LDADD = -loic-foo' ... при условии, что все еще существует в вашей производной, о которой мы ничего не знаем. –

ответ

2

Я понял, как это сделать.

Сначала я перешел на нерекурсивный make.

Далее я сделал следующие изменения в configure.am согласно этой странице http://www.openismus.com/documents/linux/using_libraries/using_libraries

AC_ARG_WITH([oci-include-path], 
    [AS_HELP_STRING([--with-oci-include-path], 
     [location of the oci headers, defaults to lib/oci])], 
    [OCI_CFLAGS="-$withval"], 
    [OCI_CFLAGS="-Ilib/oci"]) 
AC_SUBST([OCI_CFLAGS]) 
AC_ARG_WITH([oci-lib-path], 
    [AS_HELP_STRING([--with-oci-lib-path], 
     [location of the oci libraries, defaults to lib/oci])], 
    [OCI_LIBS="-L$withval -lclntsh -lnnz11"], 
    [OCI_LIBS='-L./lib/oci -lclntsh -lnnz11']) 
AC_SUBST([OCI_LIBS]) 

В Makefile.am вы затем использовать следующие строки (предполагается, что бинарное с именем Foo)

foo_CPPFLAGS = $(OCI_CFLAGS) 
foo_LDADD = libnavycommon.la $(OCI_LIBS) 

ocidir = $(libdir) 
oci_DATA = lib/oci/libclntsh.so.11.1 \ 
    lib/oci/libnnz11.so \ 
    lib/oci/libocci.so.11.1 \ 
    lib/oci/libociicus.so \ 
    lib/oci/libocijdbc11.so 
0

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

Смежные вопросы