2013-03-29 41 views
2

我創建了一個Makefile.in,我從文件中讀取內容並將其傳遞給CFLAGS。調用./configure ... Makefile將生成一切正常。Autoreconf以「非POSIX變量名」停止

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 

此問題因爲相當長的一段時間而獵殺我。我到處搜索,但沒有找到任何可以幫助我找到解決方案的東西。總之,我需要的唯一方法就是將從$ Makefile.am複製到Makefile.in的「$(shell cat $(top_srcdir)/ $(MY_REVISION_FILE))」這樣的未解釋文本的方法。

任何想法?

感謝, 奧利弗

回答

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中的值存入MakefileAC_DEFINE,因此它將存入config.h

或者,如果你想成爲非便攜式(ಠ_ಠ),你可以把-Werror你的AM_INIT_AUTOMAKEAUTOMAKE_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-portability替換它。它只是一個更好的做法。但是,嘿,很高興知道AC_SUBST是如何工作的;-) – Oliver