2016-04-21 5 views
0

Я хочу создать много вариантов --enable-*/--disable-* что-то вроде:AC_ARG_ENABLE в цикле m4_foreach_w: никакой помощи строки

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

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

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

Независимо от того, что параметры --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 

ответ

0

После того как я пошарил в источниках 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, так что я просто переименовал его чтобы избавить меня от неприятностей.