2013-03-29 4 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.in으로 옮겨서 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_catrc $ (top_srcdir)/$ (MY_REVISION_FILE))"과 같은 해석되지 않은 텍스트를 얻는 방법입니다.

어떤 생각입니까?

감사합니다, 올리버

답변

2

가 말했듯이, 문제는 유일한 휴대용 메이크 코드를 포함하는 의미 때 당신이 당신의 Makefile.am에 GNUism을 사용하고 있습니다. 그것은 (당신이 전처리가 아닌 컴파일러 플래그를 통과하고 있기 때문에 당신이 AM_CPPFLAGS를 사용한다) 휴대용 그래서

어느 코드를 재 작성 :

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

당신은 모든 컴파일에 cat를 호출하지 않으려면 configure.ac의 값을 찾을 수 있으며 AC_SUBSTMakefile 또는 AC_DEFINE이므로 config.h이됩니다.

아니면 (ಠ_ಠ) 비 호환성을 원한다면, 당신은 AM_INIT_AUTOMAKE 또는 AUTOMAKE_OPTIONS 당신의에서 -Werror을, 또는 -Wno-portability를 추가 할 수 있습니다.

1

오래 전부터 테스트를 해본 결과 AC_SUBST를 사용하기로 결정했습니다. 내 솔루션이 가장 깨끗한 것은 아니지만 나에게 적합합니다. configure.ac에서

은 내가 MY_REVISION = @ DOLLAR_SIGN @ (쉘 고양이 $에 내 이전 행을 변경 한 Makefile.am에서 다음 줄 AC_SUBST ([DOLLAR_SIGN], [$])

를 (추가 SRC_DIR)/$ (MY_REVISION_FILE))

그리고 작동합니다. 다시 귀하의 도움에 감사드립니다.

+0

이 코드는 온라인 어딘가에 있습니까? 그렇다면 해커가 아닌 것을 제안 할 수 있습니다. –

+0

실제로 AC_SUBST 해킹을 제거하고 그것을 -Wno-portability로 바 꾸었습니다. 그것을하는 것이 더 좋은 방법 일 것입니다. 하지만, AC_SUBST가 어떻게 작동하는지 알면 좋겠다 ;-) – Oliver