Ответ 1
Если библиотека, которую вы проверяете, предоставляет файл .pc
для использования с pkg-config
, вам гораздо лучше использовать PKG_CHECK_MODULES
для получения правильных флагов. libpng делает:
(in configure.ac
)
PKG_CHECK_MODULES([libpng], [libpng12])
Это дает вам доступ к переменным $(libpng_CFLAGS)
и $(libpng_LIBS)
, которые вы хотите добавить к Makefile.am
(возможно, в AM_CFLAGS
/AM_CXXFLAGS
и LDADD
или к конкретным версиям).
Он также приведет к ошибке configure
с ошибкой, если libpng12.pc
не найден. Если вы хотите, чтобы configure
продолжался, вам нужно указать третий и четвертый аргументы PKG_CHECK_MODULES
, которые ACTION-IF-FOUND
и ACTION-IF-NOT-FOUND
:
(in configure.ac
)
PKG_CHECK_MODULES([libpng], [libpng12], [HAVE_LIBPNG=1], [HAVE_LIBPNG=0])
Теперь, если вам нужен условный automake
, вы можете сделать что-то вроде:
(in configure.ac
)
AM_CONDITIONAL([USE_LIBPNG], [test "$HAVE_LIBPNG" -eq 1])
Если вам также требуется определение препроцессора, вы можете использовать AC_DEFINE
следующим образом:
(in configure.ac
)
AS_IF([test "$USE_LIBPNG" -eq 1], [AC_DEFINE([USE_LIBPNG], [1], [Define if using libpng.])])
Возможно, лучше установить определение в Makefile.am
:
(in Makefile.am
)
AM_CPPFLAGS =
if USE_LIBPNG
AM_CPPFLAGS += -DUSE_LIBPNG
endif
Это будет загромождать вашу командную строку, хотя AC_DEFINE
может поместить определение в заголовок, если вы используете AC_CONFIG_HEADERS
. Думаю, это не имеет значения, если вы используете AM_SILENT_RULES([yes])
или не заботитесь о том, чтобы ваша командная строка была аккуратной (и пусть честно говоря, automake
в любом случае генерирует некоторые довольно gnarly командные строки).
Заметка о стиле autoconf
Считается, что плохая форма для создания дополнительной поддержки основана на том, удалось ли проверить (см. этот документ gentoo). Вот как я бы закодировал дополнительную поддержку libpng:
(in configure.ac
)
# This is because the first PKG_CHECK_MODULES call is inside a conditional.
PKG_PROG_PKG_CONFIG
AC_ARG_WITH([libpng],
[AS_HELP_STRING([--with-libpng],
[support handling png files @<:@[email protected]:>@])],
[],
[with_libpng=check])
AS_CASE(["$with_libpng"],
[yes], [PKG_CHECK_MODULES([libpng], [libpng12], [HAVE_LIBPNG=1])],
[no], [],
[PKG_CHECK_MODULES([libpng], [libpng12], [HAVE_LIBPNG=1], [HAVE_LIBPNG=0])])
AM_CONDITIONAL([USE_LIBPNG], [test "$with_libpng" != no -a "$HAVE_LIBPNG" -eq 1])
(in Makefile.am
)
if USE_LIBPNG
AM_CPPFLAGS += -DUSE_LIBPNG
AM_CFLAGS += $(libpng_CFLAGS)
LDADD += $(libpng_LIBS)
libdev_la_SOURCES += png.c
endif
Если в вашей библиотеке нет файла .pc
Для полноты, вот как я проверил бы библиотеку, у которой не было файла .pc
. Я пропущу подробности следующего хорошего стиля autoconf
. AC_CHECK_LIB
задает переменную кеша, поэтому вы можете проверить, что вместо замены ACTION-IF-FOUND
AC_CHECK_LIB
:
(in configure.ac
)
AC_CHECK_LIB([png], [png_create_write_struct_2])
# Then test:
AS_IF([test "$ac_cv_lib_png_png_create_write_struct_2" = yes], [HAVE_LIBPNG=1], [HAVE_LIBPNG=0])
# Or set conditional:
AM_CONDITIONAL([USE_LIBPNG], [test "$ac_cv_lib_png_png_create_write_struct_2" = yes])
IMHO, вы должны сделать это только в том случае, если у вас нет другого варианта.