m4_include не расширяет свой аргумент?

Предположим тривиальное configure.ac:

AC_INIT([foobar], 1.0)
m4_define([foobar_m4], [foobar.m4])
m4_include(foobar_m4)

с тривиальным foobar.m4:

AS_ECHO(["foobar.m4 was included"])

Запуск autoreconf производит:

aclocal: error: configure.ac:10: file 'foobar_m4' does not exist
autoreconf-2.69: aclocal failed with exit status: 1

Как включить расширенные имена файлов m4 в configure.ac?


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


Ответы (1)


Виновником является утилита aclocal, а не m4. Расширение m4 работает просто отлично, но перед вызовом m4 aclocal сканирует configure.ac на наличие зависимостей и слепо обрабатывает макрос m4_include, как если бы он всегда вызывался с буквальным аргументом файла.

Есть два обходных пути:

  1. Используйте встроенный макрос include:

    m4_builtin([include], foobar_m4)
    

Это позволит полностью обойти предоставленный autoconf макрос m4_include, который защищает от повторного включения одного и того же файла.

  1. Определите свой собственный макрос, который вызывает m4_include:

    m4_define([my_include], [m4_include][([$1])])dnl
    my_include(foobar_m4)
    

Почему странное цитирование? Мы должны заключить в кавычки m4_include в приведенном выше определении, чтобы оно не расширялось во время определения my_include, но цитирование всего вызова m4_include([$1]) все равно приведет к отключению aclocal так же, как в вопросе.

Насколько я знаю, нет встроенного способа запретить aclocal специально обрабатывать макрос m4_include. Такое поведение aclocal важно для отслеживания зависимостей, поэтому включение файлов таким образом, скорее всего, не удастся выполнить из-за неопределённых макросов, используемых во включаемых файлах (это также объясняется здесь).

person Irfy    schedule 25.04.2016