AC_ARG_ENABLE в цикле m4_foreach_w: нет строки справки

Я хочу сгенерировать множество --enable-*/--disable-* параметров, например:

COMPONENTS([a b c], [yes])

где второй аргумент — это значение по умолчанию для автоматической переменной enable_*. Моей первой попыткой было написать AC_ARG_ENABLE(...) внутри m4_foreach_w, но пока я получаю только первый компонент, который появляется в выводе ./configure --help.

Если я добавляю рукописные AC_ARG_ENABLEs, они работают как обычно.

Несмотря на это, опции --enable-*/--disable-* работают как надо, только отсутствует текст справки.

Вот полный код для воспроизведения проблемы:

AC_INIT([foo], 1.0)
AM_INIT_AUTOMAKE([foreign])

AC_DEFUN([COMPONENTS],
[
    m4_foreach_w([component], [$1], [
        AS_ECHO(["Processing [component] component with default enable=$2"])
        AC_ARG_ENABLE([component],
            [AS_HELP_STRING([--enable-[]component], [component] component)],
            ,
            [enable_[]AS_TR_SH([component])=$2]
        )
    ])
    AC_ARG_ENABLE([x],
        [AS_HELP_STRING([--enable-[]x], [component x])],
        ,
        [enable_[]AS_TR_SH([x])=$2]
    )
    AC_ARG_ENABLE([y],
        [AS_HELP_STRING([--enable-[]y], [component y])],
        ,
        [enable_[]AS_TR_SH([y])=$2]
    )
])

COMPONENTS([a b c], [yes])

for var in a b c x y; do
    echo -n "\$enable_$var="
    eval echo "\$enable_$var"
done
AC_CONFIG_FILES(Makefile)
AC_OUTPUT

И пустой Makefile.am. Чтобы убедиться, что параметры работают:

$ ./configure --disable-a --disable-b --disable-d --disable-x
configure: WARNING: unrecognized options: --disable-d
...
Processing component a with default enable=yes
Processing component b with default enable=yes
Processing component c with default enable=yes
$enable_a=no
$enable_b=no
$enable_c=yes
$enable_x=no
$enable_y=yes

person Irfy    schedule 21.04.2016    source источник


Ответы (1)


Покопавшись в исходниках autoconf, я понял, что это связано с вызовом m4_divert_once в реализации AC_ARG_ENABLE:

# AC_ARG_ENABLE(FEATURE, HELP-STRING, [ACTION-IF-TRUE], [ACTION-IF-FALSE])
# ------------------------------------------------------------------------
AC_DEFUN([AC_ARG_ENABLE],
[AC_PROVIDE_IFELSE([AC_PRESERVE_HELP_ORDER],
[],
[m4_divert_once([HELP_ENABLE], [[
Optional Features:
  --disable-option-checking  ignore unrecognized --enable/--with options
  --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
  --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]]])])dnl
m4_divert_once([HELP_ENABLE], [$2])dnl
_AC_ENABLE_IF([enable], [$1], [$3], [$4])dnl
])# AC_ARG_ENABLE

# m4_divert_once(DIVERSION-NAME, CONTENT)
# ---------------------------------------
# Output CONTENT into DIVERSION-NAME once, if not already there.
# An end of line is appended for free to CONTENT.
m4_define([m4_divert_once],
[m4_expand_once([m4_divert_text([$1], [$2])])])

Я предполагаю, что аргумент HELP-STRING запоминается в нераскрытом виде, поэтому он добавляется только один раз для всех компонентов. Ручное расширение AC_HELP_STRING делает то, что я хочу:

AC_DEFUN([COMPONENTS],
[
    m4_foreach_w([comp], [$1], [
        AS_ECHO(["Processing component 'comp' with default enable=$2"])
        AC_ARG_ENABLE([comp],
            m4_expand([AS_HELP_STRING([--enable-comp], enable component comp)]),
            ,
            [enable_[]AS_TR_SH([comp])=$2]
        )
    ])
])

COMPONENTS([a b c x y], [yes])

Я не смог найти способ правильно заключить components в кавычки, чтобы оно отображалось в виде строки после использования в качестве переменной цикла в m4_foreach_w, поэтому я просто переименовал его, чтобы избавить себя от хлопот.

person Irfy    schedule 21.04.2016