2012-02-13 2 views
0

우선, 너무 길어서 게시물을 작성하면 미안하지만 그렇지 않으면 정보가 누락 될 것이라고 생각합니다.메이크 파일 재귀 CPPFLAGS를 전달하지 않음

각 빌드에 저장소 버전을 포함하고 싶습니다. 각각의 서브 디렉토리에 다른 메이크 파일을 마스터하는 메인 메이크 파일이있다. 하위 프로젝트가 "자동화"되었습니다.

내가 포함하는 변수를 전달하려고이 같은 내부 Makefilessvnversion :

각 하위 디렉토리는이 같은 Makefile.amconfigure.ac
# Main Makefile 

SUBDIRS = sd1 sd2 
REPO_VERSION = `svnversion` 
export ECHO = @echo 
export CPPFLAGS 

all: versioned 
    $(ECHO) "Build of all projects in $(PWD) finished." 

clean : 
    $(ECHO) "Cleaning up entire project tree..." 
    -for d in $(SUBDIRS); do ($(ECHO) "Cleaning up \"$$d\""; $(MAKE) -C $$d clean); done 

.PHONY: versioned unversioned $(SUBDIRS) 

versioned: CPPFLAGS = -DREPO_VERSION=\"v$(REPO_VERSION)\" 

versioned: subdirs 

unversioned: subdirs 

versioned unversioned: 
    $(ECHO) "Build [email protected] finished." 

subdirs: $(SUBDIRS) 

$(SUBDIRS): 
    $(ECHO) "== Building [email protected]      ==" 
    $(ECHO) " [ CPPFLAGS = \"$(CPPFLAGS)\" ]" 
    (cd [email protected] && \ 
     ([ -f Makefile ] || \ 
      (aclocal  && \ 
      autoheader && \ 
      automake --foreign --add-missing && \ 
      autoconf && \ 
      configure)) && \ 
     $(MAKE) \ 
     ) 

:

Makefile.am :

# Makefile.am in "sd1" and "sd2" 

bin_PROGRAMS = app 
app_SOURCES = source.c 

configure.ac :

AC_PREREQ(2.59) 

AC_INIT([app], [1.00], [<[email protected]>]) 
AM_INIT_AUTOMAKE 

AC_CONFIG_HEADER([config.h]) 

# Checks for programs. 
AC_PROG_CC 
AC_PROG_CPP 
AC_PROG_INSTALL 
AC_PROG_LN_S 
AC_PROG_MAKE_SET 

# Checks for header files. 
AC_HEADER_STDC 

# Checks for typedefs, structures, and compiler characteristics. 
AC_C_CONST 
AC_TYPE_SIZE_T 

# Output configuration files. 
AC_CONFIG_FILES([Makefile]) 
AC_OUTPUT 

나는이 일 것으로 예상하지만, 실행할 때 autotools를이 메이크에 REPO_VERSION를 내장하고 있으며, 더 빌드의 주요 메이크의 REPO_VERSION의 변화는 무시됩니다.

출력의 조각은 다음과 같습니다

== Building sd1      == 
    [ CPPFLAGS = "-DREPO_VERSION="1050"" ] 
(cd sd1 && \ 
     ([ -f Makefile ] || \ 
       (aclocal    && \ 
       autoheader  && \ 
       automake --foreign --add-missing && \ 
       autoconf  && \ 
       configure)) && \ 
     make \ 
     ) 
make[1]: Entrando no diretório `./recursive/sd1' 
make all-am 
make[2]: Entrando no diretório `./recursive/sd1' 
gcc -DHAVE_CONFIG_H -I. -DREPO_VERSION=\"1049M\" -g -O2 -MT source.o -MD -MP -MF .deps/source.Tpo -c -o source.o source.c 
mv -f .deps/source.Tpo .deps/source.Po 
gcc -g -O2 -o app source.o 
make[2]: Saindo do diretório `./recursive/sd1' 
make[1]: Saindo do diretório `./recursive/sd1' 

프로그램 출력 :

> ./sd1/appVersão = [1049M]. 

이 명확하게 내가 원하는 것이 아니다.

아무도 여기이 문제를 해결할 수있는 방법을 제공 할 수 있습니까?

감사합니다.

최상위 수준의 메이크업 파일에서

답변

4

export REPO_VERSION 

를 추가하고 REPO_VERSION의 값이 호출을 재귀에 수출 될 수 있도록 수출 지시어가 만드는

REPO_VERSION ?= unknown 
AM_CPPFLAGS = -DREPO_VERSION="$(REPO_VERSION)" 

이 각 Makefile.am을 수정 . Makefile.am 스 니펫은 REPO_VERSION의 기본값을 지정하지 않으면 (예 : make는 하위 디렉토리의 쉘에서 실행 됨) AM_CPPFLAGS는 해당 Makefile의 모든 대상에 대한 CPPFLAGS의 기본값을 지정합니다. 타겟 특정 _CPPFLAGS 변수가있는 경우 $ (AM_CPPFLAGS)를 추가하거나 -DREPO_VERSION = "$ (REPO_VERSION)"을 포함시켜야합니다. 좀 더 노력하면 구성 시간에 REPO_VERSION의 기본값을 설정할 수 있도록 configure.ac 파일에 몇 가지 내용을 추가 할 수 있습니다.

+0

+1 : 내보내기가 이식 가능하지 않다는 점을 제외하면 이는 좋은 해결책이며, 많은 제조업체에서 지원하지 않습니다. –

+0

좋아! 그게 내가 찾고 있던거야. 유일한 변화는'AM_CPPFLAGS = -DREPO_VERSION = \ "$ (REPO_VERSION) \"'(이스케이프 처리 된''')이라고 써야한다는 것입니다. 정말 고마워요 – j4x

1

환경을 통해 CPPFLAGS를 전달하려고하지만 환경 호출에서 구성 호출이 CPPFLAGS를 가져 오는 위치가 표시되지 않습니다. 명령 줄에서 다음과 같이 전달하십시오.

 
$(SUBDIRS): 
    $(ECHO) "== Building [email protected]      ==" 
    $(ECHO) " [ CPPFLAGS = \"$(CPPFLAGS)\" ]" 
    cd [email protected] && autoreconf -i && ./configure CPPFLAGS=$(CPPFLAGS) && $(MAKE) 

또한 configure를 한 번만 실행합니다. Makefile이 존재하면 configure를 다시 실행하지 않으므로 하위 디렉토리의 CPPFLAGS 값을 재설정하지 않습니다.

구성시 버전을 설정하는 것은 매우 불편합니다. 확인 시간에 버전을 설정할 수있는 일부 techinques에 대해서는 here을보십시오.

+0

당신의 수정에 동의하지만 제 질문에 응답하지 않습니다. 나는 여전히 나의 버전이 업데이트 된 것을보기 위해'configure'를 재생성하는 것에 묶일 것입니다. 당신이 후자에 준 링크에 대해서 생각 하겠지만 @Geoff Reedy가 내 요구에 맞춰 답장을합니다. 고마워요. – j4x