2013-07-15 3 views
1

Я использую впервые autotools & Cie и я потерян. Я генерирую около ста динамических библиотек в среде openwrt в разных пакетах. Позже в двоичном формате я использую dlopen + dlsym для использования моей библиотеки. Это позволяет мне использовать систему плагинов.openwrt config, autotools и library

Теперь я хотел бы иметь возможность связывать все мои библиотеки статически вместо использования моей системы плагинов. В основном я хотел бы сказать, если моя библиотека A определена в моем файле .config, соедините ее с моим двоичным кодом. Так что теперь я просто использую dlsym functionnality без использования функции dlopen.

Я могу это сделать, но, на мой взгляд, очень грязно.

  • Используйте мою библиотеку, если пакет определен в .config Makefile пакета моего бинарного
PKG_BUILD_DEPENDS+= +PACKAGE_LIBA:LIBA 
    ifdef CONFIG_PACKAGE_LIBA 
    CONFIGURE_ARGS+= --enable-LIBA 
    endif 
  • configure.ac моего двоичном в дл директории
AC_ARG_ENABLE([LIBA], 
    [AS_HELP_STRING([--enable-LIBA], [Enable link with LIBA (default no)])], 
    [ if test x"$enableval" = "xno" ; then LIBA="0" ; else LIBA="1" ; fi ], 
    [LIBA="0"]) 
if test "$LIBA" = "1" ; then 
    [LIBA="-la"] 
    AC_SUBST([LIBA_LIBS]) 
fi 
  • Makefile.am моего двоичном в дл директории

MYBINARY_LDADD = $ (LIBA_LIBS)

Теперь мне нужно сделать это для сотен библиотек. Более того, если LIBA использует, например, стандартную библиотеку, мне нужно добавить ее вручную ... Довольно иронично использовать AUTOtools, как это ... В любом случае это работает, но так уродливо. Преимущество этого в том, что мне нужно только модифицировать мой двоичный файл Makefile/configure, а не все пакеты. Если бы я мог это сделать только с Makefile, но одно из моих требований здесь - использовать autotools. Я также попробовал другое решение с файлом pc.in, где мне нужно описать мою библиотеку, но я не смог правильно ее использовать. И не уверен, что было действительно чисто следовать этому решению.

Thanks, Arthur.

ответ

2

Это распространенное заблуждение, что autotools сделает все автоматическим. вместо этого вы должны быть очень явными, например. вы должны добавить каждый файл-источник в свой Makefile.am, а не использовать подстановочные знаки.

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

PLUGIN_LIBS="" 
AC_ARG_ENABLE([LIBA], 
[AS_HELP_STRING([--enable-LIBA], [Enable link with LIBA (default no)])], 
[ test x"$enableval" = "xyes" && PLUGIN_LIBS="${PLUGIN_LIBS} -la" || true ]) 
AC_ARG_ENABLE([LIBB], 
[AS_HELP_STRING([--enable-LIBB], [Enable link with LIBB (default no)])], 
[ test x"$enableval" = "xyes" && PLUGIN_LIBS="${PLUGIN_LIBS} -lb" || true ]) 
# ... 
AC_SUBST([PLUGIN_LIBS]) 

на практике вы бы создать m4-макрос, который делает повторяющиеся задачи (вызов AC_ARG_ENABLE, установив справки-строку, делая тест, добавляя LIBS к PLUGIN_LIBS), так что вы в конечном итоге с:

PLUGIN_LIBS="" 
PLUGIN_BUILTIN([LIBA], [-la]) 
PLUGIN_BUILTIN([LIBB], [-lb]) 
# ... 

в обеих случаях вашего Makefile ,am будет выглядеть так:

MYBINARY_LDADD = $(PLUGIN_LIBS) 
+0

Спасибо, что вы посоветуете с макросом m4, я проверю его. До сих пор я написал сценарий оболочки, который читал мой .config моей среды openwrt и генерировал configure.ac, Makefile и т. Д. Я также использовал sed для генерации всей функции для инициализации моего плагина в моем коде. Это очень полезно, когда вам нужно изменить процесс сборки очень старого и большого проекта. Более того, я никогда не использую шаблон в Makefile. Просто нужна одна строка: '% .o:% .cpp' и' $ (CC) $ (CFLAGS) -c $ <'. – ArthurLambert

+0

Мне в основном хотелось указать, что 'autotools' не будет пытаться * автоматически * угадать, какие файлы принадлежат вашему проекту. * auto * относится к тому, как это будет * автоматически * математически выяснить, как построить свой проект на платформе XY (о котором вы, возможно, никогда не слышали). –

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