Если библиотека, которую вы проверяете, предоставляет файл .pc
для использования с pkg-config
, тогда вам гораздо лучше использовать PKG_CHECK_MODULES
для получения правильных флагов.libpng делает:
(в 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
:
(в configure.ac
)
PKG_CHECK_MODULES([libpng], [libpng12], [HAVE_LIBPNG=1], [HAVE_LIBPNG=0])
Теперь, если вам нужно условное automake
, вы можете сделать что-то вроде:
(в configure.ac
)
AM_CONDITIONAL([USE_LIBPNG], [test "$HAVE_LIBPNG" -eq 1])
Если вам также нужен препроцессоропределение, вы можете использовать AC_DEFINE
, например, так:
(в configure.ac
)
AS_IF([test "$USE_LIBPNG" -eq 1], [AC_DEFINE([USE_LIBPNG], [1], [Define if using libpng.])])
Возможно, лучше задать определение в Makefile.am
:
(в Makefile.am
)
AM_CPPFLAGS =
if USE_LIBPNG
AM_CPPFLAGS += -DUSE_LIBPNG
endif
Это загромождает вашу командную строку, тогда как AC_DEFINE
может поместить определение в заголовок, если вы используете AC_CONFIG_HEADERS
.Я думаю, это не имеет значения, если вы используете AM_SILENT_RULES([yes])
или вам не важно, чтобы ваша командная строка была аккуратной (и давайте будем честными, automake
в любом случае генерирует довольно грубые командные строки).
Aпримечание о хорошем autoconf
стиле
Считается плохой формой для создания дополнительной поддержки в зависимости от того, была ли успешной проверка (подробности см. в этом документе Gentoo ).Вот как я могу написать дополнительную поддержку libpng:
(в 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 @<:@default=check@:>@])],
[],
[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])
(в 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
:
(в 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])
ИМХО, вам следуетделайте это только так, если у вас нет другого выбора.