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

Любая идея?

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

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,

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

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

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

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

Другие вопросы по тегам