2013-03-29 2 views
2

Я создал файл Makefile.in, где я прочитал содержимое из файла и передал его в CFLAGS. Вызов ./configure ... Makefile будет сгенерирован, все работает хорошо.Autoreconf останавливается с именем «non-POSIX variable»

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.

1

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

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

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

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

+0

Действительно ли этот код онлайн? Я мог бы предложить что-то менее хакерское, если так. –

+0

На самом деле я удалил ручку AC_SUBST и заменил ее -Wno-переносимостью. Это лучший способ сделать это. Но эй, его приятно знать, как работает AC_SUBST ;-) – Oliver

 Смежные вопросы

  • Нет связанных вопросов^_^