我开始学习自动工具,以便首先了解并随后扩展现有项目的构建系统。目前,该项目构建了一个程序作为其输出。构建系统非常复杂,由几个子目录和Makefile.am
以维护者模式生成的文件组成,等等。我希望能够选择使用大部分相同的源代码创建一个库,重用大部分现有的构建系统。
我想象的是一个新的 make 目标,这样在运行 configure 之后,我就可以运行make
来制作程序,或者说,make library
构建库。执行此操作或具有类似效果的正确方法是什么?
我不想在普通运行时构建库和程序make
(只是像以前一样的程序),并且我不想在运行时构建程序make library
(我只想要库)。
如果有人可以提供一个简单的示例,例如由 组成的程序main.c
,foo.c
以及bar.c
由 and 组成的库foo.c
,bar.c
那也将非常有帮助。
编辑
为了澄清,我最初认为程序和库可以完全分开构建。该库仅包含主程序代码的子集,我相信这两者是独立的实体。然而,事情要复杂得多。程序本身被构建并用于输出一些代码,然后在第二步中将其编译到程序中(我认为)。通过执行以下步骤,我有效地得到了我想要的东西。
首先在configure.ac中添加一个条件
dnl Adds LIBRARY conditional for --enable-foolib mode to
dnl build foo as a library
AC_ARG_ENABLE(foolib,
AS_HELP_STRING([--enable-foolib],
[enable qucslib build, default: no]),
[case "${enableval}" in
yes) foolib=true ;;
no) foolib=false ;;
*) AC_MSG_ERROR([bad value ${enableval} for --enable-foolib]) ;;
esac],
[foolib=false])
AM_CONDITIONAL(FOOLIB, test x"$foolib" = x"true")
然后在适当的 Makefile.am 中,我做了类似以下的事情:
if FOOLIB
noinst_LIBRARIES = libbar.a libfoo.a
else
noinst_LIBRARIES = libbar.a
endif
bin_PROGRAMS = barprog
barprog_SOURCES = main.cpp src1.cpp src2.cpp etc.cpp
barprog_LDADD = libbar.a \
subdir1/libsubdir1.a \
subdir2/libsubdir2.a \
etcdir/libetc.a
... other stuff
if FOOLIB
libfoo_a_LIBADD = libbar.a \
subdir1/libsubdir1.a \
subdir2/libsubdir2.a \
etcdir/libetc.a
libfoo_a_SOURCES = src1.cpp src2.cpp etc.cpp
endif
然后当我想做图书馆时
configure --enable-foolib
make
这暂时有效,但似乎很笨拙。我不确定如何在构建系统中实现提供的答案。