Autoreconf останавливается с именем переменной, отличной от POSIX

Я создал Makefile.in, в котором я считываю содержимое файла и передаю его в CFLAGS. Вызов ./configure ... Makefile будет сгенерирован и все будет работать нормально.

Makefile.in: 
... 
MY_REVISION_FILE=my-revision.txt 
MY_REVISION=$(shell cat $(top_srcdir)/$(MY_REVISION_FILE)) 
AM_CFLAGS = -I$(EXTRAS_INCLUDE_DIR) -I$(top_srcdir) -DMY_REVISION=$(MY_REVISION) 
... 

Проблема возникает, когда я переместил код Makefile.in в Makefile.am, чтобы разрешить автоматическое создание Makefile.in. Там вызов autoreconf -i --force останавливается со следующей ошибкой:

server/Makefile.am:9: cat $(top_srcdir: non-POSIX variable name 
server/Makefile.am:9: (probably a GNU make extension) 
autoreconf: automake failed with exit status: 1 

Эта проблема преследует меня уже довольно давно. Я искал везде, но не нашел ничего, что могло бы помочь мне найти решение для этого. Короче говоря, единственное, что мне нужно, это способ получить неинтерпретируемый текст, такой как «$ (shell cat $ (top_srcdir) / $ (MY_REVISION_FILE))», скопированный из Makefile.am в Makefile.in

Любая идея?

Спасибо Оливер


person Oliver    schedule 29.03.2013    source источник


Ответы (2)


Как говорится, проблема в том, что вы используете GNUism в своем Makefile.am, когда он предназначен только для содержания переносимого кода Makefile.

Либо перепишите свой код, чтобы он был переносимым (вы должны использовать AM_CPPFLAGS, потому что вы передаете флаги препроцессору, а не компилятору):

AM_CPPFLAGS = -I$(EXTRAS_INCLUDE_DIR) -I$(top_srcdir) -DMY_REVISION=`cat $(top_srcdir)/$(MY_REVISION_FILE)`

Если вы не хотите вызывать cat при каждой компиляции, вы можете найти значение в configure.ac и либо AC_SUBST в Makefile, или AC_DEFINE, чтобы оно перешло в config.h.

Или, если вы хотите быть непереносимым (ಠ_ಠ), вы можете убрать -Werror из своего AM_INIT_AUTOMAKE или AUTOMAKE_OPTIONS или добавить -Wno-portability.

person Jack Kelly    schedule 29.03.2013

После долгого тестирования я решил использовать AC_SUBST. Мое решение может быть не самым чистым, но оно работает для меня.

В configure.ac я добавил следующую строку AC_SUBST ([DOLLAR_SIGN], [$])

В Makefile.am я изменил свою предыдущую строку на MY_REVISION = @ DOLLAR_SIGN @ (shell cat $ (SRC_DIR) / $ (MY_REVISION_FILE))

И это работает. Еще раз спасибо за вашу помощь.

person Oliver    schedule 01.04.2013
comment
Этот код где-то в сети? Если так, я мог бы предложить что-нибудь менее взломанное. - person Jack Kelly; 02.04.2013
comment
На самом деле я удалил взлом AC_SUBST и заменил его на -Wno-portability. Это просто лучший способ сделать это. Но, привет, приятно знать, как работает AC_SUBST ;-) - person Oliver; 02.04.2013