首先,抱歉,如果我最終做了一個太長的帖子,但我認爲它會丟失信息,否則。Makefile遞歸不通過CPPFLAGS
我想在每個版本中包含我的存儲庫版本。 有一個主makefile在其各自的子目錄中掌握了一些其他的。 子項目是「automaked」。
我試圖通過包含可變的svnversion
到內Makefiles
這樣的:
# 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
和configure.ac
這樣的:
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
我預計今年的工作,但在運行時自動工具在生成文件中嵌入REPO_VERSION
,並在主Makefile中的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:這是一個很好的解決方案,除了導出不可移植,許多make不支持它。 – 2012-02-13 16:51:38
好吧!那正是我正在尋找的。唯一的變化就是我不得不寫'AM_CPPFLAGS = -DREPO_VERSION = \「$(REPO_VERSION)\」'(轉義''') – j4x 2012-02-13 17:09:48