? Editing: Post:21.body Save Delete Cancel
Content changed Sign & Publish new content

Geekless.Twitter

Микроблог для лытдыбра

Follow in NewsfeedFollowing

Latest comments:

Add new post

Title

21 hours ago · 2 min read ·
3 comments
Body
Read more

Not found

Изобретаю макросы для autoconf

on May 01, 2019 · 1 min read

Возможно, я велосипед изобрел, но в документации ничего такого не нашел.

Если почитать Autotools Mythbuster на тему, как правильно обрабатывать зависимости пакетов, и написать максимально правильный код, получится простыня примерно такого вида:


AC_ARG_WITH([alsa],
    [AS_HELP_STRING(
        [--with-alsa],
        [enable ALSA support for volumealsa plugin @<:@default=auto@:>@]
    )],
    [],
    [with_alsa=auto]
)

AC_MSG_CHECKING([--with-alsa])
AC_MSG_RESULT([$with_alsa])

have_alsa=no
AS_IF([test "x$with_alsa" != xno], [
    AC_CHECK_HEADERS([alsa/asoundlib.h], [
        AC_CHECK_LIB([asound], [snd_seq_open], [
            have_alsa=yes
        ])
    ])
])

AS_IF([test "x$with_alsa" = "xyes" -a "x$have_foo" != "xyes"], [
    AC_MSG_ERROR([alsa requested but not found])
])

autodetected_plugin_volumealsa="$have_alsa"

В результате мы имеем автодектирование, а также принудительное включение и выключение опции через ключи запуска ./configure. На выходе этот кусок кода устанавливает переменную have_alsa в значение yes или no с учетом всех возможных вариантов , либо завершается с ошибкой, если зависимость была принудительно включена, но не найдена. Как-то так:

   (нет ключа)     -> есть библиотека     -> have_alsa=yes
   (нет ключа)     -> нет библиотеки      -> have_alsa=no
   --with-alsa     -> есть библиотека     -> have_alsa=yes
   --with-alsa     -> нет библиотеки      -> сообщение об ошибке
   --without-alsa  -> пофиг на библиотеку -> have_alsa=no

Написать этот код меня хватило только один раз. Я представил, как мне копипастить эти простыни для каждой опциональной зависимости в каждом проекте, так что пошел и запилил макрос.

С макросом всё становится по красоте:

SDE_WITH([alsa], [enable ALSA support for volumealsa plugin @<:@default=auto@:>@], [
    AC_CHECK_HEADERS([alsa/asoundlib.h], [
        AC_CHECK_LIB([asound], [snd_seq_open], [
            have_alsa=yes
        ])
    ])
])

autodetected_plugin_volumealsa="$have_alsa"

Еще пример:

SDE_WITH([oss], [enable support of the Open Sound System for volume plugin @<:@default=auto@:>@], [
    AC_CHECK_HEADERS([sys/soundcard.h], have_oss="yes")
    AC_CHECK_HEADERS([linux/soundcard.h], have_oss="yes")
])

autodetected_plugin_volume="$have_oss"

Хз, почему этого нет в autoconf из коробки.

0 Comment:

user_name1 day ago
Reply
Body
This page is a snapshot of ZeroNet. Start your own ZeroNet for complete experience. Learn More