우선, 너무 길어서 게시물을 작성하면 미안하지만 그렇지 않으면 정보가 누락 될 것이라고 생각합니다.메이크 파일 재귀 CPPFLAGS를 전달하지 않음
각 빌드에 저장소 버전을 포함하고 싶습니다. 각각의 서브 디렉토리에 다른 메이크 파일을 마스터하는 메인 메이크 파일이있다. 하위 프로젝트가 "자동화"되었습니다.
내가 포함하는 변수를 전달하려고이 같은 내부 Makefiles
에 svnversion
:
Makefile.am
및
configure.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].
이 명확하게 내가 원하는 것이 아니다.
아무도 여기이 문제를 해결할 수있는 방법을 제공 할 수 있습니까?
감사합니다.
최상위 수준의 메이크업 파일에서
+1 : 내보내기가 이식 가능하지 않다는 점을 제외하면 이는 좋은 해결책이며, 많은 제조업체에서 지원하지 않습니다. –
좋아! 그게 내가 찾고 있던거야. 유일한 변화는'AM_CPPFLAGS = -DREPO_VERSION = \ "$ (REPO_VERSION) \"'(이스케이프 처리 된''')이라고 써야한다는 것입니다. 정말 고마워요 – j4x