首先,对不起,如果我最后发帖太长,但我认为否则会丢失信息。
我想在每个版本中包含我的存储库版本。 有一个主makefile,可以在各自的子目录中掌握其他一些。 子项目是"自动化"。
我正在尝试将包含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 $@ finished."
subdirs: $(SUBDIRS)
$(SUBDIRS):
$(ECHO) "== Building $@ =="
$(ECHO) " [ CPPFLAGS = \"$(CPPFLAGS)\" ]"
( cd $@ && \
( [ -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], [<suport@domain>])
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在运行时会在makefile中嵌入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].
这显然不是我想要的。
请问有人可以解决这个问题吗?
感谢。
答案 0 :(得分:4)
在您的顶级制作文件中添加
export REPO_VERSION
并修改每个Makefile.am以
REPO_VERSION ?= unknown
AM_CPPFLAGS = -DREPO_VERSION="$(REPO_VERSION)"
export指令使得REPO_VERSION的值被导出到递归make调用。如果未给出REPO_VERSION,则Makefile.am片段设置默认值(例如,make从子目录中的shell运行),AM_CPPFLAGS为该Makefile中的所有目标指定CPPFLAGS的默认值。如果您有一个特定于目标的_CPPFLAGS变量,则应该向其添加$(AM_CPPFLAGS)或在其中包含-DREPO_VERSION =“$(REPO_VERSION)”。通过更多努力,您可以在configure.ac文件中添加一些内容,以便可以在配置时设置REPO_VERSION的默认值。
答案 1 :(得分:1)
您正试图通过环境传递CPPFLAGS,但我没有看到configure的调用在其环境中设置CPPFLAGS的位置。尝试在命令行传递它:
$(SUBDIRS): $(ECHO) "== Building $@ ==" $(ECHO) " [ CPPFLAGS = \"$(CPPFLAGS)\" ]" cd $@ && autoreconf -i && ./configure CPPFLAGS=$(CPPFLAGS) && $(MAKE)
此外,您只运行一次配置。 Makefile存在后,您不会重新运行configure,因此您永远不会在子目录中重置CPPFLAGS的值。
在配置时设置版本非常不方便。看看 here ,了解一些允许在制作时设置版本的技术。