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))
И это работает. Еще раз спасибо за вашу помощь.